Geçen gün bir döngüye girdim…

Geçen gün bir döngüye (loop) girdim, bir türlü çıkamadım. (Bilgisayar Mühendisi edasıyla okunacak)

İlgili Python satırlarını buraya eklerdim fakat WordPress.com bloglarında kod parçaları beklendiği gibi görüntülenmiyor.

Deneme yanılma yöntemiyle program yazılamayacağını yıllar önce öğrenmiş olmam gerekiyordu. Kendime ceza olarak yeni bir okuma ödevi veriyorum: Teach Yourself Programming in Ten Years ya da On Yılda Programlama Öğrenin.

Pardus’ta staj için başvuranlar Pardus’un ne olduğunu bilmiyor mu?

bunlari-okudum.jpg

Az önce “Bunları okudum!” bölümünde “Pardus staj başvurularına dair..” başlıklı bir yazıyı paylaştım sizlerle. Eğer “Bunları okudum!” bölümünden neyi kastettiğimi anlamadıysanız açıklayayım; günlüğümün sağ sütununda böyle bir bölüm mevcut. Burada Google Reader ile takip ettiğim ve beğendiğim yazıları yayınlıyorum. Günlüğe girdiğinizde bu yazıların başlıklarını görebilirsiniz. Eğer sürekli takip etmek isterseniz ayrı bir sayfa mevcut. Google Reader ile üye olmak isterseniz bu bağlantıyı kullanabilirsiniz. İlginizi çekeceğinden eminim.

staj-2007-dosya-uzantilari.png

Asıl yazmak istediğim meseleye geleyim. “Pardus staj başvurularına dair..” yazısında başvuru için gönderilen özgeçmiş belgelerinin büyük çoğunluğunun Microsoft Office ile yazılmış olduğu açıklanıyor. Konu ile ilgili yapılan yorum ise çok başarılı:

Gelen başvuru e-postaları çoğunlukla CV, kaynak kod ve niyet mektubu gibi ek materyaller içeriyordu haliyle. Dosya formatlarına gösterilen itinanın belirleyiciliği başta bir tartışma konusu idi. Örneğin “doc” uzantılı başvuruları değerlendirmeye dahi almaksızın geri çevirmek bile gündeme gelmişti. Sonuçta Pardus’un savunduğu değerler ve amaçları hakkında bu kadar bilgisiz olan ve en ufak araştırma yapmadan başvuru yapan kişiler ile ilgili ön yargısız davranmak pek kolay olmayacaktı. Fakat neticede bu başvuruları da kabul etmeye ve böyle bir sebeple insanları elememizin doğru olmayacağına kanaat getirdik. Yine de tablo son derece hazin idi.

Sonuç olarak: Yukarıdaki yoruma katılıyorum.

Okuma ödevi: İmla denetleyicisi nasıl yazılır?

how-to-write-a-spelling-corrector.jpg

Google Okuyucu’da yazılar arasında zıplarken* birden Peter Norvig ismini görünce heyecanlandım. Kendisi okurken bol bol sövdüğüm “Yapay Zeka” kitabının yazarı.

Bu makalesinde verimli çalışan bir imla denetleyicisini 21 satırlık Python 2.5 kodu ile nasıl geliştirdiğini anlatıyor.

Okuma ödevlerimin arasına ekledim. Türkçeye çevirmek nasip olur mu? Hiç sanmıyorum.

Bir yerlerde, benim hakkımda günlük yazısı yazılmış olabilir mi?

g-bsrch-logo-sm.gif

Bir yerlerde, benim hakkımda günlük yazısı yazılmış olabilir mi? Google’ın Blog Search (Günlük yazıları içinde arama) özelliğini kullanarak bu sorunun cevabını öğrenmek istedim: Google Blog Search: “mustafa ulu”.

