Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur
NodeJs etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
NodeJs etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

19 Mart 2016 Cumartesi

npm ayarları

NPM SET INIT


NPM addUser

npm client için www.npmjs.com adresinde kayıtlı olan kullanıcı bilgilerinizi bir kerede girmeniz ve ileride gerekmemesi için gerekli ayarlar:


.gitignore Dosyasıyla Yoksayılacaklar


git add -A

Tüm dosyaları (.gitignore içinde olmayan tüm dosyaları) repository'e gönderecek şekilde işaretler.

git commit -m "mesajınız"

Yaptığınız değişiklikleri bir mesaj ile repoya gönderilecek şekilde işaretler

git push

Artık github'a gittiler git push ile.

npm publish

github üstünde artık kodlarınız bulunuyor ancak npm install paket_adi ile indirilebilimesi için npmjs.com adresine publish edilmesi gerekiyor.

git tag

Buraya kadar kodunuzu ilk kez git's yüklediniz ve npm paketinizi kayıt ettirdiniz. artık npm install paketinizin_adi diyerek kullandırabilirsiniz ama zaman içinde çeşitli sürümler yaparak hem eski sürümlerinize erişim hem de yenilerini kullanma imkanı sunmak istiyorsunuz. O halde git tag [versiyonNo] ile sürekli sürüm yapabilirsiniz git üstünde. Tabi bunları npm tarafında da güncel tutmanız gerekecek ama önce git etiketlemesine bakalım:
Artık github üstünde versiyonNo etiketli sürümünüzü görebilir buna bir başlık açabilir üstünden sorunları giderebilirsiniz.

Artık Yeni Sürüm


npm install

npm install paketAdi             // son stabil paketi
npm install paketAdi@beta        // son beta sürümünü
npm install paketAdi@versiyonNo  // son beta sürümünü


npm version patch

Sadece package.json içindeki sürüm bilgisinin patch sayısını bir arttırıp package.json içindeki bilgiyi güncelleyecektir. Tabii bu işi git üstünden yaptığı için (git içindeki git-tag-version ile) git versiyonu da değişecektir. Bunu git üstünden yapmamak için npm --no-git-tag-version version -f çalıştırmalısınız.
npm version major|minor|patch şeklinde çeşitlerini buradan bulabilirsin.

npm scripts

Ref: http://blog.npmjs.org/post/118810260230/building-a-simple-command-line-tool-with-npm
Bir versiyon temel olarak major.minor.patch bölümlerinden oluşur.
Yamalamak için versiyonlama işi kısaca npm version patch ile olabilir ancak bu versiyonu npmjs.com adresine publish etmek içinde npm publish demek gerekecektir. Bunu otomatik hale getirmek için aşağıdaki blok iş görecektir. npm run patch-release ile tümünü tek bir kod ile yapabilirsiniz.
#package.json
{
  "name": "my-project",
  "version": "1.0.0",
  "scripts": {
    "patch-release": "npm version patch && npm publish && git push --follow-tags"
  }
}

Daha karmaşık bir yapıyı parçalara bölerek oluşturup tek elden çalıştırbilirsiniz npm run deploy ile.
"scripts": {
    "build": "...",
    "git-commit": "git add -A . && git commit -a -m 'gh-pages update'",
    "git-push": "git push origin gh-pages --force && git checkout master",
    "deploy": "npm run build && npm run git-commit && npm run git-push"
  },

git config --global credential.helper wincred

Git hesabınızı windows komut satırında kullanırken defalarca kullanıcı adınızın sorulmasını istemezseniz komut satırına
$ git config --global credential.helper wincred
yazmanız halinde artık kullanıcı bilgilerinizi windows tutacaktır. Yapmanız gereken git depolarından bir kaynak kodunuzla ilgili güncelleme yaparken bir kez kullanıcı adı ve şifrenizi girmek olacaktır. git config --list ile ayarlarınıza baktığınızda credential.helper=wincred satırını göreceksiniz ve sonraki tüm git işlemlerinizi komut satırından yaparken size kullanıcı adı ve şifresi sormayacak.

Windows credentials ile baktığınızda "Generic Credentials" kısmında github şifrenizin depolandığını göreceksiniz.

git config --list


cem.topkaya@CZC11141WZ C:\_Projeler\Cop\modules\kuark-istisna
$ git config --list
core.symlinks=false
core.autocrlf=false
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
pack.packsizelimit=2g
help.format=html
http.sslcainfo=/bin/curl-ca-bundle.crt
sendemail.smtpserver=/bin/msmtp.exe
diff.astextplain.textconv=astextplain
rebase.autosquash=true
user.name=cemtopkaya
user.email=cem.topkaya@hotmail.com
gui.recentrepo=C:/Users/cem.topkaya/Documents/Visual Studio 2013/Projects/ConsoleApplication8/CSharp_Orneklerim_Git
credential.helper=wincred
http.postbuffer=524288000
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
remote.origin.url=https://github.com/cemtopkaya/repo-adi.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

cem.topkaya@CZC11141WZ C:\_Projeler\Cop\modules\kuark-istisna

git config --global push.default matching

Daha sade bir çıktı almak istersek kullanacağız. Yani, normalde $ git push aşağıdaki çıtıyı veriyorken:
$ git config --global push.default matching
Komutunu çalıştırarak sadece şu çıktıyı alıyoruz:

Bu çıktıyı şu config listelerindeki değişimlerde görelim:


24 Nisan 2015 Cuma

nodemon.json vs npm run


Nodemon ayarlarını isterseniz bir config dosyasında tutabilirsiniz.
nodemon.json
{
  "verbose": true,
  "ignore": [
    "e2e-tests/*",
    "node_modules/*"
  ],
  "watch": ["node/routes/*.js"],
  "script": "node/bin/www"
}

