burak@unix~$

~genel amaçlı mühendis~

Tornado’da test yazarken ‘authenticated’ dekoratöründen kurtulmak

leave a comment

Blogu Türkçe yazıyorum ama resmen zorlanıyorum: mesela bu başlık. Ne desem uymuyor, Türkçe’ye oturtamıyorum pek bazı kavramları. Sonunda böyle ucube laflar çıkıyor klavyemden. Sanırım bazı şeyleri İngilizce yazmak gerekecek.

Tornado tam beni sevdiğim cinsten bir yazılım. Ufak ama çevik ve marifetli, tıpkı bir kedi gibi! :) Kendisiyle haşır neşir olmayı da pek seviyorum ama geçenlerde test yazarken azıcık zorlandım.

tornado.web.authenticated dekoratörünü kullanan pek çok metodu test etmek için sahte bir yetiklendirme durumu yaratmak gerekti, implentasyon detaylarından çok bahsetmeyeceğim ama şöyle bir kod örneği verebilirim:

Yukarıdaki koddaki hikaye şöyle. with ile başlayan satırda bir context manager içinde Tornado’nun RequestHandler sınıfının get_secure_cookie metodu gölgeleniyor(tam teknik tabir patching) ve döndürdüğü değer yetkilendirilmesini istediğim kullanıcı oluyor. O methot bir kez öyle bir sonuç döndüğü zaman Tornado yetkilendirilmiş bir istemcinin sorgusuna cevap verdiğini sanıyor ve istediğiniz işi yapıyor.

Bu arada, söylememe gerek var mı bilmem ama, Mock kullanıyorum.

Tornado’da test yazma konusunda en iyi kaynak da sanırım bu: http://www.tornadoweb.org/en/stable/testing.html

Written by Burak Sezer

March 7th, 2014 at 10:31 pm

PostgreSQL’de bir yetkilendirme hatasi

leave a comment

PostgreSQL ile çalışmaya devam ediyorum.

Geçen gün geliştirme ortamındaki Postgres’i 9.1 sürümünden yeni cikan 9.3.3 sürümüne taşımak istedim. pg_update ile istedigimi de yaptım fakat test veritabanı oluşturmak için güncel bir dump almaya çalıştıgımda şöyle bir hata ile karşılaştım:

psql: FATAL: Peer authentication failed for user $username

Ufak bir araştırmayla ögrendim ki, eğer ayar dosyasında yetkilendirme metodu olarak peer seçerseniz PostgreSQL işletim sistemi üzerindeki kullanici adını alıyor ve onu yetkilendirme icin kullaniyor. Yani sistem, benim veritabanına müdahale etmeye çalıştığım kullanıcı(postgres) ile yetki almaya çalışırken; pg_dump‘a verdigim yetkilendirme bilgileri tamamen farklıydı.

Çözüm oldukça basit. Önce /etc/posgresql/9.3/main/pg_hba.conf dosyasını açıp içinde şöyle bir satır aramak lazım:

local   all   postgres   peer

Bu satırın sonundaki peer ifadesi yetkilendirme metodunu belirliyor. Onu md5 olarak degiştirmeniz gerek. Bu sayede veritabanı oluştururken belirlediginiz yetkili kullanıcı ile giriş izni alabiliyorsunuz. Bunun sistem üzerinde tanımlı bir kullanıcı olması da gerekmiyor.

Değişikliğin işe yaraması için PostgreSQL sunucusunu yeniden başlatmanız lazım tabii.

Written by Burak Sezer

February 24th, 2014 at 8:46 pm

PostgreSQL’de Unicode problemleri

leave a comment

Başlık biraz geniş ele alıyor konuyu ama yazacağım şey ufak ve önemli bir bilgi. Belki zamanla yeni şeyler öğrendikçe yazıyı da güncellerim.

PostgreSQL ve SQLAlchemy kullanarak bir uygulama geliştiriyorum. Veritabanına Türkçe karakterler içeren bir giriş yaptığımda uzunca bir backtrace ile birlikte şöyle bir hata dönüyor:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

