Python etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Python etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

29 Ağustos 2013 Perşembe

Tornado websocket client

Tornado'nun sunucu hizmetleri ile ilgili bir sürü örnek var ama istemci olarak hele hele WebSocket için neredeyse hiçbir örnek bulamadım internette, onun için buraya yazalım dursun, bir gün birine lazım olur.

from tornado import websocket, ioloop, gen, escape




class SocketClient():




    def __init__(self):
        self.headers = httputil.HTTPHeaders()
        self.headers['Content-Type'] = 'application/json'
        self.request = httpclient.HTTPRequest(
            url = "wss://some.url",
            validate_cert = False,
            client_key = "client-key.pem",
            client_cert = "client-cert.pem",
            connect_timeout = 60,
            request_timeout = 60)




    def connect(self, connCallback, msgCallback):
        self.request.headers = self.headers
        self.__msgcallback = msgCallback
        self.__conncallback = connCallback
        wssConn = websocket.WebSocketClientConnection(ioloop.IOLoop.current(), self.request)
        wssConn.connect_future.add_done_callback(self.__on_connResult)




    def __on_connResult(self, conn):
        if conn.exception() == None:
            self.__wssConn = conn.result()
            self.__conncallback(True)
            self.__read()
        else:
            print(conn.exception().args)
            self.__conncallback(False)




    def send(self, data):
        self.__wssConn.write_message(escape.utf8(json.dumps(data)))




    @gen.coroutine
    def __read(self):
        while True:
            msg = yield self.__wssConn.read_message()
            if msg is None:
                self.__conncallback(False)
                break
            self.__msgcallback(msg)

27 Ağustos 2012 Pazartesi

13 Temmuz 2011 Çarşamba

Fakeman ile sohbet

Fakeman yazdığım küçük bir python betiğinin adı, benim sorularıma internetten bulduğu bazı cümlelerle karşılık veriyor. İzlemesi ne kadar eğelencelidir bilmiyorum ama Fakeman ile karşılıklı sohbet bayağı eğelenceli oluyor;

18 Şubat 2011 Cuma

Dino (Dnsomatic.com ip güncelleme istemcisi)

Evinizdeki internet bağlantısında OpenDNS servisinin filtreleme hizmetini kullanmak istiyorsanız veya sunucunuzdaki ftp, http, vnc gibi servislere ücretsiz bir alan adı üzerinden erişmek istediğinizde ip adresinizi bu servislere kayıt etmeniz gerekiyor. Ip adresiniz sabit değilse bu işi düzenli ve otomatik olarak yapacak bir araca ihtiyaç oluyor.

Aslında bu iş oldukça basit ve ddclient gibi başarılı araçlar zaten var ancak bunların bir arayüzü yok. Bu açıdan Dino'nun kullanımı oldukça kolay.

Bir başka OpenDNS hizmeti olan Dnsomatic.com servisi ise ip güncellemeye ihtiyaç duyan popüler pek çok servisteki hesaplarımıza tek tek güncelleme yapmaktan bizi kurtarıyor. Tüm bu servisleri önce dnsomatic.com hesabınıza kaydediyorsunuz, sonra dnsomatic'e tek bir güncelleme isteği gönderiyorsunuz, o sizin için kayıtlı tüm servislerinizi güncelliyor.




https://github.com/alierkanimrek/dino

http://www.ozgurlukicin.com/forum/gonullu-calismalar/20861/?page=1

12 Şubat 2011 Cumartesi

Ortaya karışık Pardus, Paso, Pog, Dnsomatic, Dino ve Imageshack salatası

Uzun zamandır günlük yazmamışım, az günlük yazdıkları için hep eleştirdiğim Pardus gelişitiricilerini daha iyi anlıyorum galiba :)

Son günlük yazımdan bugüne Pardus 2011 yayınlandı, hatta üzerine güncellemeler bile geldi ama ne acıdır ki ülkemizde hiçbir yerde doğru düzgün bir Pardus 2011 incelemesi göremedim. Yurt dışından bazı incelemeler okudum ama sanki Pardus Türkiye'de geliştirilmiyormuş gibi ülkemizden çıt yok. Belki de ben görmedim bilemiyorum, zaten bu muhabbetin sonu özgür basın tartışmasına kadar gider şimdi :P

