16 Haziran 2009 Salı

PyS60 ile Dosya Tarayıcısı

Merhabalar,

Birkaç gündür Symbian Python'u inceliyorum çok yakında bu konuda ayrıntılı dökümanlar yazacağım...
Bu yazıda Symbian telefonlar için çok çok basit bir dosya tarayıcısı yazacaz...

Lafı fazla uzatmadan anlatmaya geçelim,

Modülümüzü import ediyoruz ve uygulamanın başlığını ayarlıyoruz...

import os
from appuifw import *

app.title = u"Dosya Tarayicisi"



while True:
liste = [u"x Cikis", u"< Geri"]
for i in os.listdir(os.getcwd()): liste.append(unicode(i))

Bu kısımda dizin içeriğini alıyoruz ve tüm içeriği unicode şeklinde listeye ekliyoruz (telefonda utf-8 kullanılması gerektiği için)

döngüye devam ediyoruz...

i = selection_list(liste, 1)
if liste[i] == u"x Cikis": break;
elif liste[i] == u"< Geri":
os.chdir("/".join(os.getcwd()[:-2].split("/")[:-1]) + "//")
continue;
else: os.chdir("%s%s" % (os.getcwd(), liste[i]))

Bu kısımda selection_list ile dizini listeliyoruz bu fonksiyon seçilen elamanın listedeki indexini verir...
(örneğin; ilk eleman seçildiyse 0 döndürür)
ayrıca selection_list raw_input gibidir uygulamayı bekletir bir eleman seçildiğinde değerini döndürür ve kod aşağıya doğru devam eder...

daha sonraki işlemler ise seçilen elemanlar neyse ona göre işlem yapılıyor, Geri işlemi ise bulunulan dizinin son kısmı silinerek yapılıyor...

ve eğer "geri" veya "cikis" seçilmediyse bulunulan_dizin + secilen_dizin e giriliyor, ve tekrar listeleme yapılıyor bu şekilde döngü devam ediyor...

Ve son olarak kodun tamamı,

# -*- coding: utf-8 -*-
# s60 dosya tarayıcısı denemesi
# coded by rohanrhu

import os
from appuifw import *

app.title = u"Dosya Tarayicisi"

while True:
liste = [u"x Cikis", u"< Geri"]
for i in os.listdir(os.getcwd()): liste.append(unicode(i))

i = selection_list(liste, 1)
if liste[i] == u"x Cikis": break;
elif liste[i] == u"< Geri":
os.chdir("/".join(os.getcwd()[:-2].split("/")[:-1]) + "//")
continue;
else: os.chdir("%s%s" % (os.getcwd(), liste[i]))

09 Mayıs 2009 Cumartesi

Google App Engine İçin Özel Şablon Yardımcıları

GAE ile bir uygulama geliştirirken şablon kısmında ekrana yazılan değeri biçimlendirmem gerekti. Bu konuyla alakalı daha önce Django için bir yazı yazmıştım. Google App Engine de ise durum Django dan biraz farklıymış. Özel şablon yardımcıları oluşturmak için ilk olarak ana dizinde ya da herhangi bir dizinde bir dosya oluşturuyoruz. Örneğin ana dizinde customfilters.py adında bir dosya oluşturalım:

Dosyaya öncelikle webapp modülünü dahil ediyoruz:

#-*- coding: utf-8 -*-
from google.appengine.ext import webapp


Ardından fonksiyonlarımızı şablon içinde kullanabilmemizi sağlayan kaydediciyi oluşturuyoruz.

register = webapp.template.create_template_register()


Sonrada fonksiyonumuzu yazıyoruz. Fonksiyon gelen bağlantıdaki boşlukları - karakteri ile değiştirip geriye sonucu döndürüyor.

def escape_url(url):
return url.replace(' ','-')


Son olarakta oluşturduğumuz fonksiyonu kaydediyoruz.

register.filter(escape_url)


Şimdi customfilters.py dosyamızı projemize tanıtmamız gerekiyor. Bunun içinde main fonksiyonunun içine aşağıdaki kodları ekliyoruz:

def main():
webapp.template.register_template_library('customfilters')
run_wsgi_app(application)

if __name__ == "__main__":
main()


Bu sayede customfilters.py dosyamızı projemize tanıtmış oluyoruz. Bu tanıtım işlemi ile birlikte artık escape_url yardımcısını şablon içerisinde kullanabilirsiniz:

<a href="/book/{{ data.name|escape_url }}/{{ data.key }}">{{ data.name }}</a>