Sonuç olumsuz. Googlebot’un ulaşabildiği hiçbir yazıda benden bahsedilmemiş.
Bu arama sonucunda beklemediğim bir şeyle karşılaştım. Bana ait hiçbir yazı listede görünmüyordu. Yani Google Blog Search yalnızca günlük yazılarını dikkate alıyor, günlük sitelerindeki menüleri, sayfaları listelemiyor. Bunu da sadece beslemeleri (RSS veya Atom kaynaklarını) inceleyerek yapıyor. Hakkında sayfasından eklediğim alıntıda aranan kavramlarla ilgili olduğunda bütün bir siteyi listelediklerini söyleseler de bence bu özellik düzgün çalışmıyor.

You can use Blog Search to find either specific posts or entire blogs. The main search results always return links to posts. However, when there are entire blogs that seem to be a good match for your query, these will appear in a short list just above the main search results.

Güncelleme oldu: Technorati’nin yaklaşımı ise daha farklı. Aynı aramada sadece benim günlüğüm listeleniyor.

Simple Machines Lisansı’na güvenebilir miyim?

smflogo24bit.png

Simple Machines yazarları GNU GPL yerine kendi lisans metinlerini kullanıyorlar. Kendi metinlerinin GNU GPL’nin ve Açık Kaynak kavramının sunduğu imkanların neredeyse aynılarını sunduğunu savunuyorlar.
Ben kendilerine katılmıyorum. İşte nedenlerim;

  • Simple Machines Lisansının geleceğini kestiremiyoruz. GNU GPL’nin esnekliğini kabul etmeyen bu lisans ileride daha da katılaşabilir.
  • Simple Machines kodunu kendi ürünümüzün içerisinde dağıtamıyoruz. Bugün WordPress gibi sistemler bazı GNU/Linux dağıtımlarının paket depolarından kolaylıkla kurulabiliyor.
  • Simple Machines Lisansı yazılım ile birlikte başkası tarafından dağıtılan bir yazılım aracı veya kütüphanesinin dağıtılmasına izin vermiyor. Böylece yazılımın gelişim süreci kısıtlanıyor.

Dünya üzerindeki en başarılı Açık Kaynak projesi Linux, GNU GPL ile dağıtılıyor. GNU GPL’nin esnekliği sayesinde proje sahipleri kendi haklarını korurken aynı zamanda yazılımlarının geleceğini de güvenceye almış oluyorlar.

3BB: 3 Boyutlu Bilardo

Sabancı Üniversitesi’nde Bilgisayar Bilimi ve Mühendisliği yazısında bilardo oyunundan bahsetmiştim. 3 gün önce Karadeniz Teknik Üniversitesi Bilgisayar Mühendisliği son sınıf öğrencisi olduğunu söyleyen birisinden bir e-posta aldım. Bitirme projesi olarak 3 boyutlu bilardo oyunu hazırladığını ve benim yazdıklarımı görmek istediğini söylüyordu.

Faydalı olur düşüncesiyle projeyi indirmeye açıyorum.

Sadece kaynak kodlarının bulunduğu dağıtımı buradan: 3bb-0.0.1-src.zip

Kaynak kodları ile beraber çalıştırılabilir dosyanın da bulunduğu dağıtımı buradan indirebilirsiniz: 3bb-0.0.1-bin.zip

Notlar:

TotT: Better Stubbing in Python / Tuvalet Duvarında Test

debugging_vs_testing.PNG

Ben Python’la çalışmaya başladığım sıralarda Google “Google Testing Blog“u yayımladı. İlk yazıları ile birlikte yayımladıkları belgeyi hemen indirdim ve incelemeye başladım. Ne yazık ki o zaman Python hakkında yeterli tecrübeye sahip olmadığım için belgede anlatılmak istenen meseleyi anlayamamıştım. Zaman zaman belgeyi tekrar okuyup anlamaya çalışıyordum. En sonunda bugün (28 Ocak 2007) meseleyi tam olarak kavrayabildim.

Belgede anlatılanları ayrıntılı olarak açıklamaya çalışayım:

Elimizde aşağıdaki gibi bir fonksiyon bulunduğunu varsayalım.

