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

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
};