register.filter ile fonksiyonumuzu yardımcı bir filtre olarak tanımladık. Eğer fonksiyonu bir etiket ile kullanmak istersek aşağıdaki yöntem işimizi görecektir. Bu yöntem için farklı bir fonksiyon geliştirelim. Mesela gelen parametreleri kullanıp geriye img kodunu göndersin:

def create_image(image,alt):
return '<img src="/media/images/%s" alt="%s" />' %(image,alt)

register.simple_tag(create_image)


register.simple_tag ile kaydettiğimiz fonksiyonumuzun şablon dosyasındaki kullanımı ise şöyle olmalı:

{% create_image "sample.png" "Örnek Açıklama" %}

24 Nisan 2009 Cuma

Python’da Karakter Dizisi İşlemleri

(http://www.gokmengorgen.net adresinden alıntıdır.)

Geçenlerde bir arkadaşım, Python 3′te gettext modülünün nasıl kullanılacağını sormuştu, ben de henüz 3.* sürümünü denemediğim için bir cevap verememiştim. Hala da verebilecek aşamada değilim; ama bu konu üzerinde biraz araştırma yaparken, ilginç bir internet sayfasıyla[1] karşılaştım. Aşağıda paylaşacağım kodların ve bilgilerin Python 2.* serisinde çalışmaması söz konusu olabilir.

Python’da karakter dizilerini iki biçimde çağırabiliyoruz:

  • Karakter dizileri için % işleyicisi[2].

  • string.Template modülü[3]



% işleyicisiyle kullanım örneği, Python belgelerinde verilmiş:


>>> print('%(language)s has %(#)03d quot types.' % {'language': "Python", "#": 2})
#Python has 002 quot types.


Bu kodda değişkenler bir sözlük içinde eşleştirilmekte ve print çıktısında tanımlanmış değerleriyle ekrana yazılmaktadır. Bunun aynısı şu şekilde de yapabilirdik:


>>> print('%s has %03d quot types.' % ("Python", 2))
#Python has 002 quot types.


Birincisine göre daha basit olsa da, birinci kodda şöyle bir avantaj söz konusudur:

>>> print('The %(first)s variable, and the %(second)s variable.' % {'second': "New", 'first': "Old"})
#The Old variable, and the New variable.


Bu şekilde kullandığımız zaman, ikinci işleyiciyi ilk olarak tanımlayıp, ikinci işleyiciyi ise sonra tanımlayabilme fırsatımız olabiliyor. Nerelerde kullanılabileceği ayrı bir merak konusu. Bu merakı gidermeden önce bir de şu şekilde kullanıma bir bakalım:


>>> print('The {1} variable, and the {0} variable.'.format("New", "Old"))
#The Old variable, and the New variable.


İlginç, değil mi? Aslında bu kadar çeşitlilik olması garibime gidiyor; ama bu son yöntemin yüksek seviye programlama diline daha yakın bir tarz olduğunu düşünmeden edemiyorum. Yanılmıyorsam bu tip kullanım, C# ve Java’da da var. Şimdi son olarak aşağıdaki kodu inceleyelim:


import sys

class Main:
def __init__(self):
print("Python version is, {0}.".format(sys.version[:5])) # print'lerin yazimina dikkat..

digits_list = self.digits()

print("{1} is bigger than {0} as digit.".format(digits_list[0], digits_list[1]))

def digits(self):
try:
first_digit = int(input("Please write a digit: ")) # raw_input yerine input kullaniliyor.
second_digit = int(input("And second digit: "))

except ValueError:
print("\nSorry, you must enter a digit.")
exit()

return self.sort(first_digit, second_digit)

def sort(self, x, y):
return sorted([x,y])

if __name__ == "__main__":
Main()


Kodun yaptığı şey basit: Sizden iki sayı girmeniz isteniyor ve sayıları, büyüklüklerine göre {0} ve {1} ile eşleştirip, “X, Y’den sayıca büyüktür.” gibisinden bir cümle döndürüyor. Kod basit olduğu için bu tip karakter dizisi işleyicilerin faydası pek belli olmuyor; ama mutlaka bir yerde faydası vardır =). Son kodun çıktısı şu şekilde:


[gkmngrgn@gacer ~]$ python3 rank.py
Python version is, 3.0.1.
Please write a digit: 3
And second digit: 1
3 is bigger than 1 as digit.
[gkmngrgn@gacer ~]$


[1]: http://www.python.org/dev/peps/pep-3101/
[2]: http://docs.python.org/library/stdtypes.html#string-formatting-operations
[3]: http://docs.python.org/library/string.html#string.Template