Tankut Şentürk

Ruby ile POP3 ve SMTP

Merhabalar,

Önceki yazımızda Ruby ile FTP ve HTTP‘den bahsetmiş ve bu konuda birkaç Örnek yapmıştık. Bununla beraber Ruby’nin ağ yetenekleri içerisinde POP3, SMTP gibi elektronik posta ile ilgili yüksek seviyeli sınıfların varlığından da bahsetmiştik. Başlıktan da anlaşılacağı gibi, bu yazımızda sizlerle beraber POP3 ve SMTP konularına değineceğiz. Kendimize güzel ve popüler birkaç sorun bulup bu sorunları çÖzmeye çalışacağız.

Öncelikle POP3 protokolü ile herhangi bir elektronik mail sunucusu ile haberleşme konusunu inceleyelim, sonrasında SMTP protokolü ile ilgili Örneğimize geçiş yaparız.

POP3 protokolü ile ilgili popüler bir sorun olarak; WordPress‘i Örnek verebiliriz. Şimdi “ne alakası var kardeşim” diyeceksiniz, demeyin :) biraz sabredin.. :) WordPress’in güzel bir yeteneği var, belirli bir e-posta adresini kontrol edebiliyor, eğer bu e-posta adresine bir e-posta gelmiş ise, bu e-postanın içeriğini bir yazı olarak yayımlıyor… :) güzel bir Özellik değil mi, peki biz bunu Ruby’de nasıl yaparız ? İşte asıl soru bu.
Continue reading…

Wiki Kurulumu

Merhabalar

Geçen günlerde bir projenin dÖkümantasyonunu nasıl yapacağımıza dair tartışma halindeyken artık Office uygulamalarından daha teknolojik programları kullanmaya karar verdik. Bu programlara Wiki adını verdiklerini biliyoruz. En gelişmiş versiyonlarından olan MediaWiki ile Wikipedia‘nın yapılmış olduğunu, binlerce insana hizmet veren çok güzel bir uygulama ortaya çıktığını biliyoruz.

Daha sonra internette araştırmalar yapmaya başladım, insanlar ne yapmış, Wiki dünyasında işler nasıl yürüyor.. vs. Bu gibi soruları sora sora sonunda WikiMatrix‘i buldum. Gerçekten çok güzel bir uygulama yapılmış Özellikle arama bÖlümü gerçekten çok güzel hazırlanmış, arkadaşları tebrik etmek gerekir.

Sonuçta biz bir takım olarak dÖkümantasyon işlerini yürütecektik ve buna uygun bir uygulama aramaya koyulduk, birçok alternatife baktıktan sonra gerçekten en iyisinin (yazının yazıldığı tarihlerde) MediaWiki olduğuna karar verdim. Gerçekten iyi bir uygulama.

Fakat bir de Pimki var. Ruby’de yazılmış, instiki tabanlı, çok güzel bir uygulama, pek şirin ve gem ile kurulumu “gem install –include-dependencies pimki” kadar basit.

İkisi arasında uzun süre kararsız kaldım, daha sonra MediaWiki‘nin yorum yazma yeteneği beni tavladı ve bu uygulama ile dÖkümantasyon işlemlerine başladık. Makinamda halen Pimki kurulu, ufak tefek uygulamarı kesinlikle daha hızlı dÖkümante edeceğiniz kesin. Umarım vaktim olurda yorum ekleme mekanizmasını Pimki‘ye eklerim.

Kolay gelsin :)

Ruby ile FTP ve HTTP İşlemleri

Merhabalar,

Bugün yazımızda Ruby’nin ağ(network) ve genel ağ(web) kütüphanelerini inceleyeceğiz. Bu kütüphaneleri, mail gÖndermek, ftp ile başka bir makinaya dosya kaydetmek, herhangi bir başka web sitesininden bir sayfayı okumak veya düşük seviyeli (socket bazlı) işlemler yapmak için kullanabiliriz.

