Python 3 ve Tkinter

Cuma, 27 Ağu 2010

Bildiğiniz gibi, sitemizde devam eden bir anketimiz var. Bu ankette sorduğumuz soru şu:  “Acaba istihza.com’da Python 2.x’e mi yoksa Python 3.x’e mi ağırlık verilmeli?”.

Şu anda ankette Python 3.x önde gidiyor ve Python 2.x’e karşı arayı da gittikçe açıyor… Eğer Python 2.x’çiler son anda bir hamle yapmazsa anketin galibi Python 3.x olacakmış gibi duruyor… :)

Yukarıdaki sebepten ötürü, yakın bir zamanda artık istihza.com‘da Python 3.x konularına ağırlık vereceğim. Yalnız benim burada şöyle bir düşüncem var:

Hepinizin takdir edeceği gibi, günümüzde artık yazılan programlarda arayüz çok önemli bir olgu. Kullanıcılar genellikle konsol üzerinden çalışan, arayüzsüz uygulamalara dudak büküyorlar.  Bu nedenle, Python 3.x’i daha en başından itibaren Tkinter arayüz takımı ile bütünleşik bir şekilde anlatmayı planlıyorum.  Yani programlama konusunda hiç bir bilgisi olmayan bir kimse, Python 3.x’e daha ilk başladığı anda tkinter modülünü içe aktarmayı ve bu modülü kullanmayı öğrenecek. Böylece bir yandan Python’ı öğrenirken öte yandan da Tkinter’le arayüz geliştirmeyi kavramış olacak.

Dediğim gibi, bu düşünce henüz tasarı aşamasında. Şimdilik sadece beyin jimnastiği yapıyorum. Bu süreçte istihza.com kullanıcılarının da fikrini almak isterim. Böylece bu düşüncenin artı ve eksi yönlerini beraberce ortaya koyma imkanı elde ederiz.

istihza Python, istihza.com

Mecbur Değilsiniz

Pazartesi, 09 Ağu 2010

Bilgisayarlarında Microsoft Windows işletim sistemi kullanmayanların en büyük dertlerinden biri, markalı bilgisayar satın alırken yanında bir de Windows lisansı almak zorunda kalmalarıdır. İnsanın, kullanmayacağı bir işletim sistemine para vermek zorunda bırakılması gerçekten de son derece tatsız bir durum.

Ancak geçen yıl değerli ağabeyim Avukat Nihad Karslı’nın açtığı dava sonucu bu durum artık değişti. Bundan böyle, satın aldığınız markalı bilgisayarlarla birlikte Windows lisansı almak zorunda değilsiniz. Konuyla ilgili tartışmaya http://forum.pardus-linux.org/viewtopic.php?f=25&t=21098 adresinden ulaşabilirsiniz.

Pardus-Linux.Org ekibi, Bahri Meriç Canlı‘nın önerisiyle, bu önemli konunun forum arşivinde kaybolup gitmemesi için, sadece bu konuyla ilgili bir de web sitesi oluşturdu. Sitenin adresi http://www.mecburdegilsiniz.com/

Eğer siz de bu girişime destek olmak isterseniz, http://forum.pardus-linux.org/viewtopic.php?f=196&t=22093 adresinde tartışmaya katılabilirsiniz.

Gösterdikleri çaba ve emekten ötürü Avukat Nihad Karslı’ya, Bahri Meriç Canlı’ya ve Pardus-Linux.Org ekibine teşekkür ederim.

istihza Uncategorized , , , , ,

Dünya Sistem Yöneticileri Gününüz Kutlu Olsun!

Cuma, 30 Tem 2010

Meğer 30 Temmuz “Dünya Sistem Yöneticileri Günü” imiş… :) Bütün sistem yöneticilerinin “sistem yöneticileri gününü” tebrik ediyorum!.. Sayfası bile var: http://www.sysadminday.com/


istihza Uncategorized

istihza.com: Python 2 ya da Python 3

Perşembe, 29 Tem 2010

Bildiğiniz gibi, Python’un en yaygın kullanılan sürümleri 2.x serisinden… Henüz Python 3.x serisi yeterli yaygınlığa ulaşamadı. Bunun sebeplerini daha önceki günlük girdilerinde tartışmıştık. Python 2.x’in bu durumundan ötürü ben de istihza.com’da 2.x ile ilgili derslere ağırlık veriyorum. Daha önce yaptığımız bir anketin sonucuna göre de  istihza.com kullanıcıları ağırlıklı olarak 2.x serisini kullandığı için sitedeki 3.x belgelerini uzun süredir güncellemiyordum.

Ancak son dönemlerde Python 3.x gelişimi konusunda belli bir hızlanma söz konusu… Bu sebeple ben de istihza.com kullanıcılarına şöyle bir soru yöneltmek istiyorum:

istihza.com’da Python 2′ye mi yoksa Python 3′e mi ağırlık verilmeli?

Bu soruya cevap bulabilmek için yeni bir anket hazırladım. Ankete, sayfanın sağ tarafındaki “Polls” başlığı altından ulaşabilirsiniz. Anketten çıkacak sonuca göre ya Python 2.x belgelerini son hızla güncellemeye devam edeceğim, ya da ağırlığı Python 3.x belgelerine vereceğim.

istihza istihza.com , , ,

Python 3 ve Python 2

