3 Nisan 2017 Pazartesi

Continuous Integration (CI) - Sürekli Entegrasyon


Sürekli Entegrasyon Nedir?

  • Bir proje üzerinde her değişiklik olduğunda, projeyi yeniden deploy->test->report aşamalarından geçiren bir sistemdir.
  • En temel kullanım amacı, işleri otomatikleştirmek ve değişimler ile gelen sorunlardan kurtulmaktır.
    • Projelere commitler geldiğinde bir bölüm diğer bir bölümü acaba bozdu mu diye tahminler yürütmenin önüne geçer. Her değişim direkt olarak test edilir.
CI Hizmeti Veren Yazılımlar?
  • Travis CI
  • Jetkins
  • Bambo

  • Github/Bitbucket gibi version sistemlerini destekler.
    • Projeye gelen her commit sonrası sistem tetiklenir ve testler yeniden çalıştırılıp rapor oluşturulur.
  • C/C++/Java/JS/Ruby ve daha bir çok dil için destek sunar.
  • Açık kaynak projeler için ücretsiz.

Travis CI Github İlişkisi
  • Github ile giriş yapın.
  • Gerekli izinleri onaylayın.
  • Github üzerinden projenize .travis.yml adında ayar dosyasını ekleyin.

.travis.yml 

  • python2.7 ve 3.5 için sürekli olarak pytest'i çalıştırır.

language: python
python:  - "2.7"
  - "3.5"
# command to run tests
script: pytest



Dahası için tıklayın.

25 Şubat 2017 Cumartesi

Asynchronous and Synchronous


Merhabalar, bu blog ta asenkron(eş zamansız) ve senkron(eş zamanlı) terimleri üzerine notlarımı yazacağım.

Önce terimleri haberleşme(serial communication) açısından ele alalım.

Asynchronous Communication

  • Taraflar belirlenen bir zaman aralığında veri gönderip alırlar.(Baud Rate:9600)
  • Taraflar arasındaki haberleşme zaman aralığı farklı ise anlamsız veri transferi olur.
  • Donanımsal olarak extra bir ihtiyaç yoktur.
  • Arduino serial asenkron haberleşmeye olanak sağlamaktadır.
  • Veri gönderim hızı düşüktür.
Synchronous Communication
  • Tasarlanması için donanımsal olarak bir clock gereklidir.
  • Clock sinyaline göre veri gönderilir ve alınır.
  • Design aşaması asenkrondan daha zordur.
  • Yüksek hızda veri gönderilebilir.
  • SPI(Serial Peripheral Interface) ve RS232 destekleyen yapılardır.
*RS232 Her iki bağlantı türünüde destekler.


Şimdide yazılım açısından bu terimlere bakalım.

Synchronous Software
  • Aynı anda sadece bir işlem yürütülür.
    • Örneğin C/C++ gibi dillerde kodlarımız tek tek, sırayla işlenir.
  • Bir işlem yürütülürken diğerleri bloklanır.

Asynchronous Software
  • Belirli zamanda birden fazla iş yapılması
    • Örneğin JavaScript te setTimeOut ile sistemi manipüle ederek asenkron kod çalıştırılabilir. 
    • AJAX(Asynchronous JavaScript and XML) yine bu şekilde çalışan bir kütüphanedir.
  • Bir diğer aşamaya geçmek için anlık durumun bitmesi beklenmez. Bloklama durumu söz konusu değildir.

Source: http://tutorials.jenkov.com/software-architecture/index.html


2 Şubat 2017 Perşembe

Java Properties Dosyası Kullanımı

Merhabalar uzun bir aradan sonra yeni öğrendiğim bir bilgi ile buradayım. Daha önceki yazılarda data source den bahsetmiştim. Hem data source hemde program içinde hard olarak string tutmak yerine tutulması gereken verileri bir x.properties text dosyasında tutarız.

Neden Properties Dosyası?
- Geliştirilen sistemin bağlı oldugu DB bilgilerinin değiştirilmesi durumunda tüm programın yeniden derlenmesinin önüne geçilmesi istenir.
- Run-time esnasında bir dosyadan veriler çekilir ve güncel veriler ile sistem işlemeye devam eder.


Kod parçası üzerinden gidelim şimdide. getPropertiesFromFile metodumuza önce properties dosyamızın adını vermemiz gerekli. Sade Intellij/Eclipse üzerinde çalışıyorsanız prop dosyasını src dizinine eğer Maven tabanlı proje oluşturduysanız resources dizinine atmanız gerekli.


  1. Bir properties objesi oluşturup daha sonra getClass() ile runtime objemizi çağırıyoruz.
  2. Ardından getClassLoader() ile class loaderimizi çağıralım(önceki yazılarda bahsedildi).
  3. Dosyamızı input stream objesi olarak resource/source dizininden okuyoruz.
  4. Properties dosyasını load metodu ile inputstream ile dolduruyoruz.
  5. Hata olmaması durumunda properties dosyamız artık return edilecektir.
Şimdide properties dosyası için test yapalım.

hmenn.properties dosyası










test kodumuz:


System.out.println("db username:" + getPropertiesFromFile("hmenn.properties").getProperty("database.username"));


Çıktımız ise şu şekilde olacak:
db username:hmenn

** Bu şekilde kodumuz içine herhangi bir bilgiyi girmeden(sadece dosya adı) dinamik bir şekilde istediğimiz verileri elde edebildik. Bir serveri düşünecek olursak bu tarz bilgilerin dosyalardan okunması çok verimli olacaktır.