July, 2008

Unicode değişken adları

July 20th, 2008

Yine ilginç bir yazıyla beraberiz! [demeyi çok isterdim]. Bu yazıda çok fazla teknik detaya girmeden unicode değişkenler hakkında bilgi vereceğim.

Yıllar önce bir mühendislik öğrencisiyken, değişken adları konusunda uymam gereken bir kaç katı kural öğrenmiştim. Bunlardan biri değişken adlarında kesinlikle Türkçe karakter kullanmamaktı. ( Bu çok normal bir kuraldı çünkü derleyiciler ve yorumlayıcılar henüz bizim dilimizi bilmiyorlardı ;- ) ) ş, ı, ğ, ö, ü, ç gibi harfleri ne editör kabul ediyordu ne de derleyici.
Geride kalan yıllarda, hem dilimiz hem elimiz yarı Türkçe yarı İngilizce kırma bir teknik dile alıştı iyice. Çoğumuz eciş bücüş / yarı ingilizce yarı türkçe değişken adları yaratır olduk. Açıkçası buna mecburduk.
Zaten uluslararası şirketlerde çalışan bir geliştiriciyseniz büyük bir ihtimalle kodlama kurallarınızda (code conventions) değişken adlarının ingilizce olacağı belirtilmiştir. İş arkadaşınızın bir Çinli olduğunu ve değişken adlarını Çince yarattığını düşünsenize. Allah korusun!
Her neyse, asıl konumuza gelirsek; teknik dilbilimciler çok çalıştılar ve neredeyse tüm yazılımlara dünyanın tüm dillerini öğrettiler. Javascript’te de 1.5 sürümünden itibaren unicode desteği eklendi ve artık isteyen herkes değişken adlarını istediği herhangi bir dilde yaratabilir.
Denemesi bedava:
var öçğüış = "ben bir Türkçe değişkenim";
alert(öçğüış);
Son söz
Javascript’te değişken adı yaratırken uymanız gereken kuralları da belirterek yazımızı sonlandıralım.
  • Değişken adları rakamla başlayamaz, ( 99Village, 7Seven, 6699 kimi değişken adları geçersizdir )
  • Değişken adları, sadece [a-z A-Z] harfleri, [0-9] rakamları, $ ve _ (alt çizgi) karakterini içerebilir, ($Yami, _wallColor, $_$, $900  gibi değişken adları geçerlidir)
  • Boşluk içeremez,
  • Anahtar kelimeler (reserved keywords) değişken adı olarak kullanılamaz,
  • Değişken adları büyük-küçük duyarlıdır. Abc ve aBc değişkenleri iki ayrı değişkendir,
  • Unicode karakterler kullanılabilir. Çince ve Korece bile :- )
Kim bilir belki içinizden birileri bunu beğenir ve bundan böyle Türkçe değişkenler kullanmak ister. Kalın sağlıcakla!

IE’de string işlemlerinizi hızlandırın

July 19th, 2008
String işlemleri, javascript programcılarının en sık yaptığı işlemlerdendir. En çokta bir nesneyi ya da sorgudan gelen veriyi serileştirmek gerektiğinde çeşitli string operatörlerine ve metodlarına başvurulur.
+= operatörü

