24 Temmuz 2015 Cuma

PROMOQUBE Yaz Stajı (for Ruby :D ) 


Aslında yaz stajlarının hiçbir zaman faydalı geçmediği bir şey yapılmadığı konusunda neredeyse herkes hem fikirdir. Hatta boş boş oturarak geçer 20 iş günü :) Benim geçen seneki yaptığım stajda aynen bu şekilde olmuştu o yüzden biraz akıllanmıştım. Bu sefer farklı olmalıydı bazı şeyler.

Bir gün yine Ruby çok öğrenme aşkıyla doldum ve Ruby-tr mail grubuna mail attım "Yaz için stajyer arayan var mı?" diye :) Geriye dönüşler oldu pek umudum yoktu ama her şey beklediğimin tersine gitti. Gayet güzel oldu her şey. Memnun kaldım stajımın sonunda. 

Ruby bilgim 2014 Akademik Bilişim'de 4 günlük eğtimde ne aldıysam o kadardı. Daha sonraları hoby olarak üstüne gide gide bir şeyler öğrendiğimleydi. 

Promoqube'de Ruby ile ilgili (bana göre) çok büyük işler yapmaya çalıştım. Her gün yeni bir şeyler öğreniyordum her öğrendiğimi yazıyordum. Unutmayayım kalıcı kalsın ileriki zamanlara da kalsın diye. Stajım böylelikle baya faydalı geçti. 

Uludağ sözlük için bir web parser yazdım. Staj bittikten sonra şimdiki hedefim bir türlü öğrenmeye cesaret edemediğim Rails'i öğrenmek :) Umarım onda da güzel şeyler yaparım ve Ruby ile çalışmalarıma devam ederim.

Staj yapıcak arkadaşlara tavsiyem; github hesabınızda birşeyler olsun en azından, blog yazmıyorsanız acilen bir şeyler yazın ve "Özgür Yazılım ulan!" diyin dikkat çekiyorsunuz zaten :) 

Çünkü staj mülakatında birçok konu üstüne konuştuk fakat karşımdaki insanların merak ettiği şeyler; "Python nerde öğrendin?" "Ne zamandır Ubuntu kullanıyorsun?" "Neden Özgür Yazılım düşünüyorsun?" ve anladım ki bu alanda gerçekten bir şeyler öğrenmek istedikçe kapılar her zaman açılıyor. En şaşırtıcı noktada en son soru olarak "Okulun neydi?" dediler bir kez daha anladım bizim meslekte okul ve nottan çok neyi yapabiliyor olduğunun daha önemli olduğunu.

Staj yapıyor olan ve yapacak olan arkadaşlara başarılar dilerim şimdiden :)

Son olarak meşhur Promoqube Logosu :)


23 Temmuz 2015 Perşembe

Ruby ile Kendimize Özel Gem Oluşturmak


Bu yazımda Ruby de kendi istediğimiz işlevleri programda yerine getiren bir gem oluşturmaktan bahsedeceğim.

Ruby çok sayıda büyüleyici ve kullanışlı kütüphanelere sahiptir, bir çoğu klasik gem dosyası olarak yayınlanmıştır. Diğer kütüphaneler kaynak kodunun .zip ya da .tar.gz arşivlenmişi olarak yayınlanır.

Şimdi öncelikle bir ekrana "Merhaba naber nasılsın :) " yazdıran ruby kodumuzu tasarlayalım.














Tamam şimdi bu işlevi yerine getirecek bir gem dosyamızı oluşturalım. Bunun uzantısı .gemspec olmalıdır. Onun kodu da aşağıdaki gibidir:
















Artık kodlarımız hazır. Terminali açıp aşağıdaki kodu yazdığımızda gem'i oluşturmuş oluyoruz.



Evet oluşturduğumuz gemi install edelim. Onu yapmak için konsola;

% sudo gem install ./merh-0.0.0.gem komutunu yazıyoruz.



Artık kendi oluşturduğumuz gem yüklenmiş oldu istediğimiz ruby koduna require ederek kullanabiliriz. Yapmamız gereken tek şey .rb uzantılı ruby kodumuzun başına;

>>  require 'merh' yazmaktır.

Ben bu işlemleri ilk öğrendiğimde çok keyif almıştım çünkü istediğimiz işleri yaptıran kendimize özel bir gem oluşturarak çok farklı şeyler yapabiliriz. Bu başlangıç olarak size örnek göstermek istediğim bir gemdi. Umarım ilgilenenlere faydalı olmuştur. 

13 Temmuz 2015 Pazartesi

Redis & Redis-rb


Redis: Veriyi key-value şekilde hafızada tutar. Açık kaynaktır. Redis geçici olan hiçbir şeyi veritabanında gereksiz yere yazmaz. Çeşitli veri yapıları kullanmaya izin verir. Yüksek performanslı cacheing mekanizmasına sahiptir. Veriyi RAM'de tutar ancak istenen aralıklarla veriyi diske kaydedebilir. Belirli periyotlarda aklında tuttuğu verileri bir dosyaya yazdığı için veri kaybı söz konusu değildir.

