Emaye Tencere

Yes, i am. Bu gece ki blog girdimiz üzerine oturulan organla nasıl kod yazılır konusu ile ilgili. Örneklerle zenginleştireceğimiz bu girdiden umarım zevk alırsınız. Ben çok aldım...

Herşey bir Perşembe akşamüstü Çağlar'ın PİSİ ile paket kurarken bir exception alması ve sorunu irdelemesi ile başlar; Sorun PİSİ'nin sisteme kurmaya çalıştığı bir dosyanın sistemde var olmasından başka birşey değildir. O an beyni yerine kaba organı ile düşünen Çağlar, hemen şu aşağıdaki commit'i yapar;

Author: caglar
Date: Thu Sep 29 11:24:33 2005
New Revision: 3394

Modified:
   trunk/pisi/pisi/archive.py
Log:
symlink pörtlemesin

Modified: trunk/pisi/pisi/archive.py
=================================================================
--- trunk/pisi/pisi/archive.py  (original)
+++ trunk/pisi/pisi/archive.py  Thu Sep 29 11:24:33 2005
@@ -160,6 +160,9 @@
  
                 if info.external_attr == self.symmagic:
                     target = zip_obj.read(info.filename)
+                    # remove target file we might be overwriting
+                    if os.path.exists(target):
+                        os.remove(target)
                     os.symlink(target, ofile)
                 else:
                     perm = info.external_attr

Bu commit sonrası gerçekten log'da yazıldığı gibi symlinkler pörtlemez, problem yaşadığı paketi huşuu içinde sisteme kurar. Bu aşamadan sonra Çağlar çok mutlu yaşamaya devam eder. Ama gerçekte bu 3 satırlık kodda satır sayısından fazla yanlış vardır. Fakat bu problem Çağlar kaba organını dinleyip kodu test etmeyince kimse tarafından bir 15 dakikaya kadar farkedilmez. Fakat bir 15 dakika önce Çağlar, yeni PİSİ paketlerini sisteminde denemek için bir girişimde bulununca bir anda şok olur. PİSİ install'un ortasında acayip hatalar ile işlemi keser. Çağlar "Hmmm, neler oluyor?" sorusuna cevap bulmak için "ls rootfs/" der, kabuk ona "-bash: ls: command not found" ile geri döner, Çağlar başka komut yazar bash "-bash: *: command not found" der. Bu seri bir 10 saniyelik şok içinde devam eder ve Çağlar, PİSİ'nin yanlışlıkla config'inde belirtilen /home/caglar/svn/uludag/trunk/pisi/rootfs dizini yerine / üzerine yazdığını düşünür. Ama oraya yazdıysa bu binaryler nerededir de çalışmaz sistem diye düşünür. Ama anlamakta da gecikmez, kaba organı ile yazdığı kod aklına gelir nedense bir anda. Sorun ne PİSİ'dir, ne paketler ne de insanlık, sorun Çağlar'ın konuşan ve düşündüğü düşünen kaba organındadır.

Sorun özetle şöyledir. Örneğin /usr/bin/cat -> /bin/cat symlink'i için, aynen kodda yazıldığı gibi, Python linkin olup olmadığına bakar [if os.path.exists(target):], True döner, bunun üzerine Python linkin gösterdiği dosyayı, dikkat linki değil, siler [os.remove(target)], çünkü ona öyle söylenmiştir. Oysa kaba organı zamanında doğru fonksiyon isminin os.unlink olması gerektiğini ve başına installDIR prefix'i alması gerektiğini söylemez Çağlar'a. Python ise zavallı emir kuludur bu senaryoda, ne dense yapar. /usr/bin/cat dosyası paketin install etmek istediği dosya ile çakışır, bunun üzerine link ettiği /bin/cat dosyasını siler, sonra /home/caglar/svn/uludag/trunk/pisi/rootfs/bin/cat dosyasını ve bunu gösteren /home/caglar/svn/uludag/trunk/pisi/rootfs/usr/bin/cat linkini yerine koyar. Bir nevi Robin Hood gibi davranır PİSİ, zenginden alır (kendi sistemimde binary çok), fakire verir (rootfs altında binary yok). Sonuç olarak / altından binarylerim silinir ve sistemin küskü moduna girer.

Kıssadan hisseye, kaba organınızla kod yazmayın, yazıyorsanız beyninize de düşünmesi için arada şans verin. KNazar'ı hep açık tutun, bilgisayarınızı nazardan koruyun, kem gözlerden sakının.

Peki bu girdiyi nasıl yazıyorum derseniz, PİSİ'nin doğru yere kurduğu ama yanlış yerden sildiği binaryleri sisteme Konqueror ile geri koyup, bu binarylerin ait olduğu paketleri tekrar derlemeye başladım, bu arada Meren'de sorun yaratan kısmı sildi;

Author: meren
Date: Sat Oct  1 02:57:57 2005
New Revision: 3443

Modified:
   trunk/pisi/pisi/archive.py
Log:

 "allahın sopası yok" sananlar ne kadar yanıldıklarını gördüler.
                                        Nietzsche..