Bu arada ben nightware çalışmalarına yavaş da olsa devam ediyorum, Pardus seçkileri hazırlamak isteyen kullanıcıların işini kolaşlaştırmak amacıyla Pardus 2009 için yazdığım Paso'yu 2011 için revize ettim ve geçenlerde Öİ forumlarında Alpha sürümünü duyurmuştum.


Paso öncekine göre biraz daha basit ve sade bir kullanıma kavuştu ve hızlandı. Ayrıca OpenDNS servisinin internet filtresi hizmetini kullanmak isteyen Pardus 2009 kullanıcılarının dinamik ip ardeslerini güncelleyen POG adında bir araç geliştirmiştim ve Pardus 2009 depolarına girmişti bu. POG'u bir elden geçireyim derken OpenDNS yönetiminin genel bir dinamik ip güncelleme servisi işletmeye başladığını gördüm. http://www.dnsomatic.com/ Adresinden ücretsiz abonelik alabileceğiniz bu servise OpenDNS, Sitelutions, EveryDNS, DynDNS gibi daha pek çok servise ait üyeliklerinizi kayıt edebiliyorsunuz ve tahmin edebileceğiniz gibi sadece Dnsomatic servisine ip güncelleme isteği göndermeniz yeterli oluyor, Dnsomatic tüm aboneliklerinizi sizin için güncelliyor.

Böyle güzel bir servis olunca ben de 2011 için POG'u rafa kaldırdım ve Dnsomatic servisi için DINO adında yeni bir istemci geliştirmeye başladım. Temel işlevleri yazdım, geriye küçük bir arayüz ekleme ve biraz test edilme işi kaldı.


Yine de Dnsomatic'in API'sini geliştirmesi lazım, örneğin kullanıcının kayıtlı olan servislerini almak veya bazı servisleri tek seferde güncellemek mümkün değil şu anda. Ekran görütülerini paylaşım sitesine yüklemek için 2009'da Imageshack'ın istemcisini kullandığımı hatırladım, Wine ile kurmuştum gayet güzel çalışıyordu, 2011 kurulumunda /home bölümüne işlem yapmadığım için Wine programlarını tekrar kurmak zorunda kalmamak güzel, Imageshack istemcisi hala sorunsuz çalışıyor.


30 Nisan 2010 Cuma

Paket bağımlılıklarını aramadan bulmak mümkün mü?

Pardus paket yöneticisinin hızından şikayetçi olan sadece ben miyim bilmiyorum, gerçekte paket yöneticisi sadece bir arayüz, asıl performansı pisi gösteriyor. Pisi'nin kodlarını adam gibi incelemeden eleştirmek verilen emeğe gerçekten haksızlık olacak ama özellikle eski bilgisayarda bağımlılık hesaplaması yaparken iyice kendini gösteriyor bu yavaşlık.

Amatör bir Python yazarı olduğumdan bu bağımlılık çözme meselesi güzel bir problem gibi göründü gözüme ve acaba bu işi ben olsam nasıl yapardım diye düşünmeye başladım. Kağıt üzerinde birkaç şey karalamışım, ertesi gün o kağıt gözüme ilişti, üzerine paketleri temsil eden bir sürü yuvarlak çizmişim, sağına soluna çizgiler notlar vs.

Yav dedim bu yuvarlakların her biri bir nesne olsa ve her biri kendi bağımlılığını ve ters bağımlılığını bilse ve bunları birer eventHandler'a kaydetse, bir tanesini kurmaya çalışınca bu event'ları tetiklese hiç öyle listelerde falan arama yapmasa.

Vakit buldukça bir prototip kodlamaya başlayacağım, kendime yeni bir eğlence çıktı, hoşuma giderse belki Paso'ya eklerim Pardusman gibi depodan seçki oluştururuz, fena mı olur?

30 Kasım 2009 Pazartesi

Pardus için OpenDNS istemcisi

