26 Aralık 2017 Salı

Privacy Enhanced Mail (PEM) Kodek

Giriş
Privacy Enhanced Mail (PEM) kodek X509 dijital certifikanın veya private key'in Base64 olarak temsil edilmesi yani kodeklenmesi demek. PEM verisi kaydedilirken dosyanın uzantısı

1.pem
2.crt
3. cer

olabilir

PEM formatı editör ile açılabilir ancak Base64 olduğu için gözle okunamaz.

DER İle İlişkisi
Distinguished Encoding Rules (DER) formatı certifikanın veya private key'in binary olarak dosyaya yazılmış hali demek. PEM genellikle DER'in Base64 haline çevrilmişidir diye düşünülebilir.

Yani PEM ASCII tabanlı bir kodek. DER ise binary bir kodek.

Dosya Uzantısı PFX İse
Bazen "pfx" uzantısı ile kaydedilir ancak bu bence çok doğru değil. Çünkü ".pfx" uzantısı ile PKCS#12 dosya formatı ima edilir.


Örnek Dosya
PEM sertifika için şöyledir
BEGIN CERTIFICATE
...
END CERTIFICATE
PEM Private Key için şöyledir
BEGIN RSA PRIVATE KEY
...
END RSA PRIVATE KEY


Event Aggregator

Giriş
Açıklaması şöyle.
An Event Aggregator is a simple element of indirection. In its simplest form you have it register with all the source objects you are interested in, and have all target objects register with the Event Aggregator. The Event Aggregator responds to any event from a source object by propagating that event to the target objects.
Event Aggregator klasik Publish/Subsribe altyapısı olabileceği gibi, içinde iş mantığı kodları da barındırabilir.

22 Aralık 2017 Cuma

timer_create metodu

timer_create metodu
timer_create(), timer_settime(),timer_connet(),timer_delete() beraber kullanılıyorlar.İlki timer nesnesini yaratır, ikincisi başlatır, sonuncusu ise timer nesnesini kapatır.

timer_create() POSIX sistemlerde signal'ler ile beraber kullanılıyor. POSIX uyumlu olmayan sistemlerde sinyal olmadan kullanılabilir.
POSIX sistemde SIGEV_SIGNAL ile kullanırsak tek thread'li bir timer elde ederiz. Eğer SIGEV_THREAD ile kullanırsak timer'ın her çalışmasında yeni bir thread içinde çalışmasını sağlarız.
İmzası
İmzası şöyle.
int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid);
Bu metod ile kullanılan timer_t çoğu derleyicide void * olarak tanımlı. Bu yüzden timer_delete() ile silinmesi gerekiyor.
typedef void * __timer_t;
typedef __timer_t timer_t;
Örnek
Şöyle yaparız.
timer_t timerID;

struct sigevent se;


/* Set and enable alarm */
se.sigev_notify = SIGEV_SIGNAL;
se.sigev_signo = SIGRTMIN;
se.sigev_value.sival_ptr = &timerID;
timer_create(CLOCK_REALTIME, &se, &timerID);
Örnek
Şöyle yaparız
timer_t  timer_id;
timer_callback  func = ...;
int val = ...;

struct sigevent se;
se.sigev_notify = SIGEV_THREAD;
se.sigev_value.sival_int = val;
se.sigev_notify_function = func;
se.sigev_notify_attributes = NULL;

int status = timer_create(CLOCK_REALTIME, &se, &timer_id);
timer_settime metodu
Örnek
Şöyle yaparız
float delay = ...;
float interval = ...;

struct itimerspec ts;

ts.it_value.tv_sec = delay;
ts.it_value.tv_nsec = 0;
ts.it_interval.tv_sec = interval;
ts.it_interval.tv_nsec = 0;

int status = timer_settime(timer_id, 0, &ts, 0);

21 Aralık 2017 Perşembe

En Yakın Komşu Arama

Giriş
Geospatial Searches yazısına göz atabilirsiniz

Top K Elements veya Top K Frequent Elements

En yakın komşu arama
Özellikle harita 3D uygulamalar en yakın komşu arama işlemi çokça yapılır. Spatial işlemler için bir çok veri yapısı mevcut. Bunlar arasında kD-tree, quad-tree, octree, bounding volume hierarchy gibi yapılar sayılabilir.

Eşleştirme için Nearest neighbor search algoritmalarından birisi kullanılabilir. Bu algoritma tiplerinden bazını aşağıda anlattım.

Quad Tree
İndekslenecek alanın büyüklüğü önceden bilinir. Alan 4'lü hücrelere ayrılır. Aranılan bir alan hangi hücre ile kısmi veya tamamen çakışıyorsa hücreler içindeki nesnelere kolayca erişilir. Konuyu şekillerle anlatan iyi bir yazı burada.

Basit olarak kod şuna benzer. AABB sınırdır. Wikideki örnek kodda bu isim kullanıldığı için aynı isimle kodlanmış.
template <class T>
class Quadtree
{
  private:
  //4 children
  Quadtree* nw;
  Quadtree* ne;
  Quadtree* sw;
  Quadtree* se;