İşin kötü tarafı şu ki kodun benim yazdığım tarafında değil de SQLAlchemy içinden geliyor bu hata.

Çözmek için öncelikle ASCII olmayan karakterler içeren veriyi UTF-8‘e encode ettim ama tek başına bir işe yaramadı. Ben de engine tanımlamaya yarayan create_engine fonksiyonuna client_encoding=”UTF8″ parametresini gönderdim. Bu olmadan ASCII olmayan karakterleri veritabanına yazabilsem dahi okuma yapamıyorum.

Veritabanını dump’ına da aynı şeyi yazdım.

SET client_encoding = ‘UTF8′;

İşe yarıyor.

Written by Burak Sezer

February 5th, 2014 at 6:22 am

PostgreSQL’de dump’ı geri yükleme

leave a comment

İki sefer işim düştü veritabanı dump’ına, her seferinde aynı şeyi öfkeyle aramak zorunda kaldım. Bari kendi bloguma yazayım da bulacağım yeri bileyim.

Senaryo şu:

1- Elimde bir dump var, çalışan veritabanından alınmış. İçinde veri yok. Sadece bir şemalar, izinler vs… var.
2- İlgili veritabanının tanımlanmamış olduğu bir PostgreSQL veritabanı çalışır vaziyette bekliyor. Terminalde postgres kullanıcısı olmuş durumdayım.

Şimdi de çözüm adımları:

1- Önce template0‘dan veritanını oluşturalım.

[code]

createdb -T template0 dbname

[/code]

dbname yerine tabii oluşturmak istediğimiz veritabanı adı geliyor. dump’dan geri yükleme yaparken veritabanı oluşturmuyor, sadece içini dolduruyor.

2- dump’ı kullanarak yeni veritabanının içini doldurun:

[code]
psql dbname < infile
[/code]

infile yerine de /foo/bar/dbname.dmp gibi bir şeyin gelmesi gerekiyor.

Bu kadar.

Written by Burak Sezer

December 27th, 2013 at 8:23 pm

Tornado’da gerçek DEBUG modu

leave a comment

Başlık biraz fazla sansasyonel oldu ama arzu ettiğim ve yaptığım şeyi anlatan da bu.

Bu sıralar biraz Tornado ile oynuyorum. Kendisi bildiğiniz gibi FriendFeed‘in altyapısında kullanılmış ve Facebook tarafından satın alındıktan sonra kodu açılmış bir non-blocking web server ve saz arkadaşları, kısaca böyle.

Ciddi miktarda Django, Flask ve hatta düz Werkzeug tecrübesi olan biri olarak, Tornado’dan geliştirme yaparken herhangi bir dosyayı değiştirdiğimde kendinin yeniden başlatmasını bekliyordum. Ama Stack Overflow’da yazdığı gibi uygulamayı debug=True parametresi ile başlatınca işimi gördüğü söylenemez. Biraz araştırınca şu çıktı ortaya:

Yukarıdaki kod parçası size basit ama yukarıda bahsettiğim işlevi sağlayan bir sunucu başlatıyor. Burada dikkat etmeniz gereken kısım Watch templates yorum satırından sonraki for döngülerinin içinde yapılan iş. Yukarıdaki kod örneği SQLAlchemy ile Tornado’yu nasıl güzelce bir arada kullanıp adam gibi debug modunda çalışabileceğinizi gösteren güzel bir örnek. Afiyet olsun.

Bu arada kodun aslını yazan adam da şurada.

Written by Burak Sezer

December 23rd, 2013 at 1:40 am

aufs neden çalışmaz ki?

leave a comment

docker ile oynuyorum bu gece. Eski dostum aufs‘e ihtiyaç duyuyor çalışmak için ve benim kernel’a yaması uygulanmamıştı. Önce depodan sys-fs/aufs3 paketini kurdum ama bir sürü yerinde Undefined Symbols yazan fantastik hatalar bastı modül dmesg’e. Ben de sys-kernel/aufs-sources paketini kurdum ve bu paket aksini belirtmezseniz aufs’i kernel’a gömüyor.