Çarşamba, 28 Tem 2010

Python 3.x serisinin ilk kararlı sürümü 3 Aralık 2008 tarihinde yayımlandı. Ancak Python 3 eski sürümlerle uyumlu olmadığı için insanlar hala Python 3′e geçmekte tereddüt ediyor. Çünkü hem etraftaki Python programları, hem Python’la ilgili kaynaklar hem de önemli üçüncü şahıs modülleri henüz Python 3′e taşınmadı. Dolayısıyla, henüz Python 3′e taşınmamış modüllere bağımlılık duyan Python programlarının yazarları 3.x’e geçiş konusunda (haklı olarak) ayak diretiyor.

Python geliştiricileri, bir yandan Python 3′ü geliştirmekle uğraşırken, bir yandan da insanların Python 3′e geçişini hızlandırmak ve korkuları gidermek için bilgilendirici ve yüreklendirici makaleler yayımlıyor. Bu yüreklendirici makalelerden biri de http://wiki.python.org/moin/Python2orPython3 adresinde bulunuyor. Bu makalede, Python kullanıcılarının sıklıkla sorduğu “Python 3′ü mü yoksa Python 2′yi mi kullanmalıyım?” sorusuna bir cevap vermeye çalışıyor Python geliştiricileri…

Bu soruyu İngilizce bilmeyenlerin de sorduğunu dikkate alarak, yukarıdaki bağlantıda verdiğim makaleyi Türkçe’ye çevirdim.

İşinize yaraması dileğiyle…

Not: Özgün makaleyi hızlı bir şekilde Türkçe’ye çevirdiğim için çeviride bazı aksaklıklar gözünüze çarpabilir. Çeviri metin üzerinde iyileştirme çalışmaları yapmaya devam edeceğim. Ayrıca özgün metin üzerinde değişiklikler olursa, bu değişiklikleri çeviri metne de yansıtacağım. O yüzden bu günlük girdisini zaman zaman ziyaret etmenizde fayda olabilir…

Fırat Özgül

************************************

Geliştirme çalışmalarım için Python 2’yi mi yoksa Python 3’ü mü kullanmalıyım?

Bu ikisinin farkı nedir?

Kısa cevap: Python 2.x dilin süregelen durumunu temsil eder. Python 3.x ise yepyeni, pırıl pırıl bir dildir.

Bu makalenin yazıldığı sırada (4 Temmuz 2010) Python’ın kararlı 2.7 sürümü yayımlanmış, serinin bu son sürümünün uzun süre destekleneceği de ifade edilmişti. 2.7’den sonra 2.x serisinde artık başka bir ana sürüm olmayacak. 3.x serisi etkin bir şekilde geliştirilmeye devam ediyor. Bu serinin 3.1 sürümü yayımlandı. 3.2 sürümü ise bu yılın sonuna doğru yayımlanacak.

3.x, Python’un en yeni dalı olup bu dilin geleceğidir. Python programlama dilinin baş geliştiricisi Guido Van Rossum, 2.x serisindeki sürümlerin aksine geriye dönük uyumluluğu gözardı ederek Python 2.x üzerinde adamakıllı bir temizlik yapmaya karar verdi. Bu yaklaşım sayesinde dilin bazı temel yönleri (mesela print ve exec’in birer deyim olması, tamsayılarda taban bölme kullanılması), bu dili yeni öğrenenler için daha kolay anlaşılır bir hale getirilebilme imkanına kavuşurken, bu yönlerin dilin geri kalanıyla da daha uyumlu olması sağlanabilecek. Böylelikle dile yakın zamanda eklenmiş özelliklerin (mesela döngü kurucular) dilde eskiden beri varolan özelliklere uyarlanması da mümkün olacak (mesela range gömülü fonksiyonunun 2.x serisinde liste döndürürken, 3.x serisinde döngü kurucu döndürmesi).

Python 3.0’daki Yenilikler adlı belgede dildeki başlıca değişiklikler ve mevcut 2.x kodlarıyla olan muhtemel uyumsuzluklar gayet güzel bir şekilde özetleniyor.

Geçen yıllar içinde geniş Python ekosistemi çok sayıda kaliteli yazılım ortaya çıkardı. 3.x serisiyle birlikte geriye dönük uyumluluğun ortadan kaldırılmasının dezavantajı, bu yazılımların 3.x serisinde çalışmaz hale gelecek olmasıdır.

O halde hangi sürümü kullanmalıyım?

Hangi sürümü kullanmanız gerektiği, çoğunlukla amacınızın ne olduğuna bağlıdır.

Yapmak istediğiniz şeyi Python 3.x ile yapabiliyorsanız ne ala! Python 3.x’te nispeten kısıtlı sayıda kütüphane desteği olması ve mevcut GNU/Linux dağıtımları ile Mac’lerin hala öntanımlı olarak 2.x sürümleriyle birlikte gelmesi gibi birkaç dezavantaj dışında Python 3.x bir dil olarak her yönüyle kullanıma hazırdır. Python 3.x’in kullanıcılarınızın bilgisayarlarında bulunduğu (bu makaleyi okuyan pek çok kişinin sadece kendi için veya denetleyebildikleri bir hedef kitle için geliştirme yaptığını düşünürsek bunu sağlamak pek de zor olmasa gerek) ve üçüncü şahıs yazılımların eksikliğinin ayak bağı olmadığı (veya ihtiyacınız olan paketlerin Python 3’ü desteklediğini bildiğiniz) durumlarda Python 3.x kusursuz bir seçimdir. Ayrıca şu anda öntanımlı sürüm olarak kullanmasalar da pek çok GNU/Linux dağıtımı son kullanıcılar için Python 3.x paketleri sunabilmektedir.

