Dec 282012
 

Kısa bir hikaye bu. Mutlu sonla da bitmiyor. Belki limoni, ekşi bir son diyebiliriz.

Hikayemizin kahramanı Yaşar PHP ile yazılmış bir kodun, yapması gereken işi neden tam olarak yapmadığını anlamaya çalışmaktadır. Kapkaranlık terminal penceresinden akıp giden logları satır satır okumakta, her log satırını kod ile karşılaştırıp, programın akışını takip etmektedir. Yaptığı her testte, çalışması gereken kod satırı bir türlü çalışmamakta, PHP inatla o kod satırını es geçmektedir.

Söz konusu kod şuna benziyordu:

....
....
....
// 3. Parti API'den gelen cevabı loga yaz
// 3. Parti API'den gelen cevabı parse et, bu cevaptaki X değerini $x değişkenine Ata
....
....
....
if ($x > 0)
{
    BirSeyYap();
}
else
{
    BaskaBirSeyYap();
}

Logda 3. Partiden gelen cevap yazılıdır ve o logda X’in değeri 2’dir. Ama sanki $x değişkeni hiç bu değeri almıyormuş gibi kod sürekli BaskaBirSeyYap() fonksiyonunu çağırmaktadır. Yaşar en az 10 test yapmıştır, artık gözleri kararmaktadır. En sonunda değiştirmek istemediği kodda, if deyiminin hemen bir satır üstüne Log::writeLog(“X’in değeri bu: $x”); satırını ekler ki logda $x değişkeninin değeri görünsün. Bunun dışında hiçbir değişiklik yapmaz, “yemişim commiti” deyip, kodu Subversion deposuna göndermeden doğrudan production’a alır.

Aynı testi tekrarlar.

3. Parti API daha önceki 10 testte verdiği cevap ile aynı cevabı verir. X değeri 2’dir. Yaşar logları okumaya devam eder ve yeni eklediği log satırını görür. Şöyle yazmaktadır:
X’in değeri bu: 2

ve hemen altında BirSeyYap() fonksiyonun çağrıldığını gösteren log satırını görür. Kod doğru çalışmıştır. Halbuki $x değişkenini loga yazmak haricinde hiçbir değişiklik yapmamıştır. Gözlerini oluşturur. Testi yineler. Sonuç aynıdır. $x 2 değerini alıyordur ve kod doğru çalışıyordur.

Yaşar, “hayır, bu kadar aptalca bir şey olamaz” der ve 3. Parti API’den aldığı önceki cevaplarla, $x’ i loglara yazmasından sonraki cevapları karakter karakter karşılaştırır. Birebir aynıdırlar. Hatta bir Hex editörü ile log dosyasını açıp karşılaştırma yapacak kadar ileri gider. API’ nin döndürdüğü sonuç her durumda aynıdır ve koddaki tek değişiklik $x değişkeninin değerinin loga yazılmasıdır.

Hemen son yaptığı değişikliği geri alır ve kodu production’ a alp tekrar test eder. API aynı cevabı döndürür, $x artık logda görünmemektedir, fakat BirSeyYap() fonksiyonu çalışmaya devam etmektedir. Yaşar ne yaparsa yapsın, aynı durumu tekrar edemez. Halbuki o log satırını yazmadan önce en az 10 kez test etmiş, hepsinde de BaskaBirSeyYap() fonksiyonu çalışmıştır. Log satırını yazınca herşey düzelmiştir. Olayı etrafındakilere anlatır, ama tekrar edemediği için logları göstermesine rağmen kimseyi inandıramaz.

Sonuçta PHP’ ye bol miktarda güzel iltifatlar ederek işine devam eder.

Dec 272012
 

Kod taşımaya devam 🙂 Bu sefer bir Subversion deposunu başka bir dizine veya sunucuya taşıyoruz.

Önce eski depoyu bir dosyaya yedekleyelim:

$ svnadmin dump /eski/deponun/yolu > depoyedek
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
* Dumped revision 4.

Şimdi yeni depoyu oluşturalım:

$ svnadmin create /yeni/deponun/yolu

Eğer depoyu yeni bir sunucuya taşıyacaksanız “depoyedek” dosyasını kopyalayın.

Şimdi eski depoyu yeni depo olarak yüklemek için şu komutu verin:

$ svnadmin load /yeni/deponun/yolu < depoyedek
<<< Started new transaction, based on original revision 1
     * adding path : branches ... done.
     * adding path : tags ... done.
     * adding path : trunk ... done.
 
------- Committed revision 1 >>>
 
<<< Started new transaction, based on original revision 2
     * adding path : trunk/index.php ... done.
 
------- Committed revision 2 >>>
 
<<< Started new transaction, based on original revision 3
     * editing path : trunk/index.php ... done.
 
------- Committed revision 3 >>>
 
<<< Started new transaction, based on original revision 4
     * adding path : trunk/a.class.php ... done.
 
------- Committed revision 4 >>>

Depo aktarıldı. Artık svn checkout ile yeni depo URL’ ini kullanarak çalışma dizinleri oluşturabilirsiniz.

Eski çalışma dizinlerini yeni URL’ e geçirmek isterseniz “svn switch” kullanmanız gerek:

Eğer depolar çalışma dizinleriyle aynı sunucudaysa;

$ svn switch --relocate file:///eski/deponun/yolu file:///yeni/deponun/yolu

Eğer depolara SSH tüneli ile ulaşacaksanız;

$ svn switch --relocate svn+ssh://eskidepoadresi.com/eski/deponun/yolu svn+ssh://yenidepoadresi.com/yeni/deponun/yolu