18 Nisan 2009 Cumartesi

String vs StringBuilder

Şirkette şu an üstünde çalışmakta olduğumuz güzel düşünülmüş, bir arkadaşın ortaya koyduğu bir generic simülatör projesi var. Projenin ayrıntılarına girmem mümkün değil ancak çalışma prensibi değişken, fonksiyon, class, dll'ler, protokoller gibi kodu oluşturan öğelerin bir kullanıcı arayüzü yardımıyla xml dosyalarına yazılması ve ardından bu xml dosyalarının parse işlemiyle koda dönüştürülmesi şeklinde. Tabi simülatöre eklenen her öğe oluşturulan kodun büyümesine sebep oluyor, ve böylece gerçekten çok kapsamlı ve yetenekli bir simülatör oluşturulduğunda binlerce satır koda erişilmiş oluyor.

İşte bu noktada kodun oluşturulma süresi büyük önem kazanıyor. "Generate" dedikten sonra yavaş yavaş ilerleyen bir progress bar görüntüsünü hiç kimse sevmez. Üreteci hazırlayan arkadaşın da hoşuna gitmemiş olmalı ki performans iyileştirmesine gitmeye karar verdi. Benim de String ve StringBuilder arasındaki farkı öğrenmem onun sayesindedir. Kodu geliştirip çalıştırdığında göz açıp kapayıncaya kadar kodun üretildiğini görünce merak ettim, String yerine StringBuilder kullandım hepsi bu dedi. Bunun üzerine taa üniversitedeyken "String class'ı var ya nasıl olsa, bunların hepsini yapıyor, StringBuilder gibi daha komplex bir şeyi birşeyi hatırlamama neden gerek olsun ki" şeklindeki tembel düşüncemi hatırlayıp utandım, ve merakımı gidermeye karar verdim.

Şimdi işin hikaye kısmını geçip konuya girelim:
Kaynağım CodeProject. Konuyla ilgili en sade ve öz anlatımı burda buldum. Alois Kraus arkadaş iyi iş çıkarmış. Özetle durum şu:
String'in değişken olmayan(immutable) bir yapısı var, o yüzden herhangi bir ekleme çıkarma vs. işlemi yaptığınızda yeni bir obje üretilmekte. StringBuilder ise değişken(mutable) bir yapıda. Ama tabi bu her zaman iyi anlamına gelmiyor. Kraus da diyor ki, assembler kodunu görmeden hangisinin daha iyi performans vereceğine karar vermeyin.
Assemblerla uğraşmak istemeyenler için(sanırım çoğumuz bu kategorideyiz) Kraus bir performans testi yapmış. Insert, Remove, Replace, Format, Append, Join gibi fonksiyonların zaman ve uygulanan operasyon sayısı grafiğini çıkaracak testler hazırlamış. Grafikler aynen şunlar:





Bu tabloları yorumlayacak olursak en iyi performansı veren fonksiyonlar şunlar:
Insert: StringBuilder.Insert, 2'den az ise String.Insert
Remove: StringBuilder.Remover, 2'den az ise String.Remove
Replace: String.Replace
Format: StringBuilder.AppendFormat, 5'ten az ise String.Format
Concatenation: String.Join, 2 ise String+

8 Nisan 2009 Çarşamba

Dedektifler, Cinayetler ve Katiller

Cinayet medya için her zaman çekici bir konu olmuştur, başlığı görünce sizde de merak uyandırmadı mı? Halbuki sadece müptelası olduğum birkaç dedektiflik hikayesinden bahsedeceğim. Daha da özetleyecek olursak Agatha Christie, Adrian Monk veee (wait for it...) Dexter Morgan!

Bunlardan ilk tanıştığım Agatha Christie oldu. Bir cumartesi sabahı, aile büyükleri tarafından limitlenen televizyon izleme seanslarından birindeydik. Tabi sınırlı olunca kanalları gezerek izlemeye gerçekten değecek birşeyler arıyorduk. TRT'nin yan kanallarından birinde (TRT 3 olabilir) şöyle yumurta kafalı, komik, bi yandan da hafif karizmatik bir tiple karşılaştık. O sırada salondan geçmekte olan annem "Aa Hercule Poirot (Herkül Puaro), bunu izleyin çok güzel" dedi. Biz de annemin zevkine güvenip bunda karar kıldık. Bu ufak tefek ilginç adam insanları sorgulamaya başladı, anlaşılan öldürülen yaşlı bir hanımefendinin katilini aramaktaydı.