Ancak yine de Python 3 yerine Python 2 kullanmanızı gerektiren bazı ciddi meselelerle karşılaşabilirsiniz.

Birincisi, eğer programınız denetiminiz dışındaki bir ortamda çalışacaksa, kullanacağınız Python sürümünü seçme özgürlüğünüz olmayabilir. Böyle bir durumda belli bir Python sürümü kullanmak durumunda kalabilirsiniz.

İkincisi, eğer henüz Python 3 ile uyumlu bir sürümü yayımlanmamış belli bir üçüncü şahıs paketi ya da uygulaması kullanmak istiyorsanız, üstelik bu paketi Python 3.x sürümüne taşımak hiç de kolay bir iş değilse, o paketten yararlanabilmek için Python 2’yi kullanmayı tercih edebilirsiniz.

Python 3’ü desteklemeyen önemli uygulamalar arasında Twisted (ağ programlama ve başka pek çok şey için kullanılan bir kütüphane), gevent (Twisted’a benzeyen, ama farklı özellikleri olan bir kütüphane), Django ve Pylons (web siteleri hazırlamaya yardımcı uygulamalar), PyGTK ve PySide (grafik arayüz tasarımı), py2exe (programlarınızı Windows için paketlemeye yarayan bir kütüphane), PIL (resim işleme) ve numpy (sayı işlemleri) sayılabilir…

Bu kütüphanelerin çoğu için Python 3.x uyumluluğu üzerinde, farklı aşamalara gelmiş birtakım çalışmalar yürütülüyor. Örneğin numpy üzerindeki çalışmalar tamamlanmak üzere. Bazı kütüphanelerde ise durum bir öncelik meselesinden ibaret. Mesela Twisted çoğunlukla üretim boyutundaki sunucuları hedeflediği için, dilde büyük değişiklikler getiren bir sürüme destek vermek şöyle dursun, Python’un eski sürümlerini desteklemek dahi büyük önem taşıyor. (Twisted, 3.x’e taşıma işleminin hiç de kolay olmadığı paketler denince akla gelen başlıca örnektir.)

Elbette 3.x’e taşınmış pek çok paket de var. Örneğin yazdıkları programlara grafik arayüz eklemek isteyenler PyGTK yerine PyQT veya standart kütüphane içinde gelen Tkinter’i kullanabilir. Python 3.x kullanmak istiyor, ama bir bağımlılıktan ötürü bundan çekiniyorsanız öncelikle biraz araştırma yapmak iyi bir fikir olabilir. Kütüphaneleri taşıma işlemi devam eden bir süreçtir. Ayrıca bu wiki sayfası da zaman zaman güncellenebilir.

Python 3’e geçişle ilgili başka bir sorun da referans kitaplar ve internet üzerindeki pek çok belgenin (örnek kodlar da dahil) hep Python 2.x üzerine olmasıdır. Bu sebeple Python 3 kullanabilmek için kaynaklarda bazı düzenlemeler yapmak gerekebilir. Aynı şekilde IRC üzerinden yardım almaya alışmış kişiler için konuşmak gerekirse, #python kanalının müdavimleri, henüz 3.x’e taşınmamış, eskiden beri kullanılan yazılımlara bel bağlayan güngörmüş geliştiricilerdir (Burada örnek olarak akla Twisted, Zope ve daha önce bahsettiğimiz paketler geliyor). Sonuç olarak, IRC üzerindeki geliştiriciler size Python 3.x ile ilgili veya Python 3.x’e taşınmış kütüphaneler ile ilgili sorunlar konusunda, Python 2.x konularında yardımcı olabildikleri kadar yardımcı olamayabilir. Aynı şey #python kanalı dışındaki ortamlar için de geçerlidir. Elbette bu durum yavaş yavaş düzeliyor. Ayrıca bazı problemler zannettiğiniz kadar 3.x’e özgü olmayabilir. Dolayısıyla #python kanalından veya alternatif kaynaklardan yardım istemek yine de iyi bir fikir olabilir. Her şeye rağmen, comp.lang.python gibi, 3.x kullanıcılarının bolca bulunduğu ve sorunlarınız için yardım alabileceğiniz önemli kanallar da mevcuttur.

Ama 2.x sürümünü bir kenara bırakmak en iyisi değil mi? Ne de olsa bu, pek çok hata barındıran eski bir dil. Üstelik bütün bu hatalar ortadan kalksın diye koca bir sürüm yayımlandı.