Olay da bundan sonra başladı.

Docker’da bir Ubuntu 12.04 LTS imajına ssh yapmaya çalışırken şöyle bir hata dönüyordu:

...Error: Error starting container 042c2188714f: Unable to mount using aufs

Kernel loglarına baktım tabii hemen, aufs kelimesini grep’leyince hemen çıktı suçlu meydana:

[ 2343.072351] aufs au_loopback_init:136:modprobe[8522]: loop_backing_file() is not defined

Kolaylıkla anlaşılabileceği gibi aufs dosya sistemi, benim konfigurasyonumda, loop modülü olmadan çalışamıyor!:) Modülü kernel’a gömdüğüm için de tekrar aufs’i başlatmanın bir yolu bildiğim kadarıyla yok.

Bu durumda ya aufs’i bir modül olacak şekilde ayarlamak gerekiyor ya da loop’u da kernel’a gömmek. İkincisini yapıp tekrar kernel derledim, aynı şeyleri tekrar tekrar yapmadığı için hemen bitti ve boot edip Gentoo içinde LXC ile çalışan bir Ubuntu 12.04 LTS’ye kavuştum.

Bu da sistem yöneticisi tarafımın yazdığı bir hata yakalama hikayesi.

Written by Burak Sezer

November 2nd, 2013 at 11:26 pm

devPod’da Put.io röportajı

leave a comment

4-5 hafta önce Uğur Özyılmazel ofisimize gelip günümüzün 1 saatini bu kadar eğlenceli olacağını hiç düşünmediğim bir röportajla doldurmuştu. Biraz geç de olsa yayına almışlar.

Pilli, muhtemelen bu blogu okuyanların çoğunun bildiği gibi Pilli Network, Sosyomat ve Put.io gibi projeleri yapmış bir İnternet şirketi. Röportajdaki muhabbet genel olarak Put.io etrafında dönse de önceki projeler, yaşanan tecrübeler ve  Ruby vs Python gibi konuları da barındırıyor.

Ben de ortalarda bir yerdeyim, güzel güzel Put.io’da neler yaptığımdan bahsetmeye çalışırken arkadaşlardan birinin “bu dağıtım yapıyor” diye beni ispiyonlaması üzerine muhabbet rahmetli Hadron‘a ve Gentoo‘ya döndü. Vigo’nun da eski Gentoo’culardan olduğunu ve beni source-based Hadron’u yapmaya iten sorunları yaşadığını öğrenmiş olduk.

Bu arada, Ağustos ayının ortalarından beri Put.io‘dayım. Download’lar ve storage sunucuları başta olmak üzere bir sürü şey ve ucundan kulağından da olsa teknik olan diğer her şeyle ilgilenen bir yazılımcı olarak kariyerime devam ediyorum. Çalıştığım en keyifli iş, Python’la çalışmamızın bunda payı büyük elbet.

Python’da, yazılım geliştirmede ve Linux sistem yönetiminde kendine güvenen arkadaşla her zaman görüşmeye açık olduğumuzu da söylemiş olayım. Belki bir çalışan yakalama fırsatı olur! :)

Şuradan dinleyebilirsiniz, biraz uzun ama…

http://devpod.tumblr.com/post/64679188403/bolum-0020-put-io

Written by Burak Sezer

October 22nd, 2013 at 11:34 pm

Kaç Leylim Bahar

4 comments

Mektup ya da anı türünde okumayı pek sevmem aslında. Daha çok roman ve hikaye okurum şiirin yanında. Ama söz konusu mektuplar Ahmed Arif’in Leylâ Erbil’e yazdıkları olunca akan sular duruyor.

