Kategori Arşivi Bir player olarak canavar

Play! Framework ile asenkron HTTP

Geçtiğimiz hafta içerisinde Play! Framework Türkiye Google Grubu’nda güzel bir tartışma konusu oldu. Ahmet Alp Balkan‘ın başlattığı tartışmaya Erdem Ağaoğlu‘nun yazdığı mail damga vurdu:) Aynı tartışmada konuyla ilgili uzun boylu bir yazı yazacağıma söz vermiştim. Bu yazıda, söz verdiğim konulara değinmeden Play! Framework ile asenkron işlerin nasıl yapıldığını örneklemeye çalışacağım. Söz vermiş olduğum ‘Neden non-blocking IO, neden Tomcat “eski teknoloji”, neden Java ile ancak bu kadar’ konularına ise daha fazla zaman ayırarak ileriki bir zamanda değinmeyi düşünüyorum.

Anlatmaya çalışacağım örnek iki ayrı uygulamadan oluşmakta. İlk uygulama bir REST API sağlayıcı olmakla birlikte kullanıcı oluşturan ve kullanıcı ayrıntılarını döndüren iki API sağlıyor olacak. Diğer uygulama ise ilk uygulamanın sağladığı API’leri kullanacak. İlk uygulamaya “Provider“, ikinci uygulamaya “Client” diyeceğim.

Önce Provider içinde kullanıcıları saklamak üzere User modelini oluşturarak işe başlayalım.

Sonrasında kullanıcı oluşturmaya ve istenilen kullanıcının ayrıntılarını döndürmeye yarayan API fonksiyonlarını yazalım. Bu fonksiyonlar Provider uygulamasında Provider controller’ı içinde yer alsınlar.

routes dosyasını güncelleyerek yazdığımız API’ler için HTTP route’ları belirleyelim.

GET     /api/user                               Provider.getUser
POST    /api/user                               Provider.createUser

Dikkat edeceğiniz üzere iki API için de aynı route’u kullanacağız. Hangi API’ye ulaşmak istendiği ayrımını HTTP metodu(GET ya da POST) ile yapıyoruz.

Provider uygulamasını böylece tamamlamış olduk. Client uygulamasına HTTP metodlarını içeren bir enum ekleyerek devam edelim. Bu enum yapacağımız API isteklerini yönetmemizi kolaylaştıracak. Provider içine eklediğimiz User modelinin bir benzerini Client uygulamasına da eklememiz gerekiyor. Fakat bu kez JPA annotation’larına ihtiyacımız olmayacak çünkü kullanıcıları Client uygulamasında veritabanına kaydetmeyeceğiz.

Sırada Client uygulamasının kalbi ClientJob ve Client sınıfları var.

Provider uygulamasını http://localhost:9001 adresinde çalıştırıyoruz. ClientJob sınıfı Provider uygulamasına HTTP isteğini yaptıktan sonra sonucu Either içerisinde döndürüyor. Böylece dönen cevap ya bir Throwable ya da bir User oluyor. Client uygulamasındaki fonksiyonlar geriye Promise döndürüyorlar. Dönen Promise herhangi bir controller içerisinde await fonksiyonuna verilebilir. Örnek olarak Client uygulamasında Application.index içerisinde bu fonksiyonları kullanalım. Önce bir kullanıcı oluşturalım, sonra bu kullanıcının ayrıntılarını isteyelim.

Çıktıda şu logu göreceğiz.

INFO  ~ Kullanıcı oluşturuldu: name:Foo surname:Bar

Örneği oldukça basit tutmaya çalıştım. Ancak 4Primes bünyesinde geliştirmekte olduğumuz KURAM(*) platformu da çok benzer bir yapı kullanmakta. Bu yapının oldukça karmaşık ve büyük ölçekli ortamlarda sorunsuz çalıştığını da belirtmek isterim. Umarım faydalı olmuştur.

(*): KURAM platformu bir tür Tümleşik Yönetim Bilgi Sistemi Platformu’dur. SSO, Kullanıcı ve Yetki yönetimi, Doküman Yönetimi, Log Yönetimi, Dağıtık Arama, Dağıtık Önbellek gibi özellikler sunmaktadır. KURAM hakkında yakın zamanda güzel yazılar yazabilmeyi umuyorum.

Bora Gönül ile Fonksiyonel programlama dilleri üzerine bir söyleşi