ya da package.json içinde scripts içinde özel bir anahtarda tutabilirsiniz:
package.json
{
  "name": "angular-seed",
  "private": true,
  "version": "0.0.0",
  "description": "A starter project for AngularJS",
  "repository": "https://github.com/angular/angular-seed",
  "license": "MIT",
  "devDependencies": {
    "bower": "^1.3.1",
    "debug": "~2.0.0",
    "http-server": "^0.6.1",
    "karma": "~0.10",
    "karma-junit-reporter": "^0.2.2",
    "matchdep": "^0.3.0",
    "mocha": "^2.2.4",
    "protractor": "^1.1.1",
    "shelljs": "^0.2.6"
  },
  "dependencies": {
    "acl": "^0.4.7",
    "activedirectory": "^0.6.3",
    "body-parser": "~1.8.1",
    "cheerio": "^0.19.0",
    "compression": "1.1.1",
    "connect-busboy": "0.0.2",
    "connect-redis": "^2.2.0",
    "consolidate": "^0.12.1",
    "cookie-parser": "~1.3.3",
    "ejs": "^2.3.1",
    "emailjs": "^0.3.13",
    "express": "~4.9.0",
    "express-session": "1.8.2",
    "iconv-lite": "0.4.6",
    "jade": "~1.6.0",
    "jquery": "^1.8.3",
    "jsdom": "^4.1.0",
    "moment": "2.8.3",
    "morgan": "~1.3.0",
    "node-xlsx": "^0.5.1",
    "path": "0.4.9",
    "q": "1.0.1",
    "redis": "0.12.1",
    "request": "2.44.0",
    "serve-favicon": "~2.1.3",
    "socket.io": "^1.3.4",
    "underscore": "1.7.0",
    "winston": "^0.9.0",
    "winston-redis": "^0.3.0"
  },
  "scripts": {
    "start": "node ./node/www",
    "debug": "nodemon node/www -V -w './node/routes/**/*.js' -i './e2e-tests/*' -i './node_modules/*'",
    "test": "./node_modules/.bin/mocha"
  }
}

Normalde test, start gibi tanımlarınızı npm test, npm start ile çalıştırabilirken özel tanımladıklarınızı (burada debug oluyor) npm run debug ile çalıştırabilirsiniz.
Konsolde eğer nodemon'u doğrudan çalıştırırsanız nodemon.json dosyasının içindekini okuyarak çalıştırmış olacağınızı hatırlatmaya gerek yok:
C:\_Projeler\AdminLTE\trunk>nodemon
24 Apr 15:32:03 - [nodemon] v1.3.6
24 Apr 15:32:03 - [nodemon] reading config C:\_Projeler\AdminLTE\trunk\nodemon.json
24 Apr 15:32:03 - [nodemon] to restart at any time, enter `rs`
24 Apr 15:32:03 - [nodemon] ignoring: e2e-tests/**/* node_modules/**/*
24 Apr 15:32:03 - [nodemon] watching: node/routes/*.js
24 Apr 15:32:03 - [nodemon] watching extensions: js
24 Apr 15:32:03 - [nodemon] starting `node index.js`
24 Apr 15:32:03 - [nodemon] child pid: 13100
24 Apr 15:32:03 - [nodemon] watching 0 files

22 Nisan 2015 Çarşamba

Node.js'de namespace yapısı oluşturma

Modül yapısında
index.js başlangıç noktamız ve içerisine 1 ve 3 numaralı dosyaları require ile alması için gereken kodu yazıyoruz. Biliyoruzki 1 ve 3 gelecek ama 1'in içinde 2 numaralı dosyamızı çektiğimizde gelecek mi ve akış sırası nasıl olacak ona bakacağız.
var db1 = require('./db1'),
    db3 = require('./db3');

console.log("index içinde");
module.exports = {index:'index', db1:db1, db3:db3};

db1.js dosyamız içinden db2 yi çekelim:
var db2 = require('./db2');
console.log("db1 içinde");
module.exports = {db:1,db2:db2};

ve db2 içinde sadece ekrana yazdıralım burada olduğunu
console.log("db2 içinde");
module.exports = {db:2};

db3 ise db2 ile aynı işi yapsın
console.log("db3 içinde");
module.exports = {db:3};

çıktımız:
C:\Users\cem.topkaya\WebstormProjects\angTest\server>node
> var i = require('./db')
db2 içinde
db1 içinde
db3 içinde
index içinde
undefined
> i
{ index: 'index',
  db1: { db: 1, db2: { db: 2 } },
  db3: { db: 3 } }
>
Akışa bakalım. Önce index.js içinde ama ilk satır require(./db1) o yüzden db1.js içine gidiyor. Orada ilk satır require(./db2) olduğu için db2.js e gidiyor ve console.log ile "db2 içinde" yazıyor ve db1.js den devam ediyor "db1 içinde" yazıyor ve index.js içindeki reuqire(db3) çağrılıyor ve "db3 içinde" yazısından sonra tekrar index.js ten devam ederek "index içinde" yazıp sönen sonucu i ye atıyor.


21 Nisan 2015 Salı

Javascript Singleton Pattern


function Single(){
  if(Single.caller !== Single.getInstance){
     throw new Error("new ile çalıştırılamaz");
  }

  this.dt = new Date();
}

Single.getInstance = function() {
  // Single sınıfına ait instance static özelliği yaratılmadan önce
  console.dir(this);
debugger;
  if(this.instance === undefined){
    // this tanımı doğrudan sınıfı yani Single fonksiyonunu işaret edecektir
    this.instance = new Single();
  
    // Single sınıfının instance static özelliği yaratıldı
    // Ve bundan sonra bir daha yaratılmayıp sınıfa bağlı instance nesnesi gönderilecek
    console.dir(this);
  }
  return this.instance
}

// Single sınıfının static fonksiyonu olan getInstance üstünden tekil nesne çağırılır
a = Single.getInstance();

// new Anahtarıyla Single sınıfından bir nesne tanımlanamaz
a = new Single();

Peki node.js içinde nasıl olurdu? Unutmamalı ki require ile çağırdığımız tüm js dosyaları memorye bir kez yüklenir ve her require ile çağrıldığında artık file i/o yapmak yerine bellekten getirilir. Ve biz objemizi bir kez module.exports içine koydukmu bir daha yaratmak durumunda olmayız. Yukarıdaki kodu single.js olarak sakladığımızı düşünelim.
single.js
module.exports = Single.getInstance()
çağırdığımız dosya.js olsun:
module.exports = require('./single.js')

7 Nisan 2015 Salı

Grunt, Mocha, Assert ve Should ile temel node.js uygulaması adımları

Grunt

Otomasyon için kullanacağız

Grunt temel taşımız
...:\> npm install -save-dev grunt

Hata olmaya müsait kodlarımız için erken uyarı sistemi:
...:\> npm install -save-dev grunt-contrib-jshint

Sürekli sistemi çalıştırmak yerine aktif olarak değişen dosyaları görünce çalıştırsın diye(bir nevi nodemon)
...:\> npm install -save-dev grunt-contrib-watch

Gruntfile.js ile otomasyon ayarlarımızı yapacağız.
module.exports = function(grunt){


    grunt.initConfig({
       // jshint: hangi klasör(/test/), alt klasörlerin hepsi(/**/) ve adı ne olursa olsun hangi dosya türlerinde(/*js) 
       //         olası sorunları inceleyecek
        jshint:{
            files:['test/**/*js']
        },
       // watch: hangi klasör(/test/), alt klasörlerin hepsi(/**/) ve adı ne olursa olsun hangi dosya türlerinin(/*js) 
       //        değişimlerinde otomasyon tekrar başlatarak hangi görevleri çalıştıracak
        watch:{
            files:['test/**/*js'],
            tasks:['jshint']
        }
    });

    grunt.loadNpmTasks("grunt-contrib-jshint");
    grunt.loadNpmTasks("grunt-contrib-watch");

}