Bu yazımda, tabii sizlerde izin verirseniz, düşük seviyeli bağlantılar (Socket, BasicSocket, IPSocket, TCPSocket, SOCKSSocket.. vb.) yerine, yüksek seviyeli bağlantılardan HTTP ve FTP’yi incelemek istiyorum. Özellikle bu tür yüksek seviyeli bağlantılar için Ruby’nin gerçekten güçlü silahları vardır, bu silahlar ile pek çok uygulamayı zorlanmaksızın yazabilir, pek çok problemini kolayca çÖzebilirsiniz.
Continue reading…

Ruby ile Dosya İşlemleri

Merhabalar,

Bugün ruby’de dosya işlemleri ve ‘standart input/output’ olarak bildiğimiz konuyu işleyeceğiz. Öncelikle çok basit bir Örnek verelim, ekrandan isim ve yaş bilgilerini alarak tekrar ekrana yazalım. Ve bunu yaparken tüm bu ‘input/output’ işlemlerine Örnek vermiş olalım.
[ruby]
$stdout.sync = true # İşlemleri yaparken buffer kullanmaz, verilen işlemi anında yapar.

p “Lütfen adınızı giriniz: ”
name = gets.chomp # gets ile kullanicidan herhangi bir string (get’s’) bilgisi alınır.
print “Lütfen yaşınızı giriniz: ”
age = gets.chomp.to_i # chomp işlemi ile girilen son karakter çıkarılır, bÖylece enter karakteri işleme alınmaz.
puts “Lütfen kendiniz hakkında birşeyler yazın: ”
descr = readline.chomp # Birkaç satır bilgi almak için kullanılır(mış).

# C dilinde kullanılan bir yazım tekneği
printf “Merhaba %s, %i biraz yaşlanmışsınız.\n%s\n”, name, age, descr
[/ruby]

Bir sonraki aşamada Ruby’nin dosyalar üzerindeki işlemlerine değinelim. Öncelikle ruby’nin dünyasında herşeyin nesne olduğunu unutmayalım. Eğer bir dosya açacaksak, bu kesinlikle bir sınıf ile eşleşmeli ve işlemleri bu sınıf üzerinden yapmalıyız.
Continue reading…

Ruby’nin Çalışma Zamanı

Merhabalar,

Bugünkü konumuz biraz daha ruby on rails’e yaklaşmak, ruby’nin dosyalar, çalışma ve tasarım zamanları ile ilgili bir kaç bilgi vermek olacak.

Öncelikle bir konudan bahsetmek istiyorum, diğer birçok dilde çalışma zamanı ile tasarım zamanı birbirinden farklı ve ayrı kavramlardır. Örneğin C#’da programınızın derlenmesi ve çalışması ayrı zamanlarda gerçekleşir. Fakat Ruby’de bu kavram arasında herhangi bir fark yoktur. Ruby’de tasarım da, çalışma da aynı temellere dayanır, ikisi arasında hiçbir fark yoktur. Evet çok sert bir kavram ama sanırım bir Örnek yaptıktan sonra daha rahat anlaşılacaktır.
Continue reading…

Ruby’de Modül Yapısı – 2

Merhabalar bir Önceki yazımızda module kavramına değinmiş ve basit anlamda kullanımını işlemiş be bu yazımızda da çok güzel bir mudule mixin Örneği olduğunu sÖylemiştik. Şimdiki yazımızda Module kavramını daha da derinden işleyeceğiz.

Öncelikle module ile class arasındaki farktan bahsedelim. Evet fark diyorum çünkü sadece bir-iki küçük fark var. Elbette temelde birbirinden çok farklı yapılar ama, son kullanıcı yani bizler için aralarındaki fark at ile deve değil.
– class’ların anlık kopyaları olabilir, module’lerin olamaz.
– class’ların içerisinde module’ler olamaz, module’lerin içerisinde class’lar olabilir.
– class’lar ve içlerindeki Öğeler protected, private gibi erişim denetleyici Özelliklere sahip olabilirler, module’ler sahip olamazlar, tüm Öğeleri public’tir.
Continue reading…

