Ruby ile KyotoCabinet – 4

Merhabalar,

Bir KyotoCabinet yazısına daha hoÅŸgeldiniz. Bugün sizlerle MySql’in 100 thread üzerinden “insert” yetenekleri ile kyoto cabinet’inkileri birbirleriyle karşılaÅŸtıracağız. Peki bunu neden yapıyoruz, çünkü bir önceki yazımızda tek thread üzerinden kyoto cabinet üzerine veri yazma iÅŸlemi mysql’a göre ~10 kat daha hızlı olduÄŸunu gördük.

Bu durum, tüm transactional tablolarımızı kyoto cabinet’e taşımamıza neden olmasa bile, yazılım geliÅŸtirirken kullandığımız bir çok “log” tablolarını taşımamızın kapısını aralar diye düşünüyorum. Yazılım geliÅŸtirirken bu kayıtları için bir log tablosuna veya dosyaya yazarız. Fakat dosyaya attığımız kayıtları tekrar okumak veya istediÄŸimiz kayıda eriÅŸmek istediÄŸimizde problemlerle karşılaÅŸtığımız için genelde “log” tablolarını tercih ederiz. Ä°ÅŸte bu tercihlerimizde, eÄŸer bu testten de baÅŸarı ile geçerse, log iÅŸlemleri için (hatta belki daha fazlası için) mysql yerine kullanılabilir.

Veya tecrübe ile sabit, web sistemlerinin session yönetimi ve loglaması için kullanılabilir. Aklınıza bir soru gelebilir, çünkü session tablosunda sorgu atmak için kullandığımız tek alan SessionId’dir. Yani ID üzerinden yapacağımız tüm iÅŸlemlerde bu veri tabanı yapılarının klasik veri tabanı yapılarına göre çok daha hızlı olduÄŸunu unutmayalım.
Ruby ile KyotoCabinet – 4 yazısına devam et

Ruby ile KyotoCabinet – 3

Merhabalar,

Bir önceki yazımızda Ruby üzerinden KyotoCabinet’e 1.000.000 (1 milyon) veri giriÅŸini çok kısa bir sürede tamamlamıştık. Daha sonra içime bir kurt düştü, acaba mysql’de durum nasıldı? Yani aynı koÅŸullar altında mysql veri tabanına 1.000.000 kayıdı kaç sn içerisinde yazabilecektim?

Makinanın özelliklerini bir önceki yazımızda vermiştim.

Bu iÅŸlemin testi için öncelikle kendimize oldukça hızlı olduÄŸuna inandığım, KyotoCabinet’in Ruby arabiriminde olduÄŸu gibi C dili ile yazılmış MySQL/Ruby bir arabirim kütüphanesi buldum ve 2.8.2 versiyonunu kurdum. Bununla beraber MySQLClient versiyonunun 5.1.41 olduÄŸunu söylemeliyim.

Daha sonra key, value tutacağımız bir veri tabanı oluşturdum. Öncelikle MyISAM motorunu kullanan bir tablo oluşturdum ve testlerimi bu tablo üzerinde yaptım.

CREATE TABLE `kyoto_cabinet`.`simple_table` (
  `key` CHAR(12) UNICODE NOT NULL,
  `value` CHAR(12) UNICODE NOT NULL,
  PRIMARY KEY (`key`)
)
ENGINE = MyISAM
CHARACTER SET utf8 COLLATE utf8_turkish_ci;

Ruby ile KyotoCabinet – 3 yazısına devam et

Ruby ile KyotoCabinet – 2

Merhabalar,

Bir önceki yazımıza kaldığımız yerden devam ediyoruz. Bu sefer Kyoto Cabinet’in insert (kayıt ekleme) performansını inceleyeceÄŸiz.

Öncelikle bu bir performans çalışması olduğu için makinamın özelliklerini verelim;
– 2 x AMD Athlon x64 3800+
– 2 G Ram
– Ubuntu 10.04 LTS
– FileSystem ext4
– Ruby 1.8.7 (2010-01-10 patchlevel 249)
– KyotoCabinet 1.2.2
– KyotoCabinet ruby kütüphanesi 1.14

