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

29 Eylül 2015 Salı

Elasticsearch ile sorgulama

Search API

Önce ekşideki bilgi hapları alalım:
en önemli özelliği distributed ve real-time olması.
solr gibi core olarak lucene kullaniyor (yani datastore aslinda lucene dokumanlari). kabuk demek daha dogru olur kanimca, daha cok orchestrator gibi
aslında bir nosql databasedir. datayı relational olmayan bir şekilde store ettiği için bayılmadan full text search yapabiliyorsunuz
kendi query-dsl'ini de üzerine barındırması fevkalade bir durum
query dsl'i biraz karışık ve aslında birbirinin yaptığı işleri aynen yapan farklı fonksiyonlar var
Peki QUERY DSL ile sorgulama konusunda bool query'ye temel bakış atalım:
{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "FIELD": {
                            "value": "VALUE"
                        }
                    }
                },
                {
                    "query_string": {
                        "default_field": "FIELD",
                        "query": "this AND that OR thus"
                    }
                }
            ],
            "should": [
                {
                    "match": {
                        "FIELD": "TEXT"
                    }
                }
            ],
            "minimum_number_should_match": 1,
            "must_not": [
                {
                    "range": {
                        "FIELD": {
                            "from": "10",
                            "to": "20"
                        }
                    }
                }
            ],
            "boost": "4"
        }
    }
}

localhost:9200/index/type URL yapısında sorgulama yapmak için _search api ile sorgulamak istenildiğinde localhost:9200/index/type/_search şeklinde sorgu yazılabilir. Search API aynı zamanda Faceting ve Filtering sağlayacaktır.
Aşağıdaki sorgu sadece size ve query parametrelerinin atandığı facet ve filter'ın ise olmadığı temel bir sorgudur:
{ 
   "size": 3, 
   "query": { 
       "match": {
          "hobbies": "skateboard"
        }
    }
}
Bu sorgu sadece hobiler içinde skateboard terimini aradığımız bir sorgudur ve hem GET hem POST metotlarıyla sadece urlnin sonunda _search olacak şekilde çalıştırılabilir.


Temel sorgulama tipleri:
  1. Term
  2. Match
  3. Range
  4. Filters

Ref: http://exploringelasticsearch.com/searching_data.html
http://www.slideshare.net/clintongormley/elasticsearch-query-dsl-not-just-for-wizards

Mapping durumunu görüntüleme

Sadece bir indexin mappingi için

GET http://10.214.66.90:9200/_mapping/ihale

Birden fazla indexin mappingi için

GET http://10.214.66.90:9200/_mapping/ihale,Firma

Bir filed(alanın) mappingi için

GET http://10.214.66.90:9200/_mapping/ihale/field/Konusu

14 Eylül 2015 Pazartesi

zkemkeeper.dll ve Asp.Net uygulaması

Öncelikle biyometrik okuma cihazına bağlanmak için zkemkeeper.dll ve sdk'nın diğer dll dosyalarını registry'e kaydetmelisiniz. Bu aslında com bileşeni olarak sistemin erişebileceği bir id ile windows içinde kaydının oluşturulması demek oluyor. Bunu yapmak için zksoftware içinde gelen bat dosyasını çalıştırmanız yeterli.
copy .\sdk\*.dll %windir%\system32\
regsvr32 %windir%\system32\zkemkeeper.dll

Buna göre sdk içindeki tüm dll dosyalarını C:\Windows\system32 dizinine kopyalayıp zkemkeeper.dll dosyasını da registry'ye kaydetmiş oluyoruz. zkemkeper.dll için bir uygulama idsi oluşturdu {FE9D.....32C7} diye ve bunu da {00853....61F} ile çağırabilir bir DCOM objesi olarak sisteme kaydetti.

Normal olarak demo uygulamalarını bu kayıt işlemi yapılmadan önce çalıştırdığımda şu hatayı alıyordum: FAE has stopped working

DLL register edildikten sonra uygulama çalışıyor ve biyometrik cihazlara bağlantı sağlıyordu ama başka makinelerde aldığım bir sorunun ekran görüntüsünü şöyle alıyordum:

Bu hatayı elde etmek için program FAE hatası almasın diye dll register ettim ve uygulama açıldıktan sonra unregister ederek bağlanmayı deneyince ekrandaki Error mesajını aldım. Bu mesaj biyometrik cihazın çeşitli hata seviyelerinden(sanırım 6-7 tane var) biri. Maksadım bunu gördüğünüzde neden olduğunu bir nebze anlamanızı sağlamak.