JSDOC 3.3.0 beta

Eğer javascript dosyalarınızın belgelendirmesini istiyorsanız ve bunu jsdoc3 3.3.0 beta ile yapacaksınız ya kodlarınızın bulunduğu üst klasörlerin isimleri alt çizgi ile başlamayacak ya da node_modules/grunt-jsdoc/conf.json.EXAMPLE dosyasından aynı klasöre conf.json olarak oluşturup içindeki excludePattern'den _ çizgiyi kaldırmak için boşaltacaksınız excludePattern:"".
Sürekli aldığım sonuç aşağıdaki gibiydi:
C:\_Projeler\AdminLTE\trunk\node\batch>grunt jsdoc
Running "jsdoc:dist" (jsdoc) task
Documentation generated to C:\_Projeler\AdminLTE\trunk\doc
Done, without errors.
Ama bir türlü çıktı üretmiyordu. Bunu çözmek için C:\_Projeler\AdminLTE\trunk\node_modules\grunt-jsdoc\node_modules\jsdoc\conf.json.EXAMPLE adresindeki dosyanın bir kopyasını jsdoc_conf.json olarak Gruntfile.js ile aynı dizine kaydettim.

jsdoc_conf.json
{
  "tags": {
    "allowUnknownTags": true
  },
  "source": {
    "includePattern": ".+\\.js(doc)?$"
  },
  "plugins": [],
  "templates": {
    "cleverLinks": false,
    "monospaceLinks": false,
    "default": {
      "outputSourceFiles": true
    }
  }
}