Aslında pek de öyle değil. İyi haber şu ki, sırf 2.x kullanıyorsunuz diye 3.x’in bütün nimetlerinden mahrum kalacaksınız diye bir kaide yok. 3.0 ile uygulamaya giren pek çok yenilik 2.6’ya da aktarıldı. Üstelik 3.0, 3.1 ve yakında yayımlanacak olan 3.2 ile gelen daha pek çok yenilik de 2.7 sürümüne aktarılacak. 2.x’te yapamayıp da 3.x’te yapabileceğiniz şeyler çok azdır. Ama 2.x ile yapabilecekleriniz, 3.x ile yapabilecekleriniz kadar şık ve zarif değildir. Yalnızca 3.x sürümlerinde bulunan ve muhtemelen 2.x serisine taşınmayacak olan bazı özellikler şöyle sınıflandırılabilir:

  1. Açıklamalı Fonksiyon Parametreleri (function annotations)
  2. Sadece isimli argümanlardan oluşan fonksiyonlara ait sözdizimi
  3. Genişletilmiş demet çözme
  4. Yerel olmayan değişken tanımlama

2.x’e taşınan özelliklere ilişkin ayrıntılı bilgi için bkz. Python 2.6’daki Yenilikler ve Python 2.7’deki Yenilikler

İyi yazılmış bir 2.x kodu 3.x koduna benzer. Ancak bunu sağlamak için bazı şeylere de dikkat etmeniz gerekecektir. Mesela yeni tipte sınıfları kullanmak, print’in eski ve küflenmiş kullanımlarından uzak durmak, mümkün olduğunca liste/demet/sözlük üreteçlerinden yararlanmak gibi… Buna şöyle bir örnek verebiliriz: İyi bir 2.x kodunda range yerine xrange kullanılır. xrange 3.x’teki range’e çok benzer (Tabii Python 3’teki range çok daha yeteneklidir, çünkü sys.maxint’in gösterdiği değerden çok daha fazlasını kullanabilir).

Her şeyden öte, 2.x’ten 3.x’e geçişin olabildiğince sancısız olabilmesi için iyi kod yazmaya odaklanmanızı öneriyoruz. Bununla, eksiksiz birim testleri yazmayı ve Unicode’u düzgün kullanabilmeyi kastediyoruz (Python 3.x, Unicode ve baytlar konusunda 2.x’e kıyasla daha tavizsizdir. Bu tavizsizlik iyi bir şey olarak kabul edilir, ama bu durum bazı yazılımların 3.x’e aktarılmasını da epey zorlaştırabilir).

Python 3’ü kullanmak istiyorum, ama elimde sadece Python 2.x ile çalışabilen küçük bir kütüphane var. Acaba Python 2 ile devam mı etmeliyim, yoksa o kütüphaneyi kullanmaktan vaz mı geçmeliyim?

Halihazırda Python 3’ü destekleyen alternatif bir paket bulamadığınızı varsayarsak, yine de önünüzde birkaç seçenek var:

  1. O kütüphaneyi 3.x’e taşıyabilirsiniz (“Taşımak”, o kütüphaneyi 3.x üzerinde çalışabilir hale getirmek demektir.)
  2. Eğer taşıma işlemi çok zor olacaksa ve programınızın öteki bütün bağımlılıkları 2.x ile çalışıyorsa siz de 2.x üzerinde çalışmaya devam edebilirsiniz. Başka yerlerde de ifade edildiği gibi, bütün bağımlılıklar başarıyla 3.x’e taşındıktan sonra, iyi yazılmış bir 2.x kodunu 3.x’e taşımak sancısız bir süreç olacaktır.
  3. O kütüphanenin kattığı özelliğin ne kadar önemli olduğunu kafanızda tartın. Kimbilir belki o kütüphaneyi programınızdan çıkarsanız da olur.

Arzu edilen, o kütüphaneyi 3.x’e taşımaktır. Genellikle birileri zaten bu iş üzerinde çalışıyordur. Değilse, kütüphanenin geliştiricileri bu konuda yardım teklifinizi çoğunlukla geri çevirmeyecektir. Çünkü taşıma işlemi hem özgün yazılım içindeki hataların bulunmasını sağlar, hem de özgün yazılımın ve 3.x’e taşınmış halinin kalitesini yükseltir. Taşıma işlemi her zaman o kadar kolay değildir. Ancak taşımak sıfırdan yazmaktan kolaydır.

Taşıma işleminin nasıl yapılacağı PEP 3000‘de açıklanmıştır. Ana fikir, söz konusu kütphanenin 2.x sürümünü alıp, Python 3’le uyumlu bir sürüm elde etmek için 2to3 adlı dönüşüm betiğini kullanmak ve bütün birim testlerinin 3.x sürümünde de geçer olup olmadığını kontrol etmektir. Eğer testler geçersizse özgün 2.x kaynağını düzenleyip aynı işlemi tekrar edin. Bu yaklaşım sayesinde tek bir 2.x kod tabanı üzerinden hem 2.x’i hem de 3.x’i kolayca destekleyebilirsiniz. Bu, 2.x ve 3.x dallarını ayrı ayrı desteklemekten çok daha kolaydır (Bunu bir de Python geliştiricilerine sorun. Ne de olsa onlar bu işi yıllardır yapıyor!).

Eğer kütüphane içinde C eklenti modülleri de varsa taşıma işlemi karmaşık bir hal alabilir, ancak böyle bir durumda bile muhtemelen taşıma işlemi kendi paketinizi sıfırdan yazmaktan kolay olacaktır.

Python vikisinde bu konuya ilişkin daha ayrıntılı kılavuzlar bulabilirsiniz: Python’u Py3k’ya Taşımak, Eklenti Modüllerini Py3k’ya Taşımak