Pek çoğumuz OpenDNS'i bazı sansürlü siteleri açmak için kullanılan basit bir DNS servisi olarak biliyor, gerçekte ise üyelerine dns sunucusu üzerinden ücretsiz içerik filtreleme hizmeti veren bir servis. Eğer Pardus'ta internet içerik filtreleme kullanmak istiyorsanız bugün için en basit çözüm OpenDNS servisini kullanmak. (Tabii bu sözüm squid+dansguardian gibi paketleri yönetebilecek seviyedeki kullanıcılar için geçerli değil.)

Pardus'ta OpenDNS servisini filtreleme amaçlı kullanabilmek için OpenDNS'in ağınızın WAN ip adresini bilmesi gerekiyor. Bu iş aslında çok basit, kuracağınız küçük bir betik bu adresi belirli aralıklarla OpenDNS'e bildiriyor, bunun nasıl yapıldığını anlatan bir yazı zaten uzun zamandır özgürlükiçin'de var.

Ancak gördükleri $ işareti her şeyi GUI aracılığı ile yapmaya alışkın kullanıcıları koşarak uzaklaştırmaya yetiyor. Bende bir süredir bu küçük işlemleri nasıl bir GUI'ye yerleştiririm diye düşünüyordum. Bayram tatili fırsat oldu.

Konuyu araştırırken OpenDNS'in aslında çok basit bir API kullandığını ve bir https çağrısı ile adresin güncellenebildiğini öğrendim. Bununla ilgili python örneklerini de bulunca kendi güncelleme istemcimi yazarım dedim ve işe koyuldum.

Pog adını verdiğim (belki adını değiştiririm, böyle garip isimleri nereden buluyorsun demeyin kısaltma işte) küçük program tamamlandığında çok sevdiğimiz GUI aracılığı ile girdiğiniz OpenDNS kullanıcı adı ve şifresi ile cron zamanlayıcısını kullanarak belirli aralıklarla güncellemeyi yapacak. Çalışır hale geldiğinde http://github.com/alierkanimrek/ adresindeki deposundan indirilebilecek. GUI Meraklıları için bir de ekran görüntüsü;


16 Kasım 2009 Pazartesi

Paso 0.1

Kendinize özel Pardus kurulum ortamı hazırlayabileceğiniz Paso'nun 0.1 sürümü hazır. http://github.com/alierkanimrek/paso/downloads Adresinden indirebilirsiniz, arşivi açıp src dizininde "python paso.py" komutunu çalıştırmanız yeterli. Nasıl kullanacağınıza dair kısa açıklamalar http://wiki.github.com/alierkanimrek/paso adresinde var. Tabii eksikler çok http://github.com/alierkanimrek/paso/issues adresinden bilinen hatalara bakabilirsiniz.

Xfce önkurulumlu Pardus için bir .paso hazırladım http://groups.google.com.tr/group/antalya_linux/files adresinden indirebilirsiniz.

12 Kasım 2009 Perşembe

Paso 0.1 XML desteği ile geliyor

Paso'nun TODO dosyasında alt sıralarda olan (.pisi dosyalarını örnek aldığım) XML biçimli dosya desteğinin diğer ihtiyaçlar için bir zorunluluk olduğunu fark edince ilk sıraya onu aldım ve şu anda hazır, ama henüz testlerini tam yapamadığımdan commit etmedim. Bu, şu ana kadar hazırlanan paso dosyalarının güncel paso ile okunamayacağı anlamına geliyor, belki bir çevirme betiği yazabilirim, o konuda söz vermeyeyim. Ayrıca Paso dosyasına hazırlayan kişinin isim ve e-posta bilgilerini ekleme ve hazırlanan paso ile ilgili açıklamalar ile yapılan çalışmanın varsa internet adresini ekleme gibi güzellikler de hazır.

Şu anda git deposundaki Paso Testing'i kullananlar hazırladıkları paso dosyalarını yakında commit edeceğim Paso 0.1 ile kullanamayacak! Yani hazırladığınız Paso dosyalarını yayınlamadan önce biraz daha bekleyin ve 0.1 ile tekrar hazırlayıp öyle yayınlayın derim.

http://armuting.blogspot.com/2009/11/paso-ile-guncel-pardus-kurulumu-yapn.html
http://armuting.blogspot.com/2009/10/pasoyu-yaynladm-pardus-seckilerine-yer.html