ve gruntfile içinede şu taskı tanımladım:
module.exports = function (grunt) {
    grunt.initConfig({
        jsdoc: {
            dist: {
                src: ['jsdoc_test/*.js'],
                options: {
                    destination: 'doc',
                    configure : "jsdoc_conf.json"
                }
            }
        },.....

ve konsoldan grunt jsdoc dediğimde çalışmıştı. Underscore için tedirgin olmama gerek yok çünkü sunucu dizini içindeki dosylarımın ya da istemcideki kendi kodlarımın(bower'ın değil) js belgelendirmesini yapacağım.

MOCHA

Test için kullanacağımız çatı. İçerisinde SHOULD ve ASSERT kullanacağız.
Kurulmaları için yapmamız gereken:

Birim testleri yazmak için
...:\> npm install -save-dev assert

Davranışsal testler yazmak için
...:\> npm install -save-dev should

Bu testleri çalıştırıp bize rapor üretmesini sağlamak için
...:\> npm install -save-dev mocha

Mocha varsayılan olarak test klasöründeki js dosyalarını çalıştıracağından test klasörü içinde test dosyalarımızı tutacağız

Test edilecek dosyamız sanki DB'de Kullanıcı işmizi yaptığımız Kullanici.js dosyamız olsun.
Önce models/Kullanici.js:
// BDD yazmıyoruz bu kodun içinde. Basit Unit Test ler yazdık.
var assert = require("assert");

var Kullanici = function (args) {

    assert.ok(args.eposta && args.sifre, "EPosta ve Şifre boş bırakılamaz");

    var f_getKullanici = function (_eposta, _sifre) {
        return {
            id:1,
            adiSoyadi: 'Cem Topkaya',
            meslegi: 'Yüksek Uzay Müh.'
        }
    };

    var f_getSonGirisTarihi = function (_kullaniciId) {
        assert.ok(_kullaniciId, "Kullanıcı ID boş olamaz");
        return new Date('2015-04-07 21:51');
    };

    var temelBilgiler = f_getKullanici(args.eposta, args.sifre);

    // Dikkat! Revealing module patternini kullanıyoruz
    return {
        eposta: args.eposta,
        temelBilgiler: temelBilgiler,
        sonGirisTarihi: f_getSonGirisTarihi(temelBilgiler.id)
    }
};

module.exports = Kullanici;


Önce models/DB.js:
var Kullanici = require('./Kullanici');
var DB = {
    Kullanici:Kullanici
};

// Bir namespace gibi hazırlıyoruz.
module.exports = DB;

Test kodumuz nasıl peki:
var assert = require("assert"),
    should = require('should'),
    DB = require('./../models/DB.js');

describe("Sisteme Giriş", function () {

    describe("Kullanıcı Girişi", function () {

        // Aşağıdaki testler erişebilsin diye burada tanımlı
        var girisYapanKullanici = {};

        before(function () {
            // User modelimiz çalışıyorsa nesne yaratacaktır.
            girisYapanKullanici = new DB.Kullanici({eposta:'cem@cem.net', sifre:'test12test'})
        });



        it("kullanıcı temel bilgileri tanımlı", function () {
            girisYapanKullanici.temelBilgiler.should.be.defined;
        });

        it("şifre tanımlı");

        it("şifre 6 karakterden az değil");


    });

    describe("Kullanıcı Kayıdı", function () {

        // Aşağıdaki testler erişebilsin diye burada tanımlı
        var kayitBilgileri = {};

        before(function () {
            // Başlangıçta tanımlanacak bilgiler
            kayitBilgileri = {eposta:'cemEtCem.Net',sifre:'testSifresiRakamYok'};
        });

        it('Eposta tanımlı', function () {
            kayitBilgileri.eposta.should.be.defined;
        });

        it('Eposta doğru girilmiş', function () {
            assert.notEqual(kayitBilgileri.eposta.indexOf('@'),-1,'eposta @ karakteri içermiyor');
        });
        
        it('Şifre en az 6 karakter', function () {
            assert.ok(kayitBilgileri.sifre.length >= 6, 'Şifre en az 6 karakter olmalı!');
        });
    });
});

Konsol üstünden hızlıca çalıştırmak için mocha yı globale yükleyebilirsiniz ya da package.json içinde scripts/test özelliğini aşağıdaki gibi doldurabilirsiniz:
{
    "name": "jsPattern",
    "version": "0.0.0",
    "private": true,
    "scripts": {
        "test": "./node_modules/.bin/mocha --reporter spec",
        "start": "node ./bin/www"
    },
    "dependencies": {
        "body-parser": "~1.12.0",
        "cookie-parser": "~1.3.4",
        "debug": "~2.1.1",
        "express": "~4.12.2",
        "jade": "~1.9.2",
        "morgan": "~1.5.1",
        "serve-favicon": "~2.2.0"
    },
    "devDependencies": {
        "grunt": "^0.6.1",
        "grunt-contrib-jshint": "^0.6.1",
        "grunt-contrib-watch": "^0.6.1",
        "mocha": "^2.2.1",
        "should": "^5.2.0"
    }
}

Artık ...:\>npm test komutunu çalıştırdığımızda sonucumuz şöyle olacaktır:

Sanırım sonucu okumaya gerek yok. Yeşiller geçti kırmızılar kaldı.

Ekran görüntüleri:

9 Mart 2015 Pazartesi

JSON validator

Çok başarılı bir doğrulayıcı. Örneğim olsun deyyu ekliyorum:

https://github.com/mafintosh/is-my-json-valid
var trueString = {
    required: true,
    type: 'string'
},
falseString = {
    required: false,
    type: 'string'
},
trueBoolean = {
    "type": "boolean",
    required: true
},
falseBoolean = {
    type: 'boolean',
    required: true
},
trueNumber = {
    type: 'number',
    required: true
},
trueInteger = {
    type: 'integer',
    required: true
};

var boardSchema = {
    required: true,
    type: 'object',
    properties: {
        name: trueString,
        id: {
          type: 'integer',
          format: 'sadeceSifir'
      }
    }
},
 digerBoardSchema = {
    required: true,
    type: 'object',
    properties: {
        name: trueString,
        id: {
          type: 'integer',
          format: 'sadeceSifir'
      }
    }
}

var validate = validator(
                         { $ref: '#digeri' }, 
                         { 
                           schemas: { board: boardSchema, digeri: digerBoardSchema  }, 
                           formats: { sadeceSifir:/^0$/, sadece1:/^1$/ }
                         }
                        )


console.log(validate({ name: 'New board', id: 0 }));

Diğer örnek:
var validator = isMyJsonValid


var boardSchema = {
    required: true,
    type: 'object',
    properties: {
        name: {
            required: true,
            type: 'string'
        },
        id: {
            type: 'integer',
            format: 'sadece1'
        },
        columns: {
            type: 'array'
        },
        roles: {
            type: 'array'
        },
        users: {
            type: 'object',
            required: true,
            properties: {
                invitees: {
                    type: 'array'
                },
                members: {
                    type: 'array'
                }
            }
        },

    }
};

var schemaFormats = {
    schemas: {
        board: boardSchema
    },
    formats: {
        sadeceSifir: /^0$/,
        sadece1: /^1$/,
            'date-time': /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}[tT ]\d{2}:\d{2}:\d{2}(\.\d+)?([zZ]|[+-]\d{2}:\d{2})$/,
        date: /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}$/
    }
}

var validate = validator({
    $ref: '#board'
}, schemaFormats)


console.log(validate({
    name: 'New board',
    id: 1,
    users:{invitees1:[], members:[]}
}));


Node.js içinde kullanmak için yazdım
var validator = require('is-my-json-valid');


function f_validate(_obj, _schemaName) {
    var schema_member = {

        },
        schema_users = {
            type: 'object',
            required: true,
            properties: {
                invitees: {
                    type: 'array'
                },
                members: {
                    type: 'array'
                }
            }
        },
        schema_board = {
            required: true,
            type: 'object',
            properties: {
                name: {
                    required: true,
                    type: 'string'
                },
                id: {
                    type: 'integer',
                    format: 'sadece1'
                },
                columns: {
                    type: 'array'
                },
                roles: {
                    type: 'array'
                },
                users: schema_users
            }
        };

    var schemaFormats = {
        schemas: {
            board: schema_board,
            users: schema_users,
            member: schema_member
        },
        formats: {
            sadeceSifir: /^0$/,
            sadece1: /^1$/,
            'date-time': /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}[tT ]\d{2}:\d{2}:\d{2}(\.\d+)?([zZ]|[+-]\d{2}:\d{2})$/,
            date: /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}$/
        }
    }

    var validate = validator({$ref: '#' + _schemaName}, schemaFormats);

    var result = validate(_obj);
    console.log(validate.errors);

    return result;
}


module.exports = f_validate;

Bu daha iyisi:
var validator = require('is-my-json-valid');
var schema_member = {

    },
    schema_users = {
        type: 'object',
        required: true,
        properties: {
            invitees: {
                type: 'array'
            },
            members: {
                type: 'array'
            }
        }
    },
    schema_board = {
        required: true,
        type: 'object',
        properties: {
            name: {
                required: true,
                type: 'string'
            },
            id: {
                type: 'integer',
                format: 'sadece1'
            },
            columns: {
                type: 'array'
            },
            roles: {
                type: 'array'
            },
            users: schema_users
        }
    },
    schemaFormats = {
        schemas: {
            board: schema_board,
            users: schema_users,
            member: schema_member
        },
        formats: {
            sadeceSifir: /^0$/,
            sadece1: /^1$/,
            'date-time': /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}[tT ]\d{2}:\d{2}:\d{2}(\.\d+)?([zZ]|[+-]\d{2}:\d{2})$/,
            date: /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}$/
        }
    }


function f_filterAndValidate(_obj, _schemaName) {
    this.schemaName = _schemaName;
    this.obj = _obj;

    this.f_filter = function () {
        var filter = validator.filter({$ref: '#' + this.schemaName}, schemaFormats)
        return filter(this.obj);

    };

    this.f_validate = function (_filtered_object) {

        var validate = validator({$ref: '#' + this.schemaName}, schemaFormats);

        var result = validate(_filtered_object);
        console.log(validate.errors);

        return result;
    };

    return this.f_validate(this.f_filter())
}


module.exports = {
    schemas_board: 'board',
    schemas_users: 'users',
    'f_filterAndValidate': f_filterAndValidate
};

23 Şubat 2015 Pazartesi

Dikkat etmeniz gereken esas noktalar:

En başta istemci bacağında nasıl bir js dosyası çalışacak:
$(document).ready(function () {

// connect to the socket server
    var socket = io.connect();

// if we get an "info" emit from the socket server then console.log the data we recive
    socket.on('info', function (data) {
        console.log("info client tarafı");
        console.log(data);
    });
});

app.js içindeki kritik nokta:
/* SESSION Ayarları */
var session = require('express-session');
var RedisStore = require('connect-redis')(session); // Redis'te tutacağız
var sessionMiddleware = session({
    resave: true,
    saveUninitialized: true,
    store: new RedisStore({host: '127.0.0.1', port: 6379}),
    key: 'session_id_tutan_anahtar_kelimemiz',
    secret: 'sir_dolu_sozcugumuz_sifrelesin_deyyu'
});
app.use(sessionMiddleware); // express session ayarlarımızı kullansın

bin/www dosyasındaki esas nokta socket oluşturma ve socket içindeki session bilgilerine erişmek:
/* SOCKET */
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var sessionMiddleware = session({ resave: true, saveUninitialized: true, store: new RedisStore({host: '127.0.0.1', port: 6379}), key: 'express.sid', secret: 'secret' });

var arrSessions = [];
var sio = require('socket.io').listen(server);
sio.use(function(socket, next) {
    sessionMiddleware(socket.request, socket.request.res, next);
});

sio.sockets.on('connection', function (socket) {
    console.log("-------------Session ID: "+socket.request.sessionID);
    console.log('A new user connected!');
    arrSessions.push(socket.request.sessionID);
    console.log(arrSessions);
    socket.emit('info', { msg: 'The world is round, there is no up or down.' });
});

Ekran Çıktıları


Tüm Kod

app.js dosyası:
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var io = require('socket.io');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());

/* SESSION Ayarları */
var session = require('express-session');
var RedisStore = require('connect-redis')(session); // Redis'te tutacağız
var sessionMiddleware = session({
    resave: true,
    saveUninitialized: true,
    store: new RedisStore({host: '127.0.0.1', port: 6379}),
    key: 'session_id_tutan_anahtar_kelimemiz',
    secret: 'sir_dolu_sozcugumuz_sifrelesin_deyyu'
});
app.use(sessionMiddleware); // express session ayarlarımızı kullansın

/* GET home page. */

app.use('/', express.Router().get('/', function(req, res, next) {
    req.session.deneme = '^cem$';
  res.render('index', { title: 'Express', sid:req.sessionID });
}));

// catch 404 and forward to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

module.exports = app;

bin/www dosyasının içeriği
#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('redis_pub_sub:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
    var port = parseInt(val, 10);

    if (isNaN(port)) {
        // named pipe
        return val;
    }

    if (port >= 0) {
        // port number
        return port;
    }

    return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
    if (error.syscall !== 'listen') {
        throw error;
    }

    var bind = typeof port === 'string'
        ? 'Pipe ' + port
        : 'Port ' + port

    // handle specific listen errors with friendly messages
    switch (error.code) {
        case 'EACCES':
            console.error(bind + ' requires elevated privileges');
            process.exit(1);
            break;
        case 'EADDRINUSE':
            console.error(bind + ' is already in use');
            process.exit(1);
            break;
        default:
            throw error;
    }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
    var addr = server.address();
    var bind = typeof addr === 'string'
        ? 'pipe ' + addr
        : 'port ' + addr.port;
    debug('Listening on ' + bind);
}


/* SOCKET */
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var sessionMiddleware = session({ resave: true, saveUninitialized: true, store: new RedisStore({host: '127.0.0.1', port: 6379}), key: 'express.sid', secret: 'secret' });

var arrSessions = [];
var sio = require('socket.io').listen(server);
sio.use(function(socket, next) {
    sessionMiddleware(socket.request, socket.request.res, next);
});

sio.sockets.on('connection', function (socket) {
    console.log("-------------Session ID: "+socket.request.sessionID);
    console.log('A new user connected!');
    arrSessions.push(socket.request.sessionID);
    console.log(arrSessions);
    socket.emit('info', { msg: 'The world is round, there is no up or down.' });
});

//for testing, we're just going to send data to the client every second
setInterval(function (socket) {

    /*
     our message we want to send to the client: in this case it's just a random
     number that we generate on the server
     */
    var msg = Math.random();
    sio.emit('info', msg);
    console.log(msg);

}, 10000);

Kaynaklar:
  1. http://danielnill.com/nodejs-tutorial-with-socketio/
  2. https://devcenter.heroku.com/articles/node-websockets
  3. https://github.com/rajaraodv/redispubsub

19 Şubat 2015 Perşembe

Node.js loglarınızı winston-redis ile Redis db de tutma

Kod içinde winston nasıl log seviyesini belirliyor ve redis tarafında nasıl tutuyoru görebilirsiniz:
var winston = require('winston'),
    winstonRedis = require('winston-redis').Redis;

// console'da sadece hepsi tutuluyor olacak çünkü info log seviyesinden sonra diğer tüm log seviyeleri sıralanmış
var transportConsole = new winston.transports.Console({ json: false, timestamp: true, prettyPrint:true, colorize: true, level:'info' }),
// File'da sadece i ve db tutuluyor olacak çünkü i den sonra db log seviyesi sıralanmış
    transportFileDebug = new winston.transports.File({ filename: __dirname + '/debug.log', json: true }),
    transportFileException = new winston.transports.File({ filename: __dirname + '/exceptions.log', json: false }),
    // rediste sadece db tutuluyor olacak çünkü db den sonra bir log seviyesi yok
    transportRedis = new (winstonRedis)({host: '127.0.0.1', port: 6379, level:'db'});


var logger = new (winston.Logger)({
    levels: {
        info: 0,
        warn: 1,
        error: 2,
        verbose: 3,
        i: 4,
        db: 5
    },
    transports: [
        transportConsole,
        transportFileDebug,
        transportRedis
    ],
    exceptionHandlers: [
        transportConsole,
        transportFileException
    ],
    exitOnError: false
});

winston.addColors({
    info: 'green',
    warn: 'cyan',
    error: 'red',
    verbose: 'blue',
    i: 'gray',
    db: 'magenta'
});

logger.i('iiiii foobar level-ed message');
logger.db('dbbbbb foobar level-ed message');
logger.info('infoo foobar level-ed message');
logger.warn('warnnnn foobar level-ed message');
logger.error('errroor foobar level-ed message');

module.exports = logger;

Node.js kodunuzu winston.js ile konsol çıktılarınızda renklendirme