Uzunca zamandır büyük ilgi ve sevgiyle tekrar tekrar okuduğum, dinlediğim şiirlerin ilham kaynağının Leylâ Erbil olduğunu öğrenince, şiirlerin en ince yerlerinde geçen “leylim” kelimesi çok hoş bir anlam kazandı. Hele ki Ay Karanlık’da yangın mavisine çalan gözlerin Leylâ Erbil’in gözleri olduğunu fark etmek güzeldi ki gerçekten de maviymiş gözleri.

Kitapda şiirlerin ham hallerinin yanı sıra, özellikle Leylâ Erbil’e aşkını anlatırken seçtiği kelimelerle birlikte, şiirlerinden çok şeyler var. Yıllarca tekrar tekrar okuduğum şiirlerin kaynağını en saf haliyle görmek paha biçilecek türden bir şey değil benim için.

Edebiyatı seven, bilhassa Ahmed Arif seven herkesin bu özel mektupları okumasını tavsiye edebilirim gönül rahatlığıyla.

Son olarak,

Aşık olan adam Ahmed Arif gibi insanın aklını başından alacak bir ifade gücüyle aşkını anlatsa da, kadın Leylâ Erbil gibi bir kadın olsa da sonuç değişmiyor. Kadın hep aynı kadın, erkek hep aynı erkek.

Written by Burak Sezer

October 10th, 2013 at 7:40 pm

Celery görevlerinde deadlock mevzusu

leave a comment

Saçma sapan Celery sıkıntıları yaşamaya devam ediyorum. Worker tahmin edilemez biçimde çalışmayı kesiyor, biraz araştırdıktan sonra file descriptor(tam Türkçesi nedir bilemiyorum, açık dosya olarak da geçiyor) saysınını artırmanın bir çözüm olduğunu okudum. Uyguladım, sorun en azından orta vadede kaybolur gibi oldu; ama 2 saat önce fark ettim ki olmuyor. Zaten tahminen sadece sorunun yaşanmasını geciktirecek bir şeydi bu.

Bu deadlock sorununa bir çözüm olarak CELERYD_FORCE_EXECV parametresinin True olarak ayarlanması öngörülmüş. Güzel, commit loglarından ve diğer yerlerden okuduğuma göre, diğer alternatif çözümlere nazaran kısa yoldan net sonuca götürebilecek bir şey; ama malesef bir BUG var!

Ben yazdığım görevleri sınıf tabanlı olarak tasarlamıştım ve CELERYD_FORCE_EXECV parametresini True olarak atadığınız zaman bu sınıf tabanlı görevler scheduler’a kayıt edilmiyor! Konuyla ilgili hata kaydı ve Celery’nin yazarı Ask Solem‘in yorumu da bu:

https://github.com/celery/celery/issues/1150#issuecomment-12893580

6 ay önce açılan bir hata kaydının hala en güncel kararlı sürümde bana karın ağrısı olmasını bir kenara bırakacak olursak; bu saçma hatanın çözümünün görevlerinizi sınıf tabanlı değil de dekoratör tabanlı yazmanın olduğunu fark ettim. Şöyle:

http://stackoverflow.com/a/14703588

Şanslıyım ki görevlerin tanımlı olduğu task.py dosyasında sadece 10-20 satır kod var. Her şeyi güzelce modülerize ettiğim için 2-3 satır değişiklikle olaydan sıyrıldım.

Şimdi de sıra tavsiye edilen diğer parametreleri doğru bir şekilde ayarlama ve yeni deadlock durumları için pusuya yatmakta.

Written by Burak Sezer

July 21st, 2013 at 3:47 pm

Yine Yeni Yeniden

2 comments

Uzunca bir süredir kurup kullanmıyordum, geçen gece can sıkıntısıyla sitesinde bir dolaştım Gentoo‘nun, eski aşk depreşti sanırım! Zaten tüm altyapısını avucumun içinden iyi bildiğim bir dağıtım olduğu için fazla uzak kalamıyorum.

