Aylık arşivler: Eylül 2007

Regular Expression

Merhabalar,

Bugün yeni gelen bilgisayar masamın ÅŸerefine bir yazı yazmak istiyordum ama öyle boÅŸu boÅŸuna yazı yazamayacağım için arada sizlere regular expression’dan bahsetmek istiyorum :)

Öncelikle sizlerin de yazılım hayatınıza baÅŸlayalı 5~10 yılı geçtiyse artık etraf koddan geçilmez hale gelir. Her yerde baÅŸka kodlar, hepsinize siz yazmışsınızdır ama.. “kardeÅŸim ne yazmışım yaa, bu kadar da olmaz ki”.. dersiniz. Daha sonrasında kendinizi birÅŸeyler araken ve en önemlisi bulumazken bulacaksınız.. “ahh nereye koymuÅŸtum bunu salak ÅŸeyi..” dersiniz.. tekrar dersiniz.. ama bunu söylemenin bir etkisi yoktur, gene bulamazsınız.. gene bulamazsınız.

Ya da size bir iÅŸ verirler. RegEx (Regular Expression) kullanmanız gerekir.. Gerekir gerekir gerekmez demeyin. Örnek vermek gerekir ise, geçen gün Zodazone Türkiye’de belirli bir tabloda yer alan açıklama bilgilerini deÄŸiÅŸtirilmesi istendi üstlerden bir yerlerden (ne biliyim muhasebeden falan iÅŸte..).

Bize bir ofis dökümanı içerisinde tekil kod bilgisini ve yanında yeni açıklamasını gönderdiler.. Onlar oturmuÅŸ kasmış… hatta uÄŸraÅŸmış sabahlara kadar 150 civarındaki açıklamayı kafa patlatmışlar, düşünmüşler, taşınmışlar.. ve deÄŸiÅŸtirmiÅŸler.. Tabii ne zennetiniz sadece bunun için maaÅŸ alan adamlar bile mevcut.

Ehh tabii bu Tankut kardeÅŸiniz oturup, 150 tane açıklama alanını tek tek yapacak hali yok. Deli miyim ben :) söz meclisten dışarı efenim :) Neyse ÅŸimdi bu dökümanı gönderdiler ya içerisinde sadece açıklama bilgisi bulunmuyor ki, kim bilir hangi düzenle yazdılar bu dökümanı diye bir düşünün bakalım.. Regular Expression olmadan adım atamazsın adım….

Neyse öncelikle güzel güzel açıklayalım bu RegEx nedir, ne değildir ?
RegEx, karakter yığınları içerisinde özel belirtilen karakter veya karakter kümelerini bulmak, diğerlerinden ayırmak için kullanılan oldukça gelişmiş bir kütüphanedir. Kullanımı biraz zordur, hemen kısa sürede alışmanız zor olabilir.

Öncelikle RegEx tanımlarını ve anahtar kelimelerini tanıyalım; (Kitap yazmıyoruz burada ona göre.. tüm özelliklerini yazmıyorum sadece çok kullandıklarımı)

Anahtar kelimeler:
^ : Satır başını ifade eder.
\n : Enter karakteri için kullanılır.
\t : Tab karakteri için kullanılır
[…] : Örnek: [aeıioöuü] sadece sesli harfleri bulunur. ‘[]’ karakterleri içerisinde yer alan herhangi bir karaktere uyanları getirir.
[^…] : Örnek: [^aeıioöuü] sadece sessiz harfleri bulunur. ‘[^]’ karakterleri içerisinde yer alan herhangi bir karaktere uymayanları getirir.
. : Yeni satır (\n) karakteri hariç herhangi bir karakteri ifade eder. Tek karakteri
\w : Herhangi bir alfanumeric veya numeric karakteri iÅŸaret eder. a..z, A..Z, 0..9
\W : \w’nin tersidir.
\d : \d herhangi numeric karakter.
\D : \d’nin tersi.
\ : bir sonraki karakter özel bir anlam ifade ediyorsa, bu özelliği iptal eder.

Destekleyiciler
? : Bir önceki karakterden bir tane var ise bulur.
+ : Bir önceki karakterden bir ve birden fazla var ise.
* : Bir önceki karakterden 0 ve birden fazla var ise.
{n} : Bir önceki karakterden n adet olanları bulur.
(…) : Gruplama iÅŸlemi yapar. ‘()’ içerisine yazılanlar grup olarak deÄŸerlendirilir.
| : ‘OR’ iÅŸlemi için kullanılır, 2 farklı RegEx bu ÅŸekilde baÄŸlanabilir.

Opsiyonlar:
i : Büyük küçük harfe duyarlı olmaz.
m : Karakter katarını birden çok satırmış gibi düşünür.
s : Karakter katarını tek satırmış gibi düşünür.

Kolay gelsin.. :)

Hpricot Örneği

Merhabalar,

GeçmiÅŸ zaman olurki bir proje için internette yayınlanan videoların kaç kez görüntülendiÄŸini öğrenmek isteyen arkadaÅŸlar ile tanıştım, çok ısrar ettiler yaptım. Bazı siteler için süper basit ve hızlı olurken bazıları için uzun sürdü ama 5 site için görüntüleme bilgilerini 2 saat gibi uzun bir sürede yapmayı baÅŸardım. Öff bee çok uzun sürmüş harbiden… ÅŸimdi yazınca daha da uzun geldi… aman aman bir daha yapmam valla… bu nedenle sizler de tekrar tekrar uÄŸraÅŸmayın diye bu Tankut kulunuz bu yazıyı yazıyor. Sırf sizler için, reklamları tıklamanız için deÄŸil, adımı aÄŸzınızda sakız yapmanız için deÄŸil.. sadece siz uÄŸraÅŸmayın diye.. heyttt bee hizmet etmeye geldik diye siyasi bir yaklaşım içerisinde bulunan ve hiç birÅŸey yapmayanlar utansın..