colorize: true ile renklendirme oluyor. Ama renklendirmede kullanılacak renk sayısı çok değil Marak/color.js:
  • black
  • red
  • green
  • yellow
  • blue
  • magenta
  • cyan
  • white
  • gray
  • grey

var winston = require('winston');

var transportConsole = new winston.transports.Console({ json: false, timestamp: true, prettyPrint:true, colorize: true });

var logger = new (winston.Logger)({
    levels: {
        info: 0,
        warn: 1,
        error: 2,
        verbose: 3,
        i: 4,
        db: 5
    },
    transports: [ transportConsole ]
});

winston.addColors({
    info: 'green',
    warn: 'cyan',
    error: 'red',
    verbose: 'blue',
    i: 'gray',
    db: 'magenta'
});

logger.i('iiiii foobar level-ed message');
logger.db('dbbbbb foobar level-ed message');
logger.info('infoo foobar level-ed message');
logger.warn('warnnnn foobar level-ed message');
logger.error('errroor foobar level-ed message');

module.exports = logger;

Ekran görüntüsü:

21 Ocak 2015 Çarşamba

Centos üzerine NodeJs

İndirelim
curl -sL https://rpm.nodesource.com/setup | bash -
Yükleyelim
yum install -y nodejs
Versiyonumuz kaçmış?
[root@localhost Downloads]# node -v
v0.10.35
[root@localhost Downloads]# 

Ref: https://github.com/joyent/node/wiki/installing-node.js-via-package-manager

Uygulamamıza geçmeden önce uygulamamıza özel bir kullanıcı tanımlayalım ki sisteme erişim yetkileri verebilelim:




Ref: https://www.digitalocean.com/community/tutorials/how-to-deploy-node-js-applications-using-systemd-and-nginx

17 Aralık 2014 Çarşamba

NODE_ENV nasıl bir şey?

Aşağıdaki yazıyı kavrayışınızı derinleştirmeniz için derinlemesine yazıyorum. Umarım yüksek anlayış seviyesine varmanızda faydası olur ;)