Ruby Modülleri (Ruby Modules)

Merhabalar,

Bugün Ruby’nin çok güçlü olduğu bir konuya değineceğim, modüller. Özellikle çok büyük uygulamalar yazarken, bazı durumlarda ‘Object Oriented’ tasarım yaklaşımının sınırlarını zorlamak gerekir. Günümüzdeki pek çok programlama dilinde olduğu gibi Ruby’nin tasarımcıları da ‘multiple inheritance’ kavramını desteklememiştir. Fakat bu Özelliğin bulunmaması elbetteki bazı kısıtlamaları beraberinde getirmiştir. Bu engelleri ortandan kaldırmak için modüllerin kullanımı ve Özellikleri arttırmış ve sonuçta ortaya çok güzel bir yapı ortaya çıkmıştır.

Aslında ‘module’ kavramı Ruby dili içerisinde pek çok alanda kullanılabilir. Bir modül ‘static’ bir sınıf gibi davranabileceği gibi, bir ‘namespace’ gibi de kullanılabilir. Tüm bu kullanım alanlarına ek olarak sınıfların genişletilmesi için kullanılır ki, bu gerçekten çok güzel bir Özelliktir.
Continue reading…

Yazılım Alt Yapıları (Software Frameworks)

Merhabalar,

Yazdığımız programlar büyüdükçe, eğer herhangi bir methodoloji kullanmıyor isek, değişiklik veya eklenti yapmak gittikçe zorlaşır. Yazılımcılar, bu tür problemleri aşmak için “framework”ler üretmeye başladılar. Günümüzde, “framework” deyince çok geniş bir yelpaze karşımıza çıkmakta. Bu geniş yelpaze içerisinde istenilen Özelliklere uygun bir yapı bulmak gittikçe zorlaşmakta. Belki bu yelpazeyi biraz olsun daraltmak ve kategorilere ayırmaya çalışırmak bu konuda bizlere yardımcı olabilir. Bu nedenle normal dillerde olduğu gibi düşük, orta ve yüksek seviyeli gibi terimler kullanmak belki bizlere yardımcı olabilir.

Düşük seviyeli “framework” lerin tanımını yapacak olursak; “Bu tipte yer alan yapıların, kendi derleyicileri ve/veya çalışma ortamları yoktur. Herhangi bir kum havuzunda değil, tüm makina üzerinde çalışırlar”. Bu yapılara Örnek olarak TCL(Think Class Library), MFC(Microsoft Foundation Class veya orjinal adı ile AFX: Application Framework eXtensions), ATL (Active Template Library), WTL (Windows Template Library) ve OWL (Object Windows Library) yapıları verilebilir.

Orta seviyeli “framework” lerin tanımını yapacak olursak; “Bu tipte yer alan yapıların, kendi derleyicileri, kendi çalışma ortamları mevcuttur. Kısaca bir kendilerine ait olan bir kum havuzunda çalışırlar. Bununla beraber dış dünyaya erişmek için kum havuzunun dışına çıkan yetenekleri de olabilir.” diyebiliriz. Bunlara Örnek vermek gerekir ise; Java, .NET, Ruby, Python, PHP gibi dilleri Örnek verebiliriz. Hemen aranızdan bazılarının itiraz ettiğini duyar gibi oldum “Java ile .NET diğerlerinden farklı.. onlar derleniyor… diğerleri script dilleri bir fark olmalı.”. Evet belki ‘derleyici mühendisliği’ açısından farkları olduğu açık ama son kullanıcı için yani, bu yapıları kullanan yazılımcılar için bir farka sahip olduklarını sÖylemek çok zor.

