21 Haziran 2019 Cuma

REST mi? WEBSOCKET mi?

Rest vs Websockets


Bu yazımda istemci-sunucu iletişiminin temellerini inceleyeceğiz.Rest ve Websocket'i
projelerimizde kullanmak için hangisini ne zaman seçmemiz doğru olur bu konuda fikir edineceğiz.


Ağ iletişimi için oluşturulmuş OSI modeli bulunmaktadır.
Bu model 7 katmandan oluşmaktadır.
    1.Physical (Fiziksel Katman)
    2.Data Link (Veri Bağlantı Katmanı)
    3.Network (Ağ Katmanı)
    4.Transport (Taşıma Katmanı)
    5.Session (Oturum Katmanı)
    6.Presentation (Sunu Katmanı)
    7.Application (Uygulama Katmanı)

Uygulama katmanı son kullanıcıya en yakın olandır ve iletişime katılan uygulamalarla etkileşime girmekten sorumludur. FTP, SMTP, SNMP,HTTP ve WebSocket gibi bu katmanda kullanılan birkaç popüler protokol vardır.

WebSocket kalıcı bir TCP bağlantısı üzerinden çift yönlü, tam çift yönlü iletişimi sağlayan bir iletişim protokolüdür.WebSocket, 2011 yılında IETF tarafından RFC 6455 olarak bir iletişim protokolü olarak standartlaştırılmıştır. Günümüzde çoğu modern web tarayıcıları, WebSocket protokolünü desteklemektedir.

İnternetteki her yerde bulunmasından dolayı hepimiz HTTP'nin farkında olsak da, aynı zamanda bir uygulama katmanı iletişim protokolüdür. HTTP, istek yanıtına dayalı bir protokoldür.
REST (Temsili Durum Aktarımı), web hizmetleri oluşturmak için HTTP'ye bir dizi kısıtlama getiren mimari bir stildir.

WebSocket, istemci ve sunucu arasında iki yönlü iletişim için bir protokol tanımlarken, değiş tokuş edilecek mesaja herhangi bir koşul getirmez. Bu, iletişimdeki tarafların alt protokol müzakeresinin bir parçası olarak kabul etmeleri için açık bırakılmıştır.Önemsiz uygulamalar için bir alt protokol geliştirmek uygun değildir. Neyse ki, STOMP gibi kullanıma hazır birçok popüler alt protokol var.
STOMP, Basit Metin Yönelimli Mesajlaşma Protokolü anlamına gelir ve WebSocket üzerinden çalışır.

HTTP ve WebSocket'ı, her ikisi de uygulama katmanı protokolleri olduğu gibi doğrudan karşılaştırabilsek de, REST'i WebSocket ile karşılaştırmanın doğal olmadığını unutmayın.Daha önce gördüğümüz gibi REST, iletişim için HTTP'yi kullanan mimari bir stildir.Dolayısıyla, WebSocket ile karşılaştırmamız çoğunlukla HTTP'deki yetenekler veya eksiklikler ile ilgili olacaktır.

Handshake (El sıkışma), iletişim kuran taraflar arasında otomatik olarak iletişim protokolü müzakere yöntemini ifade eder. HTTP, durumsuz bir protokoldür ve bir istek-yanıt mekanizmasında çalışır. Her HTTP isteğinde, sunucuyla soket üzerinden bir TCP bağlantısı kurulur.İstemci daha sonra sunucu kaynakla veya bir hatayla yanıt verene kadar bekler. İstemciden gelen sonraki istek, önceki istek hiç olmamış gibi tekrar eder.

WebSocket, HTTP ile karşılaştırıldığında çok farklı çalışır ve gerçek iletişimden önce bir Handshake
(el sıkışma) ile başlar.WebSocket durumunda, istemci HTTP'de bir Protokol Handshake(El Sıkışma) isteği başlatır ve ardından sunucu HTTP'den WebSocket'a yükseltme kabul etmeye yanıt verene kadar bekler.Tabi ki, Protokol Handshake( El Sıkışma) HTTP üzerinden gerçekleştiğinden, önceki şemadan gelen sırayı izler. Ancak bağlantı kurulduktan sonra, oradan istemci ve sunucu daha fazla iletişim için WebSocket'e geçer.

