Archive for the 'software development' category

Soyutlamalar

Oct 27 2017 Published by under java, software development

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 Published by under java, machine learning, python

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 Published by under machine learning, python

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

Spark ML’e Kategori Değişkenlerini Belirtme

Mar 08 2017 Published by under machine learning, scala, software development

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

TC Kimlik Numarası Doğrulama Kodu

Dec 15 2016 Published by under java, software development

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 Published by under java

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 Published by under machine learning, scala

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 Published by under scala, software development

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

Spring Boot 1.3’ten 1.4’e geçiş rehberi

Aug 22 2016 Published by under java, software development

28 Temmuz 2016 itibariyle Spring Boot 1.4 versiyonu yayınlandı. Bu versiyonla birlikte başta test altyapısı olmak üzere birçok değişiklik yayına alındı. Spring Boot 1.3’ten Spring Boot 1.4’e geçiş yapacaklar için bir rehber hazırladım.

Bağımlılıklar:

İlk olarak pom.xml veya build.gradle dosyasında Spring Boot versiyonunun 1.3.x.RELEASE ‘den 1.4.0.RELEASE‘e çekilmesi gerekiyor.

JPA:

Eğer JPA kullanılıyorsa @EntityScan notasyonunun paketi değişti. Kullanılan import’larda bu paket değişikliğinin yapılması gerekiyor:

Eskisi:

Yenisi:

Testler:

Eğer Spring’in test arayüzü kullanılıyorsa burada da kullanılan notasyonlar değişti. SpringJUnit4ClassRunner yerine SpringRunner geldi. @SpringApplicationConfiguration yerine de @SpringBootTest kullanıluyor:

Eskisi:

Yenisi:

Aynı zamanda assertj’nin versiyonu arttı. Burada da kullanılan assertThat metodunun paketi değişti:

Eskisi:

Yenisi:

Hibernate:

Hibernate 4’ten Hibernate 5’e geçildi. Bu büyük bir değişiklik ve eğer büyük problemler yaratırsa Hibernate geçiş rehberine göz atılabilir:

https://github.com/hibernate/hibernate-orm/blob/5.0/migration-guide.adoc

Spring Boot 1.4 Sürüm Notları:

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes

Comments are off for this post

Android’den Para Kazanma Sanatı – GDG Sunumu

May 05 2016 Published by under mobile, software development

GDG Kocaeli Üniversitesi etkinliğinde yaptığım “Android’den Para Kazanma Sanatı” isimli sunuma aşağıdaki linkten ulaşabilirsiniz:

AndroiddenParaKazanmaSanati

Comments are off for this post

Older posts »