24 Ekim 2009 Cumartesi

Paso'yu yayınladım, Pardus seçkilerine yer açın!

Pardus seçkileri oluşturmak için yazmaya başladığım Paso'yu sonunda yayınladım, http://github.com/alierkanimrek/paso adresinden indirip hemen kullanılabilir, Qt4 arayüzlü bir Python betiği sonuçta.

Pisi paketi ve çevirisi için henüz erken olduğunu düşünüyorum, temel işlevleri yerine getirse de henüz pek çok eksiği ve eminim bilmediğim pek çok hatası var. Nasıl kullanıldığına dair bir örnek yapıp ekran kaydı aldım, örnekte Gnome'lu Pardus kurulum ortamı hazırladım. (Tam ekran izleyin)





Paso ile istediğiniz paketlerden oluşan size özel bir Pardus kurulum imajı oluşturabilirsiniz. Daha önemlisi bu imajları oluşturmak için kullandığınız .paso dosyasını paylaşarak herkesin kendi sisteminde sizin hazırladığınız imajları oluşturmasını da sağlayabilirsiniz. Ama unutmayın ancak kurulmuş bir Pardus sistemindeki paketlerden oluşan bir kurulum seçkisi hazırlayabilirsiniz.

Paso dosyaları sadece paketlerin hangi depolarda olduğu bilgisini içeren küçük dosyalardır,, paylaşması kolaydır, isterseniz internetteki depolarda olmayan kendi hazırladığınız paketleri de paso dosyası ile paylaşıp oluşturulacak imaja dahil edebilirsiniz. Kurulum bildiğiniz Pardus kurulumu olacak.

Yakaladığınız hataları ve önerileri github'dan iletebilirsiniz, ama yazılım ile hobi olarak ilgilenen bir amatörüm ve bu işlere kısıtlı zaman ayırabiliyorum, geri dönüş için acele etmeyin :) Ayrıca İngilizcem çok iyi olmadığından bu konudaki düzeltme önerilerini de memnuniyetle karşılarım.

17 Ekim 2009 Cumartesi

Paso test sürüşünde

İş güç özel yaşam derken eğlenceye kalan zaman azalıyor, benim eğlencem de kodlarım. Bir süredir çalıştığım Paso artık ayaklandı ve iş çıkarmaya başladı ama daha oturup adam akıllı test edemedim. Çünkü test aşamaları uzun zaman gerektiriyor, sanal makinede Pardus kurulumu (hadi bunu sanal disk kopyalarıyla hallediyorum) değişik paketlerin kurulumu veya kaldırılması, paso ile tekrar imajın oluşturulup sonra bu imajın kurulması falan... Bu sabah Xfce'li Pardus kurulumu yaptım ve birkaç hata düzelttim;


Geçenlerde yaptığım ilk testte çok ilginç bir durumla karşılaştım, Paso ile oluşturduğum iso dosyalarıyla yaptığım kurulumlarda /boot/grub/message dosyası oluşturulmuyor. Bu dosya gfxtheme-pardus-boot paketinin kurulumu sırasında oluşturuluyormuş, paket hatasız bir şekilde kuruluyor ve ayarlanıyor görünüyor ama... Neyse şimdilik bunun üzerinde duracak zamanım yok, Gnome'lu Pardus gibi birkaç denemeden sonra kodları yayınlamak için acele ediyorum.

22 Eylül 2009 Salı

Pardus seçkilerine doğru

Üzerinde çalıştığım proje hayal ettiğim gibi gerçekleşirse isteyen herkes kendi seçtiği paketlerden oluşan özel bir Pardus Kurulum ortamı oluşturabilecek. Hatta bunu küçük (-1MB) dosyalarla paylaşabilecek. Yani içinde oyunlar olan kendi kurulum DVD'nizi hazırlayabileceğiniz gibi örneğin bir başkasının hazırladığı Xfce paketlerinden oluşan seçkisini de indirip kurulum ortamı olarak inşa edebileceksiniz.