En azından bu özelliklerle yapılan bir test sizleri kodu kendi makinanıza alıp denemeniz için cezbedebilir. Sonuçta bir önceki yazıdan kurulum işlemleri uygulayıp sonrasında aşağıda belirteceğim kod parçasını uygulayacaksınız. Sonuçları benimle paylaşabilirsiniz.

require 'kyotocabinet'
include KyotoCabinet

DB::process('subscribers.kch') { |db|
  # resmi sitede yer alan örneklerde set_encoding olarak gösteriliyor fakat aslında tune_encoding olmalı.
  db.tune_encoding('utf-8')

  # Telco sektöründe çalıştığımız için, numara bir MSISDN'e benziyor degil mi :)
  start_number = 905000000000

  start_time = Time.now
  puts "sira;gecen_sure;toplam_gecen_sure"
  100.times { |index|
    first_loop_start_time = Time.now
    10000.times {
      start_number += 1

      # Evet alt satirda KyotoCabinet üzerinde "Insert" islemi yapıyoruz.
      db[start_number] = start_number
    }
    loop_elapsed = Time.now.to_f - first_loop_start_time.to_f
    total_elapsed = Time.now.to_f - start_time.to_f
    puts index.to_s + ";" + loop_elapsed.to_s + ";" + total_elapsed.to_s
  }

  puts "1.000.000 kayit eklenmistir. Toplam süre: " + (Time.now.to_f - start_time.to_f).to_s
}

ruby kyoto_test01.rb > output.csv ile çalıştırırsanız çıktı dosyasını bir office programında açar ve performans analizinizi daha hızlı yapabilirsiniz. Unutmadan uygulamayı Netbeans veya Scite gibi editörlerin üzerinden çalıştırmayın toplamda benim makinamda 3 sn gibi fazlalıklara neden oldular.

İşte benim makinam üzerindeki sonuçların bir özeti;
Ruby ile KyotoCabinet – 2 yazısına devam et

Ruby ile KyotoCabinet

Merhabalar,

Uzun bir aradan sonra kendimde tekrar yazı yazabilecek enerjiyi bulabildim. Nasıl mı? Aslında ben de bilmiyorum. Yeni doğan kızım Nil (evet, artık benim bir kızım var, kendisi daha 22 günlük :) ) nedeniyle evde çok neşeli bir telaşımız var ama yine de bir cumartesi akşamı ben bu yazıyı yazabiliyorum.

Ayrıca bugünün cumartesi olması ve ÅŸu saatlerin de akÅŸam olması ve artık bir kızımın olması nedeniyle ilk kez akÅŸam gezintileri için “benden geçmiÅŸ” demek zorunda hissettim kendimi. :)

Neyse konumuza dönelim, konumuz Kyoto Cabinet‘in ruby’de kullanılması olacak. Öncelikle

Kyoto Cabinet nedir;
Aslında bilenler var ise Kyoto Cabinet, Tokyo Cabinet gibi, Memcache gibi yüksek performanslı non-relational (türkçe çevirisi için ‘iliÅŸkisiz’ den daha iyi fikri olan söylesin) veri tabanı sistemidir. Limitleri oldukça yüksektir ve performans konusunda gerçekten dudaklarınızıda uçuklatabilir. Kesinlikle oracle, mysql veya postgre gibi relational (iliÅŸkili) veri tabanı sistemleri ile kıyaslanmamadır. Bu elma ile armut kıyaslanması gibi olur.

Kyoto Cabinet aslında “Key” ve “Value” ikilisini bir veri tabanında (bir dosyada) tutmak ve yönetmek için yapılandırılmış bir kütüphanedir. Bir dosya üzerinde yer alan Key ve Value alanları farklı uzunluklara sahip ve farklı tiplere sahip olabilir. Ayrıca bu kayıtları B-Tree veya Hash olarak tutabilmektedir.

Peki hemen aklınıza bir soru gelebilir. Nedir bu B-Tree ve Hash denen arkadaşlar? Sayfaları ziyaret edin, kullanın öğnenin diyorum başka da birşey demiyorum. Yaptığınız işe göre, kullanmanız gereken algoritmaya göre seçeceğiniz yapı yazılım performasını etkileyen en büyük unsur olacaktır. Ve malesef bunların bir tanesi hepsini dövmüyor/dövemiyor.

