Ev Arşiv Hakkında

Python'da circular list

12-2-2011, 8:13 ö.ö. // yorum // python // 547

Son dönem aramda Land of Lisp okumaya başlamıştım, bu sabah biraz daha kurcalayayım dedim ve common lisp'deki circular list olayını öğrendim.

Kısaca, listenin son hücresinin cdrının listenin carını gösterdiği liste. Bu durumda örneğin liste 3 elemanlıysa, 4. eleman listenin 1. elemanını ve 5. eleman listenin 2. elemanını gösteriyor.

Hazır Python'da magic methodları yeni yeni kullanmaya başlamışken, bu Python'da nasıl olur diye düşündüm. Şu şekilde basit bir CircularList sınıfı oluşturabildim:

class CircularList():
    def __init__(self, *args):
        self.members = list(args)

    def __getitem__(self, member):
        return self.members[member % len(self.members)]

    def __setitem__(self, member, value):
        self.members[member] = value
        return value

    def __delitem__(self, member):
        return self.members.remove(member)

    def __len__(self):
        return len(self.members)

    def __contains__(self, item):
        return item in self.members

    def __iter__(self):
        i = 0
        while True:
            yield self.members[i]
            i += 1
            if i >= len(self.members):
                i = 0

    def __repr__(self):
        s = str(self.members)
        return s.split(']')[0] + ', ...]'

    def append(self, value):
        self.members.append(value)

    def remove(self, value):
        self.members.remove(value)

Birkaç test:

>>> cl = CircularList(1, 3, 5, -10, 'doh')
>>> cl[124]
'doh'
>>> cl[4]
'doh'
>>> cl.append('fuuu')
>>> cl
[1, 3, 5, -10, 'doh', 'fuuu', ...]
>>> cl.remove(-10)
>>> cl
[1, 3, 5, 'doh', 'fuuu', ...]
>>> i = iter(cl)
>>> i.next()
1
>>> i.next()
3
>>> cl.remove(5)
>>> cl.remove('fuuu')
>>> i.next()
'doh'
>>> i.next()
1

Mümkün olduğunda Python'ın list veri yapısına benzetmeye çalıştım(append, remove, repr falan). Ne işe yarar henüz hiçbir fikrim yok :)

Github'a taşınıyorum

11-2-2011, 7:26 ö.s. // yorum // // 460

Çöplük gibi bilgisayarımda 10 farklı yere yedek alıp, hangisinin son yedek olduğunu hatırlamaya çalışmaktansa, github kullanmaya karar vermiştim ve bir süredir ödevlerimi ve diğer çalışmalarımı github'da saklıyordum.

İki çalışmam ve C ödevleri hariç tüm kodları aktardım. C ödevleri arasında işe yarar birşey olmadığından sanırım onları koymayacağım, geriye Django ile yazdığım bu blog ve bloga yazı eklemek için yazdığım program kalıyor. Blogun bir sürü düzenlemeye ihtiyacı var, sanırım hiçbir zaman koyamayacağım.

Arşiv düzenleyiciyide artık bu sitede güncellemeyeceğim. En güncel hali bundan sonra github adresimde olacak. Benioku dosyasının ve koddaki açıklamaların güncellenmesi/düzenlenmesi gerek. Bundan sonraki adım sanırım hatalı etiketleri düzeltmek. Last.fm apisi bu konu hakkında yardımcı olabilir sanırım.

Github alanıma şurdan ulaşabilirsiniz(nautilus scriptleri en güncel halinde olmayabilir, bir ara düzenleyeceğim). Aşağıdaki de yazı ekleyicinin son hali.

markdown önizleme özelliği ekledim, yazıyı ekleme sürecini az da olsa hızlandırıyor.(gtk ile html render etmeye çalışanlar için not: anahtar kelime, GtkMozEmbed)

C hakkında öğrenilecekler

1-2-2011, 7:41 ö.ö. // yorum // // 538