WebSocket ve HTTP arasındaki temel fark, WebSocket’ın kalıcı bir TCP bağlantısı üzerinde çalışırken, HTTP her istek için yeni bir TCP bağlantısı oluşturmasıdır.Şimdi açıkçası, her istek için yeni TCP bağlantısı oluşturmak çok başarılı değil ve HTTP bunun farkında değil. Aslında, HTTP / 1.1'in bir parçası olarak, HTTP'nin bu eksikliğini gidermek için kalıcı bağlantılar tanıtıldı.
Bununla birlikte, WebSocket, kalıcı TCP bağlantılarıyla çalışmak için sıfırdan tasarlanmıştır.

Kalıcı TCP iletişimi üzerinde çalışan WebSocket ile, hem sunucu hem de istemcinin birbirinden bağımsız ve aslında birçok iletişim kurucu tarafa veri göndermesi mümkündür.Buna iki yönlü iletişim denir.

WebSocket iletişiminin bir başka ilginç özelliği de tam çift yönlü olmasıdır. Şimdi bu terim ilginç gelebilirken; bu sadece sunucunun ve istemcinin aynı anda veri gönderebileceği anlamına gelir.Bunu, sunucunun verileri yanıtlayabilmesi için isteği tam olarak alana kadar beklemesi gereken HTTP'de olanlarla karşılaştırın.

Hem HTTP hem de WebSocket, TLS'nin güvenlik avantajlarından yararlanır. HTTP, bunu kullanmak için URL şemalarının bir parçası olarak https sunarken, WebSocket, aynı etki için URL şemalarının bir parçası olarak wss'ye sahiptir.Bir RESTful servisini veya bir WebSocket iletişimini güvenceye almak çok derin bir konudur ve burada ele alınamaz. Şimdilik, her ikisinin de bu konuda yeterince desteklendiğini varsayalım.

Sonuç

WebSocket’ın HTTP’deki eksikliklerden ortaya çıkmasına rağmen, aslında bir HTTP’nin yerine geçmediğini unutmamak önemlidir. Bu yüzden ikisinin de yeri ve kullanımları var. Nasıl karar verebileceğimizi  anlayalım.

Bir çalışanın kaydını almak gibi sunucu ile zaman zaman iletişimin gerekli olduğu senaryoların çoğu için, HTTP / S üzerinden REST hizmetini kullanmak hala mantıklı. Ancak, sunucudan gerçek zamanlı güncellemeler gerektiren bir hisse senedi fiyatı uygulaması gibi daha yeni istemci tarafı uygulamalar için WebSocket’tan yararlanmak çok kolaydır.

Genelleme, WebSocket, push tabanlı ve gerçek zamanlı iletişimin gereksinimi daha uygun şekilde tanımladığı durumlar için daha uygundur. Ek olarak, WebSocket, bir mesajın aynı anda birden fazla müşteriye gönderilmesi gereken senaryolar için iyi çalışır. Bunlar, RESTful hizmetleri üzerinden istemci ve sunucu iletişiminin yasaklayıcı olmasa zor geleceği durumlardır.


Alıntı

21 Aralık 2017 Perşembe

Huffman Encoding (Sıkıştırma Algoritması)

      Sıkıştırma algoritmaları temel olarak iki kategoride incelenir. Bunlar, kayıplı ve kayıpsız sıkıştırma algoritmalarıdır. Kayıplı algoritmalarda sıkıştırılan veriden orjinal veri elde edilemezken kayıpsız sıkıştırma algoritmalarında sıkıştırılmış veriden orjinal veri elde edilebilir.
   
    Kayıplı sıkıştırma tekniklerine verilebilecek en güzel örnekler MPEG ve JPEG gibi standartlarda kullanılan sıkıştırmalardır. Bu tekniklerde sıkıştırma oranı artırıldığında orjinal veride bozulmalar ve kayıplar görülür. Kayıpsız veri sıkıştırmada durum çok farklıdır. Bu tekniklerde önemli olan orjinal verilerin aynen sıkıştırılmış veriden elde edilmesidir. Bu teknikler daha çok metin tabanlı verilen sıkıştırılmasında kullanılır.
    Bir metin dosyasını sıkıştırdıktan sonra metindeki bazı cümlelerin kaybolması istenmediği için metin sıkıştırmada bu yöntemler kullanılır. Huffman sıkıştırma algoritması kayıpsız bir veri sıkıştırma tekniğini içerir.

