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)
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.
27 Ağustos 2012 Pazartesi
Dojo (CoffeeScript) projesini Nginx ve Tornado Server ile sunmak
Önceki yazıda basit bir panele bir açılır düğme yerleştirmiştim. Artık projeyi Nginx+Tornado Server sunucusundan çalıştırıyorum.
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.
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.

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?
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ü;

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
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
Ş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.
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.
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
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;
Buradaki ilk değerin boş olduğunu görüyorsunuz, bu değeri ihtiyaç halinde ön-ek (prefix) olarak kullanabilirsiniz. Şöyle;
Peki şöyle bir import yazdıysak?
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;
Düzenli ifadede olarak kısaca "pardus/", 4 haneli sayı, "/" ve bir haneli sayı tanımı yapıyoruz.
Peki fonksiyon tanımını şu şekilde yaptığımızı farz edelim;
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.
Bunun ışığında /pardus20081 url adresi için şöyle bir ifade kullanılabilir.
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.
Ö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
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
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.)
Cevap : pogy.tar.gz
İlgililerin paketteki README dosyasını okumasını... (Henüz beta bile olmadığını düşünerek pisilemedim.)
Kaydol:
Kayıtlar (Atom)