DÜZENLEME: Bir arkadaş uyardı, yazı pek hoş değil, sil yada düzenle diye. Kimseye kişisel olarak takıntım yok, kimseyle problemim de yok, olay çıkartmak, problem yaşamak falan da istemiyorum, 6 yıldır blog tutuyorum(netomer.com, omeragacan.com, osa1.net), kafama takılan, hoşuma giden, sinirimi bozan ne varsa yazarım, sinirlendiğimde ilk yaptığım şey blog yazmak olunca kötü sonuçlar olduğunu daha önceden çok tecrübe ettim, sorun olacaksa yazıyı değiştiriyorum, kısaca aşağıdakiler, programlamaya giriş 2(c/c++) dersinde aklıma takılan sorular, cevaplarını öğrendikçe ekleyeceğim.

  • Linux ortamında birkaç header dosyası inceledim(string.h, stdin.h, vs.). Bir sürü tanımlama var, peki bu fonksiyonların içerikleri nerede? Ben #include <stdio.h> dediğim zaman, stdio.h'daki fonksiyonların içerikleri nereden temin ediliyor, bunlar nerede saklanıyor, derleyici bunların nerede olduğunu nereden biliyor?

  • Unicode karakterler bellekte nasıl tutuluyor? Char veri tipinin signed veya unsigned olması ne demek? Signed ise, negatif sayı olma durumunda ne oluyor?

  • Header dosyalarını incelediğimde, neredeyse tüm değişkenlerin extern keywordu ile işaretlendiğini gördüm, bu nedir, ne işe yarar?

  • Hiçbir kütüphane import etmediğimiz durumda kullanabileceğimiz C fonksiyonları neler? (built-in c fonksiyonları yani)

  • İstediğim uzunlukta int, double, veya array nasıl tanımlarım. Kullanıcıdan girdi alacağım, veya dosya okuyacağım ama uzunluğu belli değil, garanti olsun diye +100000 alan ayırmaktan daha mantıklı bir yol olmalı.

  • Fonksiyonları overload edemediğimize göre, aynı isimle farklı argumanlar alan fonksiyonlar tanımlayarak yaptığımız işleri bu dilde nasıl yaparız?

  • Python'daki *arg ve **kwarg gibi şeyler mümkün mü? (printf fonksiyonu buna benzer birşey kullanıyor örneğin)

  • Array gösterimiyle pointer gösterimi arasındaki fark ne? (Örneğin array gösteriminde uzunluk belirtirken pointer'da belirtmiyoruz, bundan nasıl faydalanabiliriz, bu ne demektir?)

  • Random tamsayı üretmek, srand(), time(), random(), farkları ne, kullanım alanları ne?

paste.pocoo nautilus scripti

19-1-2011, 10:54 ö.ö. // yorum // python , nautilus // 525

Bir süredir sık sık yaptığım işleri otomatiğe bağlamak için python ve nautilus kullanıyorum(ftp upload, arşiv düzenleme, css sıkıştırma), freenode #python kanalında sık sık kod yapıştırmam gerekiyor ve sürekli dosyanın içeriğini kopyalayıp, paste.pocoo.org'u açıp, formu doldurup, adres satırını kopyalamaktansa, basit bir nautilus scripti yazdım.

Scriptin yaptığı şey, seçtiğiniz dosyayı paste.pocoo.org'a(python dosyası olduğunu varsayarak) yapıştırıp, linki bir uyarı ekranı şeklinde yazdırıyor(alttaki ekran görüntüsü).

Uyarı ekranı için, pratik olsun diye PyZenity kullandım, sudo pip install pyzenity ile kurabilirsiniz.

Kodu şuradan indirebilirsiniz. Çok küçük değişikliklerle tüm diller için ayralanabilir. Hatta dosya formatından hangi dil olduğunu tahmin edebilir hale getirilebilir.

Bil113 ve Bil114 arasında ne fark var?

4-1-2011, 12:30 ö.s. // yorum // // 555

Çok sinirlendim, bilmeyenler için, Bil113, ilk dönem aldığım programlamaya giriş dersi, Bil114 de bu dönem alacağım, aynı dersinde devamı. Şimdi küçük bir programla, bil113 ve bil114 hakkındaki garipliklere bir bakalım:

>>> java = """Programlamaya giriş. Derleyici ve yorumlayıcılar. Dilin temel elemanları ve veri tipleri. Değişkenler ve atama deyimi. İşleyiş akış kontrolleri: Karar verme ve döngü yapıları. Sınıflar ve metotlar. Diziler. İstisna durumlar (Exceptions). Metin dosyaları ile Giriş/Çıkış işlemleri. Özyineleme. """  # bil113 ders tanimi
>>> c = """C/C++ ile programlamaya giriş. Derleyiciler. Dilin temel elemanları ve veri tipleri. Değişkenler ve atama deyimi. İşleyiş akış kontrolleri: Karar verme ve döngü yapıları. Sınıflar ve nesneler. Dizinler. Metin dosyaları ile Giriş/Çıkış işlemleri. Kalıtım. Çok yüzlülük. Aykırı durum denetleme. """  # bil114 ders tanimi
>>> len(java.split())
36
>>> len(c.split())
38
>>> counter = 0  # ders tanimlarindaki ortak kelime sayisi
>>> for word in c.split():
    if word in java:
        counter += 1

>>> counter
28
>>> counter*100/(len(c.split()) * 1.0)  
73.684210526315795
>>>

Yukarıdan görülebileceği gibi, ders tanımlarının %73.684210526315795'i ortak. Şaka gibi. Bu konuların hepsini ilk dönem biz zaten gördük. Aslında aynı anlama gelen farklı kelimeler de işin içine girerse bu oran %90'ı çok rahat bulur. Programlamaya kaç kere giriliyor anlamadım ben.

0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12