Şaka bir yana derlemeyi özlemişim; arada sırada Linux‘un yeni sürümlerinin çıktığını fark ettikçe içim gidiyordu zaten. ChangeLog dosyasında, commit loglarında biraz dolaşıp pek bir şey anlamadıktan sonra yama setlerini falan ayarlayıp garip garip konfigurasyonlarla tiny kernel derlemeyi çok özlemiştim.

Dayanamadım, gecenin bi vakti indirdim stage3, boş bir bölüm ayarladım ve kurdum. 2008 yılında ilk yaptığım Gentoo kurulumu gibi stable brachından kurulum yaptım. İyi ki de yapmışım; artık orjinalini hiçbir dağıtımda göremeyeceğimi düşündüğüm GNOME 2.32.1 sürümü stable’da gayet güzel, bakımlı bir şekilde duruyordu. Onu da, ihtiyacım olan şeyleri de kurdum kullanıyorum şimdi.

Gentoo aslında genel klasmanda mükemmele yakın bir dağıtım, kendi klasmanında ise kötülerin en iyisi; yani bir çeşit mükemmel.

Gentoo’daki güncellik ve kararlılık dengesine bayılıyorum bir kere. GNOME 2.32.1‘i stable branch’dan sunup diğer her şeyi makul bir güncellikte tutmak benim için çok cazip. Tabii genel olarak Gentoo’da stable ve unstable branchları çok kolay bir şekilde beraber kullanabildiğinizi de unutmamak lazım.

Paket depolarında, kullanıcı depoları dahil, hemen her paketin pek çok sürümü aynı anda var. Söz gelimi Python 2.5, 2.6, 2.7, 3.2 ve 3.3 sürümlerini aynı anda sisteme kurup bunlar arasında mümkün olduğunca yumuşak bir geçiş yapabileceğiniz bir binary dağıtım yok. Bu örneğe dahil edilecek pek çok paket daha var. Zaten rolling release mantığını en iyi uygulayan dağıtımlardan olduğu için bir Ubuntu gibi sonraki sürümün çıkışı yaklaştıkça güncellemelerin kesilmesi, azalması gibi bir durum da söz konusu değil. Zira yeni sürüm diye bir şey yok. Teorik olarak sabit diskiniz yanana kadar kullanabilirsiniz.

Dediğim gibi, çok geniş bir paket ağacına da sahip. Mesela Ubuntu’da Nodejs‘in en güncel kararlı sürümüne ihtiyaç duyduğum zaman PPA aramış, bulmuş ve paketlerin işi ziyan etmesini izledikten sonra kendim elle derleyip sistem geneline kurmuştum en güncel sürümü. Gentoo’da Nodejs’in beta durumundaki sürümünden pek eski sürümlerine kadar rahatlıkla bulunabiliyor. Hatta biraz zorlarsanız direk kod deposundan da kurabilirsiniz, paket yönetiminin dışına çıkmadan. Kullanmayı bilen için büyük avantaj.

USE Flag‘ların, paketlerin özelliklerini dinamik olarak ayarlamanın, aslında ne güzel bir şey olduğunu da lamer olmayan herkes sanırım anlayabilir. Bahsetmeye gerek yok.

Kötü yanları yok mu, elbette var. Portage mesela; çok iyi düşünülmüş ve gayet olgun bir araç ama çok salakça tasarlanıp kodlanmış. Sistemi kullandıkça bağımlılık çözme işinin tadını iyice kaçırıyor, eix olmasa zaten kimse paket araması yapamaz depoda. O derece.

Hadron‘da bu sorunları proof of concept olarak da olsa çözmeye çalıştık. Ama tabii resmen çılgın projedir Hadron. 1-2 kişiyle yapılacak iş değil.

Uzun lafın kısası şu: ne yaptığınızı biliyorsanız ve yeterince sabırla beraber iyi bir CPU-RAM kombosuna sahipseniz Gentoo çok iyi bir seçenek.

Written by Burak Sezer

July 18th, 2013 at 2:12 pm