Aşağıdaki, bu dönem aldığım ve geçemediğim takdirde okulumu bir dönem uzatacak(ya da bıraktıracak) olan Japonca dersime çalışmak için ~15 dakikada hazırladığım ~70 satırlık bir program:
Yaptığı rastgele olarak hiragana ve katakana sesler göstermek ve sizden cevabı beklemek. Eğer doğru cevap veremezseniz doğru cevabı gösterir. Github deposundan çekebilirsiniz. Hiragana ve katakana fontlar da içinde(sisteminize kurmanız gerekiyor).
Bu arada bir yerden sonra sıkıntıdan ölecek seviyeye geldiğimden hiragana'dan birkaç harf atlamış olabilirim, katakana'yı da henüz eklemedim. Birileri katakana ekleyebilirse süper olur aslında :) .
Dün ilk Arduino'm elime geçti. Ne olup bittiğini biraz kavradıktan sonra bugün ilk denemelerimi yapmaya başladım. Aşağıdak, Python ile Arduino'ya serial port üzerinden komut gönderme denemelerimin ilki:
Arduino'nun yaptığı, serial port'u dinleyip, gelen verinin 0'dan büyük bir takam olduğunu varsayarak(val -= '0'), bu veriye göre ledleri yakıp söndürmek.
İlk deneme için gayet basit ve güzel :) . Aslında amacım, Python ve Pygame ile yaptığım şeyleri Clojure ile(Pygame kısmı için AWT gerekecekti sanırım) yapmaktı ama sırt ağrım bir yerden sonra dayanılmaz hale geldi(zaten çalışma ortamım rahat değil, bir de Arduino için masaya eğilince) ve bir an önce bitirmeye çalıştım. Bundan sonraki denemelerimi Clojure ile yapmaya çalışacağım.
Onun dışında, Arduino kodunu Pardus ortamında bir türlü derleyemedim, gerekli kütüphaneler/bağımlılıklar yüzünden. Bir ara onunla uğraşacağım.
Islah olmaz bir Vim kullanıcısı olduğumdan(yine de Vim ile Java yazmayı denemiyorum, heh), her işimi Vim ile görmeye çalışıyorum. Şu ana kadar kullandığım diller arasında, Java'yı saymazsak, beni en çok uğraştıran Clojure oldu.
Genel olarak 2 yol var. Birincisi, Emacs'in SLIME klonu olan SLIMV. Common Lisp, Scheme ve Clojure için kullanılabiliyor. Fakat Clojure desteğinde bazı sorunlar var. İkincisi, vimclojure. Clojure düzenleme yetenekler SLIMV'e göre çok daha iyi, ama REPL kısmı biraz sıkıntılı. Lein REPL kullanamıyorsunuz, Nailgun kullanıyor. Yavaş çalışıyor. Göçtüğünde bir daha başlatması, bir işlemde takıldığında durdurması vb. şeyler zor.
Benim izlediğim yol, SLIMV üzerine vimclojure syntax renklendirme ve indentation scriptlerini kullanmak oldu. Normalde SLIMV'in Clojure indentation kısmında birkaç problemi var. Clojure keyword'lerini de tanıymıyor.
Bunu yapmanın en kolay yolu, benim vim ayar dosyalarımı çekip(github) veya ayar dosyalarımdan /bundles/slimv/i çekip gerekli yerlere atmak. Onun dışında, bir hata durumunda bana sövmeyin diye ne yaptığımı da açıklayayım. Standart SLIMV(0.8.4 kullandım, 0.8.5 REPL ekranı daha yavaş çalıştı nedense, yazarı olmaması gerektiğini söyledi ama, bir daha kurcalayacağım bir ara) altına, autoload klasörü oluşturup vimclojure autoload scriptini kopyaladım. Bu bana vimclojure fonksiyonlarını sağladı(syntax renklendirme ve indentation için gerekecek). Daha sonra slimv/indent/clojure.vim ve slimv/syntax/clojure/slimv-syntax-clojure.vim dosyalarının içeriğini vimclojure scriptlerininkiyle değiştirdim. Bu kadar.
SLIMV'in eksikleri var. Geliştiricisiyle stackoverflow'da karşılaştım ve şu anda birkaç eksikliği düzeltmek için uğraşıyor. Birincisi, lein repl kullanmasına rağmen, javadocsource gibi bazı fonksiyonları (use '[clojure.repl :only (source apropos dir pst doc find-doc)]) ile kullanmanız gerekiyor. Normalde terminalden lein repl ile çalıştırırsanız bunları direkt kullanabiliyorsunuz ama. İkincisi, program bir noktada takılırsa(uzun bir işlem vs) durdurmanın bir yolu yok(ya da ben bulamadım).
Aslında SLIMV varken sıfırdan bir Clojure scripti yazmak çok saçma geldi bana. Vimclojure yazılacağına SLIMV Clojure desteği üzerinde uğraşılsaymış çok daha güzel birşey olacakmış. Şimdi ben kendim ikisinin güzel özelliklerini kullanmaya çalışıyorum mesela.
Bugün çok sıkıldım öylesine birşeyler karalayacağım..
Sınav haftaları beklenenden çok farklı bir şekilde faydalı aslında. Sınav haftası geldiğinde birden bir odamı süpüresim geliyor mesela. Masamın tozunu alıyorum, bulaşıkları yıkıyorum falan. Mesela benim bu hafta 3 tane sınavım vardı ve şunu yaptım:
Ne olduğuna gelirsek, kendim sürekli kullandığım basit bir scriptimi, daha esnek bir hale getirdim ve QT ile arayüz tasarladım. Programın yaptığı şey, gösterdiğim klasörleri(ve isteğe bağlı olarak onun alt klasörlerini) izleyerek, bir ekleme veya değişiklik(zaten olan bir dosyanın değiştirilmesi anlamında) olduğunda yine benim belirlediğim komutları dosyaya uyguluyor. Bunu yaparken, dosyanın formatına göre komutları giriyorum(şimdi aklıma geldi de, tüm formatlar için uygulanacak komutlar için bir ayar yapılabilir). Komutları girerken de, eklenen/değiştirilen dosyanın adını, formatını ve bulunduğu konumun tam adresini bir değişkende tutuyorum ve bu değişkenler komutta kullanılabiliyor. Örneğin yukarıdaki resimlerde kullandığım komutlardan biri pyrcc4 _path_/_name_._frm_ > _path_/../_name__rc.py. Bu komutta _path_ kısmı dosyanın bulunduğu konumun tam adresi, _name_ kısmı dosyanın adı ve _frm_ kısmı dosyanın formatıyla değiştiriliyor. Kapattığınızda task bar'a yerleşiyor ve dinlemeye geçiyor, daha sonra ordan çağırıp istediğiniz değişiklikleri yapabiliyorsunuz(komutlarda ve klasörlerde).
Bu arada 2. resimde gördüğünüz şey, Gökmen Göksel'in PDS'i yardımıyla hazırlandı.
Klasör ve komut ayalarını JSON ile saklıyorum. Python'da list ve dict veri yapılarının JSON ile saklamak çok kolay oluyor(JSON hakkında pek bilgim yok, diğer veri yapılarını da denemedim).
Bu arada QT hakkında birşeyler söyleyeyim, arayüz programlamadan nefret eden bana bile arayüz tasarımı yaptırdı bu kütüphane. Yine bu sınav haftasında, arşiv düzenleyicinin arayüzünü de GTK'dan QT'ye geçirmeye başladım(birkaç özellik de ekleyeceğim tabii). QT hakkında bir ara daha detaylı birşeyler yazmayı planlıyorum. Yine sınav haftalarından sınav haftalarına geliştirdiğim IRC istemcimi de QT ile yapıyorum. Arşiv düzenleyiciyi de birkaç güne adam eder(yeni özelliklerle beraber), github deposunu güncellerim herhalde.
Bu yukarıda resimlerini gördüğünüz programı da, dosya sistemi izlemeyle alakalı problemlerimi düzeltip, bir isim bulduğumda github'a koyacağım.
DÜZENLEME: Programın çalışan bir halini github'a koydum fakat henüz kurulabilir değil, yani dosyaları uygun bir yere taşımalı, daha sonra kaynak koddan çalıştırdığınız klasörü belirtmelisiniz. Kurulum scriptini herhalde birkaç güne hazırlarım.
Son birkaç gündür yoğun bir şekilde GUI programlama ve Java ile uğraştım. İlk başta 2 arkadaşımla beraber basit bir chat sunucu/istemcisi yazmaya başladık(kaynak koda github depomuzdan erişebilirsiniz). Daha önceki tecrübelerimden (lisede web tasarım, daha sonra Python + GTK/QT ile arayüz denemelerim) arayüz tasarımından ne kadar nefret ettiğimi bildiğimden, bu projede ben sunucu ve istemci altyapısını hazırlamakla uğraştım. Fakat sonra bir ödev gereği, arayüz tasarımıyla da kendim uğraşmam gerekti.
Ödev Java ile yapılacaktı ve dolayıyısla arayüz olarak Swing kullandım. Başlangıç için Eclipse için WindowBuilder eklentisi ile ana çerçeve + layoutları oluşturup daha sonra elle yazdım. Bu süreçte şunu farkettim, adam gibi bir IDE, işleri daha önce tahmin edemeyeceğim kadar kolaylaştırıyor. Asıl olarak Python ile yazan biri olarak, birkaç gün öncesine kadar her işimde VIM kullanıyordum ve çok da memnundum(arayüz tasarımı yapmıyorum). Şu birkaç gün(sadece ödev için 1460 satır kod) bazı şeyleri farketmemi sağladı.
Onlarca sınıf, her sınıf için onlarca method, ve bu sınıflar arasında karışık ilişkilerin olduğu bir işle uğraşıyorsanız, iyi bir IDE şart. Dökümantasyonda geçirdiğiniz çok kısaltıyor.
Static typing çok hoş bir olay. Okula başladıktan sonra bol miktarda C(programlama yarışması) ve Java(ödevler) uğraşmam gerekti. Henüz sadece birkaç dili birşeyler üretebilecek seviyede biliyorum ve bu konuda çok da bilgili değilim, ama Python ile en çok dökümantasyon ve IDE sıkıntısı çekiyorum. Ücretli IDEleri denemedim ama denediğim tüm ücretsiz Python IDEleri Autocomplete konusunda çaresiz kalıyorlar. Python'da aşağıdaki gibi birşey görebilmek için herşeyimi(?!) verirdim:
Hatta mesela şöyle birşey yapabilseydim:
Ama yok, örneğin PyDev daha aşağıdaki kodda çakılıyor:
cls=Class1()cls.
Daha burda bile, Class1'in methodlarını gösteremiyor. Direkt olarak Class1. şeklinde yazıp, autocomplete çalıştırırsak, methodları gösteriyor, bu iyi, fakat bu sefer de bound-unbound method farkını anlayamıyor ve bound methodları da gösteriyor. Ki bound methodlar bu şekilde çağırılamaz. Fail.
WingIDE diyenler için, personal sürümü, sanki "öyle gerekli özellikler çıkaralım ki, kimse almasın" diye düşünülerek hazırlanmış. O kısıtlı özellikleri çıkardığımızda, Vim ile de yapıyorum zaten geri kalanları. Burdan bakın. Professional sürümü de çok pahalı.
PyCharm diyenler için, Open Source lisansı ücretsiz, fakat Open Source Definition'a uyan bir projeniz olmalı. Benim yok.
Eclipse, Java'nın verdiği acıyı inanılmaz derecede hafifletiyor. Yoksa sınıflar arasındaki saçma derecede karmaşık ilişkiler başka türlü çözülemez. Python'da ise, benzer karışıklıkta tasarlanmış(muhtemelen başka bir dilde, örneğin QT için C++) bir kütüphane ile çalışıyorsanız, acınızı hafifletecek hiçbir şey yok.
Konudan biraz sapacağım ama, Python hakkında beni sinirlendiren bir başka konu da, threading ve socket olayları. Ne zaman socket veya threading kullansam, mutlaka bir problemle karşılaşıyorum ve bunu ne zaman IRC'de sorsam, mutlaka birileri Twisted kullanmamı söylüyor. Kötü alışkanlıklardan, yanlış programlamadan vs bahsedip duruyorlar. Sanki Freenode #python kanalında, içinde şöyle bir kod olan bir sürü bot varmış gibi:
if"socket"inmsgor"thread"inmsg:self.reply(msg,"Use twisted!!1 bad habits good code debugging bla bla bla")
Java'da yaklaşık bir hafta kadar önce kullanılabilr bir hale getirdiğimiz chat istemci/sunucusu, dilin kendi thread ve socketlerini kullanıyor. Thread ve socket kullanımı ile alakalı dökümantasyon hariç hiçbir yere baktığımı hatırlamıyorum. Python'dan gelen birisi olarak şaşırtıcı derecede kolay ve stabil oldu.
Bir süredir kafamda kendi IRC istemcimi yazma fikri var. Şu anda yazabilmek için gerekli herşeyi biliyorum. Dün oturdum, Java ve Python'da IRC sunucusuna bağlanabilmek için gerekli en küçük kodu yazmaya karar verdim(arayüz ile beraber). Java'da, kendi socket ve thread sınıfları ve Swing ile kolayca yazdım(bu arada Swing'in ne kadar kötü gözüktüğüne dikkat, platform bağımsız olarak iğrenç gözüken bir arayüz kütüphanesi kendisi, ehehe):
Python'da QT kullandım. Fakat garip bir şekilde, ne zaman sunucudan bir mesaj gelse, QT segmentation fault veriyor:
IRC'de sorduğumda aldığım yanıtı tahmin edersiniz zaten.
Şimdi oturup düşünüyorum, bir yanda Java, sadece dilin kütüphaneleri ile sunucuya bağlanıp, mesaj gönderip aldığım kod, arayüz ile beraber hazır bile. Elimin altında Eclipse gibi bir IDE var. Python ile yapmak istersem, ekstra olarak uğraşmam gerekecek şeyler: PyQT'nin dökümantasyonu, Twisted'ın dökümantasyonu, Twisted'ı öğrenmek, QT Designer ile tasarımı koda çevirmek için ekstra bir işlem yapmak, daha sonra bir daha QT Designer ile değişiklik yapamamak(Eclipse + WindowBuilder ile tasarım/kod arasında değiştirmek tek tuş).
Adil olmak lazım, Java ile başta bahsettiğim projeye girişmeden önce, bunların farkında değildim. Python ile ise bu boyutta bir proje yapmadım. Küçük küçük bir sürü script(ki her biri, yazdığım satır sayısına göre işimi abartı derecede kolaylaştırıyor), en büyük projem kendi blogum.
Python bana programlamaya ilk başladığım günlerde bile birşeyler üretme imkanı verdi. Programlamaya başladığım sene(lisede yaptığım web tasarım + programlamayı saymıyorum), ilk önce kendi blogumu, daha sonra arşiv düzenleyiciyi yapabildim. Başka bir dille yapamazdım.
Şu anda static typed bir dilin bana sağladıklarını biliyorum(en azından bu projeleri yapmaya başlamadan öncekine göre çok daha iyi biliyorum). Şimdi dynamic typed bir dilin avantajlarını görmem lazım.
O yüzden IRC istemcimi her şeye rağmen Python ile yazacağım. Java ile yazarsam, kendimi tekrar etmekten başka birşey yapmamış olacağım. Twisted'ı ihtiyacım olduğu kadarıyla öğrenmeye bugün başlıyorum. Çalıştırılabilir bir hale gelir gelmez yorumlarımı buraya yazacağım.
(Bu arada Twisted'da IRC istemci protokolü hazır olarak var)
VIM hakkında
Vim hakkında da birkaç birşey söyleyeyim hazır IDE/Editor muhabbetine girmişken. Yaklaşık 7-8 aydır(sanırım) Vim kullanıyorum, ve şu dakikadan sonra Vim'siz hiçbir şey yazamaz oldum. Maillerimi Vim ile yazıyorum(sylpheed), bloga yazıları Vim ile giriyorum(kendi eklentim), Eclipse'de Vim eklentisi kullanıyorum(o olmasa Eclipse kullanamazdım), Lisp ile uğraştığımda, Emacs kullanmam gerekiyor ve Emacs'i vimpulse ile kullanıyorum. Şöyle iyi böyle güzel diye anlatmayacağım, resmen bağımlı oldum. Arkadaşların, normal IDE/Editorlerde nasıl yazdıklarını görünce duygulu anlar yaşıyorum.
Bu yüzden IDE seçerken dikkat ettiğim konulardan biri de Vim desteği(veya eklentileri) oluyor. Eclipse o açıdan(viPlugin sağolsun) çok başarılı. Söz konusu Java olduğunda düşünüyorum da, Eclipse olmasa herhalde hiçbir şey yazamazdım.(bu arada WingIDE Vim tuşlarını destekliyormuş, ne kadar başarılıdır bilmiyorum)