Huffman sıkıştırma algoritması şöyle hesaplanır.
-> Dosyadaki her karakterin ne kadar geçtiği yüzde olarak bulunur.
-> Her bir karakter ve yüzdeyi bir ağaç düğümü kabul edilir ve yaprak düğümü olur.
-> Kök düğümler elde edilirken her zaman için küçük iki değere sahip düğüm birleştirilir.
-> Bütün düğümler birleştirilenedek ağaç oluşturulur.
-> Her düğümün sol elemanı 0 , sağ elamanı 1 olarak kabul edilerek kodlama yapılır.

Örnek;
Bir metinde geçen karakterlerin sayıları
A=250 B=350 C=500 D=900 E=1200 F=100 G=600 H=1100

Yüzdeleri hesaplıyoruz.
A=%5 B=%7 C=%10 D=%18 E=%24 F=%2 G=%12 H=%22

Şimdi ağacımızı oluşturuyoruz.



Şimdi hesaplamalarımızı yapıyoruz.
Dosyanın normal boyutu 5000 btye = 5000 x 8(bit ile ifade edildiğinde) =40 000 byte

Huffman algoritması 
= A(5x250)+ B(4x350) + C(3x500) + D(3x900) + E(2x1200) + F(5x100) + G(3x600) + H(2x1100)
=13750 byte sıkıştırılmış hali

Örnek metin "bahc" kodlaması "0001(b)00001(a)11(h)100(c)" "00010000111100" 

Kısaca huffman sıkıştırma algoritmasında karakterin bulunma sıkılığına göre ifade edildiği bit sayısı değişmektedir.

Algoritmanın kodu

20 Ekim 2017 Cuma

Asimptotik Gösterim

Asimptotik Gösterim
    Algoritmaları karşılaştırabilmek için bir algoritmanın zorluk derecesi ölçümüne “Computational Complexity” denir. Aslında problem veya algoritmaların çözüme ulaşmadaki karmaşıklığını ölçmek için kullanılır.Fonksiyon içerisindeki önemsiz kısımlar ve katsayılar atılarak basitleştirilir ve gerçek fonksiyona göre yaklaşık bir değer bulunur. Elde edilen bu yeni etkinlik ölçümüne “Asymptotic Complexity” denir.

    Bunun üç türünü göreceğiz: büyük- \Theta Θ gösterimi, büyük-O gösterimi, ve büyük- \Omega Ω gösterimi.

Büyük-O gösterimi: Algoritmanın çalışabileceği en yüksek üst sınırı ifade eder.Yani bu üst sınırdan daha kötü çalışamayacağını gösterir.
Asymptotic upper bound
-f(n) = O(g(n)), eğer sabit bir c ve n0 değeri için
-f(n) >= c.g(n) bütün n >= n0 değerleri için doğruysa
-f(n) ve g(n) pozitif değere sahip fonksiyonlardır.

Örneğin; T(n)=3n²+8n+3 için O(n²) olduğunu gösterelim.
T(n)=3n²+8n+3   g(n)=n²
c.g(n) >= 3n²+8n+3
c.n² >= 3n²+8n+3
3n²+8n²+3n²  >= 3n²+8n+3
14n² >= T(n)

n0=1 c=14



Büyük- \Omega Ω :Bazen, üst sınır belirlemeden, bir algoritmanın en az belirli bir süre aldığını söylemek isteriz. Bu durumda büyük-Ω gösterimini kullanırız.
Asymptotic Lower Bound
-f(n) = W (g(n)), eğer sabit bir c ve n0 değeri için
-c.g(n) <= f(n) bütün n >= n0 değerleri için doğruysa

Örneğin; T(n)=4n³+2n²+3 için O(n³) olduğunu gösterelim.
T(n)=4n³+2n²+3   g(n)=n³
c.g(n) <= 4n³+2n²+3
c.n³ <= 4n³+2n²+3
4n³ <=  T(n)

Katsayılar atıldığında O(n³) bulunur.