Memcached'den farklıdır. Memcached sadece veri girişi ve çıkışı yapar. Veriyi RAM'de tutar ancak veriyi dosyaya yazamaz.

Redis github üzerinde in-memory nosql veritabanıdır.
Kullandığı veri yapıları "string, hashes, lists, bitmaps vb."

Destekleyen diller; C, C#, C++, Clojure, Common Lisp, D, Dart, emacs lisp, Erlang, Fancy, Go, Haskell, haXe, Io,  Java, Lua, Node.js, Objective-C, Perl, PHP, Pure Data, Python, Ruby, Scala, Scheme, Smalltalk, Tcl.

Redis-rb


Yukarda Redis'i tanımladıktan sonra şimdi de Ruby'de Redis işlemlerinden bahsetmek istiyorum.

Her zaman olduğu gibi öncelikli olarak Redis'i require etmemiz gerekir:

>> require "redis"

Redis sınıfı tarafından Redise bağlanmak istersek:

>> redis = Redis.new

Eğer bir naklen serverı veya farklı bir porta bağlanmaya ihtiyaç duyarsak:

>> redis = Redis.new(:host => "10.0.1.1", :port => 6380, :db => 15)

Ayrıca özel bağlantı ayarları olan bir URL'ye bağlanabiliriz:

>> redis = Redis.new(:url => "redis://:p4ssw0rd@10.0.1.1:6380/15")

Bir Unix sokette redis dinlemek için bağlanabiliriz:

>> redis = Redis.new(:path => "/tmp/redis.sock")

Bir password korumalı redis örneğine bağlantı için:

>> redis = Redis.new(:password => "kerem3434")

-Redis sınıfı aynı isimlendirilmiş metodları dışa aktarır. Verilen komutlarla çalışırlar.
-Redis websitesinde özel olarak hazırlanmış argumentler kullanılır. Bakmak için tıklayınız.

Bunlara örnek olaran SET ve GET komutlarına bi bakalım.

>> redis.set("mykey", "kerem hallac")
# => "OK"

>> redis.get("mykey")
# => "kerem hallac"

Sentinel Support


Performansı otomatik üstlenme işini Redis Sentinel ile yaparız. Sentinele bağlanma;


>> SENTINELS = [{:host => "127.0.0.1", :port => 26380},
{:host => "127.0.0.1", :port => 26381}]

>> redis = Redis.new(:url => "redis://mymaster", :sentinels => SENTINELS, :role => :master)

-Redis stringler isadece değer olarak depolar. Eğer bir nesne depolamak istersek,  JSON require edip kullanmamız gerekmektedir.

>> require "json"

>> redis.set "foo", [1, 2, 3].to_json
# => OK

>> JSON.parse(redis.get("foo"))
# => [1, 2, 3]

Pipelining


Çoklu komutları sıralı bir şekilde çalıştırdığımız zaman, fakat bağımlı olmadan, pipelined çağırılabilir. Bu istemci bir sonraki komutun gönderilmesinden  önce ilk komutun cevabı için beklemez. 
Bunun avantajı çoklu komutlar gönderildiğinde dönüş yüksek hızlı bir çalışmada sonuçlanır.

>> redis.pipelined do 
>>     redis.set "foo", "bar"
>>     redis.incr "baz"
>> end

# => ["OK", 1]

Bir atomik oluşumda numaralı komutları çalıştırabilmek için MULTI/EXEC kullanılır. Pipeline çalışmasına benzerdir. Cevaplar multi metodu tarafından döndürülülür.

>> redis.multi do 
>>    redis.set "foo", "bar"
>>    redis.incr "baz"
>> end

# => ["OK", 1]

Bir şey yolunda gitmiyorsa exception çevirmeliyiz.

>> begin 
   redis.ping 
>> rescue Exception => e 
   e.inspect
# => #<Redis::CannotConnectError: Timed out connecting to Redis on 10.0.1.1:6380>

   e.message
# => Timed out connecting to Redis on 10.0.1.1:6380
>> end

Daha fazla bilgi için ---->> https://github.com/keremh/redis-rb

Redis hakkında söylemek istediklerim bu kadar umarım isteyen kişilere faydalı olmuştur. Son olarak Redis'in efsane fotoğrafıyla yazımı sonlandırıyorum :) 


10 Temmuz 2015 Cuma

Ruby ile Unit Testing

Yazılan bir Ruby kodunun nasıl test edileceğinden bahsetmek istedim. Bu test aşaması sonunda kodun çalışmasında sonuç olarak kaç tane iddia var, kaç tane arıza var,  kaç tane hata var, kaç tane atlama var bunların sonucuna ulaşmış oluruz.