Hadi Kyoto Cabinet kuralım
0- Linux’da çalışıyor. Benim kullandığım ubuntu üzerinden kurulumu anlatacağım.
Ruby ile KyotoCabinet yazısına devam et

Çizginin Dışındakiler

Geçtiğimiz günlerde Malcolm GLADWELL’in “Outliers” Çizginin Dışındakiler adlı kitabını okudum. Oldukça güzel ve hoş bir kitap olduğunu düşünüyorum bu nedenle sizler için, daha doğrusu sizlere kitabı satabilmek için :) bu yazıyı yazmaya karar verdim.

Genel DeÄŸerlendirme:
Yazılara tersten başlamak adetim değildir ama bu sefer böyle yapmak istedim. Genel değerlendirmem kitabın oldukça iyi olduğu yönünde. Özellikle yine son zamanlarda okuduğum bir diğer popüler kitap olan Martin Lindstrom’un Buyology adlı kitabı ile karşılaştırdığımda bir baş yapıt olduğunu söylemek herhangi bir sakınca görmüyorum.
Aslında Outliers’da kolay bir kitap olmaktan çok uzak. Kitabın sonundaki yazarın kendi kritiğini yapması ve kitabın genel hatları insanda bazı karamsar duyguların oluşmasını sağlıyor. Tarih boyunca başarılı olmuş karakterlere birer mit olarak bakmaktansa yakınızda yer alan ve doğru zamanda doğru kararlar vermiş birer insan olarak göstermesi, başarıyı kâf dağından ayaklarımızın dibine getirebiliyor. Aynı zamanda bunu son derece mantıklı ve kanıtlara dayandırarak yapması, bunun mümkün olacağını belitiyor.
Yazar başarıyı ayaklarımızın dibine getirirken, diğer yandan fırsat ve zamanlama konusunda insanın elinde olmayan daha büyük bir güçün varlığına işaret ediyor ki işte o zaman daha da karamsarlığa kapılıyorsunuz.
Genel olarak başarının olmazsa olmaz maddeleri ile beraber bu maddeleri yapsanız dahi “niye çizginin dışındakiler kadar başarılı olamadığınızı” anlatan harika bir kitap.
Çizginin Dışındakiler yazısına devam et

Spartacus Blood and Sand

Gerçekten iyi dizi, ilk bir-iki bölüm oldukça yavan geçiyor. biraz sabır sonrasında Spartacus ve arkadaÅŸları entrikanın dibine vuruyorlar. Ezel’in Roma versiyonu.. hemde gereksiz uzatılmamış :)

1. sezonu tarafımca izlenmiÅŸ olup, dizinin “öyle böyle deÄŸil” gerçekten çok sert görüntüler içerdiÄŸini söylemek isterim :) Ä°zlenirken dikkatli olunması ve kadınların (özellikle hamile), çocukların izlememesi gerekir diye düşünüyorum.

Bebek odası

Merhabalar,

Bebek odası dediÄŸiniz ÅŸeyi hafife almayın, aldırmayın. Yanılırsın “yeÄŸen” der Ramiz dayı. Bebek odasını doÄŸumdan en az 2 ay öncesinde eve gelecek ÅŸekilde hazırlıklarınızı yapın. Birkaç kez yıkayın silin tekrar yıkayın silin. Kokusu çıksın diyorlar ama 2 ay boyunca o bebek odasında ne yapacağımızı kimse söylemiyor!

Boya konusuna gelince kendiniz yapmayın, kaşınmayın. Ben kaşındım, kaşıdılar :) Avrupa ve Amerikan filmlerinde çocuk odasını boyayan erken ve romantik erkeklere kanıp evde ben boyarım, ben romantik erkeğim diye geçinmeyin. Aslında o filmlerin yapıldığı ülkelerde işçiliğin maliyeti çok yüksek olduğu için adamın parası yetişmiyor.. sonra yok ben romantiktim de, yok ben kendim boyamak istiyordum da.. inanmayın yaa adamın parası yok.

Paranız var ise profesyonel yardım alın.