def Foo(path):
  if os.path.exists(path):
    return DoSomething()
  else:
    return DoSomethingElse()

Bu fonksiyon dosya sistemimizdeki herhangi bir adresi parametre olarak alıyor. Bu adresin geçerli bir dosyaya işaret edip etmediğini kontrol ediyor. Sonuçta dosya mevcut ise “DoSomething()” değilse “DoSomethingElse()” fonksiyonunu çalıştırıyor.

Şimdi unit test sınıfımızın içerisinde bu fonksiyonu test eden bir fonksiyon yazacağız. Yapmak istediğimiz adresteki dosyanın var olması ve olmaması durumlarında yukarıdaki fonksiyonun davranışlarını test etmek.

def testFoo(self): # Somewhere in your unit test class / Unit test sınıfının içinde biryerde
  old_exists = os.path.exists
  try:
    os.path.exists = lambda x: True
    self.assertEqual(Foo('bar'), something)
    os.path.exists = lambda x: False
    self.assertEqual(Foo('bar'), something_else)
  finally:
    os.path.exists = old_exists # Remember to clean-up after yourself! / İşinizi bitirdikten sonra ortamı temizlemeyi unutmayın!

Bu fonksiyon ile bütün olasılıkları test ediyoruz. Fakat bazı durumlarda testlerin sonucu beklediğimiz gibi olmuyor. Örneğin “DoSomethingElse()” fonksiyonu başka bir dosyanın varlığını kontrol ediyor olabilir.

def DoSomethingElse():
  assert os.path.exists(some_other_file)
  return some_other_file

Sonuç olumsuz olacaktır çünkü “os.path.exists(path)”in hangi sonucu döndüreceğine test sırasında biz karar veriyoruz. Bu sorunu gidermek için birinci “os.path.exist” yapısını parametre olarak atayabiliriz.

def Foo(path, path_checker=os.path.exists):
  if path_checker(path):
    return DoSomething()
  else:
    return DoSomethingElse()

Böylece sadece yukarıda anlatılan problemi gidermiş olmuyoruz, aynı zamanda hız kazanıyoruz çünkü Python yerel değişkenlere daha hızlı ulaşabiliyor. Test fonksiyonumuz da aşağıdaki gibi kısaltılabiliyor.

def testFoo(self):
  self.assertEqual(Foo('bar', lambda x: True), something)
  self.assertEqual(Foo('bar', lambda x: False), something_else)

Debugging socks. Testing rocks. / Böcek avını bırak. Test etmeye bak.

SMF’nin Joomla! 1.0 serisi için köprü eklentisi ve çalışmayan URL’ler

SMF geliştiricilerinin bizlere sunduğu bir eklenti sayesinde Joomla! 1.0 serisi ile SMF arasında köprü kurabiliyoruz. Forum yazılımları arasında sadece SMF bu özelliğe sahip. Eklentinin biri dışında bütün özellikleri ek işlem yapmadan beklendiği gibi çalışıyor. Yalnızca SMF’yi Joomla! bileşeni olarak göstermek istediğinizde bazı URL’ler çalışmıyor. Bu sorunun çözümü Joomla!’nın htaccess.txt dosyasında kısmen verilmiş. Çözümü kısaca aktarayım ve gözden kaçan kısmı tamamlayayım.

“.htaccess” (htaccess.txt dosyasının adını “.htaccess” olarak değiştirmiş olmanız gerekiyor) dosyasının içinde aşağıdaki satıra benzeyen iki satır var.

#RewriteCond %{REQUEST_URI} ^(/component/option,com) [NC,OR] ##optional – see notes##

Bu satırları bulup başlarındaki “#” işaretini silin.

Joomla! web alanınızın kök dizinine kurulu ise artık SMF’ye “http://webalaniniz.com/component/option,com_smf/” adresinden erişebilirsiniz.