3.x ile bir şeyler yazmaya karar verdim, ama şimdi bu yazdığım şeyi elinde sadece 2.x bulunan biri kullanmak istiyor. Ne yapmalıyım?

2.x kaynak kodlarından 3.x kodları üretilmesine olanak tanıyan 2to3 adlı aracın yanısıra, 3.x kodlarını 2.x koduna dönüştürmeyi amaçlayan 3to2 adlı bir betik de vardır. Teorik olarak, 3.x’te daha az pürüzlü nokta olduğu için (ne de olsa geriye dönük uyumluluğu kırmanın ana sebeplerinden biri de bu pürüzlü noktaları olabildiğince gidermekti!) 3to2 aracı daha iyi sonuç verecektir. Ancak 3.x’e özgü özellikleri (mesela açıklamalı fonksiyon parametreleri veya genişletilmiş demet çözme) bolca kullanan kodların başarıyla 2.x’e dönüştürülmesinin de pek mümkün olmayacağı bilinmelidir.

Ayrıca şu anda 3to2 aracının, 2to3 aracına kıyasla daha az kullanıldığını söyleyebiliriz. Dolayısıyla 3to2 aracında bazı aksaklıklarla karşılaşabilirsiniz. Ancak eğer 3.x kodları yazmak istiyorsanız elbette bu araç denemeye değer…

Python 2 ile Python 3 arasında seçim yapmanıza yardımcı olabilecek başka kaynaklar

#python tayfasından öğütler (aynı zamanda bu makalenin de ilham kaynağıdır): http://python-commandments.org/python3.html

Özellikle Python 3 üzerinden programlama öğretimi konusunda Nick Efford’un bazı önerileri var: http://www.comp.leeds.ac.uk/nde/papers/teachpy3.html

Mark Pilgrim Dive Into Python’ın Python 3’ü temel alan sürümünü yayımladı: http://diveintopython3.org/whats-new.html

“IronPython kullanıcılarının Python 3 hakkında bilmesi gerekenler”: http://www.itworld.com/development/104506/python-3-and-ironpython

istihza Python, istihza.com , , , ,

Odun ve Parçala

Çarşamba, 28 Tem 2010

istihza.com takipçilerinin Python programlama dilini kullanarak yazdıkları programları tanıttığımız “Python Programları” adlı bölümümüze bugün iki yeni program daha ekledik. Bu programlardan birincisi “Odun”, ikincisi ise “Parçala” adını taşıyor. Dilerseniz önce Odun’dan başlayalım.

GNU/Linux dağıtımlarını kullananların gayet iyi bildiği gibi, interneti olmayan bir bilgisayara program kurmak, “bağımlılık cehennemi” denen şeyden ötürü oldukça belalı bir iştir. İşte Odun adlı program bu meselenin en azından bir kısmını ortadan kaldırmak amacıyla üretilmiş bir yazılım.

Özel olarak Pardus kullanıcılarını hedefleyen bu uygulama, interneti olmayan Pardus makinaların çevrimdışı güncellenmesine yardımcı oluyor.

Bu noktada,  “Odun” adı nereden geliyor diye sorduğunuzu duyar gibiyim. “Odun” kelimesinin açılımı “Offline Downloader Updater iNstaller”. Yani “Çevrimdışı İndirme, Güncelleme ve Kurulum”.

Python programlama dili ve PyQT4 kullanılarak yazılan Odun; Aşkın Yollu, Erdem Artan ve Metehan Özbek imzasını taşıyor. Geliştirilmesi hala devam eden bu yazılımı her zaman olduğu gibi http://istihza.com/programlar/icindekiler_programlar.html adresinden indirebilirsiniz.

Python Programları bölümümüzün ikinci konuğu ise Metehan Özbek tarafından yazılmış, “Parçala” adlı bir program. Python programlama dili ve PyQT4 kullanılarak hazırlanan bu program işlev olarak Hj-Split adlı yazılıma benziyor. Parçala’nın görevi büyük boyutlu dosyalarınızı parçalayıp birleştirmektir. Parçala, aynı zamanda hash değeri de üretebiliyor.

Bu programı da http://istihza.com/programlar/icindekiler_programlar.html adresinden indirebilirsiniz.

Bu programları yazan ve bize ulaştıran Aşkın Yollu, Erdem Artan ve Metehan Özbek’e teşekkür ederim.

İyi çalışmalar,

istihza

istihza Yazılım , , , , , ,

Invent with Python

Salı, 13 Tem 2010