Fonksiyonel programlama dilleri deyince ülkemizde akla ilk gelen isimlerden olan Bora Gönül ile kısa bir söyleşi yaptık. Bilgi dolu yorumları için kendisine tekrar teşekkür ederim.

  1. Okuyucuların sizi daha iyi tanıması adına kendinizi kısaca tanıtır mısınız?
  2. Merhaba. Adım Bora Gönül, 1974 doğumluyum. Yazılımla ilgilenmeye ortaokul yıllarında Commodore-64 ve Amiga oyun introlarını kırıp kendi adımı yazmak niyetiyle başladım. Daha sonra İTÜ Elektronik ve Haberleşme Bölümü’nde okudum. Buna paralel çalışmaya başladım. Yaklaşık 17 senedir İstanbul’da IT sektorundeyim. Pek çok yerli ve yabancı firmada çalıştım. Şu anda da Software & Solutions Architect olarak freelance çalışıyorum.

  3. Fonksiyonel programlama dilleri aslında çok uzun zamandır ortalardalar. Siz ne kadar zamandır fonksiyonel programlama dilleri ile ilgileniyorsunuz?
  4. Yazılım benim hem işim, hem hobim. Bu yüzden birçok farklı dilde uygulama geliştirdim. Imperative dil olarak Java, fonksiyonel programlama dilleri olarak Scala, Haskell, Erlang ve Javascript favorilerim. Bu tanışıklığımız da yaklaşık 15 sene önce Haskell ile başladı.

  5. Fonksiyonel programlama dillerine olan ilginizin sebebi nedir?
  6. Bu biraz matematiğe olan sevgimle ilgili. Ortaokulda okuduğum ilk kitapta gördüğüm “X=X+1″ beni o kadar rahatsız etmişti ki ( 0=1 ?) kitabı hemen kapatmıştım. Sonra merakım ve arayışım devam etti. Üniversitenin ilk yıllarında Haskell ile tanıştım. Matematiği kullanabileceğim bir yazılım dili bulmak benim için heyecan vericiydi.

  7. Fonksiyonel dillerin diğer dillere(nesne yönelimli, mantıksal, prosedürel) kıyasla temel avantajları nelerdir? Bu dillerin günümüzdeki kullanım alanları hakkında bilgi verebilir misiniz?
  8. Oldukça derin bir soru oldu. En temel fark şu:
    – Imperative dillerde (C, Java, vs) sonuç odaklıyız; değişkenler tutup onları güncelleyerek sonuca ulaşıyoruz.
    – Applicative dillerde (Scala, Haskell vs) olayın kendisini ifade etmek için hesaplamalara (sonuçlara değil!) odaklanıyoruz.

    Şimdi sorsanız kimse fonksiyonel bir dil bilmediğini söyleyecek, halbuki her gün kullandığınız fonksiyonel bir dil var: “Javascript” :) JS’deki “fonksiyon alan fonksiyonlar, fonksiyon dönen fonksiyonlar, closure’lar, callback’ler, vs.” ne kadar güçlüler bir düşünün.

    Diğer bir önemli fark FP(Fonksiyonel Programlama) dillerinde State olmaması. “Y=X+1″. İşte bu, benim bildiğim matematik…

    Bir başka artısı paralel programlama konusunda. Bir örnek vereyim: Yazdığımız kod kendi makinamızda çalışır ama production ortamında aynı şekilde çalışmaz (Benim makinamda çalışıyor sendromu). Peki bunun sebebi nedir? Determinism = State * Parallelism. Bizse non-deterministik; çalışması ortama bağlı olarak değişmeyen kod istiyoruz.

    Nasıl yapacağız?
    - Parallelism istenen bir şey olduğuna göre State’i ortadan kaldıracağız. Bu konuyu okurlara bırakıyorum, başka bir sohbette detaylarını anlatırım.

    Bir başka önemli katkı olarak applicative dillerde business logic kodun içinde kaybolmaz. Örnek:

    Java

    Scala

    Peki neden şimdi FP? FP esasında yeni bir şey değil. Ama bildiğiniz gibi Moore yasası doyuma ulaştı. Çekirdeklere daha fazla transistor sığdıramıyoruz. Bunun yerine çekirdek sayısını arttırıyoruz. Amacımız da bu çekirdekleri daha iyi kullanmamızı sağlayacak dilleri bulmak. FP dillerde state olmadığı için multicore’dan verim almak daha kolay. Elbette ki sürekli değişken yaratmanın yan etkileri var(bellek açısından) ama kullandığımız makinalarda en az 4GB RAM var. Bu konu dediğim gibi oldukça derin. Umarım cevabım biraz tatmin etmiştir sizi. Özetle FP yeni değil, eski ve değerli. Her alanda kullanılabilir. Web programlamadan, data mining ya da real-time sistemlere kadar…

  9. Scala, fonksiyonel programlama dillerinin en popülerlerinden biri olmakla beraber prosedürel ve nesne yönelimli programlama özelliklerini bir arada barındıran C++ diline benzer şekilde nesne yönelimli ve fonksiyonel programlama özelliklerini birlikte sunuyor. C++ oldukça başarılı olsa da hiçbir zaman prosedürel bir dil olan C dilinin önüne geçemedi. Nesne yönelimli diller konusunda zirvenin sahibi ise Java oldu. Sizce Scala bu bilgiler ışığında başarılı olabilecek mi?
  10. Object oriented programlamanın avantajı insan zihninin bir sorun karşısında olayı küçük
    parçalara ayırıp; detayları tek tek çözüp, sonrasında bunları birleştirebilme yeteneğini simgeliyor olması. Örnek olarak bir film sahnesinde cam ekran üzerinde aktörün bir treni tutup pek çok küçük parçaya böldüğünü ve sonra birleştirdiğini hayal edin.

    FP ise apayrı bir dünya. Bildiğiniz tüm tasarım kalıplarını bir kenara koyun, bir de fonksiyonlar ve recursion(özyineleme) ile yapabileceklerinizi.

    Bir soru: bana “while” control structure’ının kendisini OO bir dilde gerçekleyebilir misiniz? Scala’da gayet basit:

    Şu kodda bile High-Order Fonksiyonlar, Currying gibi kavramlar var ve bunlar applicative(kendini anlatıyor). Kısaca Scala ya da FP bir rakip değil aksine bir tamamlayıcı.

  11. Scala hakkında son zamanlarda, özellikle çok karmaşık olduğuna dair olumsuz yorumlar yayınlanıyor. Hatta bu yorumlar adeta bir karalama kampanyasına dönüşmüş durumda. Sizce yapılan yorumlarda doğruluk payı var mı? Scala gerçekten çok mu karmaşık?
  12. Evet Scala zor bir dil çünkü:

    - FP lisedeki biri için kolay, imperative dil bilen (Java, C vs) biri için çok zor.
    - Type oriented programming (Varyans, Covariant, Contravariant) karışık.
    - Implicit conversionlar ilginç.

    Sanki bu yeni bir gezegen bulmak gibi, keşfetmek için biraz zaman gerekiyor. Ama tadını alınca dünyaya geri dönmek istemiyorsunuz. Bir diğer problemse bu dünyada yalnız kalıyorsunuz. Bu açıdan eleştirilere katılıyorum. Düşünsenize ben kime, nasıl Scala anlatacağım, öğreteceğim ve birlikte ortak bir proje yapacağız?

  13. Sizce Türkiye’de gerek üniversiteler, gerekse kurumlar ve şirketler açısından fonksiyonel programlama dillerine gereken ilgi gösteriliyor mu?
  14. Kesinlikle hayır :( Pek çok üniversitede Scala ile ilgili seminerler verdim. Hocalarımızın çoğu dahil FP ne demek Türkiye’de bilinmiyor. Tüm gençlere aynı şeyi söyledim. Yurt dışında çalışmak mı istiyorsunuz? En az bir FP dili öğrenin.

  15. Türkiye’de bilişim sektöründe fonksiyonel dillerin payı ne orandadır? Bu konuda kendini geliştiren bir üniversite öğrencisinin sektörde kendine yer bulma şansı nedir?
  16. Şu anda Türkiye’de odaklanılan konu Web + DB programcılığı. Henüz hatırı sayılır real-time yazılımlarımız bile yok.

    İki örnek;
    - Uçakların inmesini kalkmasını sağlayan, sensor verilerini toplayan merkezi bir real-time sistem. FP ve Message Passing Concurrency (Erlang / Akka) için biçilmiş kaftan.
    - Kredi kartı alışverişi real-time data mining. Kim hangi sektörde ne oranda kredi kartı kullanıyor. Yine FP ve Data-Mining/Data-Flow için ideal.

    Bu konuda gençler Türkiye’yi değil yurtdışını düşünsün. Orada Haskell, Erlang ve Scala çok aranıyor.

    Bir de söyle bir yanlış anlama var. Genişleme daha çok makina demek değil. Aynı makinadan daha iyi verim almak demek. FP’ye bir de bu gözle bakmak lazım.

  17. Nesne yönelimli programlama dillerinden birine yeterince hakim bir geliştirici fonksiyonel programlama dillerinden birinde sizce ne kadar zamanda yeterli hale gelebilir?
  18. Hiç gelemeyebilir. İkisi apayrı, iki farklı dünya. Biri makinaların dünyası(Java, C altında assembly), diğeri matematiğin, kümelerin, monad, monoidlerin dünyası.

  19. Türkiye’de Scala eğitimi verdiğini bildiğiniz üniversiteler ya da kurslar var mı? Sizin bu konuda çalışmalarınız oluyor mu?
  20. Ben Scala ve FP eğitimi vermeyi çok istiyorum. Ama henüz böyle bir oluşuma ihtiyaç yokmuş gibi görünüyor. Keşke olsa…

  21. Play! Framework 2.0 çekirdeği radikal bir şekilde değiştirilerek Scala ile yeniden yazıldı. Bu konuda yorum yapmak ister misiniz?
  22. Evet Play!, Scala ile yeniden yazıldı. Nedenlerini sitesinde bulabilirsiniz. Yukarıda saydığım tüm nedenler orda var. Ayrıca FP ile yazılan kod çok daha basit ve elegant(asil) oluyor. Ne demek istediğimi FP yazınca anlayacaksınız.

    Play şu anda TypeSafe’e katıldı. Martin ve ekibi bu konuda çok iyi yoldalar. Özellikle Akka çok doğru bir şekilde Erlang temellerini Scala’da implement etti. 2000′li yıllarda Spring bir gün defakto standard olacak dediğimde kimse inanmamıştı, bugün herkes CV’sine Spring yazıyor. Aynı şekilde Akka(Message Passing Concurrency), concurrent programlama için defakto standart olacak diye düşünüyorum. Lütfen kayıtlara geçin :)

  23. Son olarak eklemek istediğiniz noktalar var mı?
  24. Ne yazık ki FP ya da Scala’yı Türkiye’de kullanırız diyemeyeceğim. Startup olgusu keşke bizde de oluşsa ve düşük maliyetli, cloud üzerinde çalışan Internet tabanlı uygulamaların sayısı artsa. Oyun sunucuları, bankacılık, sigorta sektorü, realtime engine’ler… Bunların hepsi için doğru adres FP, Scala ve Erlang.

    Teşekkürler.

