Soyutlamalar

Oct 27 2017

Yazılımcılar olarak bir iş mantığını daha hızlı ve kolay geliştirmek için çoğu zaman soyutlamalar (abstractions) kullanırız. Sık ve farklı istemciler tarafından kullanılan bir iş mantığını soyutlayıp istemcilerin işini kolaylaştırmaya çalışırız. Dar boğazımız “zaman kısıtı” ise soyutlama kullanmak çoğu zaman işe yarar ama dezavantajları da beraberinde gelir. Joel Spolsky “The Law Of Leaky Abstractions” başlıklı makalesinde TCP protokolü üzerinden örnek vererek her soyutlamanın mutlaka bir seviye sızdıracağından bahseder. Sızdırmaktan kasıt ise alttaki bir protokolün üzerine soyut bir protokol geliştirildiğinde, hala alttaki protokolle ilgilenme ihtiyacı duymamızdır. Soyutlamadaki alt katmana sızdıran delik ne kadar büyükse karmaşıklık o kadar artar ve işimizi kolaylaştırsın diye seçtiğimiz mantık ayağımıza dolanır. Ne soyutun avantajlarını yeteri kadar kullanabiliriz ne de onu çöpe atıp direk bir alt katmanı kullanabiliriz. Bunu ben en çok tam iki kat arasında kalmış bir asansöre benzetiyorum. Ne tırmanıp üst kattan çıkabilirsiniz ne de eğilip alt kattan. Sıkışıp kalırsınız.

Bu konuyu gündeme getirmemin sebebi yukarıda bahsettiğim gibi her gün bununla çok sık karşılaşmam. Örneğin Redis gibi bir bellek/veri tabanı kullanıyorsanız Redis’in komut satırından çalıştırabildiğiniz onlarca komut bulunuyor. Bu komutların ne iş yaptığını Redis’in kendi dokümantasyonundan net bir şekilde biliyorsunuz. Java programlama dili kullanıyorsanız Redis’e genellikle Jedis isimli istemci kütüphanesi aracılığıyla erişiyorsunuz. Burada bir seviye soyutlama bulunuyor zira Redis komutlarının küçük bir kısmını Jedis ile kullanamıyorsunuz. Bir de Jedis’in üzerine spring-data-redis gibi bir kütüphane daha kullanıyorsanız Redis komutlarının üzerine iki kat çıkmışsınız demektir. Operasyonlarda işiniz kolaylaştı fakat Redis’ten de iki kat uzaklaştınız. Varsayalım ki kullandığınız kütüphanelerden bir tanesi bir NullPointerException fırlatıyor. Buradan itibaren artık tamamen “Leaky Abstraction” kavramıyla karşı karşıyasınız demektir ve sorunun çözümü için ters mühendisliğe ihtiyaç duyacaksınız. Kat kat çıktığınız soyutlamaların sızdıran deliklerinden birer birer alt katlara ineceksiniz.

Örneğin spring-data-redis’in RedisOperations.java sınıfını açıyorsunuz ve şu şekilde bir kod dokümantasyonu göze çarpıyor:

“ Returns the operations performed on simple values (or Strings in Redis terminology) bound to the given key.”

Meali: Redis’teki basit operasyonları döner. Biz buna boundValueOps dedik ama bu aslında Redis terminolojisine göre String operasyonlarına karşılık geliyor.

Sızdıran delikten bir alt kata indiniz ve oradaki bir terimin aslında Redis’teki String operasyonları yaptığını öğrendiniz ve problemin karmaşıklığına göre en alt kata kadar inebilirsiniz.

Sonuç olarak biz yazılımcılar sürekli soyutlamaların sızdıran deliklerinden girip çıkıyoruz ve bu konuyu henüz çözebilmiş değiliz. Programlama tarihi de düşük seviyeden başlayıp en yüksek seviye programlama dillerine evrildi (Nesne yönelimli, belleği kendi yöneten diller). Hatta sürükle-bırak yaparak program yazılabileceğini iddia edenler dahi oldu. Bir takım donanım kısıtlarına gelindiğinde ise tekrar düşük seviye diller popüler olmaya başladı (Paralel programlama, Fonksiyonel programlama..vs.). Karşılaştığımız problemlere ve dar boğazlara göre ömrümüz kat kat soyutlamalar arasında inip çıkmakla geçecek gibi görünüyor. 🙂

Yazıya medium’dan da erişebilirsiniz: https://medium.com/@yyenigun/soyutlamalar-478437b70144

Comments are off for this post

H2O ile Yapay Zeka Geliştirme

Jul 19 2017

iyzico’da yaptığım H2O ile Yapay Zeka Geliştirme sunumuna aşağıdaki linkten erişebilirsiniz:

https://www.slideshare.net/YalnYenign/ai-development-with-h2oai

Not: Sunum İngilizce’dir.

 

Comments are off for this post

H2O ve Python ile Makine Öğrenmesi Modeli Oluşturma

May 27 2017