Projeye "Paso" adını verdim, bayram tatilinden önce birkaç temel Python sınıfı yazmıştım, tatilde fırsat buldukça da Qt ile arayüz hazırladım, epeydir Qt ile ilgilenmiyordum arayüz giydirmek çok zaman alan bir işmiş. Paso iki bölümden oluşuyor, hazırlama ve inşa bölümleri. Hazırlama bölümü çalışır hale geldi, inşa bölümüne ise bugün başladım.



Bir an önce temel işlevlerle kullanıma açmak için acele ediyorum, bu nedenle bazı özellikleri yazmadan bıraktım, örneğin: kayıt dosyasında xml yerine düz metin biçimi kullandım, options menüsünde olmasını istediğim seçenekleri ve hazırlama aşamasındaki exclude işlemini yazmadım, bazı ayarları koda gömdüm, inşa bölümünde de atlayarak ilerliyorum vs. En azından bir alpha seviyesine gelince sourceforge gibi bir yere GPL lisansıyla yükleyeceğim, ama tatil bitiyor, birkaç hafta bekleteceğim sanırım.

27 Ağustos 2009 Perşembe

Yeni başlayanlar için Python problemi

Kod yazarken bazen yazdığınız şey olması gerektiği gibi çalışmaz, mantıklı bir sebep bulabilmek için saatlerce ararsınız, tararsınız, kodu şekilden şekile sokup yapboza çevirirsiniz, ama nafile. Hatta yazdığınız kodu o kadar basite indirgersiniz ki, artık "Yeni başlayanlar için ..." kitabının ilk sayfasında yer alabilecek hale gelir.

O anda artık bunun bir hata değil çok basit olduğu halde yorgunluk ve dikkatsizlikten mütevellit göremediğiniz bir şeyden olduğunu içten içe hissedersiniz, ama saç baş yolunma noktasına çoktan gelinmiştir. Tıpkı aşağıdaki Python kodunda olduğu gibi;


class C:

     def seta(self, a): pass

     def geta(self): return "a"

     x = property(geta,seta)


test = C()
test.x = "b"
print(test.x)


Kodun her durumda "a" çıktısı vermesi gerektiğini düşünürsünüz ama "b" verir. İşte böyle bir durumda yapılacak en iyi şey uzun bir ara verip, dingin bir kafa ve yeni bir bakış açısıyla dönmektir. Çünkü döndüğünüzde eksiği şıp diye bulacaksınızdır. :D

18 Haziran 2009 Perşembe

SLC profil yönetimi

Eğlence projem SLC için yazdığım az miktar kod ile aslında işin sandığımdan da kolay olacağını düşünmeye başlamıştım. Çünkü SLC'nin çekirdeği diyebileceğim konfigürasyon dosyalarını oluşturma kısmı Django sayesinde çok kolay oldu, sadece Python'un xml.dom.minidom sınıfı ile biraz cebelleştim.

Hemen bir heyecanla arayüz tasarımı yapayım dedim, her ne kadar SLC'yi arayüz barındırmayacak bir kütüphane olarak tasarlasam da bir arayüz ile kullanarak kısa sürede pratik bir şeyler ortaya çıkarabilirim diye düşünmüştüm ama biraz uğraşınca arayüz işinin daha külfetli olacağına inandım ve SLC'ye geri döneyim dedim.

Bugün bir boş vaktimde biraz kağıt üzerinde Profil yönetimi üzerine çalıştım. İki farklı profil yönetimi olsun dedim, bir tanesi konfigürasyon dosyalarının profilleri diğeri de genel profiller. Örneğin a,b,c gibi konfigürasyon dosyalarımız varsa;

Ev Profili = a.profil1, b.profil2, c.profil5, d.profil8
İş Profili = a.profil4, b.profil1, c.profil3, d.profil1
Sunucu Profili = a.profil1, b.profil3, c.profil5, d.profil2

Böylece kullanıcı bir paketin ayarlarındaki pek çok alternatifi kayıtlı tutabilecek ve istediği zaman istediği profilde bunlardan seçim yaparak kolayca kullanabilecek. Konfigürasyon profillerinin her biri kendi paketine ait diğer profillerle birlikte ayrı bir dizinde dosya olarak bulunurken ev, iş gibi genel profillerin taşıdığı konfigürasyon profilleri listesini bir text dosyada tutabilirim.