Öfff öff gene gereksiz yazdım işte örnekler :)

Öncelikle bulduÄŸumuz gösterim sayılarını (view count) html veya “,” gibi karakterler ayırmak için bir methoda ihtiyacımız var. Ä°ÅŸte ‘remove_char’ methodu tam bu noktada isteklerimizi karşılıyor.

def remove_char(number)
  ret = ''
  number.to_s.split(//).each do |char|
    ret += char if char.to_i.to_s == char
  end
  ret
end

Öncelik google kardeÅŸimizin olsun, google kardeÅŸimiz video url’i aslında frame’lerden oluÅŸuyor. Ve gösterim sayısının (video view count) bulunduÄŸu frame’i üstün araÅŸtırmalarımın sonucunda buldum… :) url’de ‘videoplay’ yerine ‘videohosted’ yazıyorsunuz oldu bitti maÅŸallah :).

require 'open-uri'
require 'hipricot'

# Sassy Girl (Chun-Hyang) Episode 5
video_url = 'http://video.google.com/videoplay?docid=1197987351381288347'
google_video = Hpricot(open(video_url.gsub('videoplay','videohosted')))
temp = google_video.search("//table[@id='statsshowmore']")
google_video_view = Hpricot(temp.innerHTML).search("//td")
view_count = remove_char(google_video_view[0]).to_i
puts view_count

Sonraki örneÄŸimiz myspace’den olsun…

# Internet People!
require 'open-uri'
require 'hipricot'

video_url = 'http://vids.myspace.com/index.cfm?fuseaction=vids.individual&VideoID=2057681175'
myspace_video = Hpricot(open(video_url))
temp = myspace_video.search("//div[@class='userinfo']")
myspace_video_view = Hpricot(temp.innerHTML).search("//span")
view_count = remove_char(myspace_video_view[2]).to_i
puts view_count

Vur patlasın çal yahoo’dan gelsin örnek..!

# Eastern Promises
require 'open-uri'
require 'hipricot'

video_url = 'http://video.yahoo.com/video/play?vid=1145798&fr=&cache=1'
yahoo_video = Hpricot(open(video_site.url))
temp = yahoo_video.search("//div[@class='vd']")
yahoo_video_view = Hpricot(temp.innerHTML).search("//span[@class='bold']").inner_text
view_count = remove_char(yahoo_video_view).to_i
puts view_count

En son youtube kardeşe bakalım; ama bir saniye youtube kardeşle uğraşmaya gerek yok.. :)
“gem install youtube” yazın evinize gelsin :)

require 'youtube'

Kolay gelsin..

** Düzeltme kodlar muhtemelen artık çalışmıyordur. Sadece örnek olması açısından değerlendirin lütfen.

Dosya İşlemleri (Karşılaştırma)

Merhabalar,

Öncelikle karşılaştırma derken, nasıl bir karşılaştırma yapacağımızı anlatmalıyım. Performans işlemleri karşılaştırma kriterlerim içerisinde bulunmuyor, bundan hiç bahsetmeyeceğim. Ama kodun okunabilirliği, hızlı yazılması, hatalara karşı ne kadar duyarlı olduğu ve tabii ki en önemlisi tekrar kullanabilirliği.

Aslında bu son nokta yani ‘tekrar kullanılabilirlik’ baÅŸlı başına bir yazı konusu ama buna ÅŸimdilik pek deÄŸinmeyeceÄŸim. BaÅŸlıkta yazdığı gibi dosya iÅŸlemlerini karşılaÅŸtıracağım.

Arşılaştırmayı sadece VBScript, JScript ve Ruby arasında yapacağım, neden mi ? hali hazırda yapmıştım da ondan.. bu yazıyı yazacağım diye oturup program yazmadım. Önce programları yazdım, sonra yazıyı yazmak aklıma geldi. Bu nedenle neden diye sormayın. :)

Ama belki daha sonraki zamanlarda Java ve C# versiyonlarının karşılaştırmalarını da eklerim.

Öncelikle sizlere problemden bahsedeyim.

Belirli bir server üzerinde ps ve txt (post script ve text) dosyaları online bir uygulama tarafından oluÅŸturuluyor, daha sonrasında online uygulama üzerinden kullanıcı bu dosyaları temizlemeyi unutuyor ve dosya sisteminin ÅŸiÅŸmesi ile beraber performans problemleri ortaya çıkıyor. Bu nedenle dosyaların gün bazında ömürlerinin olmasına ve ömrünü doldurmuÅŸ olan dosyalarında sistem tarafından silinmesine, silme iÅŸlemi esnasında log almasını ve bu loglarında aynı ömür kuralına tabii olmasını istiyoruz… iÅŸte bu program bu iÅŸi yapacak.. günde bir kez çalışacak ve bu iÅŸlemi yapacak. Microsoft Windows sistemde çalışmasını istediÄŸimiz için VBScript ve JScript’de (JavaScript’in bire bir aynı klonu) ve platform bağımsız olan Ruby’de yazıldı. Ä°ÅŸte Ruby örneÄŸi;
Dosya Ä°ÅŸlemleri (KarşılaÅŸtırma) yazısına devam et