Unit Testing: Yazılım programlamasında bir yazılım tasarımı ve geliştirme yöntemidir. Bu yöntemde yazılımcı yazılım kodunu oluşturan birimlerin kullanıma hazır olduğuna ikna olur.

Şimdi bir SimpleNumber isimli içinde iki sayıyı toplayıp çarpan iki tane metod bulunduran basit bir sınıf oluşturalım:
















Şimdi bu kodun doğruluğuyla alakalı bir test kodu hazırlayalım..











Bu yazdığımız Testi terminalde çalıştırdığımızda alıcağımız çıktı şu olucaktır:









Bu testin sonunda istediğimiz bilgilere ulaşmış oluruz.
Bize daha fazla bilgilerin vermesini isteyebiliriz bir Test sonucunun daha kompleks bir kod tasarlıycak olursak:















Bu Test kodunu çalıştıracak olursak alıcağımız çıktı şöyle olucaktır:
















Ruby'de bu Test aşamasını yukarıdaki kodlarda da kullandığımız birtakım assertionlarla sağlarız.


Onlardan birkaç tanesi bu şekildedir. Tablonun tamamına ulaşmak için tıklayınız.

Ruby ile ilgili yazmış olduğum Unit Test yazımın sonuna geldik. Okuyup vakit ayırdığınız için teşekkürler umarım faydalı olmuştur ilgilenenlere görüşmek üzere :)

3 Temmuz 2015 Cuma

Nokogiri ile HTML/XML Dökümanlarını Parsing İşlemi

Bir önceki yazımda bir web sitesini Request ve Respond işlemlerinin nasıl yapıldığından bahsetmiştim. Bu işlemlerin ardından o web sitesinde istediğimiz bir kısmı Parse etme işleminden bahsedicem bu yazımda. 

Nokogiri: Nokogiri bir HTML, XML, SAX ve Okuyucu Parserıdır. Ruby'nin Gem listinin içinde yer alır. Dökümanların çekimi sırasında CSS ve XPath ayırıcılarından yardım alır.

HTML: Web sayfalarını oluşturmak için kullanılan standart metin işaretleme dilidir.

XML: Hem insanlar hem bilgi işlem sistemleri tarafından kolayca okunabilecek dökümanlar oluşturmaya yarayan bir işaretleme dilidir.

SAX: XML dosyalarını olay tabanlı, sözcüksel işlemedir. Dosya içerisindeki her düğüm bir geri-besleme fonksiyonu aracılığı ile istemci koda yansıtılır.

CSS: HTML'e ek olarak metin ve format biçimlendirme alanında fazladan olanaklar sunan bir Web teknolojisidir.

XPath: XML dökümanındaki bir bilgiyi bulmak için kullanılan bir dildir. XML dökümanı içindeki elemanları ve onlara ait özellikleri incelemeye yarar.

Nokogiri Kurulumu:

Bu komutu terminale yazdığımızda nokogiri eğer yüklü değilse yüklemiş oluruz.



Kullanımı için gerekli 'require' işlemleri:

Kodun başına mutlaka nokogiri ve open-uri gem'lerini require etmemiz gerekir.





HTML dökümanını parse etme:






Bu komut ile verilen linkteki entry'i fetch etmiş oluyoruz. Sonraki adımda da bu entry içindeki yorumlardan istediğimiz birisini parse edeceğiz.
Parse etmeyi istediğimiz yorumun içinden bir kelimeyi seçip sağ tıklayıp "Öğeyi Denetle" deriz.

Burada işaretli kısımdaki id içeriğini altta gösterilen kod kısmında parametre olarak kullanırız ve o yorumun tamamını parse etmiş oluruz.






Bu kodun çıktısı olarakta artık o yorumu parse etmiş oluruz.









Bu işlemi bir döngü içinde başlık kısmına denk gelen id numarasından başlanarak arttıra arttıra giderek cevap alabildiğimiz entryleri parse etmemiz mümkündür. Ben bu işlemi CSS kullanarak yaptım bunun XPath ile yapılması da mümkündür tabiki. Fakat o kısımda pek bir bilgim olmadığından CSS'i tercih ettim.
Yine bu olayı ben HTML kullanarak yaptım bunun XML kullanarak bir dosyadan parse etmekte mümkündür. Aşağıda sizlere onun kodunu paylaşıyorum.







Bazı Parse Ayarları:


  • NOBLANKS: Boş nodeları siler
  • NOENT: Entitilerin yerine geçer
  • NOERROR: Hata raporlarını ortadan kaldırır.
  • STRICT: Kusurlu dökümanların parse edilidiği zaman bir hata yükseltir
  • NONET: Hiç internet bağlantısı olmadığında parse etme işlemini engeller.
Yukarıda ayarların kodda nasıl kullanıldığına bakacak olursak;







Bu yazımın da sonuna gelmiş bulunuyoruz okuyup vakit ayırdığınız için teşekkür ederim. Umarım birazcıkda olsa ilgilenenlere faydalı olmuştur. Sonraki yazılarımda görüşmek üzere :)