Kodlamaya geçince neler çıkacak henüz bilmiyorum tabii ki, profil yönetimi işin kendisinden daha çetrefilli olacak gibi görünüyor.

10 Mayıs 2009 Pazar

SLC Started

Uzun zamandır (1,5 yıldır) Linux sistemindeki çok çeşitli conf dosyalarını tek bir araç ile yönetip bu dosyalar için gui yazılmasını kolaylaştıracak bir şeyler hayal ediyorum. Nasıl mümkün olacağı konusunda pek bir fikrim yoktu ama son 1 ayda kafamda bazı noktalar şekillendi ve "evet bu böyle olmalı" dediğim konular artınca artık kodlamaya başlamalıyım diye düşündüm. En azından olgunlaşan bazı noktaları koda dökerek unutulup gitmesini önlemiş olurum.

Projeye SLC (Simple Linux Configuration) adını verdim, çok iddaalı bir isim ama "Just for fun" nihayetinde :) Hem bir taraftan boş zamanlarda tıkırdayacağım bir Python projem olmuş oldu böylece. Bugün birkaç kütüphane yazdım, ne kadar zaman ayırabileceğimi bilmiyorum ama tahminimce bu yıl sonuna doğru temel işlevlerini kazanıp internetten duyurulabilecek hale gelir.

Ayrıca bir başlangıç noktası koymuş olmak için günlüğe yazayım dedim, 2 ay sonra bakıp "ohoo 2 ay geçmiş başlayalı hala ortada bi şey yok, yatmayı bırak!" diyebileceğim yani. Başlarken hayaller de kurmadım değil, yoksa heyecan nereden gelecek? proje ayağa kalkarsa Arch tabanlı bir dağtım hayallerimi süslüyor :)

13 Ocak 2009 Salı

"Django template" sistemini bağımsız kullanmak


Django'nun en sevdiğim tarafı veritabanı soyutlaması değil şablon sistemi, bunu da bağımsız bir python projesinde kullanabilir miyim diye bakınırken önce yolum (Pardus IRC kanalından uic'in önerisiyle) Mako Templates'e düştü. Bir taraftan Mako'yu kurcalarken bir taraftan da django belgelerine bakınıyordum ve bingo! küçük bir paragraf buldum, tam istediğim şey...



# -*- coding: utf-8 -*-
from django.template import Context, Template
    
#İşte burada manuel konfigürasyon yapıyoruz
from django.conf import settings
settings.configure()
    
    
def index():
     t = Template('Benim şablonum {{ var }}.')
     c = Context({'var': 'süper oldu.'})
     return t.render(c)
    
print index()


Ayrıca configure() fonksiyonuna parametre olarak çeşitli ayarları belirtmek mümkün;


settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
     TEMPLATE_DIRS=('/home/web-apps/myapp', '/home/web-apps/base'))

25 Eylül 2008 Perşembe

Django'da url ile dans

Önceki yazıda Django ile veritabanı kullanımı örneği yapacağımı yazmıştım ama url adresleri ile oynarken çok eğlenceli şeyler çıktı ortaya yazmadan edemedim.

Önceki örnekteki urlpatterns listemiz aşağıdaki gibiydi;

from deneme.dersler import dersindex, ders1, ders2

urlpatterns = patterns('',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)

Buradaki ilk değerin boş olduğunu görüyorsunuz, bu değeri ihtiyaç halinde ön-ek (prefix) olarak kullanabilirsiniz. Şöyle;

from deneme.dersler import *

urlpatterns = patterns('deneme.dersler',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)

Peki şöyle bir import yazdıysak?

from deneme.dersler import *
from deneme.makale import *

#Şöyle

urlpatterns = patterns('deneme.dersler',
(r'^$', dersindex),
)

urlpatterns += patterns('deneme.makale',
(r'^$', makaleindex),
)

Bu r'^$' ifadesinde önceki örnekten farklı olarak bir "r" ekledim, bu zorunlu olmasada Python'a bu ifadenin string değil raw olduğunu anlatıyor ve kullanılması iyi olur.

Ayrıca Python'un 255 karakterlik bir fonksiyon arguman limiti var, yani büyük bir sitenin patterns() listesi büyük boyutlara ulaştığında yukarıdaki yöntem kullanılabilir.