Bu arada mobilya alırken gezebildiÄŸiniz kadar gezin. Eli ayağı düzgün mobilyalar için fiyatlar 2000 TL’den baÅŸlıyor. Fakat hanıma ve ailenize söz geçirebilirseniz (ama bu çok zor) ucuz bir baÅŸlangıç yapın, sonrasında erken yaÅŸta genç odası alın. Emin olun çocuÄŸunuz daha mutlu olacaktır. Anneler ve aileler genelde daha ÅŸeker olduÄŸu için bebek odası diye bastırıyorlar.

Mobilya konusunda benim tercihim Masko‘daki Beybish maÄŸazası oldu. Yani isminden de anlaşılacağı gibi ben bebek odası aldım.. :) Ehh yazıyoruz ama yazdığımızı yapıyoruz anlamına gelmiyor elbette.

Sevgiler.

İş Fırsatı (Ruby on Rails)

Merhabalar,

Oldukça yakın ve kadim dostlarımdan Litespell yöneticleri, Litespell bünyesinde bir yazılım ekibi oluşturma çabasına girişti. Oldukça güzel, neşeli bir çalışma ortamda İnternet teknolojilerinin mutfağında çalışmak isteyen arkadaşlar başvurularınızı bekliyoruz.

İş ilanı mı ? işte link.

Kolay gelsin :).. Bu arada başvuruları değerlen kişilerden birisi de ben olacağım.. bilginize :)

Düzeltme: Malesef artık aranmıyor.

Süper, Yazılımların Türkiye uyumluluk testleri

Merhabalar,

Genel ağ üzerinde öyle deli divane gezerken gördüm, paylaşmak istedim bu çok iyi yazıyı.

Çoklu dil desteği olan (Örneğin İngilizce, Türkçe, Almanca..vb.) yazılımları geliştiren arkadaşların kontrol etmesi gerekenleri çok güzel bir şekilde listelemiş, sorunları anlatmış, çözümlerini vermiş. Örnekler .NET (C#) üzerinden ama bu ayrıntıya takılmayalım önemli olan problemleri size hatırlatması ve çözüm bulması.

Teşekkürler Jeff Moser. (Thank you Jeff Moser).
Does your code pass Turkey test.

Kasım Ayı Ezdi Geçti

Merhaba arkadaÅŸlar,

Bu aralar evde ve iÅŸ yerinde oldukça yoÄŸun ve yorucu bir dönem geçiriyorum. Özellikle Vodafone’da oldukça sert bir dönemi geride bıraktık ama baÅŸarı ile bıraktık :) yani en azından teÅŸekkür maili aldık, bizi bu kadar yoran ÅŸey ise Vodafone’un yeni özelliÄŸi “Tek Fatura” (Single Invoice), iÅŸin büyük kısmı Fatura üzerinde olduÄŸu için canımız çıktı diyebiliriz, ama baÅŸarının verdiÄŸi o güzel hazzı, projenin son gününden 1-2 gün önce tatmayı baÅŸardık. Ãœstelik Vodafone IT departmanı 2 sene sürmesi planlanan bir deÄŸiÅŸim sürecine girdiÄŸi ÅŸu sancılı günlerde yaptık bunu :) kolay iÅŸ deÄŸil yani…. YoÄŸunluk diyorum, diyorum ama aklınızda soru iÅŸareti oluÅŸmasın, tüm bu çalışma boyunca (6~7 yıldır olduÄŸu gibi) ben hiç fazla mesai yapmadım, çalışma arkadaÅŸlarımdan Salih Diler ise, sadece birkaç gün fazla mesai yaptı.

Hayatımdaki yoÄŸunluÄŸun Vodafone kısmı bu ÅŸekilde devam ederken, dertsiz başıma bir de yeni televizyon alma derdini eklendim, sanki sizleri duydum “iyi halt ettin” mi dediniz ? Eh teknoloji ile ilgileniyoruz yaa, bu iÅŸlerden anlıyoruz yaa.. öyle gözümüzü kapatıp “aaaa bu televizyon güzelmiÅŸ, hemen alalım ÅŸunu” diyemedik, 2 hafta boyunca girmediÄŸim site, okumadığım yazı, bakmadığım özellik açıklaması kalmadı, üzerine bir de iÅŸin felsefesine kaçtık, fiyat performans çıkartırken mantık çercevesinde her bir özelliÄŸin ne kadar edeceÄŸini bulmaya çalışıp, bu özelliklerin fiyatları ne kadar etkilediklerine baktım, inceledim.. falan filan.. uzun uzun yazmadan hemen sonunu söyleyeyim, gözümü kapadım ve Sony Bravia aldım… aldıktan sonra “bu iÅŸi baÅŸtan yapsaydım” dedim :)