H2O (https://www.h2o.ai/h2o/) makine öğrenmesini kolaylaştıran ve en önemli özelliği hafif  (lightweight) olması ve az kaynak tüketmesi olan bir yapay zeka kütüphanesidir. Kendi içinde barındırdığı dağıtık bellek (in memory distributed k/v store) sayesinde makine öğrenme modellerinin eğitilmesi bir hayli hızlı olmaktadır zira belleğe her bir erişim ortalama 150 nanosaniye sürmektedir (NonBlockingHashMap için). Yine kendi içerisinde bulunan ve yine hafif (lightweight) olan MapReduce katmanı sayesinde milyonlarca satırı paralel olarak işleyebilir.

H2O ile bir modeli eğitip ardından modeli bir java sınıfı (POJO) olarak kaydedebilirsiniz. Böylece eğittiğiniz modeli istediğiniz sunucuya sadece java bağımlılığıyla yükleyebilirsiniz.

Bunu Python, Pandas ve H2O üçlüsü ile yapmak için:

 

Referanslar:

https://github.com/h2oai/h2o-tutorials/blob/master/tutorials/gbm-randomforest/GBM_RandomForest_Example.py

https://blog.h2o.ai/2014/03/h2o-architecture/

http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_sql_query.html

https://groups.google.com/forum/#!msg/h2ostream/DCBG9auR2qw/bKEiGBeJBwAJ

Comments are off for this post

Plotly ve Python ile 3D Veri Görselleştirme

Apr 21 2017

Plotly (https://plot.ly/) bir veri görselleştirme kütüphanesi. Birden fazla programlama diliyle veriyi iki boyutlu veya üç boyutlu görselleştirme arayüzleri sunuyor. Bulut ortamında da görselleri kaydetme imkanı sağlıyor.

Screen Shot 2017-04-21 at 19.06.07

Python ile yukarıdaki gibi üç boyutlu bir grafik çizmek için ilgili X, Y ve Z değerlerini vererek aşağıdaki python kodunu kullanabiliriz. Aşağıda daha önce Pandas ile oluşturulmuş bir DataFrame’den (transitDataFrame) iki farklı etikette veri alınıp görselleştirilmiş. Burada transitDataframe.label bölümü veri filtrelemeyi, head fonksiyonu ise ilk 2000 değeri getirmeyi sağlıyor. İki farklı etikette görselleştirme için iki farklı Scatter3d ‘yi veri olarak notebook‘a vermek gerekiyor.

 

Comments are off for this post

Spark ML’e Kategori Değişkenlerini Belirtme

Mar 08 2017

Spark ML’de sınıflandırma algoritmalarını kullanırken iki tip değişkeniniz vardır: Sürekli Değişkenler ve Kategori Değişkenleri. Sürekli değişkenler, değerin kendisinin ve değişimlerinin (artma veya azalma) sizin için önemli olduğu değişkenlerdir. Kategori değişkenleri ise sınıfsal değişkenlerdir.  (maksimum x farklı değer alabilirler.)

Algoritmanızı geliştirirken sürekli değişkenler ve kategori değişkenlerini birbirinden ayırmanız gerekmektedir. Bunun için Spark ML’de VectorIndexer sınıfı kullanılır.

İlk olarak kategori değişkenlerinizi bir Vector’de tutarsınız:

Ardından maksimum alacakları değer çeşitliliğine göre VectorIndexer sınıfını kullanarak bu değerlerinizi index’ler ve maksimum değer sayısını Indexer’a parametre olarak verebilirsiniz.

Bu alanlar artık kategori değerleri olarak index’lenmiştir ve Spark Pipeline’ına ekleyebilirsiniz:

Referans:

https://spark.apache.org/docs/latest/ml-features.html#vectorindexer

Comments are off for this post

Building a Data Driven Product with Machine Learning

Jan 29 2017

Garaj oluşumu için KWorks’te yaptığım “Building a Data Driven Product with Machine Learning” sunumuna aşağıdaki linkten ulaşabilirsiniz.

http://www.slideshare.net/YalnYenign/building-data-driven-applications-with-machine-learning-71497185 

Comments are off for this post

TC Kimlik Numarası Doğrulama Kodu

Dec 15 2016

TC Kimlik Numarasını doğrulamak istiyorsanız Java ile geliştirilmiş örnek kodu aşağıda bulabilirsiniz:

 

Comments are off for this post

Jackson’da “Primitive Serialization” Problemi

Dec 09 2016

Bir nesneyi JSON’a ya da XML’e “serialize” ederken değişkeninizin tipi boolean ise ve Jackson kütüphanesi kullanıyorsanız değişken ismini verirken dikkatli olmanız gerekiyor. Eğer değişken isminizi isWhite ise ve primitive ise bazı IDE’lerin bazı versiyonları o değişkenin getter metodunu isWhite() olarak üretiyor. Jackson kütüphanesi isWhite() isimli bir getter görünce onu JSON nesnesinde white olarak bekliyor.

Eğer client’ınızda da JSON’ı isWhite olarak göndermeye çalışırsanız  o değişken sunucuya ulaşmaz. Sunucuya ilk değeri false olarak gider.

Bunun çözmek için @JsonProperty notasyonunu kullanabilirsiniz. Ya da boolean değişkenleri primitive olarak kullanmazsınız.

 

Comments are off for this post

PredictionIO kullanırken Spark’a Parametre Geçmek

Oct 25 2016

Apache PredictionIO bir çok şeyi kolaylaştıran açık kaynak kodlu bir “Machine Learning” sunucusudur. Alt yapısında SparkML ve Spark kullanır. PredictionIO ile modeli eğitirken veya test ederken Spark’a parametre geçmek için — işaretini ilgili parametrelerin başına aşağıdaki gibi koymak yeterlidir. spark-submit’e verilen değerler parametre olarak geçer:

Örnek:

 

 

Comments are off for this post

SBT Offline Build

Oct 19 2016

Scala ile kod geliştiriyorsanız kodu derlemek ve bağımlılık yönetimi için SBT kullanmanız gerekiyor. Yeni bir bağımlılığa ihtiyacınız yoksa ve internete bağlanmadan tekrar kodunuzu derlemek istiyorsanız build.sbt dosyanıza aşağıdaki parametreleri eklemeniz yeterli olacaktır.

Comments are off for this post

Older posts »