  AABB boundary;
  
 public:
  
 Quadtree<T>(AABB boundary);
  
};
Buradaki bir yazıda QuadTree'nin neden tercih edilmediği var.

Locality sensitive hashing 
Locality Sensitive Hashing yazısına taşıdım

K-D Tree
K-D agaç yapısını 2 boyutlu olarak anlatan ve okuması kolay bir yazı burada.
K-D Tree algoritmaları bence karmaşık şeyler. K-D Tree'nin bazı özellikleri şöyle.
1. Dengeli (balanced) olmak zorunda değil.
2. N boyutlu arama yapmaya izin verir.

PostgreSQL
Eğer çok hassas sonuç istemiyorsak şöyle yaparız.
SELECT * FROM tweets WHERE location <@ circle '((-34.603722, -58.381592), 2000)'
Buradaki yazıda PostgreSQL + PosGIS ile verilen noktayan en yakın 10 tane nesneyi çekme örneği verilmiş.

SQL'de kullanılan 4326 WGS-84 için kullanılan numara ise SRID. Konuyla ilgili Vektor Harita başlıklı yazıya bakabilirsiniz. 

20 Aralık 2017 Çarşamba

Http Post ve multipart/form-data - Dosya(lar) Yüklemek İçindir

Giriş
Http ile POST işlemi için 3 seçenek var.

1. application/x-www-form-urlencoded (the default)
2. multipart/form-data
3. text/plain

application/x-www-form-urlencoded
Sorgu string'i gibi şeyleri göndermek için kullanılır.

multipart/form-data
Dosya yüklemek için kullanılır. Dosya yüklemek için kullanılır. Açıklaması şöyle.
The content type "application/x-www-form-urlencoded" is inefficient for sending large quantities of binary data or text containing non-ASCII characters. The content type "multipart/form-data" should be used for submitting forms that contain files, non-ASCII data, and binary data.

text/plain
Tam olarak ne işe yarar bilmiyorum.

HTML
Dosya yüklemek için tarayıcı tarafında 2 çözüm var
1. <form> tag'ini kullanmak
2. <input> tag'ini type="file" şeklinde kullanmak ve AJAX çağrısı yapmak. AJX kullanımı tüm sayfayı tekrar yenilemeye gerek olmadığı için tercih edilebilir

Örnek - HTML Form
Şöyle yaparız
<form method="post" action="fileuploadservlet" enctype="multipart/form-data">
  <input type="file" name="file1" />
<input type="file" name="file2" />
<input type="file" name="file3" />
  <input type="submit" value="Upload" />
</form>
Örnek - AJAX
Şöyle yaparız. Burada AJAX kütüphanesi olarak tarayıcıda yerleşik bulunan window.fetch kullanılıyor
<!-- HTML5 Input Form Elements -->
<input id="fileupload" type="file" name="fileupload" /> 
<button id="upload-button" onclick="uploadFile()"> Upload </button>

<!-- Ajax JavaScript File Upload Logic -->
<script>
  async function uploadFile() {
    let formData = new FormData(); 
    formData.append("file", fileupload.files[0]);
    await fetch('/fileuploadservlet', {
      method: "POST", 
      body: formData
    }); 
    alert('The file has been uploaded successfully.');
  }
</script>
multipart/form-data Nedir?
Post isteğinde önce Content-Type gönderilir. Bu alan multipart isteğin başladığını ve her bir part arasındaki ayracı belirtir. Tüm multipart'ın büyüklüğü Content-Length ile belirtilir.

Her bir part Content-Disposition ile başlar. Bu alan part'ın ismini ve kaydedilecekse dosya ismini belirtir.
Ayrıca part'ın tipi de Content-Type ile belirtilir.

Örnek
Post isteği şöyle başlar.
Content-Type: multipart/form-data; boundary=----------735323031399963166993862150
Content-Length: 8341
Örnek
Eğer metin göndereceksek şöyle bir html görürüz.
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="text1"

mytext
Örnek
Eğer a.txt dosyasını göndereceksek şöyle bir html görürüz.
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain

Content of a.txt.
Örnek
Eğer html göndereceksek şöyle bir html görürüz.
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html

<!DOCTYPE html><title>Content of a.html.</title>
Örnek
Eğer octect göndereceksek şöyle bir html görürüz.
-----------------------------735323031399963166993862150
Content-Disposition: form-data; name="file3"; filename="binary"
Content-Type: application/octet-stream

Byte'lar
Örnek
Content-Length tüm parçaların toplam uzunluğu verir. Şöyle yaparız.
Content-Type: multipart/form-data; boundary=---------------------------1294919323195
Content-Length: 502
-----------------------------1294919323195
Content-Disposition: form-data; name="number"

5555555555
-----------------------------1294919323195
Content-Disposition: form-data; name="clip"

rickroll
-----------------------------1294919323195
Content-Disposition: form-data; name="upload_file"; filename=""
Content-Type: application/octet-stream


-----------------------------1294919323195
Content-Disposition: form-data; name="tos"

agree
-----------------------------1294919323195--