Öncelikle birÅŸeyi belirtmek zorundayım, ÅŸu plazma ve lcd tartışmaları artık gözümde son buldu. Şöyleki tüm özellikler artık birbirlerine denk gibi, fakat en ayırt edici özellik LCD’lerin daha az elektrik yakması (Çevreye duyarlı bir vatandaÅŸ olarak bu benim için çok önemli) ve yüksek çözünürlüğe sahip olmaları. Özellikle LCD’lerdeki parlaklık sorunuda çözüldükten sonra (Kontrast Oranı 5000:1’den düşük almayın, hatta yanına yaklaÅŸmayın, tersini söyleyen kiÅŸiye inanmayın) LCD, plazmanın önüne geçti. Özellikle son teknoloji LED LCD’ler ve 100 Hz’lik LCD’ler tam bir sanat eseri. Cebinizde 10.000 YTL’niz var ise Samsung’un bir modeli var.. kaçırmayın derim, benim yoktu kaçırdım bir dahaki bahara artık.

Ä°ÅŸin felsefi tarafını özetlemek gerekir ise, bir televizyona 3000 YTL’den fazla verilmez. Bu tarihte (Kasım 2007’de) Full HD almanın bir anlamı yok Blue-Ray veya HD-DVD sistemlerinin yaygınlaÅŸması gerekiyor. Fakat 1080i giriÅŸi destekleyen bir model almalısınız.

Ek bir bilgi olarak http://www.istanbulbilisim.com.tr adresinden modellerin detaylı bilgileri bakabilirsiniz, fiyat olacak pek cazip bir site olmasada, diğerlerinden daha fazla model ve özellik açıklamaları bulabilirsiniz.

Bir de Amerika’da birkaç arkadaÅŸ var ki, bu aralar canımıza okuyorlar :) Ahh ÅŸu Stanford’lu gençler yok mu…

Kolay gelsin.

Diziler (Uzmanlar için)

Merhabalar,

Uzun süredir herhangi bir yazı yazmıyordum, arkadaÅŸlar arasında konuÅŸurken “neden yazmıyorsun” gibi sorulara maruz kaldım, “eee dedim yazacak pek bir ÅŸey kalmadıki, ben ruby veya yazılım ile ilgili konularda yazıyorum” dedim. “eÄŸer herhangi bir konuda istek gelir ise o konuda yazarım ama, ÅŸimdilik böyle bir konu yok” dedim. Dedim de hemen cevabı yapıştırdılar suratımın orta yerine.. “Ruby dizileri gerçekten basit tutmuÅŸ, herhalde hız için.. Lisp veya fonksiyonel programlama dileri kadar esnek deÄŸil” dediler.. “Eneee” dedim :) bana yazı yazacak konu çıktı.

Şimdi öncelikle biraz konu ile ilgili kendimizi motive edelim; Neden dizi işlemleri bu kadar önemli ? Ya da diğer işlerden farkı ne olabilir ki ?

Öncelikle bir konuya açıklık getirmek gerekir, günümüzde yazılan programlar içerisinde pek çok durumda dinamik veya durağan veri kümeleri ile işlemler yapılıyor. Bu işlemler, yazdığımız programlar içerisinde performansı etkileyen en önemli etken olarak karşımıza çıkıyor. Ve günümüzdeki daha fazla veri üzerinden daha doğru bilgi edinme anlayışı nedeni ile dizilerin boyutları gün geçtikce artıyor ve üzerlerinde yapılan işlemler gün geçtik fazlalaşıyor, bu performans etkeni daha da önemli hale geliyor. Yanlış anlaşılma olmasın, burada bahsettiğim performans Şişirme Veri Girişi adlı yazıda bahsettiğim veri yoğunluğunun artması ile beraber ortaya çıkan performans kötüleşmesi.