Şimdi "happy path"(mutluluğa giden keçi yoluna bakalım :) )
Dll kaydedildi ve demo uygulamasıyla cihaza bağlanalım:

ASP.NET uygulamamda ise şu hataları alıyordum:
  1. Class not registered diyerek CZKEMClass'tan bir nesne yaratmama müsade etmiyordu
  2. Başka bir makinede ise nesne yaratıyor ama aktif cihazlara peş peşe bağlantı sağla dediğimde sorun çıkartmazken, pasif bir cihaza bağlan dediğimde bir sonraki aktif cihaza bağlantı sağlamayı denemeden cihaza ulaşılamadı diyordu

1. Madde için aldığım sorunu göstereyim:
Retrieving the COM class factory for component with CLSID {00853A19-BD51-419B-9269-2DABE57EB61F} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

2. Madde için ekran görüntüsünü yaratamıyorum ama ikisinin çözümünü nerede bulduğumun ekranını paylaşayım:
IIS Express'in 64 bit versiyonunu çalışmaya zorlayınca dll'lerin register edildiği versiyona erişmesini sağlamış oldum. Çünkü zkemkeeper.dll'i kaydetmek istediğinizde 32/64 bit seçeneklerinden eğer 64 bitlik sistem üstünde koşuyorsanız 32 liğini yükleyemiyorsunuz(klasör adı "Communication Protocol SDK(32Bit Ver6.2.4.1)" olanı yükleyemiyorsunuz çünkü içeriğindeki zkemkeeper.dll 32 uyumlu değil).
Ancak Communication Protocol SDK(64Bit Ver6.2.4.1) klasöründeki zkemkeeper.dll dosyasını sisteme kaydedebiliyorsunuz. Bu durumda ASP.NET uygulamanızın IIS Express versiyonununda 64 bit olması için zorlamanız gerekiyor.

Ve tekrar çalıştırdığımda uygulamamı:

Lotus Notes ile gönderdiğiniz iletileri başka bir eposta hesabına gönderebilmek

Tüm kodumuz burada ve ekran görüntüleri de aşağıda olacak. Anlaşılmasında sorun çıkarsa yardım etmeye çalışırım.
Sub Initialize
 
 
 Dim s As New NotesSession 
 Dim db As NotesDatabase       ' current mail file
 Dim lupV As NotesView        ' docs in forwarding folder
 Dim lupDoc As NotesDocument     ' current lupE doc being forwarded
 Dim counter As Long         ' counter, use for limit
 Dim dc As notesdocumentcollection
 
 Set db = s.CurrentDatabase
 Set dc=db.UnprocessedDocuments
 Set lupDoc = dc.GetFirstDocument
 
 Do While Not(lupDoc Is Nothing)
  
  If (ProcessEmail(s, db, lupDoc, "cem.topkaya@hotmail.com")=1) Then
   Set lupDoc = dc.GetNextDocument(lupDoc)
  End If
  counter =counter+1
 Loop
 
SkipDone:
 Print "Es geçilen belge"
 Exit Sub
 
ErrorHandler:
 Print "Unexpected Error: " & Cstr(Err) & " " & Error$ & ", on line: " & Cstr(Erl)
 
End Sub

Function ProcessEmail(s As NotesSession, db As NotesDatabase, lupDoc As NotesDocument, newSendTo) As Integer
 ' forwards current entry/doc, and returns 1 if successful
 ' newSendTo should be internet address or Canonical Notes name
 Dim mDoc As NotesDocument ' new memo doc created from original doc
 
 On Error Goto FErrorHandler
 
 ' create new doc from current document
 Set mDoc = db.CreateDocument()
 Call lupDoc.CopyAllItems(mDoc, True)
 mDoc.SaveMessageOnSend = False
 
 ' remap from/sendto/replyto so when forwarded still be from original person
 Call mDoc.ReplaceItemValue("SendTo", newSendTo)
 Call mDoc.ReplaceItemValue("CopyTo", "")    ' otherwise another copy will be sent
 Call mDoc.ReplaceItemValue("BlindCopyTo", "")  ' otherwise another copy will be sent
 
 ' send new doc
 Call mDoc.Send(False, newSendTo)
 ' reset to nothing
 Set mDoc = Nothing
 
 ' başarılı bir eposta gönderimi yaptık
 ProcessEmail = 1
 
FExit:
 Exit Function
 
FErrorHandler:
 Print "(ProcessEmail) Unexpected Error: " & Cstr(Err) & " " & Error$ & ", on line: " & Cstr(Erl)
 ProcessEmail = 0
 Exit Function
End Function