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

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:

Javascript Patterns

Javascript Pattern'ler:

Module, Revealing Module ve Prototype Pattern'in

Constructor Pattern:

Factory Pattern:

6 Nisan 2015 Pazartesi

360 derece anket soruları

Kendinize aşağıdaki soruları sorabilir ve geliştirebilirsiniz veya olduğunuz gibi kalabilirsiniz:
1 Kilit konulara ve hedeflere olan dikkatini bölünmelere rağmen korur.        
2 Hedeflerin gerçekleşmesi için kararlı şekilde hareket eder.        
3 Aksiyona geçerken ve öncesinde diğerlerinin hislerini göz önüne alır.        
4 İçtenlik ve iyimserlik yoluyla olumlu bir ortam yaratır.        
5 Gelecekle ilgili diğerlerini motive eden bir vizyon yaratır.        
6 Ek sorumluluklar vererek diğerlerine olan güvenini gösterir.        
7 "Ya…..ise…" soruları sorarak mevcut durumu ve varsayımları sorgular.        
8 Bir sorunun altta yatan nedenlerini ve sistemsel sebeplerini arar ve kavramlaştırır.        
9 Yeni fikirlerin yerleşik prosedürler ve süreçlere entegrasyonu için adımlar atar.        
10 Zor durumlarda düşünürken titizlik ve disiplin sergiler.
11 Büyük değişimlerin yaşandığı zamanlarda, görünür şekilde diğerleri için güven kaynağı oluşturur. Örneğin kilit hedef ve değerleri belirler.        
12 Kişilerin daha yüksek seviyede performansa ulaşmalarına yardımcı olmak için çeşitli yöntemler (sebep, ilham vs.) kullanır.        
13 Bakış açılarını; diyalogları olumlu yönde etkileyecek şekilde sunar ve ifade eder.        
14 İlgili bilgileri ve verileri sentezleyerek ve uygulayarak çözümleri şekillendirir.        
15 İnsanları birbirlerinin güçlü yanlarından faydalanmaları ve birlikte daha verimli çalışmaları için teşvik eder.        
16 Kısa dönemli aktivitelerin uzun dönemli stratejik hedefleri desteklediğinden emin olur.        
17 Özel dikkat gerektiren girişimleri veya projeleri ayırt eder ve hedefler.        
18 Ulaşılabilir hedefleri gerçekleştirmekle yetinmeyip, yeni hedefler koyar ve bunlara ulaşmak için çalışır.        
19 Her kişiye, onun yapısını dikkate alarak farklı davranır.        
20 Aksiliklerle karşılaşıldığında takımlara ve/veya bireylere güven verirken olgunluk gösterir.
21 Verdiği sözleri tutarak kişilerin güvenlerini ve bağlılıklarını kazanır.        
22 Kilit görevleri ve işleri delege ederek kişilere olan güvenini sergiler.        
23 Sorunlara çözüm ararken görünür olan çözümlere takılmaktansa alternatif çözümler arar.        
24 Karmaşık bir durumdaki birçok olasılığı açığa kavuşturacak fikirleri sezgisel olarak biçimlendirir.        
25 Bir projede doğru kişilerin yer aldığından emin olmak için süreçleri takip eder.        
26 Organizasyon içinde yer alan kilit kişilerle fikirleri ve varsayımları görüşerek dikkatli bir şekilde karar alır.        
27 Değişim sonucunda takımlarda ortaya çıkan aksaklıkları saptamaya ve çözümlemeye yardım eder.        
28 Diğerlerinin gelişim alanlarını yapıcı ve faydalı olacak şekilde fark etmelerine yardım eder.        
29 Fikirleri, kişilerin desteğini ve aksiyonlarını teşvik eden odaklı mesajlara dönüştürür.        
30 Zamanında karar vermek için seçenekler arasında titiz analiz verilerinden ve gerçeklerden yararlanarak ilerler.
31 Takım üyelerinin girdi sağlamalarını ısrarla ister ve katılımlarını teşvik eder.        
32 Değişimi öngörür ve fırsatlardan fayda sağlayacak ve tehditleri en aza indirecek şekilde kararlar verir.        
33 Kilit hedeflere enerjisini verirken zihnini tek bir konuya odaklar.        
34 Bir hedefe ulaşmak için olası engellerin üstesinden gelir.        
35 Duyguların ve hislerin etkilerini hesaba katar.        
36 Duygularını yapıcı bir şekilde filtreleme ve kontrol etme becerisi sergiler.        
37 Ortak çabalar için bağlılığı, kişilerin bireysel katkılarını överek ve takdir ederek güçlü bir şekilde teşvik eder.        
38 Konular veya davranışlar ile ilgili açık geri bildirim vererek diğerlerinin başarılarına bağlılık gösterir.        
39 Kutunun dışında düşünerek yeni iş fikirleri yaratma becerisi sergiler.        
40 Anahtar konular veya fırsatları ortaya çıkaran bilgiler, etkinlikler, vb. arasında bağlantılar kurar.
41 Organizasyonu, kritik ve birbirine üst seviyede bağlı olan iş süreçleri olarak algılar ve bu süreçleri göz önüne alarak hareket eder.        
42 Belirsizlik ve bilgi yığınlarını yönlendirerek fikirleri sistemli ve sistematik bir şekilde somutlaştırır.        
43 Kritik organizasyonel hedefler nedeniyle ortaya çıkan değişim ihtiyacı ile ilgili diğerlerini ikna eder.        
44 Çalışma arkadaşları, direk bağlı olunan kişilerle ilgili kritik gelişim meseleleri ve engellerini belirler ve onlarla yüzleşir.        
45 Hem bire bir hem de grup görüşmelerinde fikirlerini düzgün ve ikna edici şekilde sunar.        
46 Bir sorunun köklerini saptar; bir başka deyişle semptomları nedenlerden ayırır.        
47 Takımım ilerleyişine müdahale eden çatışmaları ve belirsizlikleri çözmek için uygun şekilde araya girer.        
48 Süreçlerin, sistemlerin ve ölçümlerin stratejik hedefleri desteklediğinden emin olur.        
49 Kısıtlı zaman ve/veya kaynaklarla karşılaştığında kilit görevlere odaklanır.        
50 İşlerin bitmesi için ne yapılması gerekiyorsa yapmak için isteklilik sergiler.
51 Kişilerin çeşitli psikolojik ve duygusal ihtiyaçlarını anlar.        
52 Aksilikleri kararlılıkla kabul ederek başarısızlıklarla başa çıkma konusunda model olur.        
53 Önemli taahhütleri yerine getirerek diğerleri için açık bir örnek teşkil eder.        
54 Diğerlerine, karar alma mekanizmalarına katılma ve sorumlulukları paylaşma gücü verir.        
55 Fikir ve kavram üretme ve/veya geliştirmede yaratıcılık gösterir.        
56 Somut olmayan verilerin, bilgilerin veya düşüncelerin daha iyi organize edilmesinde yeni ve farklı bakış açıları üretir.        
57 Organizasyon içinde süreçler geliştirerek ve aralarında bağlantılar kurarak başarılı şekilde uygulanmalarını sağlar.        
58 Bir problem için en iyi çözümü ararken mevcut alternatifleri titizlikle ve eleştirel bir tarzla analiz eder.        
59 Sürekli oluşan ve bazen çalkantılı olan değişimlere uyum sağlamak için yeni beceriler veya davranışlar öğrenir ve geliştirir.        
60 "Bunu yapamam" diyenler de dahil olmak üzere diğerlerine, güven duygusu telkin eder.        
61 Farklı paydaşların çatışan ihtiyaç ve isteklerini uzlaştırmak için ortak zemin bulur.        
62 Sorunları veya durumları daha kolay yönetilebilecek ayrı parçalara böler.        
63 Sonuçlara ulaşma ihtiyacı ile takım üyelerinin performansını ve becerilerini geliştirme fırsatlarını dengeler.        
64 Stratejik yönelimi net şekilde tanımlar ve iletir.        
65 Öncelikler listesinin en üstte yer alan %20'sine zamanının en az %80'ini ayırır.        
66 Yüksek standartlara ve performans düzeylerine ulaşabilmek için uzun dönemde dayanıklılık ve enerji sergiler.        
67 Kendi davranışlarının ve kararlarının diğer insanlar üzerindeki etkilerini göz önüne alır.        
68 Kendi duygularını tutarlı şekilde ifade ederek, katılım ve açık iletişimin gerçekleşmesini sağlar.        
69 Görünür aksiyonları ile organizasyonun paylaşılan hedeflerine ve değerlerine bağlılık konusunda örnek oluşturur.        
70 Kişilerin, kendi işleri ile ilgili sorumluluğu üzerlerine almaları ve başarılı sonuçlar üretmeleri için neye ihtiyaç duyuyorlarsa onları sağlar.
71 Gelişim ve kazanç potansiyeli olan yenilikçi kavramlar yaratır.        
72 Birbiriyle ilişkisiz gibi görünen bilgiler, olaylar vs. ile ilgili bir bütün elde etmek için sorular sorar.        
73 Kritik aksiyon adımlarını ve organizasyonel öğrenmeleri dokümante ederek süreç geliştirmek adına bağlılık gösterir.        
74 Sorunları, mantıklı ve iyi organize edilmiş bir tarzla düşünür.        
75 Değişimin uygulanmasında ortak engeller ve çareler sunabilecek kişileri belirler ve onlara yardımcı olur.        
76 Kişilere sorunları ve krizleri çözmek konusunda yardım eder.        
77 Kişilerle (iç ve dış) organizasyonun yararı için anlaşmalara varır.        
78 Umutsuz gibi görünen sorunlar da dahil olmak üzere sorunların nasıl çözülebileceğini bulur.        
79 Takım için vizyon yaratmak yerine ortak bir vizyon oluşturmak için takımla birlikte çalışır.        
80 Kapsamlı stratejileri belirli aksiyonlara ve kilometre taşlarına dönüştürür.