Dün istihza.com okurlarından Kadir Can Çetin bana Python ve PyGame ile ilgili bir kitaptan söz etti. Kitabın adı “Invent Your Own Computer Games With Python” [Python'la Kendi Bilgisayar Oyunlarınızı Tasarlayın].

Bu kitap Al Sweigert adlı bir Python programcısı tarafından, 10-12 yaş arası çocukların anlayabileceği bir dil kullanılarak yazılmış. Ancak yazar bu kitabın her yaştan insana hitap ettiğini de vurguluyor. Yazarın web sitesine http://inventwithpython.com/ adresinden ulaşabilirsiniz.

Kitaba erişmenin üç yolu var:

1. Kitabı amazon.com‘dan satın alabilirsiniz. Kitabın fiyatı 25 dolar.

2. Kitabı ücretsiz olarak internetten okuyabilirsiniz.

3. Kitabı PDF biçiminde bilgisayarınıza indirebilirsiniz.

Kitabın içeriği ise şu konulardan oluşuyor:

Chapter 1 – Installing Python
Chapter 2 – The Interactive Shell
Chapter 3 – Strings
Chapter 4 – Guess the Number
Chapter 5 – Jokes
Chapter 6 – Dragon Realm
Chapter 7 – Using the Debugger
Chapter 8 – Flow Charts
Chapter 9 – Hangman
Chapter 10 – Tic Tac Toe
Chapter 11 – Bagels
Chapter 12 – Cartesian Coordinates
Chapter 13 – Sonar
Chapter 14 – Caesar Cipher
Chapter 15 – Reversi
Chapter 16 – AI Simulation
Chapter 17 – Graphics and Animation
Chapter 18 – Collision Detection and Input
Chapter 19 – Sound and Images
Chapter 20 – Dodger
Appendix A – Differences between Python 2 and 3
Appendix B – Statements, Functions, and Methods Reference
Appendix C – Running Python Programs Without Python Installed
Appendix D – Common Error Messages in Python

Kitabı yazan Al Sweigert’e ve beni kitaptan haberdar eden Kadir Can Çetin’e teşekkür ediyorum.

istihza Python , , , ,

Şifreli Metin

Perşembe, 17 Haz 2010

http://www.istihza.com/blog/this-modulu-icindeki-sifreli-metin.html/ adresindeki yazıda Python’daki this modülü içinde yer alan şifreli bir metinden ve bu metnin Python yardımıyla nasıl çözüleceğinden söz ettik.

Sizce o şifreli metni, kesinlikle Python’dan yararlanmadan, sadece İngilizce bilgisi kullanarak çözme imkanı var mı? Yani diyelim ki elinizde sadece bu şifreli metin var ve bildiğiniz tek şey bu metnin İngilizce olduğu… Bir de metindeki “Gur” kelimesinin “The” anlamına geldiğini biliyoruz. Böyle bir durumda acaba bu metin nasıl çözülür?

Metnimiz şu:

“Gur Mra bs Clguba, ol Gvz Crgref. Ornhgvshy vf orggre guna htyl. Rkcyvpvg vf orggre guna vzcyvpvg. Fvzcyr vf orggre guna pbzcyrk. Pbzcyrk vf orggre guna pbzcyvpngrq. Syng vf orggre guna arfgrq. Fcnefr vf orggre guna qrafr. Ernqnovyvgl pbhagf. Fcrpvny pnfrf nera’g fcrpvny rabhtu gb oernx gur ehyrf. Nygubhtu cenpgvpnyvgl orngf chevgl. Reebef fubhyq arire cnff fvyragyl. Hayrff rkcyvpvgyl fvyraprq. Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff. Gurer fubhyq or bar– naq cersrenoyl bayl bar –boivbhf jnl gb qb vg. Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh’er Qhgpu. Abj vf orggre guna arire. Nygubhtu arire vf bsgra orggre guna *evtug* abj. Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg’f n onq vqrn. Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn. Anzrfcnprf ner bar ubaxvat terng vqrn — yrg’f qb zber bs gubfr!”

Bulmaca meraklılarına hodri meydan!… :)

istihza Uncategorized ,

this Modülü İçindeki Şifreli Metin

Çarşamba, 16 Haz 2010

Python’daki sürpriz yumurtalar içinde en bilineni herhalde şudur:

>>> import this

Bu komutu verdiğinizde, Python’un felsefesini anlatan bir metin görürsünüz:

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

Ancak “this” modülü yukarıdaki metinden ibaret değildir. Bu modülün başka özellikleri de bulunur. Peki nedir bu özellikler?

Yukarıdaki çıktıyı veren “this” adlı modülün içeriğine baktığımızda şöyle bir şeyle karşılaşıyoruz:

>>> dir(this)
 
['__builtins__', '__doc__', '__file__', '__name__',
 '__package__', 'c', 'd', 'i', 's']

Demek ki “this” modülünün içinde “c”, “d”, “i” ve “s” adlı dört adet nitelik var. Ben bu yazıda sizin dikkatinizi “s” ve “d” niteliklerine çekmek istiyorum.

Önce “this” modülünün “s” niteliğini kontrol edelim:

>>> this.s
 
"Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf 
orggre guna htyl.\nRkcyvpvg vf orggre guna 
vzcyvpvg.\nFvzcyr vf orggre guna pbzcyrk.\nPbzcyrk 
vf orggre guna pbzcyvpngrq.\nSyng vf orggre guna 
arfgrq.\nFcnefr vf orggre guna qrafr.\nErnqnovyvgl 
pbhagf.\nFcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx 
gur ehyrf.\nNygubhtu cenpgvpnyvgl orngf chevgl.
\nReebef fubhyq arire cnff fvyragyl.\nHayrff rkcyvpvgyl 
fvyraprq.\nVa gur snpr bs nzovthvgl, ershfr gur grzcgngvba 
gb thrff.\nGurer fubhyq or bar-- naq cersrenoyl bayl bar 
--boivbhf jnl gb qb vg.\nNygubhtu gung jnl znl abg or boivbhf 
ng svefg hayrff lbh'er Qhgpu.\nAbj vf orggre guna arire.
\nNygubhtu arire vf bsgra orggre guna *evtug* abj.\nVs 
gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
\nVs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n 
tbbq vqrn.\nAnzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f 
qb zber bs gubfr!"