Oldukça kullanışlı ve pratik bir operatördür. İki veya daha çok string veriyi birleştirmede kullanılabilir. Ama bir gerçekte vardır ki bu operatörü kullanan bir çok programcı performansın nasıl etkileneceğini bilmemektedir. ( IE’deki performans, göz ardı edilemeyecek kadar kötü! )
Javascript’teki string işlemlerini, motorun (javascript-engine) içinde bulunan global String nesnesi yürütür. Yaratılmış her metin aslında arka planda geçici bir String nesnesi haline getirilir. Ve işi bitince çöp toplayıcısı (garbage collector – gc) bu nesneyi bellekten siler.
var metinTutucu1 = "abcdefg";
var metinTutucu2 = new String("abcdefg");
Genelde birinci yolu tercih etmemizin nedeni pratik ve kolay anlaşılır olması. Ama isteyen gönül rahatlığıyla ikinciyi de kullanabilir.
Her metin aslında arka planda geçici bir String nesnesi haline getirilir demiştik. Bu sayede; String nesnesine ait metodların hepsini herhangi bir metnin üstüne direkt uygulayabiliriz.
alert("abcdefg".length);
Yukarıdaki satır bize 7 sonucu verecektir.
var metinTutucu = "bir";
metinTutucu += "iki";
metinTutucu += "üç";
metinTutucu += "dört";
alert(metinTutucu); // ekranda birikiüçdört uyarısını verir
+= operatörü kullanımı kolay olmakla beraber belleği en kötü kullanan, masraflı operatörlerden de biridir. Yukarıdaki 4 satırlık kod için bellekte 4 farklı yer kaplanır. Her bir += işleminden sonra bellekte yeni bir alan yaratılır ve yeni metin bu alanda tutulur. Bir önceki bellek alanı ise çöp toplayıcı tarafından silinmek üzere işaretlenir. Ama çöp toplayıcı biz isteyince gelip temizlik yapan bir hizmetçi olmadığı için bellekte bıraktığımız çöpleri ne zaman toplayacağını önceden kestiremeyiz.
Durum böyle olunca da, += operatörü nedeniyle bellekte bir çok yeni alan yaratmak ve bunların en sonuncusu hariç geride kalan bütün alanları çöp olarak bellekte bırakmamız gerekiyor. İşte bu nedenle += operatörü, büyük döngüler içinde kullanılmaya uygun olmayan, hep daha fazlasını isteyen şımarığın tekidir. Yolda gördüğü her şeyi elllediği ve istediği için de onunla seyahat etmek bazen çook ama çook sıkıcı ve yavaştır.
Ama sakın yanlış anlaşılmasın. Az sayıda string birleştirme işi yapılacaksa hiç çekinmeden += operatörünü kullanabilirsiniz. Basitlik her zaman düsturumuz olmalı. (Keep it simple stupid – Kiss)
Çözüm : Array.join() metodu
Özellikle büyük döngüler için çalışacaksanız ve string birleştirme işlemi yapacaksanız oldukça idealdir. Bütün browserlerde hızlı çalışır.
var tmpArray = [];

tmpArray.push("bir")
tmpArray.push("iki");
tmpArray.push("üç");
tmpArray.push("dört");
tmpArray.join("");
Birazdan göreceğiniz, tarayıcılara göre hız kıyaslaması sizi çok şaşırtacak. IE geliştirme takımı yine çuvallamış durumda!

Test Kodlarımız

5000 çevrimlik bir döngü oluşturdum ve her iki yöntemin ne kadar süre aldığını ölçtüm. Döngülerin her birini 50 kere çalıştırarak, her bir tarayıcı için en uzun, en kısa ve ortalama süreyi tespit ettim.
Kıyaslama sonuçları

+= IE 7.0 FF 3.0.1 Opera 9.51 Safari 3.1.2
Toplam süre 3.967sn 0.122sn 0.109sn 0.203sn
En uzun süre 0.094sn 0.005sn 0.016sn 0.016sn
En kısa süre 0.062sn 0.002sn 0sn 0sn
Ortalama süre 0.079 0.002sn 0.002sn 0.004sn
Array.join() IE 7.0 FF 3.0.1 Opera 9.51 Safari 3.1.2
Toplam süre 0.719sn 0.160sn 0.453sn 0.141sn
En uzun süre 0.031sn 0.005sn 0.016sn 0.016sn
En kısa süre 0sn 0.002sn 0sn 0sn
Ortalama süre 0.014sn 0.003sn 0.009sn 0.003sn
Sonuç olarak:
Safari ve Firefox neredeyse iki yöntemde de çok hızlı. Aradaki hız farkları göz ardı edilebilir. Dolayısıyla canımız hangi yöntemi isterse onu kullanabiliriz.
Opera ise ilginç bir şekilde += operatörünü kullandığımız birinci yöntemde daha başarılı. Array.join() yöntemindeki hızı, ilkine göre %300 yavaş.
IE’nin durumu tabloda çok açık ve net olarak görülüyor. İlk yöntemde neredeyse 4 saniyeye varan bir yavaşlık söz konusu. İkinci yöntemde kendini toparlıyor ama yine de diğerlerinin yanına bile yaklaşamıyor.
Javascript programcılarının hepsi IE’de karşılaştığımız bu problemi bilmeli ve önceden önlem alabilmeli. Ayrıca IE geliştirme takımı da artık bu tarz can sıkıcı problemleri gidermeli diye düşünüyorum. Kendinize iyi bakın ve kodlarken eğlenmeyi unutmayın.
Ayrıca inceleyin:

IE’deki Array.indexOf problemi

July 18th, 2008

Javascript ile uğraşırken hepimiz mutlaka en az bir kere, bir dizinin içinde aradığımız bir değerin olup olmadığını kontrol etme ihtiyacı hissetmişizdir.

Herkesin aklına ilk indexOf metodu gelir doğal olarak. Ama nedense diğer bir çok programlama dilinden aşina olduğumuz bu metod Internet Explorer takımının aklına gelmemiş.

Firefox, opera ve safari tarafından desteklenen ve javascript motorlarına dahil etmiş oldukları indexOf methodu IE motoruna eklenmemiş ne yazık ki. Bu nedenle yazmış olduğunuz kod firefox, opera ve safari’de çalışırken IE’nin hiç bir sürümünde (IE7′de bile) çalışmayacak.

Ama korkmayın :-) Javascript burada da imdadımıza yetişiyor. Javascript’te bulunan temel Array sınıfını prototype ile genişleterek kodumuzun IE’de de sorunsuz çalışmasını sağlayabiliriz. Size iki alternatif kod aktaracağım. Herhangi birini kullanmakta serbestsiniz.

İlk önce Firefox’un kendi motorunda da kullanmış olduğu kodu görelim:

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

Veya aşağıdaki gibi daha basit bir kod kullanabiliriz:

if(!Array.indexOf){

      Array.prototype.indexOf = function(s){
         for(var i = 0; i < this.length; i++)
            if(this[i] === s) return i;

         return -1;
      }
   }

Yukarıdaki kodlardan herhangi birini javascript kodunuza dahil ettiğinizde, kodunuz artık browser ayrımı yapmadan çalışacaktır.

    var myArray = ["1","2","3","4"];
    alert(myArray.indexOf("3")); // Bütün browserler de 2 değerini verir.
Önemli not : Her iki metod Firefox, IE, Safari ve Opera’da test edilmiş ve testi başarıyla geçmişlerdir.
Ayrıca inceleyin:

Yeni Blog (MovableType)

July 15th, 2008

Çok uzun zamandır bir inatla zend-framework’te kendi blog uygulamamı yazmayı ve kendi blogumu da onun üstünden yayınlamayı düşünerek yazmaya ara vermiştim. Ama artık daha fazla inat etmeden bu sevdadan vazgeçiyorum.

Bir çeşit zaman tünelinden geçiyorum ve günler gözümü kapatıp açıncaya kadar geçiyor. İşyerindeki yorucu ama keyif veren tempo, taşınma meselesi (evleneli 3 sene olmadı ama dördüncü evimize taşındık bile :- ) ), sezonun başlamasına sayılı günlerin kalması, Antalya’da havanın çok sıcak ve bunaltıcı olması… Ve bir sürü saymakla bitmeyecek mesele.

Bir önceki bloğumu wordpress üstüne kurmuştum ve kendi evimden sunuyordum ama çeşitli teknik sorunlar çıkınca 20 girdi bile olmadan yayından kaldırmıştım.

Yine kendime neden bloğumu devam ettirmiyorum diye kzdığım bir günün ardından Blogger’de bir blog açıp devam etmek istedim ama o kadar kısıtlı bir blog sistemi ki çok fazla katlanamadan vazgeçtim.

Ve en sonunda, hem biraz meraktan hem de adını sıkça duyduğum için MovableType’ın kişisel sürümünü kullanmaya karar verdim. Ne diyelim, hayırlı olsun.

Bu seferki çabamın daha uzun süreceğini ve kesintiye uğramayacağını düşünüyorum.

Bu bir ilk yazı, çokta uzatmamak lazım. Kalın sağlıcakla!

SEO Powered by Platinum SEO from Techblissonline