Hercule Poirot'nun sıcak çikolata içerken bile yüz ifadesindeki o komik ukalalık, yardımcısını sürekli nezaket ve düzen konularında fırçalamasını izlemek gerçekten çok eğlenceliydi. Tabi yavaş yavaş katili de merak etmeye başladık. Bu titiz adam öyle akla gelmez sorular soruyordu ki karşısındakinin en ufak bir mimik hareketi bile anlam kazanıyordu. Dizinin (ki biz izlerken film sanmıştık) sonlarına doğru "Buldum, kesin katil şu, hayır hayır bu" şeklinde kendimizden çok emin yorumlar yapıyorduk, tabi bu tespitlerimizde hep eksik bir nokta kalıyordu. Bölümün sonunda o küçük adam "Hastings, davayı çözdüm" dedi. Tabi çözer çözmez açıklamadı da, tüm zanlıları toplayıp sakin bir dille herkesin gizlediklerini bir bir ortaya döktü, sonra da hem sebebini hem ispatını söyleyip katile "...o yüzden onu siz öldürdünüz" diyiverdi. salonda vaaay diyip alkışlamamak için kendimizi zor tuttuk(bi de gençtik tabi o zamanlar:D)

Her neyse, sonraki haftalarda aklımıza geldikçe izledik adamımızı, bir süre sonra da bir çizgifilm için ihanet edip onu unuttuk. Yıllar sonra üniversiteye geldiğimde, güzel kütüphanemizde dolaşırken cinayet/dedektiflik bölümüne geldim. Hem ince hem de bir sürü oldukları için Agatha Christie serisine gözüm takıldı ve birini karıştırmaya başladım. Kitaplar basit ve eğlenceli görünüyordu, tatilde olmadığımız için de uzun soluklu birşeyler okuyamayacaktım, böylece almaya karar verdim. Hercule Poirot'yla tekrar karşılaştığımda ise ağzım kulaklarıma varmıştı, sanki eski bir dostla karşılaşmış gibiydim. (Yalnız algılamam uzun zaman aldı, çünkü poirot diye yazılan şey puaro'yu hiç andırmıyordu:) ) Aynı yazarın bütün kitaplarını alıp okumaya, tatile giderken eve götürmeye başladım. Çünkü yazdığı kitapların hepsi merak uyandırıcı, zekice işlenmiş ve gizlenmiş cinayetler içeriyor, hem de okurken yüzünüzden gülümsemeniz eksik olmuyordu. Sanki kadın sabah uyanıyor, "Hmm ne harikulade bir hava, cıvıl cıvıl her yer, tam cinayetlik bir gün, keyfiniz nasıl Mösyö Poirot, hadi biraz maceraya atılalım" diyip eline kalemi alıyor ve bir kitap çıkarıyor gibi. Tabi farklı kahramanları da var (Örneğin Miss Marple), ancak favorim her zaman belçikalı dedektif Mösyö Poirot olarak kalacaktır.

Biraz da Adrian Monk'tan bahsedelim. Bu adamcağız aşırı derecede takıntılı, dahası hasta (Obsessive-compulsive disorder) bir dedektiftir. Çözemediği tek cinayet ise karısı Trudy'nin ölümüdür. Polis departmanından takıntıları yüzünden uzaklaştırılmış, bir yandan cinayet çözerken diğer yandan da iyileşip rozetini geri almaya çalışmaktadır. Sürekli bir bakıcıyla dolaşmak zorunda olup onu sık sık "wet wipes" (ıslak mendil) diye sayıklarken görebilirsiniz. Rainman'i hatırlar mısınız? Ordaki gibi gördüğü bir şeyi asla unutmayan bir yapısı vardır dedektifimizin. Ayrıntılara olan dikkati, titizliği, düzensiz, olması gerektiği gibi olmayan bir şeyi hemen farketmesi, ve Mösyö Poirot gibi sürekli "gri hücreler"i çalıştırması sayesinde büyük küçük demeden her cinayeti çözer. Bazen merak ediyorum, bir gün bu saplantılarından kurtulduğunda hala cinayetleri çözme kaabiliyeti olabilecek mi diye.