3 Nisan 2015 Cuma

SQL Server üstünden Web Servisine Çağrı Yapmak

USE [FEInvoice]
GO
/****** Object:  StoredProcedure [dbo].[WS_QueryOutboxInvoiceStatus]    Script Date: 04/03/2015 19:45:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[WS_QueryOutboxInvoiceStatus]
 @faturaUUID varchar(40),
 @username varchar(40)= NULL,
 @password varchar(40)= NULL,
 @invoiceStatus as Varchar(20) OUTPUT,
 @ResponseText as Varchar(8000) OUTPUT
AS
BEGIN
 SET NOCOUNT ON;

 IF(@username IS NULL OR @password IS NULL)
 BEGIN
  DECLARE @vkn VARCHAR(20),
    @gibPk VARCHAR(100);
    
  SELECT @username=UyumSoftKurumKullanicilari.kullaniciAdi, 
         @password=UyumSoftKurumKullanicilari.sifre,
         @vkn=Kurumlar.vergiNo,
         @gibPk=Kurumlar.gibPostaKutusu
    FROM UyumSoftKurumKullanicilari 
 INNER JOIN Kurumlar ON UyumSoftKurumKullanicilari.refKurum_id = Kurumlar.id 
 INNER JOIN FaturaNoOtomatik ON Kurumlar.vergiNo = FaturaNoOtomatik.vkn AND Kurumlar.gibPostaKutusu = FaturaNoOtomatik.gibPk
   WHERE (FaturaNoOtomatik.faturaUUID LIKE @faturaUUID)
  
  IF LEN(@username)=0 RAISERROR('Vergi numarası "%s", GİB Posta Kodu "%s" olan kuruma ait Uyumsoft Web Servislerini sorgulayabilecek kullanıcı bilgileri Fatura Numarası üreten veritabanında yok. Lütfen kullanıcı bilgilerinin veritabanına girilmesini sağlayınız ve tekrar deneyiniz!', 11, 1, @vkn, @gibPk)
 END

 
 BEGIN -- Sorgulamak için soap zarfını oluşturalım.
  DECLARE @Request INT
  Declare @Body as varchar(8000) = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
 <s:Header>
  <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
   <o:UsernameToken>
    <o:Username>'+@username+'</o:Username>
    <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">'+@password+'</o:Password>
   </o:UsernameToken>
  </o:Security>
 </s:Header>
 <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <QueryOutboxInvoiceStatus xmlns="http://tempuri.org/">
   <invoiceIds>
    <string>'+@faturaUUID+'</string>
   </invoiceIds>
  </QueryOutboxInvoiceStatus>
 </s:Body>
</s:Envelope>'  

  EXEC sp_OACreate 'MSXML2.ServerXMLHTTP', @Request OUT;
  EXEC sp_OAMethod @Request, 'open', NULL, 'post','https://efatura.uyumsoft.com.tr/Services/Integration', 'false'
  EXEC sp_OAMethod @Request, 'setRequestHeader', null, 'SOAPAction', 'http://tempuri.org/IIntegration/QueryOutboxInvoiceStatus'
  EXEC sp_OAMethod @Request, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
  EXEC sp_OAMethod @Request, 'send', null, @body
  
  EXEC sp_OAMethod @Request, 'responseText', @ResponseText OUTPUT
  
  -- Uyumsoft kullanıcı adı ve şifresi geçersiz. Raiseerror !
  IF (CHARINDEX('You dont have enough permission to access this system',@ResponseText) > 0) RAISERROR('Uyumsoft servislerini sorgulamak için tanımlı "%s" kullanıcı adı ve "%s" şifresi geçerli değildir. Lütfen geçerli kullanıcı adı ve şifresinin Fatura Numarası Üreten veritabanına girilmesini sağlayınız. Alınan cevap: %s',19,1, @username, @password, @ResponseText);
  -- Uyumsoftun yanıtı boş ya da cevap içeren zarf yok. Raiserror!
  IF (@ResponseText IS NULL OR CHARINDEX('Envelope', @ResponseText) = 0) RAISERROR (N'Uyumsoft QueryOutboxInvoiceStatus metodundan hata alındı. Dönen sonuç: %s', 19, 1, @ResponseText);
  
  BEGIN -- Fatura durumunu çekip VT'yi güncelleyelim
   IF CHARINDEX('<Value Status="', @ResponseText) > 0
   BEGIN
    -- Faturanın son durumu 
    DECLARE @indexStart INT
    DECLARE @indexEnd INT
    
    SET @indexStart = CHARINDEX('<Value Status="', @ResponseText)+LEN('<Value Status="')
    SET @indexEnd = CHARINDEX('" StatusCode=', @ResponseText)  
    
    SET @invoiceStatus=SUBSTRING(@ResponseText, @indexStart, @indexEnd-@indexStart)
   END
  END

  -- Request objesini sonlandırım belleği özgürleştirelim
  Exec sp_OADestroy @Request
 END
END


IsEInvoiceUser

POST https://efatura.uyumsoft.com.tr/Services/Integration HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IIntegration/IsEInvoiceUser"
Host: efatura.uyumsoft.com.tr

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
 <s:Header>
  <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
   <o:UsernameToken>
    <o:Username>xxxxx</o:Username>
    <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">xxxxx</o:Password>
   </o:UsernameToken>
  </o:Security>
 </s:Header>
 <s:Body>
  <iseinvoiceuser xmlns:ns1='http://tempuri.org/'>
   <vkntckn>xxxxx</vknTckn>
  </IsEInvoiceUser>
 </s:Body>
</s:Envelope>

1 Nisan 2015 Çarşamba

Fiddler ile WCF servisini çağırmak

WSDL'ı parça parça aşağıdan okuyalım.

Çağıracağımız fonksiyonda iki farklı tipte iki parametre var QueryInboxInvoiceStatus(InvoiceLogin _invoiceLogin, string[] _invoiceIds)
İşte fonksiyonumuzun WSDL'daki ifadesi:
<xs:element name="QueryInboxInvoiceStatus">
 <xs:complexType>
  <xs:sequence>
   <xs:element xmlns:q29="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" minOccurs="0" name="_invoiceLogin" nillable="true" type="q29:InvoiceLogin"/>
   <xs:element xmlns:q30="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="_invoiceIds" nillable="true" type="q30:ArrayOfstring"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

_invoiceIds parametremiz string tipinde bir dizi. Bunda dikkat edeceğimiz husus xml namespace bilgisinin doğru yazılması. Karmaşık bir tip(complex type) olmadığı için detayı yok ama InvoiceLogin için var:
<xs:complexType name="InvoiceLogin">
 <xs:sequence>
  <xs:element minOccurs="0" name="Password" nillable="true" type="xs:string"/>
  <xs:element minOccurs="0" name="UserName" nillable="true" type="xs:string"/>
 </xs:sequence>
</xs:complexType>
2 tane string tipinde özelliği olan bir sınıf. Şuna benziyor olsa gerek:
class InvoiceLogin
{
  public string UserName;
  public string Password;
}
Şimdi xml namespace bilgileri fiddler ile talebimizi yaparken nasıl yer alıyor:


O halde bu web servis metodunu çağırdığımak için aşağıdaki http gövdesini kullanacağız:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <QueryInboxInvoiceStatus xmlns="http://gib.fresenius.com.tr/FEFatura">
   <_invoiceLogin xmlns:a="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Password>şifremiz</a:Password>
    <a:UserName>kullanıcıAdı</a:UserName>
   </_invoiceLogin>
   <_invoiceIds  xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <b:string>353d5faf-f227-4600-8efe-3fb5ab0f1f48</b:string>
   </_invoiceIds>
  </QueryInboxInvoiceStatus>
 </s:Body>
</s:Envelope>

Bu da fiddler üstünden çağırmak için kullanacağımız http talebi ve cevabı:
POST http://localhost:53644/FEInvoice.svc HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPoxWgzmMUISZHhT9DgBmdvzAAAAAAA/+at96K6Uq35zPRjKxBIsVGn2pZnrlOgakzi+yKWdsACQAA
SOAPAction: "http://gib.fresenius.com.tr/FEFatura/IFEInvoice/QueryInboxInvoiceStatus" 
Host: localhost:53644
Content-Length: 677
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <QueryInboxInvoiceStatus xmlns="http://gib.fresenius.com.tr/FEFatura">
   <_invoiceLogin xmlns:a="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Password>şifremizBudur</a:Password>
    <a:UserName>kullaniciAdimizBuOlsun</a:UserName>
   </_invoiceLogin>
   <_invoiceIds  xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <b:string>353d5faf-f227-4600-8efe-3fb5ab0f1f48</b:string>
   </_invoiceIds>
  </QueryInboxInvoiceStatus>
 </s:Body>
</s:Envelope>

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVsZXJcRk1DLlR1cmtpeWUuV2NmLkVGYXR1cmFcdHJ1bmtcRkVJbnZvaWNlLnN2Yw==?=
X-Powered-By: ASP.NET
Date: Wed, 01 Apr 2015 10:07:45 GMT
Content-Length: 929

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <QueryInboxInvoiceStatusResponse xmlns="http://gib.fresenius.com.tr/FEFatura">
   <QueryInboxInvoiceStatusResult xmlns:a="http://schemas.datacontract.org/2004/07/FMC.Turkiye.Lib.EInvoice" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Nesne i:nil="true"/>
    <a:hasError>false</a:hasError>
    <a:invoiceResult i:nil="true"/>
    <a:islem>QueryInboxInvoiceStatus Metodu</a:islem>
    <a:istisna i:nil="true"/>
    <a:lstWsResult>
     <a:WSResult>
      <a:Nesne i:nil="true"/>
      <a:hasError>false</a:hasError>
      <a:invoiceResult i:nil="true"/>
      <a:islem>QueryInboxInvoiceStatus Metodu</a:islem>
      <a:istisna i:nil="true"/>
      <a:lstWsResult/>
      <a:sonuc i:nil="true"/>
      <a:succeedTransaction>true</a:succeedTransaction>
     </a:WSResult>
    </a:lstWsResult>
    <a:sonuc i:nil="true"/>
    <a:succeedTransaction>false</a:succeedTransaction>
   </QueryInboxInvoiceStatusResult>
  </QueryInboxInvoiceStatusResponse>
 </s:Body>
</s:Envelope>

Uyumsoft WCF Servisine Talep

Şimdi bu talebi uyumsoft'un e-fatura servislerine nasıl yapabiliriz bakalım ve bilgimizi ikinci bir örnek ile ilerletelimki anlayışımız artsın.
Önce metodumuzu wsdl içinde bulalım:
soapAction servisi çağırırken hangi metodu çağıracağı bilgisini içeriyor.

input ile metoda verilecek parametreleri, output ile çıktı olarak üreteceği sonucu görüyorsunuz.

Peki parametrenin veri tipi ne?
ArrayOfString tipi olacak.

Şimdi talebimizi yapalım:
POST https://efatura.uyumsoft.com.tr/Services/Integration HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/IIntegration/QueryInboxInvoiceStatus"
Host: efatura.uyumsoft.com.tr
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Length: 937


 
  
   
    kullaniciAdimiz
    şifremiz
   
  
 
 
  
   
    353d5faf-f227-4600-8efe-3fb5ab0f1f48
   
  
 

Ve cevabımız:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=giq1anjro5kiajmwxzar1t11; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 01 Apr 2015 11:26:03 GMT
Content-Length: 845


 
  
   
    2015-04-01T11:26:04.353Z
    2015-04-01T11:31:04.353Z
   
  
 
 
  
   
    
   
  
 

Kolay gelsin....

17 Mart 2015 Salı

Only Web services with a [ScriptService] attribute on the class definition can be called from script.

Hata aşağıdaki gibi:

Servisimizde:
<%@ WebService Language="C#" Class="NSCem.Cem" %>

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Web.Services;
using System.Xml.Serialization;

namespace NSCem
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    //[System.Web.Script.Services.ScriptService]
    public class Cem : System.Web.Services.WebService
    {
  [WebMethod]
        public string f_Hello(string _gelen)
        {
   return "Gelen: "+_gelen;
  }
    }
}

Olması gereken
...
    [System.ComponentModel.ToolboxItem(false)]
    //[System.Web.Script.Services.ScriptService]
    public class Cem : System.Web.Services.WebService
    {
...


POST /HTUS/cem.asmx/f_Hello HTTP/1.1
Host: 10.130.214.205:8082
Content-Type: application/json; charset=utf-8
Cache-Control: no-cache

{"_gelen":"cem"}

POSTMAN ile ajax talebinde bulunalım

Aşağıda chrome ile yakalanmış bir ajax talebi var:

Bu talebin aynısını POSTMAN içinde oluşturalım ama önce gereksiz ayrıntıları kaldırarak:

Şimdi Chrome'da yakaladığımız talebin detaylısını oluşturalım:
Talebin içeriğine baktığınızda JSON tipinde olduğunu görüyorsunuz. Bunu sunucuya da söylemeliyizki HTTP talebinin gövdesini ona göre parçalasın. HTTP Talebimizin JSON formatında olduğunu Content-Type: application/json, charset=UTF-8 ile belirtiyoruz.

Bu kez tüm talebimizin HTTP paketinde nasıl olduğuna bakalım. Bir başlık(header) bir de gövdemiz(body) var. Gövdeye JSON tipinde verimizi yazıyoruz. Başlıkta da bir çok bilgiyle talebimizi yapıyoruz:

form-data ve application/x-www-form-urlencoded

Özetle metin gönderiyoruz ve karşı tarafın bunu anlamasını istiyoruz. Sunucu hangi dilden konuşmak istiyorsa bizimde onun dilinden konuşmamız gerekecek.
Önce application/x-www-form-urlencoded ile gönderilen verinin nasıl göründüğüne bakalım:


Şimdide nasıl gittiğine bakalım:
POST /HTUS/HastaTahlilUyariServisi.asmx/f_HastaninLabTestleri HTTP/1.1
Host: 10.130.214.205:8082
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="_enumKanTahlilikontrolTarih"

KAYITTARIHI
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="_enumHastaKontrolKodu"

KLINIK_KODU
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="_sCliniclist"

18043
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="_dtBaslamaTarihi"

2015/01/07
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="_dtBitisTarihi"

2015/01/07
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="_sTCKimlikNO"

32963180024
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="_bGonderilmis"

true
----WebKitFormBoundaryE19zNvXGzXaLvS5C

application/x-www-form-urlencoded nasıl görünüyor:


Nasıl gittiğine bakalım:

POST /HTUS/HastaTahlilUyariServisi.asmx/f_HastaninLabTestleri HTTP/1.1
Host: 10.130.214.205:8082
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

_enumKanTahlilikontrolTarih=KAYITTARIHI&_enumHastaKontrolKodu=KLINIK_KODU&_sCliniclist=18043&_dtBaslamaTarihi=2015%2F01%2F07&_dtBitisTarihi=2015%2F01%2F07&_sTCKimlikNO=32963180024&_bGonderilmis=true

Fiddler ile web servisine çağrı yapmak

Bu yazdığımız servis:

POST http://10.130.214.205:8082/HTUS/HastaTahlilUyariServisi.asmx HTTP/1.1
HOST: 10.130.214.205:80828
Content-Type: text/xml; charset=utf-8
SoapAction: "http://tempuri.org/f_HastaninLabTestleri"
Content-Length: 863

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <Ticket xmlns="http://tempuri.org/">
      <TicketNumber>string</TicketNumber>
    </Ticket>
  </soap:Header>
  <soap:Body>
    <f_HastaninLabTestleri xmlns="http://tempuri.org/">
      <_enumKanTahlilikontrolTarih>KAYITTARIHI</_enumKanTahlilikontrolTarih>
      <_enumHastaKontrolKodu>KLINIK_KODU</_enumHastaKontrolKodu>
      <_sCliniclist>18043</_sCliniclist>
      <_dtBaslamaTarihi>2015-01-07</_dtBaslamaTarihi>
      <_dtBitisTarihi>2015-01-07</_dtBitisTarihi>
      <_sTCKimlikNO>32963180024</_sTCKimlikNO>
      <_bGonderilmis>true</_bGonderilmis>
    </f_HastaninLabTestleri>
  </soap:Body>
</soap:Envelope>

XML içerikli bir request yaptık. Fiddler görüntüsü:

Sonucu:

POSTMAN ile yaptığımızda ilk olarak şu hatayı alabiliriz:
Request format is unrecognized for URL unexpectedly ending in '/f_HastaninLabTestleri'.
Metot adının POST ve GET metotlarıyla çağrılabilmesine dair web.config içinde ayar yapmamız gerekecek:
<configuration>
    <system.web>
    <webServices>
        <protocols>
            <add name="HttpGet"/>
            <add name="HttpPost"/>
        </protocols>
    </webServices>
    </system.web>
</configuration>
Kaynak: Stackoverflow sorusu.

Şimdi sonucu çekelim:

Şimdi bu talebin nasıl yapıldığına bakalım:
POST /HTUS/HastaTahlilUyariServisi.asmx/f_HastaninLabTestleri HTTP/1.1
Host: 10.130.214.205:8082
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

_enumKanTahlilikontrolTarih=KAYITTARIHI&_enumHastaKontrolKodu=KLINIK_KODU&_sCliniclist=18043&_dtBaslamaTarihi=2015%2F01%2F07&_dtBitisTarihi=2015%2F01%2F07&_sTCKimlikNO=32963180024&_bGonderilmis=true

13 Mart 2015 Cuma

Elasticsearch ile uygulama loglama - Application logging with Elasticsearch

Önce elasticsearch head plugin windows'a nasıl kurulur:

Plugin bize durumu görme sorgu gönderme vs. kolaylıkları sağlayacak:

  1. Önce log indexini yaratalım
  2. Sonra loglanacak hash'imizin veri yapısına göre mapping
  3. verimizi girelim
  4. Tüm verilerimizi görecek sorgu çakalım

  1. Önce log indexi olan diviner_log'u oluşturalım:
    PUT http://localhost:9200/diviner_log/
  2. Hash'imize göre map oluşturalım. Buradaki püf noktası automatic _id yaratıyor olmamız ve bu id için gönderdiğimiz içinde milisaniyelik bilgi olan tarih alanını kullanacağız. Bu sayede loglamak istediğimiz bilginin id alanından loglarına erişeceğiz ama tarih alanı her defasında farklı gideceği için versiyonlamış olacağız. Elasticsearch'ün aynı _id değerine PUT ile gönderdiğimiz değerlerin kaçıncı _versyion olduğunu söylemesine rağmen X versiyonunu çekip vermemesi nedeniyle eşsiz _id değerlerini işlemin gerçekleştiği tarih olarak oluşturuyoruz:
    PUT http://localhost:9200/diviner_log/ihale/_mapping
    {
      "ihale": {
        "_id": {
          "path": "tarihi"
        },
        "properties": {
          "id": {
            "type": "long"
          },
          "konusu": {
            "type": "string"
          },
          "tarihi": {
            "type": "date"
          }
        }
      }
    }
    Hadi birde _mapping sonucuna bakalım nasıl olmuş:
    Mapping sonucunu görelim:
    GET http://localhost:9200/diviner_log/ihale/_mapping
    {
      "diviner_log": {
        "mappings": {
          "ihale": {
            "_id": {
              "path": "tarihi"
            },
            "properties": {
              "id": {
                "type": "long"
              },
              "konusu": {
                "type": "string"
              },
              "tarihi": {
                "type": "date",
                "format": "dateOptionalTime"
              }
            }
          }
        }
      }
    }
  3. Veri girelim
    POST http://localhost:9200/diviner_log/ihale/
    {
      "id": 1,
      "konusu": "Diyaliz makinesi alımı",
      "tarihi": "2015-03-12T15:44:50.488Z"
    }

    Cevabı:
    {
      "_index": "diviner_log",
      "_type": "ihale",
      "_id": "2015-03-12T15:44:50.488Z",
      "_version": 1,
      "created": true
    }

  4. Tüm verilerimizi görecek sorgu çakalım
    {
      "query": {
        "bool": {
          "must": [
            {
              "wildcard": {
                "ihale.konusu": "*"
              }
            }
          ],
          "must_not": [],
          "should": []
        }
      },
      "from": 0,
      "size": 10,
      "sort": [],
      "facets": {}
    }

    Sonuçlar:
    {
      "took": 8,
      "timed_out": false,
      "_shards": {
        "total": 6,
        "successful": 6,
        "failed": 0
      },
      "hits": {
        "total": 4,
        "max_score": 1,
        "hits": [
          {
            "_index": "diviner_log",
            "_type": "ihale",
            "_id": "2015-03-12T15:44:50.489Z",
            "_score": 1,
            "_source": {
              "id": 2,
              "konusu": "AV Seti alımı",
              "tarihi": "2015-03-12T15:44:50.489Z"
            }
          },
          {
            "_index": "diviner_log",
            "_type": "ihale",
            "_id": "2015-03-12T15:44:50.491Z",
            "_score": 1,
            "_source": {
              "id": 2,
              "konusu": "AV Seti alımı - ver 3",
              "tarihi": "2015-03-12T15:44:50.491Z"
            }
          },
          {
            "_index": "diviner_log",
            "_type": "ihale",
            "_id": "2015-03-12T15:44:50.488Z",
            "_score": 1,
            "_source": {
              "id": 1,
              "konusu": "Diyaliz makinesi alımı",
              "tarihi": "2015-03-12T15:44:50.488Z"
            }
          },
          {
            "_index": "diviner_log",
            "_type": "ihale",
            "_id": "2015-03-12T15:44:50.490Z",
            "_score": 1,
            "_source": {
              "id": 2,
              "konusu": "AV Seti alımı - ver 2",
              "tarihi": "2015-03-12T15:44:50.490Z"
            }
          }
        ]
      }
    }




  5. Şimdi id değerine göre loglara bakalım:



  6. Gelen sonuçlar score'a göre sıralandı ama bizim log sonuçları işlem tarihine göre sıralansın:
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "ihale.id": "2"
              }
            }
          ],
          "must_not": [],
          "should": []
        }
      },
      "from": 0,
      "size": 10,
      "sort": [
        {
          "ihale.tarihi": {
            "order": "asc"
          }
        }
      ],
      "facets": {}
    }

    Sonuç kümesini görelim:
    ... "hits": [
        {
          "_index": "diviner_log",
          "_type": "ihale",
          "_id": "2015-03-12T15:44:50.489Z",
          "_score": null,
          "_source": {
            "id": 2,
            "konusu": "AV Seti alımı",
            "tarihi": "2015-03-12T15:44:50.489Z"
          },
          "sort": [
            1426175090489
          ]
        },
        {
          "_index": "diviner_log",
          "_type": "ihale",
          "_id": "2015-03-12T15:44:50.490Z",
          "_score": null,
          "_source": {
            "id": 2,
            "konusu": "AV Seti alımı - ver 2",
            "tarihi": "2015-03-12T15:44:50.490Z"
          },
          "sort": [
            1426175090490
          ]
        },
        {
          "_index": "diviner_log",
          "_type": "ihale",
          "_id": "2015-03-12T15:44:50.491Z",
          "_score": null,
          "_source": {
            "id": 2,
            "konusu": "AV Seti alımı - ver 3",
            "tarihi": "2015-03-12T15:44:50.491Z"
          },
          "sort": [
            1426175090491
          ]
        }
      ]...




12 Mart 2015 Perşembe

Elasticsearch notarım

{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "ihale" : {
            "_source" : { "enabled" : false },
            "_type" : {"index" : "no"},
            "_id" : {
                "index" : "not_analyzed",
                "store" : true
            },
            "properties" : {
                "id" : { "type" : "long", "index" : "not_analyzed" },
                "konusu" : { "type" : "string", "index" : "not_analyzed" }
            }
        }
    }
}
--------------------------------------------------------------------------------------------------------
PUT http://localhost:9200/diviner_log/ HTTP/1.1
User-Agent: Fiddler
Host: localhost:9200
Content-Length: 404

{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "ihale" : {
            "_source" : { "enabled" : false },
            "_type" : {"index" : "no"},
            "properties" : {
                "id" : { "type" : "long", "index" : "not_analyzed" },
                "konusu" : { "type" : "string", "index" : "not_analyzed" }
            }
        }
    }
}

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 21

{"acknowledged":true}
--------------------------------------------------------------------------------------------------------  
:9200/index/_type/_id 
index için > GET http://localhost:9200/diviner_log/_mappings
_type için > GET http://localhost:9200/diviner_log/tweet/_mapping
--------------------------------------------------------------------------------------------------------   

MAPPINGS vs MAPPING

PUT http://localhost:9200/diviner_log/tweet/_mapping HTTP/1.1 // _mapping ile tek bir 
User-Agent: Fiddler
Host: localhost:9200
Content-Length: 402

{
            "_source" : { "enabled" : false },
            "_type" : {"index" : "no"},
            "_id" : { "path" : "tarihi" }, // :9200/index/_type/_id > _id değerini "tarihi" özelliğinden alacak
            "properties" : {
                "id" : { "type" : "long", "index" : "not_analyzed" },
                "konusu" : { "type" : "string", "index" : "not_analyzed" },
                "tarihi":{ "type" : "date", "index" : "not_analyzed" }  // "tarihi" özelliğinin tipinin date olduğunu belirtelim ki; 
                        // kibana'da süzme işlemleri kolay olsun
            }
}

İhale için mapping:
PUT http://localhost:9200/diviner_log/ihale/_mapping
{
  "ihale": {
    "_id": {
      "path": "tarihi"
    },
    "properties": {
      "id": {
        "type": "long"
      },
      "konusu": {
        "type": "string"
      },
      "tarihi": {
        "type": "date"
      }
    }
  }
}

Mapping sonucunu görelim:
GET http://localhost:9200/diviner_log/ihale/_mapping
{
  "diviner_log": {
    "mappings": {
      "ihale": {
        "_id": {
          "path": "tarihi"
        },
        "properties": {
          "id": {
            "type": "long"
          },
          "konusu": {
            "type": "string"
          },
          "tarihi": {
            "type": "date",
            "format": "dateOptionalTime"
          }
        }
      }
    }
  }
}

--------------------------------------------------------------------------------------------------------   
CLEAR CACHE - ELASTICSEARCH
$ curl -XPOST 'http://localhost:9200/twitter/_cache/clear'
--------------------------------------------------------------------------------------------------------   

AUTO CREATE ID 

POST http://localhost:9200/diviner_log/tweet/ HTTP/1.1 // PUT yerine POST ile gönderince otomatik ID üretecektir
User-Agent: Fiddler
Host: localhost:9200
Content-Length: 74

{id:1, konusu:"Cemin deneme tahtasındaki ilk konu", tarihi:1426086937374}


HTTP/1.1 201 Created
Content-Type: application/json; charset=UTF-8
Content-Length: 97

{"_index":"diviner_log","_type":"tweet","_id":"AUwM_9mGuoX-zfkMiNtf","_version":1,"created":true}

--------------------------------------------------------------------------------------------------------   

11 Mart 2015 Çarşamba

How to set different default tab (like RAW) on fiddler's inspector view?, Fiddler de inspector görünümden farklı tab'ı varsayılan olarak yapmak

First you need to find QuickExec box:

Enter the config tab:

fiddler.ui.inspectors.request.alwaysuse RAW
fiddler.ui.inspectors.response.alwaysuse RAW

OR you can do with this QuickExec command:
PREFS SET fiddler.ui.inspectors.request.alwaysuse RAW
PREFS SET fiddler.ui.inspectors.response.alwaysuse RAW

And I wanted to add HTTP method column to fiddler and wanted to show how we can do:


Ref: http://stackoverflow.com/q/3319848/104085

10 Mart 2015 Salı

ElasticSearch Windows 7'de çalışsın

Zip dosyasını indirelim:

Dosyayı klasöre açalım:

Java_Home ayarının yapılması:


Çalıştıralım:

Çalıştı:

Buna bir de kibana'yı bağladım:

Çalıştıralım Kibanayı

Arayüz nasılmış?

Buradan Elasticsearch nasıl kullanılırı daha iyi kavrayabilirsiniz: Joel Abrahamsson
Kitabı

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ü:

26 Ocak 2015 Pazartesi

Redis, Centos 6.5 & 7

Redis rpm paketleri: http://www.rpmfind.net/linux/rpm2html/search.php?query=redis
2.6 dan yüksek Redis sürümü için: https://robotsystematic.com/redis-higher-than-2-6-in-centos
Ref: http://sharadchhetri.com/2014/10/04/install-redis-server-centos-7-rhel-7/
original: https://troubleshootguru.wordpress.com/2014/11/19/how-to-install-redis-on-a-centos-6-5-centos-7-0-server-2/
Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.

How To Install Redis on Centos 7
# wget -r –no-parent -A ‘epel-release-*.rpm’ http://dl.fedoraproject.org/pub/epel/7/x86_64/e/
# rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-*.rpm

It will create two epel’s repo file inside /etc/yum.repos.d
These are –
1. epel.repo
2.epel-testing.repo
Install Redis with Yum
# yum install redis php-pecl-redis

Enable Redis service to start on boot
# systemctl enable redis-server.service

Disable Redis service from start on boot
# systemctl disable redis-server.service

Start/Stop/Restart Redis
# systemctl start redis-server.service
# systemctl stop redis-server.service
# systemctl restart redis-server.service

Check if Redis is Running
#systemctl is-active redis-server.service

How To Install Redis on Centos 6.5
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
# yum install redis php-pecl-redis
# service redis start
# chkconfig redis on

Now verify its set to start at boot
# chkconfig –list redis
redis 0:off 1:off 2:on 3:on 4:on 5:on 6:off

To make sure redis is working, run command “redis-cli ping” from command line. If you get result “PONG”, that shows redis is working.
Now install redis PHP extension, using following command.
# pecl install redis

Now open php.ini ( /usr/local/lib/php.ini on cPanel servers ) file and add the following line to it
extension=redis.so
Now restart Apache to apply the changes to php.ini file.
Now that was pretty simple, but lets say you want to add a second instance to your server on a different port

Add a second instance of Redis
# cp redis.conf redis2.conf && cp /etc/init.d/redis /etc/init.d/redis2

Change
# vim /etc/init.d/redis2
pidfile=”/var/run/redis/redis.pid” to pidfile=”/var/run/redis/redis2.pid”
REDIS_CONFIG=”/etc/redis.conf” to REDIS_CONFIG=”/etc/redis2.conf”

Change
# vim /etc/redis2.conf
port 6379 to port 6380
unixsocket /tmp/redis.sock to unixsocket /tmp/redis2.sock

# service redis2 start

To install a web interface for redis
# cd /downloads/
# git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git
# cd phpRedisAdmin/includes
# cp config.sample.inc.php config.inc.php
Make sure the setting are correct
# vim config.inc.php
Lets add the RedisAdmin configuration file to Apache
# vim /etc/httpd/conf.d/redisadmin.conf
Now add the following
#
# Web Interface for RedisAdmin
#

Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from

Alias /redisAdmin /downloads/phpRedisAdmin
Alias /redisadmin /downloads/phpRedisAdmin
View your RedisAdmin Section

http://example.tld/redisadmin

Create a Bash Script to make sure Redis is Running
vim /scripts/redis-check.sh
Add the following for the above installation

#!/bin/bash
PS=$(which ps)
GREP=$(which grep)
WHEN=$(date +”%Y-%m-%d-%H:%M:%S”)
if ! $PS aux | $GREP “redis.conf” | $GREP -v grep 2>&1 > /dev/null; then
/etc/init.d/redis restart
echo ‘Restarted Redis @’ $WHEN
fi
#Check Second instance
if ! $PS aux | $GREP “redis2.conf” | $GREP -v grep 2>&1 > /dev/null; then
/etc/init.d/redis2 restart
echo ‘Restarted Redis2 @’ $WHEN
fi
Make the Script executable

# chmod +x /scripts/redis-check.sh
Add your script to your cron to run every 3 minutes or so

# vim /var/spool/cron/root
*/3 * * * * /bin/bash /script/redis-check.sh >> /var/log/redis-check.log