Java ve .NET gibi yapılar bizim yazdığımız kodları ortak bir başka dile belirli optimizasyon yÖntemleri kullanarak çevirir (Örneğin MSIL) ve daha sonra çok esnek ve profesyonel bir ‘cache’ mekanizması ile yazdığımız programlar bu framework’ler tarafından çalıştırılır. Diğer taraftan script dilleri olarak yorumladığımız Ruby, Python ve PHP gibi diller başka bir dile çevrilmezler, ‘cache’ mekanizmaları da yoktur. Ama bu diller de aynı Java ve .NET gibi framework’ler tarafından çalıştırılır. Yani Ruby, Python ve PHP gibi script dilleri ile .NET ve Java gibi diller arasında başka bir dile çeviriliyor olmaları ve ‘cache’ yetenekleri dışında bir fark yoktur. Günümüz yazılım dünyasında ise, Özellikle hafıza, hız gibi kısıtlamaların gittikçe kalktığı bir yazılım dünyasında bu tür farklardan dolayı ayrı kategorilerde yer almak sanırım tüm bu dillere karşı bir haksızlık olur.

Yüksek seviyeli “framework” lerin tanımını yapacak olursak; “Bu tipte yer alan yapıların, kendi derleyicileri yoktur fakat bir kum havuzu üzerinde çalışırlar. Yani bir orta seviyeli framework’ün üzerinde belirli bir methodoloji ile yazılmış yapılardır” diyebiliriz. Örnek vermek gerekir ise; Ruby on Rails, Pylons, TurboGears ve hiç adını duymasam da wikipedia’da karşıma çıkan ‘ColdFusion on Wheels’ Örnek olarak verilebilir.

Sonuç olarak; eğer bir makina otomasyonu yapacaksak, düşük seviyeli bir “framework” seçmek, bir internet uygulaması yapacak ise, orta veya yüksek seviyeli bir framework seçmek daha doğru olacaktır. Ama gerçekten az kişi ile çok büyük (Özellikle internet) uygulamalar yapmak istiyor isek, yüksek seviyeli “framework”lerden başka çaremiz olmadığı bir gerçektir.

Kolay gelsin :)

Ruby ile Başlangıç – Hata Yakalama – 2

Marhabalar,

Daha Önceki yazımızda belirttiğimiz hata yakalama sizlere yetmemiş olabilir. Bazı durumlarda tüm bu hata yakalama işlemlerinden daha sert bir şeye ihtiyacınız olabilir. İşte bu yazının yazılma nedeni bu :)

Bir Önceki yazımızda, diğer dillerde yer alan try..catch..finally kavramını tamamen destekleyen hatta fazlasını veren begin..rescue..else..ensure kavramı ile tanışmıştık. Daha fazla bilgi için.

Bu yazımızda daha Önceden de belirttiğimiz gibi daha sert bir kavramı inceleyeceğiz.
catch..throw
Hemen Örneğimizi verelim;
[ruby]
$stdout.sync = true
catch (:hata_test) do
begin
field = gets.chomp
throw :hata_test if field.index(“hata”) == 0
puts “Hata bulunamadı..”
end while 1 == 1
puts “Bu bÖlüm hiç işlenmeyecek.”
end
puts “Hata üretilmeden ‘catch’ bloğundan çıkıldı..”
[/ruby]
Ruby programınızı çalıştırırken, throw deyimine rastladığında, en yakın uyumlu* catch‘e kadar yukarı çıkar. Ve catch bloğunun işlenmesini sona erdirerek, bu bloktan sonraki kodları işlemeye başlar.

*throw deyimine parametre olarak bir deyim veya String verilebilir. Eğer bu parametre verilir ise, bu parametreye uygun olan catch yakalanmaya çalışır.

Eğer throw deyimi nedeni ile yukarıya doğru giderken herhangi bir catch bulunamaz ise, `in throw’: uncaught throw `hata_adı’ (NameError) şekilde bir hata ile programımız sonlanır.

GÖrüldüğü gibi, begin..rescue..else..ensure deyimi gibi, catch..throw deyimini çeşitlendirmek pek kolay bir yÖntem değil. Bu nedenle çok zorda kalmadığınızda kullanmayın. Ama sert ve keskin bir biçimde programın işlenmesini kesmek ve/veya yÖnünü değiştirmek istediğiniz kullanabilirsiniz.