Büyük- \Theta Θ gösterimi:Büyük-Θ gösterimi kullandığımızda, çalışma süresinin üzerinde asimptotik olarak sıkı bir sınır vardır diyebiliriz. "Asimptotik olarak" çünkü sadece n'nin yüksek değerleri için önemlidir. "Sıkı sınır" deriz; çünkü çalışma süresini üstten ve alttan sabit bir çarpana kadar indirebildik.
Asymptotic tight bound
-f(n) = Θ(g(n)), eğer sabit c1, c2, ve n0, değerleri için
-c1.g(n) <= f(n) <= c2.g(n) bütün n >= n0 değerleri için doğruysa

Örneğin;T(n)=2n²+3n+1 için O(n²) olduğunu gösterelim.
T(n)=2n²+3n+1 g(n)=n²
c1.g(n) <= 2n²+3n+1 <= c2.g(n)
c1.n² <= 2n²+3n+1 <= c2.n²
2n² <= 2n²+3n+1 <= 6n²

c1=2 c2=6 n0=1


18 Ekim 2017 Çarşamba

Heroku

Heroku nedir?
Heroku, Ruby, Node.js, Java, Python, Clojure, Scala, Go ve PHP ile yazılmış uygulamaları dağıtmanıza, çalıştırmanıza ve yönetmenize izin verir. Kısaca bulut uygulama platformudur.

Heroku Kullanımı
-Kullanmaya başlamadan önce heroku.com bağlantısından üyelik kaydımızı yaptırıyoruz.
-Daha sonra set-up bağlantısından Heroku CLI aracını işletim sistemimize uygun olanı indirip kurulumunu yapıyoruz.
-İşlemlerimizi komut satırı üzerinden gerçekleştireceğiz. (Git versiyon kontrol sistemini kullanmayıda bilmelisiniz.)
-Komut satırında $ heroku login yazıyoruz ve üye olurken kullandığımız e-posta adresini ve parolamızı yazarak giriş yapıyoruz.

$ heroku login
Enter your Heroku credentials.
Email: java@example.com
Password:

-Eğer githubda bulunan projeyi kullanmak istiyorsak öncelikle projeyi bilgisayarımıza indiriyoruz.

$ git clone https://github.com/heroku/myApp.git

-Eğer bilgisayarımızda yeni bir projeyi kullanmak istiyorsak öncelikle git ile projemizi sürüm kontrolü altına alıyoruz.
Komut satırında proje dizinimizi açıyoruz!

$ git init
Initialized empty Git repository in .git/
$ git add .
$ git commit -am "First commit"

-Projemizi herokuya(localde) ekliyoruz.
Komut satırında proje dizinimizdeyken!

$ heroku create myApp

-Herokuya eklediğimiz projemizi uzak sunucuya yolluyoruz.
Komut satırında proje dizinimizdeyken!

$ git push heroku master

-Uygulamanın en az bir örneğinin çalıştığından emin olmak için

$ heroku ps:scale web=1

-Eğer uygulamamızı açmak istersek

$ heroku open

*- $ heroku keys:add komutunu girerek heroku public key ortak kullanılmasını sağlıyoruz.
*- $ heroku logs --tail  komutu ile heroku üzerinde yapılan aktiviteleri görüntüleriz.
*- Uygulamanızı başlatmak için hangi komutun çalıştırılacağını açıkça bildirmek için uygulamanızın kök dizininde bir metin dosyası olan bir Procfile kullanın. Procfile içerisine web: java -jar target/myApp-1.0.jar projemizin jarını belirtiyoruz.


26 Mayıs 2017 Cuma

Sosyal Haber Platformu

Spring Hibernate Thymeleaf Bootstrap JQuery
Bu proje bitirme tezim için yazdığım bir haber paylaşım projesidir.
Projeninin kısımları;
-Haber işlemleri
-Takip işlemleri
-Arama işlemleri
-Yorum işlemleri
-Haber pinleme işlemleri
-Haber rezerve etme işlemleri
Not:Kalan kısımları için proje raporunu inceleyebilirsiniz. Not:Proje geliştirilmeye açıktır. İşinize yarıyorsa istediğiniz gibi alıp kullanabilirsiniz.Eklediğiniz yeni özellikleri commit ederseniz projeyi daha güzel bir hale dönüştürebiliriz. Özellikle yeni bir java developer olarak öğrendiklerim kadarıyla standartlara uymaya çalışsamda hatalarım olmuş olabilir.Hatalarımı düzeltmem ve doğrularını öğrenebilmem için yardımlarınızı bekliyor olacağım.
Kodlara github adresinden ulaşabilirsiniz.