Karşımıza anlamsız gibi görünen bir karakter dizisi çıktı… Aslında bu karmaşık ve anlamsız görünen kelime yumağının, en başta verdiğimiz “The Zen of Python” adlı metnin “şifrelenmiş” hali olduğunu az çok tahmin edebiliyoruz. Peki bundan nasıl emin olabiliriz?

Herhangi bir adım atmadan önce bir de “this” modülünün “d” niteliğine bakalım:

>>> this.d
 
{'A': 'N', 'C': 'P', 'B': 'O', 'E': 'R', 'D': 'Q', 'G': 'T',
 'F': 'S', 'I': 'V', 'H': 'U', 'K': 'X', 'J': 'W', 'M': 'Z', 
 'L': 'Y', 'O': 'B', 'N': 'A', 'Q': 'D', 'P': 'C', 'S': 'F', 
 'R': 'E', 'U': 'H', 'T': 'G', 'W': 'J', 'V': 'I', 'Y': 'L',
 'X': 'K', 'Z': 'M', 'a': 'n', 'c': 'p', 'b': 'o', 'e': 'r',
 'd': 'q', 'g': 't', 'f': 's', 'i': 'v', 'h': 'u', 'k': 'x',
 'j': 'w', 'm': 'z', 'l': 'y', 'o': 'b', 'n': 'a', 'q': 'd',
 'p': 'c', 's': 'f', 'r': 'e', 'u': 'h', 't': 'g', 'w': 'j',
 'v': 'i', 'y': 'l', 'x': 'k', 'z': 'm'}

“d” niteliği ise, anahtarları ve değerleri alfabetik karakterler olan bir sözlük barındırıyor. Gördüğünüz gibi bu sözlükte belli harfler belli harflerle eşleştirilmiş.

Bu alfabetik sözlüğün de yukarıdaki şifreli metinle bir bağlantısı olduğunu kestirmek çok zor değil. Hemen bir kaç deneme yapalım:

>>> this.d[this.s[0]]
 
'T'

Burada this.s adlı karmaşık karakter dizisinin ilk harfini this.d adlı sözlüğe anahtar olarak verdik. this.s karakter dizisinin ilk harfi “G”. Dolayısıyla şöyle bir şey yapmış olduk:

>>> this.d["G"]

Tabii this.d sözlüğünde “G” harfinin karşılığı “T” harfi olduğu için çıktıda “T” harfini aldık. O halde şöyle bir şey yazabiliriz:

>>> for i in this.s:
...     print this.d[i]

Buradan şöyle bir çıktı alırız:

T
h
e
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyError: ' '

Bu çıktı bize iki önemli bilgi verdi:

Birincisi, şifreli metnin ilk kelimesini elde ettik. Buna göre ilk kelime “The”. Yani doğru yoldayız!

İkincisi, sözlükte sadece alfabe harfleri olduğu için, for döngüsü bir boşluk karakteriyle karşılaştığında doğal olarak KeyError hatası veriyor. Yani kelimeleri birbirinden ayıran boşluk karakterlerinin ve hatta satırları bitiren “yeni satır” (newline — \n) karakterlerinin icabına bakmamız gerekiyor. Bunun için şöyle bir şey yazılabilir:

>>> a = ""
>>> for i in this.s:
...     try:
...         a += this.d[i]
...     except KeyError as k:
...         a += str(k)
...
>>> print a

Burada öncelikle a adlı boş bir karakter dizisi tanımladık. Biraz sonra bir for döngüsü ile alacağımız bütün harfleri bu a adlı karakter dizisi içinde toplayacağız.

Sonraki satırda for döngümüzü yazıyoruz. Burada yaptığımız şey şu: this.s adlı karakter dizisi içindeki bütün karakterleri tek tek this.d sözlüğü içinde sorgulayıp, hepsini a adlı karakter dizisine atıyoruz. Ancak this.s adlı karakter dizisi içinde, this.d adlı sözlükte herhangi bir karşılığı olmayan boşluk ve yeni satır karakterleri de olduğu için, KeyError hatası alma ihtimaline karşı, hata veren bütün karakterleri de tek tek a adlı karakter dizisine gönderiyoruz. Böylece şifreli karakter dizisi içindeki bütün boşlukları ve satır başlarını muhafaza etmiş oluyoruz. Eğer bu boşluk ve satır başlarını a karakter dizisine göndermek yerine mesela pass gibi bir deyimle görmezden gelirsek şifreli metindeki boşlukları ve satır başlarını kaybetmiş oluruz. O zaman a adlı karakter dizisindeki bütün harfler çıktıda birbirine bitişik görüneceği için yine anlaşılması zor bir metin ortaya çıkmış olur…

Son olarak da a adlı karakter dizisini ekrana yazdırıyoruz…

Bakalım bu kodlar bize ne çıktı veriyor:

The’ ‘Zen’ ‘of’ ‘Python’,” ‘by’ ‘Tim’ ‘Peters’\n”
\n’Beautiful’ ‘is’ ‘better’ ‘than’ ‘ugly’.”\n’Explicit’
‘is’ ‘better’ ‘than’ ‘implicit’.”\n’Simple’ ‘is’ ‘better’
‘than’ ‘complex’.”\n’Complex’ ‘is’ ‘better’ ‘than’
‘complicated’.”\n’Flat’ ‘is’ ‘better’ ‘than’ ‘nested’.
”\n’Sparse’ ‘is’ ‘better’ ‘than’ ‘dense’.”\n’Readability’
‘counts’.”\n’Special’ ‘cases’ ‘aren”‘”t’ ‘special’ ‘enough’
‘to’ ‘break’ ‘the’ ‘rules’.”\n’Although’ ‘practicality’ ‘beats’ ‘purity’.”\n’Errors’ ‘should’ ‘never’ ‘pass’ ‘silently’.
”\n’Unless’ ‘explicitly’ ‘silenced’.”\n’In’ ‘the’ ‘face’ ‘of’
‘ambiguity’,” ‘refuse’ ‘the’ ‘temptation’ ‘to’ ‘guess’.
”\n’There’ ‘should’ ‘be’ ‘one’-”-” ‘and’ ‘preferably’
‘only’ ‘one’ ”-”-’obvious’ ‘way’ ‘to’ ‘do’ ‘it’.”\n’Although’
‘that’ ‘way’ ‘may’ ‘not’ ‘be’ ‘obvious’ ‘at’ ‘first’ ‘unless’
‘you”‘”re’ ‘Dutch’.”\n’Now’ ‘is’ ‘better’ ‘than’ ‘never’.
”\n’Although’ ‘never’ ‘is’ ‘often’ ‘better’ ‘than’ ”*’right’*”
‘now’.”\n’If’ ‘the’ ‘implementation’ ‘is’ ‘hard’ ‘to’ ‘explain’,
” ‘it”‘”s’ ‘a’ ‘bad’ ‘idea’.”\n’If’ ‘the’ ‘implementation’ ‘is’
‘easy’ ‘to’ ‘explain’,” ‘it’ ‘may’ ‘be’ ‘a’ ‘good’ ‘idea’.
”\n’Namespaces’ ‘are’ ‘one’ ‘honking’ ‘great’ ‘idea’
”-”-” ‘let”‘”s’ ‘do’ ‘more’ ‘of’ ‘those’!’

Bingo! Böylece şifreli metni çözmüş olduk…

Şifreli metni çözmemizi sağlayan kodları aslında şu şekilde de yazabilirdik:

>>> a = ""
>>> for i in this.s:
...     a += this.d.get(i, i)
... 
>>> print a

Gördüğünüz gibi, bu defaki çıktımız çok daha zarif…

Burada Python sözlüklerinin get() metodunu kullandık. Bu sayede try…except bloklarıyla uğraşmamıza da gerek kalmadı. get() metodunun ikinci argümanı sayesinde, sözlükte bulunamadığı için hata veren boşluk ve yeni satır karakterlerinin doğrudan a değişkenine eklenmesini sağladık. Bu get() metodunun nasıl çalıştığını daha iyi anlamak için http://www.istihza.com/py2/sozluk.html#get-ve-has-key adresini ziyaret edebilirsiniz.

İyi çalışmalar,

istihza Python , , , ,

Gish Oyunu

Çarşamba, 16 Haz 2010

Bugün http://www.ozgurlukicin.com/forum/haberler/16523/?page=1#post106779 adresinde bir oyun tanıtımı dikkatimi çekti. Normalde oyun oynamayı seven biri değilimdir. Ama bugünlerde biraz rahatlamaya/gevşemeye/stres atmaya şiddetle ihtiyaç duyduğum için, üstelik bu oyun tanıtımına yapılan “müzikleri muhteşem” yorumunu da görünce oyunun kaynak kodlarını sitesinden indirip derlemeye karar verdim.

Oyunun müzikleri gerçekten muhteşem. Oyunun müziklerini dinleyebilmek için oyunu derlemenize gerek yok. Kaynak kodların içindeki “music” adlı dizinin içinde .ogg dosyaları var.

Ama eğer oyunu derlemek isterseniz şu yolu izlemeniz gerekiyor:

1. Öncelikle şu paketleri kurun:

cmake

libsdl1.2-dev

libopenal-dev

libvorbis-dev

Eğer Ubuntu kullanıyorsanız şu komutla gerekli bütün paketleri kurabilirsiniz:

sudo apt-get install cmake libsdl1.2-dev libopenal-dev libvorbis-dev

2. Daha sonra http://github.com/blinry/gish adresinden “download source” bağlantısına tıklayarak kaynak kodları indirin ve indirdiğiniz bu sıkıştırılmış dosyayı açın.

3. “blinry-gish-b595e01″ adlı dizinin içinde sırasıyla şu komutları verin:

mkdir build

cd build

cmake ..

make

4. Dizin içinde “gish” adlı bir çalıştırılabilir dosya oluşacak.

5. Komut satırında ./gish komutunu vererek oyunu başlatabilirsiniz.

6. Oyunu oynarken ihtiyacınız olan tuşlar “space”, “yön tuşları”, “s” ve “a” tuşları.

Gayet keyifli bir oyuna benziyor. Ben biraz oynadım. Ama açıkçası müzikleri daha çok ilgimi çekti… Dinlemenizi öneririm.

Bu arada giriş müziği Hömey’e (Moğol gırtlak müziği) benziyor… Bu işin uzmanları daha iyi bilir.

istihza GNU/Linux, Yazılım , , ,