Şimdi "/pardus/2008/1" adresini yazacağım pardussurumleri() fonksiyonu ile oluşturmak istiyorum. Bunun için yeni bir pardus.py dosyası açıp şu şekilde yazdım;


# -*- coding: utf-8 -*-

from django.http import HttpResponse

def pardussurumleri(request, version, subversion):
html = "Pardus "+version+"."+subversion
return HttpResponse(html)

Düzenli ifadede olarak kısaca "pardus/", 4 haneli sayı, "/" ve bir haneli sayı tanımı yapıyoruz.

urlpatterns += patterns('deneme.pardus',
(r'^pardus/(\d{4})/(\d{1})/$', pardussurumleri),
)

Peki fonksiyon tanımını şu şekilde yaptığımızı farz edelim;

def pardussurumleri(request, subversion, version):

Bu durumda "/pardus/2008/1" url adresi sonucunda Pardus 1.2008 gibi bir çıktı alırız, ancak aşağıdaki gibi bir pattern tanımı yaparsak fonksiyonumuz pardussurumleri(request, version="2008", subversion="1") olarak çağırılacak.

urlpatterns += patterns('deneme.pardus',
(r'^pardus/(?P<version>\d{4})/(?P<subversion>\d{1})/$', pardussurumleri),
)

Bunun ışığında /pardus20081 url adresi için şöyle bir ifade kullanılabilir.

r'^pardus(?P<version>\d{4})(?P<subversion>\d{1})/$'

Eğer henüz test aşamasındaki bir sürüm için kullanılacak bir url için "/pardus2009test" yerine "/pardus2009" kullanmak istersek pattern ile fonksiyona sabit bir değer geçirebiliriz.

(r'^pardus(?P<version>\d{4})/$', pardussurumleri, {'subversion' : 'test'})

23 Eylül 2008 Salı

Django için paçaları sıvadım

Bende sonunda eğlenceyi doruklarda yaşamak için Django ile "Selam cümlet-ül alemin" (Hello world) dedim. Linus'un Linux 1.0 duyurusunu yaptığı sıralarda (tabii 2 yıl öncesine kadar bundan haberim yoktu) ben bir Apple makinasındaki GWBasic ile "hello world" yazmanın heyecanını yaşayan bir gençtim. O gün bu gündür ne zaman yeni bir "hello world" yapsam hep aynı heyecanı duyuyorum. Bu arada "hello world yapmak" diye bir deyimi ilk kullanan kişiyim herhalde.

Her neyse, bu yazı öyle geyik bir yazı olmasın bir işe yarasın, diye neler yaptığımı anlatayım.

Django 1.0'ı Pardus'da kurmak için "sudo pisi it Django" komutu veya Paket Yöneticisinden tıklamanız yeterli.

Daha sonra projeler için bir klasör açmanız iyi olur, ben ev dizininde django adında bir klasör açtım, konqueror ile bu dizine girip F4 tuşuna basarak konsolu açın ve ilk projenizi aşağıdaki komut ile oluşturun.

django-admin.py startproject deneme

Django bu komutla deneme adında bir dizin oluşturacak ve proje için gerekli temel dosyaları buraya yazacaktır. Proje henüz boş ancak çalışıp çalışmadığını aşağıdaki komutla hemen test edebilirsiniz.

python manage.py runserver

Bu komutu deneme dizininde vermelisiniz, çünkü manage.py orada. Komut çıktısından anlayacağınız gibi tarayıcınızın http://127.0.0.1:8000 adresinden projenizi görüntüleyebilirsiniz. Kocaman bir "It worked" yazısı görmüş olmalısınız. Evet şimdi kendi kodlarımızı yazalım;

deneme Dizini altında "dersler.py" adında bir dosya oluşturun, içeriği şöyle;


# -*- coding: utf-8 -*-
#Üst satır Türkçe karakterler için

#Django kütüphanesinden bir işlev ekliyoruz
from django.http import HttpResponse


#Bu fonksiyon sitemizin indeks sayfasını oluşturacak
def dersindex(request):
html = "<a href='bolum1'>Bölüm 1</a><br>"
html += "<a href='bolum2'>Bölüm 2</a><br>"
return HttpResponse(html)