Node uygulamanızın test mi production mı, development mu olduğunu ve ona göre çalıştırılmasına karar verdiğiniz noktada sizin de benim gibi process.env.NODE_ENV değerine atama yapmanız gerekecek.
Ama önce process.env ne getiriyor ve anlamı ne?
C:\temp\nodeapp>node app.js
process.env = {"ALLUSERSPROFILE":"C:\\ProgramData","APPDATA":"C:\\Users\\cem\\AppData\\Roaming","CommonProgramFiles":"C:\\Program Files\\Common Files","CommonProgramFiles(x86)":"C:\\Program Files (x86)\\Common Files","CommonProgramW6432":"C:\\Program Files\\Common Files","COMPUTERNAME":"G6YE305003NG","ComSpec":"C:\\Windows\\system32\\cmd.exe","ConEmuANSI":"ON","ConEmuAnsiLog":"","ConEmuArgs":"","ConEmuBackHWND":"0x000A098A","ConEmuBaseDir":"C:\\_Portables\\ConEmu\\ConEmu","ConEmuBuild":"141208","ConEmuConfig":"","ConEmuDir":"C:\\_Portables\\ConEmu","ConEmuDrawHWND":"0x00040A1E","ConEmuDrive":"C:","ConEmuHooks":"Enabled","ConEmuHWND":"0x00080978","ConEmuPID":"4228","ConEmuServerPID":"4600","ConEmuWorkDir":"C:\\Users\\cem","ConEmuWorkDrive":"C:","FP_NO_HOST_CHECK":"NO","HOMEDRIVE":"C:","HOMEPATH":"\\Users\\cem","LOCALAPPDATA":"C:\\Users\\cem\\AppData\\Local","LOGONSERVER":"\\\\G6YE305003NG","NUMBER_OF_PROCESSORS":"4","OS":"Windows_NT","Path":"C:\\_Portables\\ConEmu\\ConEmu;C:\\Program Files\\Common Files\\Microsoft Shared\\Windows Live;C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\Windows Live;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\OpenCL SDK\\3.0\\bin\\x86;C:\\Program Files (x86)\\Intel\\OpenCL SDK\\3.0\\bin\\x64;C:\\Program Files (x86)\\Windows Kits\\8.1\\Windows Performance Toolkit\\;C:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn\\;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;c:\\_Portables\\mysql-5.6.15-winx64\\bin;C:\\Program Files (x86)\\MySQL\\MySQL Utilities 1.3.6\\;C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin;C:\\Program Files\\TortoiseSVN\\bin;C:\\Program Files (x86)\\Microsoft SDKs\\TypeScript\\1.0\\;C:\\xampp\\php;C:\\ProgramData\\ComposerSetup\\bin;C:\\Program Files (x86)\\Windows Live\\Shared;C:\\Program Files (x86)\\Git\\cmd;C:\\_Portables\\ConEmu;C:\\Program Files\\nodejs\\;C:\\Users\\cem\\AppData\\Roaming\\npm","PATHEXT":".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC","PROCESSOR_ARCHITECTURE":"AMD64","PROCESSOR_IDENTIFIER":"Intel64 Family 6 Model 58 Stepping 9, GenuineIntel","PROCESSOR_LEVEL":"6","PROCESSOR_REVISION":"3a09","ProgramData":"C:\\ProgramData","ProgramFiles":"C:\\Program Files","ProgramFiles(x86)":"C:\\Program Files (x86)","ProgramW6432":"C:\\Program Files","PROMPT":"$P$G","PSModulePath":"C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\","PUBLIC":"C:\\Users\\Public","SESSIONNAME":"Console","SystemDrive":"C:","SystemRoot":"C:\\Windows","TEMP":"C:\\Users\\cem\\AppData\\Local\\Temp","TMP":"C:\\Users\\cem\\AppData\\Local\\Temp","USERDOMAIN":"G6YE305003NG","USERNAME":"cem","USERPROFILE":"C:\\Users\\cem","VS110COMNTOOLS":"C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Common7\\Tools\\","VS120COMNTOOLS":"C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\Tools\\","windir":"C:\\Windows","windows_tracing_flags":"3","windows_tracing_logfile":"C:\\BVTBin\\Tests\\installpackage\\csilogfile.log"}

Hangi işletim sistemini kullanırsanız kullanın, sistem üzerinde kaynaklara erişim için ortam değişkenleri kullanılır. Bu değişkenler hem kullnıcıya hem sisteme göre iki türde olur. Sisteme dahil olan değikenlere tüm kullanıcılar ve uygulamaları erişebilirken kullanıcıya ait olanlara ise sadece değişkeni kendisinde tanımlı kullanıcı erişebilir.
Sistem değişkenleri registry içinde burada tanımlıdır: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\


Yerel değişkenler(kullanıcı değişkenleri) ise burada: HKEY_CURRENT_USER\Environment\


Ayrıca bu değişkenlere bilgisayarım ikonuna sağ tuş ve sistem değişkenleri kısmından erişebilirsiniz:


Tüm ortam değişkenlerini bulmamızı sağlayan node scriptini bir dosyaya yazın ve c:\>node dosyaAdi.js diyerek çalıştırın:
console.log('process.env = ' + JSON.stringify(process.env));

Sonucu json formattırladığımızda değerleri açık seçik göreceksiniz:
{
  "ALLUSERSPROFILE": "C:\\ProgramData",
  "APPDATA": "C:\\Users\\cem\\AppData\\Roaming",
  "CommonProgramFiles": "C:\\Program Files\\Common Files",
  "CommonProgramFiles(x86)": "C:\\Program Files (x86)\\Common Files",
  "CommonProgramW6432": "C:\\Program Files\\Common Files",
  "COMPUTERNAME": "G6YE305003NG",
  "ComSpec": "C:\\Windows\\system32\\cmd.exe",
  "ConEmuANSI": "ON",
  "ConEmuAnsiLog": "",
  "ConEmuArgs": "",
  "ConEmuBackHWND": "0x000A098A",
  "ConEmuBaseDir": "C:\\_Portables\\ConEmu\\ConEmu",
  "ConEmuBuild": "141208",
  "ConEmuConfig": "",
  "ConEmuDir": "C:\\_Portables\\ConEmu",
  "ConEmuDrawHWND": "0x00040A1E",
  "ConEmuDrive": "C:",
  "ConEmuHooks": "Enabled",
  "ConEmuHWND": "0x00080978",
  "ConEmuPID": "4228",
  "ConEmuServerPID": "4600",
  "ConEmuWorkDir": "C:\\Users\\cem",
  "ConEmuWorkDrive": "C:",
  "FP_NO_HOST_CHECK": "NO",
  "HOMEDRIVE": "C:",
  "HOMEPATH": "\\Users\\cem",
  "LOCALAPPDATA": "C:\\Users\\cem\\AppData\\Local",
  "LOGONSERVER": "\\\\G6YE305003NG",
  "NUMBER_OF_PROCESSORS": "4",
  "OS": "Windows_NT",
  "Path": "C:\\_Portables\\ConEmu\\ConEmu;C:\\Program Files\\Common Files\\Microsoft Shared\\Windows Live;C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\Windows Live;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\OpenCL SDK\\3.0\\bin\\x86;C:\\Program Files (x86)\\Intel\\OpenCL SDK\\3.0\\bin\\x64;C:\\Program Files (x86)\\Windows Kits\\8.1\\Windows Performance Toolkit\\;C:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn\\;C:\\Program Files\\Microsoft\\Web Platform Installer\\;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;c:\\_Portables\\mysql-5.6.15-winx64\\bin;C:\\Program Files (x86)\\MySQL\\MySQL Utilities 1.3.6\\;C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin;C:\\Program Files\\TortoiseSVN\\bin;C:\\Program Files (x86)\\Microsoft SDKs\\TypeScript\\1.0\\;C:\\xampp\\php;C:\\ProgramData\\ComposerSetup\\bin;C:\\Program Files (x86)\\Windows Live\\Shared;C:\\Program Files (x86)\\Git\\cmd;C:\\_Portables\\ConEmu;C:\\Program Files\\nodejs\\;C:\\Users\\cem\\AppData\\Roaming\\npm",
  "PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC",
  "PROCESSOR_ARCHITECTURE": "AMD64",
  "PROCESSOR_IDENTIFIER": "Intel64 Family 6 Model 58 Stepping 9, GenuineIntel",
  "PROCESSOR_LEVEL": "6",
  "PROCESSOR_REVISION": "3a09",
  "ProgramData": "C:\\ProgramData",
  "ProgramFiles": "C:\\Program Files",
  "ProgramFiles(x86)": "C:\\Program Files (x86)",
  "ProgramW6432": "C:\\Program Files",
  "PROMPT": "$P$G",
  "PSModulePath": "C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\",
  "PUBLIC": "C:\\Users\\Public",
  "SESSIONNAME": "Console",
  "SystemDrive": "C:",
  "SystemRoot": "C:\\Windows",
  "TEMP": "C:\\Users\\cem\\AppData\\Local\\Temp",
  "TMP": "C:\\Users\\cem\\AppData\\Local\\Temp",
  "USERDOMAIN": "G6YE305003NG",
  "USERNAME": "cem",
  "USERPROFILE": "C:\\Users\\cem",
  "VS110COMNTOOLS": "C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Common7\\Tools\\",
  "VS120COMNTOOLS": "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\Tools\\",
  "windir": "C:\\Windows",
  "windows_tracing_flags": "3",
  "windows_tracing_logfile": "C:\\BVTBin\\Tests\\installpackage\\csilogfile.log"
}



Bu environment variables uzun klasör adları yazmayı önlediği gibi hızlıca çalıştırmak istediğiniz uygulamalara da klasör adları eklemeden gidebilmenizi sağlar. Klasörlere ise %YOL_ADI% ile erişebilirsiniz.

Referanslar:
  1. environmentvariables.org
  2. www.computerhope.com

16 Aralık 2014 Salı

node js debug paketi ile debug etmek

Debug ile ilgili node-inspector çok iş görüyor ve hele webstorm'unuz varsa başka bir araca ihtiyacınız yok demektir ama öğrenmenin sonu yok. Bir videoda debug modülünü gördüm ve merak ettim nasıl çalışıyor diye. Aslında webstorm içinde çıktıları filitreleyebilmek isterdim ama buna debug modülü bir nebze hizmet ettiği için bilmekte fayda var.

Şöyle çalışıyormuş:
  1. Önce paketi ekleyin, var Debug = require('debug');
  2. Ekran çıktıları görünsün diye: Debug.enable('süzmek_icin_fonksiyon_icindeki_isimler_ya_da_hepsi_icin_*');
  3. sonra çıktı görmek istediğini fonksiyonların içine bir değişken tanımlayın Debug'dan var debug = Debug('fonksiyonu_filitrelemek_icin_bir_isim_yazin');
  4. çıktılarınızı görmek için için, debug('main fonksiyonu içinden!', degisken, degisken1);
var Debug = require('debug');

/* ekranda sadece app:main 
   fonksiyonuna ait çıktıları görebilmek için */
Debug.enable('app:main');

/* ekranda hem app:main hem de app:main1
   fonksiyonlarına ait çıktıları görebilmek için */
Debug.enable('app:main,app:main1');

/* ekranda tüm debug değişkeni içeren fonskiyonları 
   fonksiyonlara ait çıktıları görebilmek için      */
Debug.enable('*');

var main = function() {  
    var degisken = [
        { adi:'Cenk', soyadi:'Topkaya' },
        { adi:'Cem', soyadi:'Topkaya' }
    ];
    var degisken1 = { adi:'Cem', soyadi:'Topkaya' }
    /* debug değikeni yaratılırken 
       fonksiyonun eşsiz adını tanımlayalım ki
       tüm çalışanların içinde filitre edebilelim */
    var debug = Debug('app:main');
    debug('main fonksiyonu içinden!');
    debug('Tek bir değişken: ', degisken);
    debug('Birden fazla değişken: ', degisken, degisken1);
}

var main1 = function() {    
    var debug = Debug('app:main1');
    debug('main1 fonksiyonu içinden!');
}


main();
main1();

28 Kasım 2014 Cuma

jQuery requires a window with a document

jQuery ile dom parse etmek içinde gezerek manipüle etmek istediğimde aldığım hataydı: jQuery requires a window with a document

jsdom, cheerio kullanımı tavsiye edilse de jQuery ile çalışmak için bir yol daha var. Şimdilik çok eski diyemeyeceğim 1.8.3 NodeJs tarafında çok fazlaca işlerimi gördüğünden
C:\Projeler\Test>npm install jquery@1.8.3
ile tam sürümünü kurabilirsiniz.

$ ile şöyle çalışabilirsiniz:
var fnCalisAbi = function () {
    var options = {
        method: 'GET',
        host: '127.0.0.1', // Fiddler içinde görünsün deyyu
        port: 8888,        // Fiddlerin dinlediği porta yönlendiriyoruz
        path: 'http://bidibidi.com/tata.aspx',
        headers: {
            Host: 'bidibidi.com',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Cookie': "ASP.NET_SessionId=4etkmibuyjbg1qi3x04eouuz"
        }
    };
    var $ = require('jquery'),
        sayfa='';
    var req = http.request(options, function (res) {
        console.log('STATUS: ' + res.statusCode);
        console.log('HEADERS: ' + JSON.stringify(res.headers));

        res.setEncoding('utf8');  // sayfa cevap olarak utf8 gelecek

        res.on('data', function (chunk) {  // Tek bir pakette gelmezse ki gelmez, her parça geldiğinde
            sayfa+= chunk;                 // sayfa değişkenine ekleyelimki tüm html elimizde olsun
        });

        res.on('end', function (chunk) {   // Aktarım(response, cevap) tamamlandığında jQuery ile işleyelim
            $sayfa = $(sayfa);
            var tbl = $sayfa.find(".cssAdi").parents("table:first").find("tr").map(function() {
                return $(this).attr("style")
                    ? {
                        Cinsi:$(this).find("td:nth(1)").text(),
                        Miktari:$(this).find("td:nth(2)").text(),
                        Birim:$(this).find("td:nth(3)").text(),
                        Aciklama:$(this).find("td:nth(4)").text()
                      }
                    : null;
            }).get();
            console.log("Sonuçta oluşan dizi:");
            console.log(tbl);
        });
    });

    req.on('error', function (e) {
        console.log('problem with request: ' + e.message);
    });

    req.on('end', function (e) {

    });

    req.end();
};

25 Haziran 2014 Çarşamba

NodeJs Çalışmalarım

Önce Visual Studio ile debug yapabileceğimiz Node Tools for Visual Studio 1.0 Alpha videosunu izleyip ilgili eklentiyi indirip kuralım. Hızlıca nasıl kullanıdığına dair bilgiyi edinmek için burasını biraz okuyalım.

Geliştiriciler için doğru Chrome sürümünü de buradan indirelim.


my_module.js
// Sadece içeride kullanılır. Dışarıdan erişilemez!
function private_Hello() {
    return "World";
}

// İhraç edilecek func, içeride private metodu çağırır
function public_Hello() {
    return private_Hello();
}

// public_Hello func dışarıdan Hello ile çağrılabilir
module.exports.Hello = public_Hello;

server.js
var mymodule = require("./my_module.js");
console.log("Hello: " + mymodule.Hello());

REQUEST


GetIp_req.js
// http://nodejs.org/api/http.html#http_http_request_options_callback
var http = require('http');

function getIp(prm1, prm2, doneCallback) {
    var funcParams = [prm1, prm2];

    var options = {
        host: 'ip.jsontest.com',
        //host: 'www.google.com',
        path: '/',
        //path: '/',
        method: 'GET'
    };

    var req = http.request(options, function (res) {
        // Response içindeki STATUS ve HEADER bilgilerini görelim
        console.log('STATUS: ' + res.statusCode);
        console.log('HEADERS: ' + JSON.stringify(res.headers));

        // Tüm cevabı tutacağımız değişken
        var body = '';
        // Gelen veri akışı UTF8 türünden olacağı için başta sabitleyelim
        res.setEncoding('utf8');

        // Her parça veri geldiğinde
        res.on('data', function (chunk) {
            console.log('\n*** YENİ CHUNK veri geldi ****');
            console.log(chunk.toString());
            body += chunk.toString();
        });

        res.on('end', function () {
            console.log('\n*** Tüm veri akışı tamamlandı ****');
            console.log('GELEN VERİ: ' + body);

            // Bilgiyi isteyenin fonksiyonuna geçirelim
            doneCallback(JSON.parse(body));
        });
    });

    req.on('error', function (e) {
        console.log('problem oluştu: ' + e.message);
    });

    req.end();
}

module.exports.GetIp = getIp;

server.js
var getIp = require("./GetIp_req.js");
getIp.GetIp('parametre1', 'param2', function (ip) {
    console.log('Çıkış IP Adresim: ' + ip.ip);
});


Express içinde 4 versiyonuyla birlikte çıkartılanlar:
  1. app.configure()
  2. app.router
  3. express.createServer()
  4. res.charset

Node.Js ile API

Ben yazmaya başladım ama bir baktım pırlanta gibi anlatmış bu arkadaş.
Burada gördüğüm POSTMAN için chrome uzantısını bulunca sizinle paylaşayım dedim.