Play! Framework önbelleğini güncel tutmak

Bu videoda veritabanı kayıtları güncellendiğinde Play! Framework önbelleğini de güncellemek adına iki farklı yöntem öneriyorum. Bu yöntemlerin ilki Model sınıfında save metodunu override etmek, diğeri ise JPA olaylarını dinleyen bir plugin yazmak. Uygulamanın kodlarına buradan erişebilirsiniz. İyi seyirler!

Güncelleme (11 Mart 2011)
Play! Framework Türkiye Google Grubu‘nda Ahmet Alp Balkan şöyle bir yorumda bulunmuş. Buraya da not düşmek istedim.

Bir noktada serializable alan metoda kabul ettirmek icin ArrayList olarak degistirmissiniz List olan bir variable’i. Neyin gelmedigini bilmediginiz durumlarda (ornegin JPA cogu metodu List donduruyor ama tipi soylemeyebiliyor, bu yuzden ArrayList yazamayabilirsiniz bu ornekteki gibi), butun list’leri (Serializable)’a guvenle cast edebilirsiniz, tum standard API List implementasyonlari serializable oldugu icin.



Play! Framework ile etkin önbellek yönetimi

Bu videoda Play! Framework önbelleğini etkin yönetebilmek adına bir yöntem öneriyorum ve veritabanı istatistiklerini 5 dakikada bir yenilenecek şekilde önbellekte tutan bir örnek veriyorum. Yöntemin eksiklerini ya da hatalarını gidermek üzere yorumlarınızı okumaktan memnun olurum. Uygulamanın kodlarına buradan erişebilirsiniz. İyi seyirler!



Play! Framework Türkiye mail listesinde konuyu tartışırken CacheManager sınıfını daha da iyileştirdik.

Controller içerisinden istatistiklere erişmek için aşağıdaki kod yeterli oluyor.