Feb 022013
 

Bir önceki yazımda iTerm2′ den ve birden fazla terminale aynı anda komut gönderme özelliğinden bahsetmiştim. Sunucu kümelerindeki her sunucuya bağlanmak için ayrı ayrı komut girmek yerine bir süredir i2cssh adlı küçük bir Ruby betiğini kullanıyorum. Aslında i2cssh, “Cluster SSH” (csshX) in iTerm2 için uyarlanmışı.
Continue reading »

Feb 022013
 

aTerm hariç 🙂 Ama aTerm’ i OS X ortamında kullanma imkanım pratik olarak yok. Aslında mümkün, fakat X’ in o iticiliği ile karşılaşmaktansa aTerm’ siz olmayı tercih ederim.

Hal böyle olunca ve OS X ile birlikte gelen Terminal.app her ne kadar iyi sayılabilecek olsa da daha önce Linux’ ta kullandığım birçok terminal uygulamasının yanında basit kalınca alternatif aramaya başladım (yok, şimdi değil, uzun zaman önce). Sonunda bana aTerm’ i aratmayan, üstüne de birçok özellikle gelen iTerm2‘ yi buldum.

iterm2-simple

Continue reading »

Jan 022013
 

Geçen gün, uzun bir süredir çeşitli uygulamaları çalıştırdığımız, ama artık yavaş yavaş emekliye ayırmak üzere uygulamaları üzerinden taşımaya başladığımız bir sunucuya bağlanmışken, merak edip konsolda uptime yazıverdim. Karşıma şöyle bir görüntü çıktı:

uptime

 

Evet, yanlış görmüyorsunuz. Sunucu 2,5 yıldan uzun bir süredir açık.

Sunucu ve alan isimlerini gizlemek durumda olduğum için kırmızıyla çizdim.

 

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
Oct 282012
 

Eğer Raspberry Pi tükenmeden alabilen şanslı kişilerdenseniz, onu biraz nostalji için kullanmak isteyebilirsiniz. Örneğin, çocukken oynadığınız (ya da başkları oynarken görüp de oynayamadığınız) Atari, NES, Super NES, Amiga vs. oyunlarını oynayabilirsiniz.

Bu eski platformların hepsini destekleyen güzel bir emülatör geliştirilmiş: RetroArch

RetroArch hakkında daha fazla bilgi almak ve kaynak kodunu indirmek için şu adrese gidebilirsiniz: http://themaister.net/retroarch.html

RetroArch’ı Raspberry Pi üzerinde çalıştırmak için kaynak kodunu indirip kurmak ve daha bir çok ayar yapmak gerekiyor. Ancak petRockBlog‘da yazan elektronik meraklısı, hem Raspberry Pi ile eski SNES kontrolcülerini çalıştırmayı başarmış, hem de RetroPie-Setup adında bir script hazırlayarak RetroArch’ın kurulumunu ve kullanımını kolaylaştırmış.

petRockBlog zaten bir kurulum kılavuzu yayınlamış. Ben de bu kılavuz ile kurulum yaptım, ancak hem İngilizce bilmeyenler için Türkçe olarak yazmak, hem de kendi yaptığım birkaç düzenlemeyi yazmak istedim.
Continue reading »