Diziler üzerinde yapılacak işlemlerde öncelikle iki ana başlıkta değerlendirilmelidir;
1- Kolay kullanım,
2- En iyi algoritmanın kullanılması.

Ä°kinci maddenin neden gerekli olduÄŸu konusunda fazla söze gerek yok ama, birinci maddenin neden gerekli olduÄŸu konusunda aklınızda sorular olabilir, bu soruları ortadan kaldırmak için ÅŸu ÅŸekilde bir açıklama yapabilirim. “Diziler üzerinde yaptığınız optimizasyonlar, algoritma seçimleri veya memory optimizasyonları” gerçekten zor ve uygulanması oldukça tartışmalı olabilir. ÖrneÄŸin google’ın java dili için çıkardığı “Google Collections Library” buna örnek olarak gösterilebilir. Kolay kullanım ve entegrasyon yazılımcılar tarafından her zaman tercih edilir.

Peki Ruby tüm bunların karşısında bize güzel silahlar veriyor. Aslında tüm Ruby iÅŸlemlerinde olduÄŸu gibi performans basitliÄŸin gerisinde kalmış, yüzlerce kez söylediÄŸim gibi “yazılımın çalışma hızı sonsuza giderken, geliÅŸtirme süresi sıfıra gitmeli” felsefesine ters deÄŸil.

data = [1,2,4,8,12,5,7,3,0,13,10,11,3]

# For..In
data.each { |x| puts "x=#{x}" }

# data içerisindeki tüm elemanları tek tek verilen 
# blok içerisindeki işlemden geçirir ve sonuçlardan yeni bir dizi üretir.
puts data.collect { |x| x + x }

# For..In :) ile indexleri verir.. :) pek çok programlama dilinde 
# karşılığı bulunmaz.
data.each_with_index { |x, index| puts "#{index}. eleman = #{x}" }

# 5'den büyük ilk kayıdı bulur.
puts data.detect { |x| x > 5 }

# 5'den küçük olanları true_data değişkenine, 
# diÄŸerlerini false_data deÄŸiÅŸkenine dizi olarak atar.
true_data, false_data = data.partition { |x| x < 5 }
puts true_data
puts false_data

# 5'den küçük olanları diziden çıkartır ve geri döner.
puts data.reject { |x| x < 5 }

# Varsayılan sıralama işlemi
puts data.sort

# Belirlenmiş kritere göre sıralama işlemi (string olarak sıralama)
puts data.sort_by { |x| x.to_s }
# veya
puts data.sort_by { |x| (x+5)/x }

Kolay gelsin.. :)

Kizlarayaklandı

Merhabalar,

Türkiye’nin ilk ‘ticari’ RoR (Ruby on Rails) uygulamalarından birisi olan Kizlarayaklandi yarışması sonuçlandı. Büyük ödülü kazanan Burcu Güleç‘i ve diÄŸer kazanan arkadaÅŸları baÅŸarılarından dolayı tebrik ederim. Projede emeÄŸi geçmiÅŸ olan herkeze, özellikle Litespell’den Erhan Yürük ve Mehmet Hazman’a teÅŸekkür ederim. Beraber nice güzel projelere diyorum ve bitiriyorum :)

Kolay gelsin.

Bağımsız Lili

Merhabalar,

Biraz önce “Je vais bien, ne t’en fais pas” (bağımsız ruhlar) adlı filmi seyrettim. Gerçekten çok güzel bir film, aÅŸağıda da bu filmin unutulmaz müziÄŸi yer alıyor.

Uzun süredir böyle güzel bir film seyretmemiştim. İlk 10~20 dk. içerisinde tempo biraz düşük eğer yılmaz ve filmin devamını izlerseniz yaşattığı duygu seli sizleri oldukça tatmin ediyor.

Öncelikle bu duygu selini yutmak, hazmetmek istiyorsunuz. Ama size fazla geliyor, kendinizi çok zorluyorsunuz görünürde 5 yaşındayken 2 külah dondurmanın size yaptığı etkiyi yapıyor, midenize oturuyor, tam tanımı “BoÄŸazınızda birÅŸeylerin eksikliÄŸini hissettiren bir yumru ve midede hafif bir kasılma”.

Bu film ne 2 külah dondurma, ne de bizler 5 yaşındayız.

Kolay gelsin.

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.. :)