#Bu fonksiyon da başka bir sayfa
def ders1(request):
msg = "Django mu? o da ne?"
return HttpResponse(msg)



#Bir başkası
def ders2(request):
msg = "Django Reinhardt ünlü bir gitaristtir."
return HttpResponse(msg)


Bu üç fonksiyonun ortak özelliklerine dikkat edin, parametre olarak "request" alıyorlar ve HttpResponse ile değer döndürüyorlar. Buradaki her bir forksiyonun yaptığı sadece sayfanın içeriğni oluşturmak. dersindex Fonksiyonunudaki HTML kodlarına bakarsanız /bolum1 ve /bolum2 dizinlerine bağlantı verildiğini görüyorsunuz, ancak projemizde böyle bir dizin açmadık, şimdi anladığınız üzere ders1 ve ders2 diye iki fonksiyonumuz var ve bu url adreslerini bu fonksiyonlara bağlamamız gerekiyor. Bunu da Django'nun oluşturduğu urls.py dosyasından yapıyoruz. Bu dosyayı şöyle düzenledim;


# -*- coding: utf-8 -*-
#Bunu ben ekledim

from django.conf.urls.defaults import *

#Bunu da ben ekledim, yazdığımız fonksiyonları projeye ekliyoruz
from deneme.dersler import dersindex, ders1, ders2

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()


urlpatterns = patterns( '',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)


Böylece patterns fonksiyonundaki parametreler ile sitemizin /bolum1 adresi çağırıldığında ders1 forksiyonunun çalışmasını sağlamış oluyoruz. Bu url adreslerinde '^$' gibi düzenli ifadeler kullanılabiliyor, bunula ilgili http://pythontr.blogspot.com/2008/09/dzenli-ifadelelerde-kullanlan.html adresinden bilgi alabilirsiniz.

Merak etmeyin Django ile veritabanı kullanmak en az bu örnek kadar basit :) Bir sonraki örnekte ona bakarız.

23 Ağustos 2008 Cumartesi

Smooth Jazz ver bana gazz

Pardus için yazdığım çevrimdışı güncelleme yardımcısını kurulum CD'sinde bulunmayan PyQt4 ile geliştirmişim. Geliştirmişim diyorum çünkü bu trajik-komik durumu interneti olmayan bir kullanıcının test ederken aldığı "
ImportError: No module named PyQt4" hatasıyla anlamış olmamdan dolayı yaşadığım dumuru hala üzerimden atamadım. :D

Bu sabah programı pek içimden gelmeyerek PyQt'ye uyarlamak için biraz kurcaladım ama bu iki kütüphanenin birbirinden temel farklılıkları olduğunu anlayınca bu işi şimdilik bir kenara bırakıp programı bir komut satırı aracına dönüştürmenin daha az acı vereceğine karar verdim. Bu projeyi Qt ve özellikle QtXml'i tanımak için yapmıştım, beni teselli eden herhalde bu amacıma ulaşmış olmam oldu. Tabii bunu yaparken işe yarar bir şeyler ortaya çıkmasını da istiyordum.

Ancak kodlarla boğuşurken bu defa farklı olarak üyesi olduğum www.live365.com'dan bir Smooth Jazz [1] kanalını Amarok ile açtım. Kod yazarken ihtiyaç olan konsantrasyon, meditasyon, navigasyon vs.için oldukça etkili olduğunu fark ettim. Genelde sıkı bir Jazz dinleyicisi değilim ama sesi fazla açmadan yan taraftaki bir caz kulübünden odaya süzülen melodiler havasında dinlenen bu tür Cazın "Cazz'n Gazz" etkisini de hiç hafife almayın ve deneyin derim.

[1] http://www.live365.com/stations/bo67

30 Temmuz 2008 Çarşamba

Pardus'da çevrimdışı güncelleme (Pogy)

Soru: Emekleme aşamasındaki bir "python coder" bu konuyu proje olarak seçerse ne olur?
Cevap : pogy.tar.gz

İlgililerin paketteki README dosyasını okumasını... (Henüz beta bile olmadığını düşünerek pisilemedim.)