Eğer Joomla! web alanınız içinde alt dizinlerden birisine kurulu ise son bir değişiklik daha yapmanız gerekiyor. Mesela Joomla! “http://webalaniniz.com/deneme/” adresindeyse yukarıda verdiğim “.htaccess” dosyasının içindeki satırlardan sadece bir tanesini aşağıdaki gibi değiştirmelisiniz. Bu satır “Begin – Joomla! core SEF Section” başlığı altındaki satır olmalı.

RewriteCond %{REQUEST_URI} ^(/deneme/component/option,com) [NC,OR] ##optional – see notes##

Yeniden PHP

Uzun zamandır PHP kodu yazmamıştım. Bir süredir Python ile uğraşıyorum. Python’a alışan parmaklarım PHP’ye döndüğümde “$” işaretinin klavyedeki yerini bulmakta zorlandılar.

Gelelim PHP’ye neden ihtiyaç duyduğuma. “http://mustafau.com” adresine gelen bir kullanıcıyı tarayıcısının dil ayarlarına göre “http://gunluk.mustafau.com” (Türkçe) veya “http://blog.mustafau.com“a (İngilizce) yönlendirmek istiyorum. mustafau.com‘a yeni bir sunucu alanı almak istemediğim için ilk yönlendirmeyi “http://students.sabanciuniv.edu/~mustafau/r/redirect.php” adresine yapıyorum. Burada tarayıcının dil ayarlarına bakılıyor. Varsayılan ayarlarda “tr” (Türkçe) veya “az” (Azerice) var ise ziyaretçi gunluk.mustafau.com‘a yoksa blog.mustafau.com‘a yönlendiriliyor.

Şimdi de sıra betiği paylaşmaya geldi. Kodları aşağıya yazıyorum. Sıkıştırılmış dosya olarak indirmek isterseniz buyrun burada.

<?php

/**
* @version 1.0, redirect.php, 2007-02-28, 22:50
* @copyright (C)2007 Mustafa Ulu, All rights reserved. / Her hakkı saklıdır.
* @license GNU/GPL
* This is free software. / Bu özgür bir yazılımdır.
*/

// Tarayıcının varsayılan dillerini inceler, belirli dillere rastlar ise uygun
// yönlendirmeyi gerçekleştirir.
// EasyPHP 1.8 sürümü ile gelen 'index.php' dosyasından esinlenildi.

// tarayıcının varsayılan dillerini bir array içine al
$browser_languages = explode(",", getenv("HTTP_ACCEPT_LANGUAGE"));
$browser_languages_size = sizeof($browser_languages);

// İngilizce ve Türkçe dilleri için yönlendirme adresleri
$redirect_en = 'Location: http://blog.mustafau.com/';
$redirect_tr = 'Location: http://gunluk.mustafau.com/';

// varsayılan yönlendirme adresimiz İngilizce günlük
$redirect_str = $redirect_en;

for ($i = 0; $i < $browser_languages_size; $i++)
{
$lg = explode("-", $browser_languages[$i]);

if($lg[0] == 'tr' || $lg[0] == 'az') {
// 'tr' veya 'az' kodlarına rastlarsan Türkçe günlüğe yönlendir
$redirect_str = $redirect_tr;
break;
}
}

header($redirect_str);

?>

Eclipse ile çalışırken hata yapmaktan korkmayın!

Eclipse ile yazılım geliştirirken eski çalışmalarınızı kaybetmekten korkmayın. Eclipse sizin için projenizdeki dosyaların yedeklerini saklıyor.
eclipse-compare_with-yayinla.PNG
Herhangi bir tarihte kaydedilmiş yedek dosya ile mevcut dosyanın içeriğini karşılaştırabilirsiniz.

eclipse-replace_with-yayinla.PNG

Dilerseniz eski dosyayı geri getirebilirsiniz.
eclipse-preferences-yayinla.PNG

Ayarlar penceresinden dosyalarınızın saklanmasını istediğiniz gün sayısını belirtebilirsiniz.
eclipse-preferences-local_history-yayinla.PNG