Bu arada muhtemelen anlaşılıyor ama Monk'un bir dizi olduğunu belirteyim. Şu an Türkiye'de TNT'de yayınlanmakta. Çok popüler olmasını beklemeyeceğim bir dizi. Bununla tanışmam fox ve TNT'den başka hiçbirşey çekmeyen televizyonumuz sayesinde olmuştu. Bir kaç kere rastlaşıp dizinin durağan işleyişinden dolayı pek üzerinde durmamıştım. Monk öyle aksiyon sevenlere hitap eden bir dizi değil. Sakin, komik, sempatik bir yapısı var, asıl karakteri gibi. Ancak sakin, Adrian Monk için pek uygun bir tabir değildir. Hasta olacağı için sürekli panik halindedir, insanlarla el sıkışamaz, kıyafetlerini hijyenik paketlerde saklar, karşısındakinin üstünde bir asimetri, leke ya da tüy vesaire varsa durumu düzeltene kadar başka bir şey düşünemez. Kimi yerde bu adama acır, bir sonraki sahnede katıla katıla güler, sonunda ise illa ki dehasına hayran olursunuz.
Şimdilerde eski televizyonda TNT var sadece. Ben haftanın ütü saatlerini Monk'un başlama saatine ayarlıyorum. Bu şekilde ütü çok daha çekilir oluyor, bütün gömlekler yetişmezse ardından Lost başlıyor zaten, nostalji yapıyoruz.

Gelelim Dexter'a... Öncekilerden farklı olarak burda favori karakter katilin kendisi. Dexter Morgan, insanın kafasını karma karışık eden, psikopata çeviren bir sevimli katil. Normalde izlediğiniz/okuduğunuz eserlerde kendinizi baş kahramanın yerine koymak gibi bir huyunuz varsa Dexter'da önce bir durup düşünmenizi tavsiye ederim. Bir de tabi ki küçüklerle ve fazla büyüklerle izlemeyiniz. Gerçi Türkiye'de gündüz saatlerinde yayınlanmakta olan versiyonu epey sansürlü imiş bu konuda şansınızı deneyebilirsiniz.
Öncelikle şunu söyleyeyim, Dexter öyle vahşice kıyım yapan bir katil değildir. Her işini ince bir şekilde, belirli bir prosedüre göre, temiz halleder, o açıdan ben korku filminden kandan gerilimden hiç hazzetmem diyenler bile çoğu bölümü rahatlıkla izleyebilirler. Ama ona nefretle bakmayışımızın asıl sebebi muhtemelen masum insanları öldürmemesidir. Çevresinde dolanmadan iyisi mi konusunu anlatayım(spoiler içermemektedir):
Miami de, bir polisin üvey evlat olarak alıp büyüttüğü Dexter, küçükken yaşadığı bir şoktan ötürü öldürme içgüdüsüyle doludur. Bunu erken yaşlarda farkeden babası onun öldürmesini engelleyemeyeceğini farkeder ve onu kamu yararına eğitmeye, bir yandan da nasıl yakalanmayacağını öğretmeye başlar. Böylece kanundan kaçmış katilleri yakalayıp temizleyen bir seri katilcik, yani Dexter doğar.
Dexter adli tıpta çalışmakta, işi gücü kan analizleri (tahlil değil, kan buraya fışkırmış öyleyse bıçağı şurdan saplamışlar gibi şeyler) üzerinedir. Sürekli küfreden, Debra adında, çizgi film karakterlerini andıran, bir de üvey kızkardeşi vardır ki o da polis olarak aynı mekanda çalışmaktadır. Aslında dizi yan karakterlere de çok güzel ağırlık vermiş, hepsi birbirinden orjinal ve iyi oyuncular, hemen hemen her bölümde de aktif olarak rol almaktalar, ancak hepsini teker teker anlatamayacağım. Çevresindeki herkes tarafından aşırı normal bir hayatı olan, kibar, etliye sütlüye karışmayan biri olarak görülen Dexter olaylarla başa çıkma dehası ile göz kamaştırmakta, bir yandan da dedektiflik yapmaktadır. Tabi bazı konularda şansı da yaver gidiyor diyebiliriz:)
Dizinin kurgusu gerçekten çok zekice. Genelde sakin giden akışına rağmen meraklandırma işini sonuna kadar başarıyor. Dahası dizi boyunca söylenen her kelime yerli yerinde kullanılmış, sürekli bir tebessümle veya merakla izliyorsunuz. Bazı şeylerin çift anlamları extra eğlence katıyor, tıpkı tanıtım sloganlarındaki gibi: "Takes life. Seriously" (Can alır. Cidden/Ciddi bir şekilde) Bu arada kurgu ve dialoglara bu kadar yer vermem dizinin aksiyon yoksunu olduğu imajını uyandırmasın, çünkü pek güzel aksiyon da içermekte. Bu arada dizinin imdb puanı'nın 9.2 olup Lost'dan daha yüksek olduğunu da hatırlatayım...