burak@unix~$

~genel amaçlı mühendis~

Neler yapiyorum?

3 comments

Baslik biraz tatilci basligi sanki ama bir iskolikden tatil yazisi beklemenin bir anlami yok.

Guncelleme var mi diye bakinirken aylardir tek kelam etmemis oldugumu fark etmem uzerine yaziyorum bu yaziyi. Malum, eskiden siklikla yazmaya calisirdim bloguma, o gunlerin tadi da hala damagimda ama bir turlu eski tempoyla yazasim gelmiyor. Bunun artik her anlamda daha olgun olmaktan, tamamen teknik islere kafa patlatan bir adam olmama kadar cesitli sebepleri var sanirim.

Sebep her ne olursa olsun bence blog yazmak bambaska ve guzel bir is, su an yaptigim gibi tamamen dogaclama ve bir uber geek’in nelerle ilgilendigine dair, daha sonradan da kolaylikla bulunup okunabilecek ve Google tarafindan indekslenip her lazim oldugunda insanlarin karsisina kolaylikla cikabilecek seyler sosyal medya denen lagim akintisinda pek uretilemiyor. Ne diyeyim, sosyal medyasiz gunleri ozler oldum…

Bu arada, fark edebileceginiz gibi artik bir Ingilizce klavyeye sahibim. Bir Dell dizustu bilgisayar magduru olarak bu konuda gercekten sansli hissettim cunku dizustu parcalarini bulmak oldukca zor ki Ingilizce klavyeden bahsediyoruz. Orjinal klavyemi bozmamla birlikte yaklasik 1 hafta suren sancili bir “nasil toparlariz bu isi” sancisindan sonra Yazicioglu’ndan gidip yan sanayisini almama hala seviniyorum. Malum, programci adam icin en ideali Inglizce klavye. Bu arada yan sanayisi Dell’in orjinal donanimindan daha iyi.

put.io‘da Python yazan DevOps olarak yasantima devam ederken hayatima yeni bir programlama dilini soktum, kim oldugumdan bahseden sayfada da bahsettigim gibi kendisi Go. O yaziyi karalarken sadece laf olsun torba dolsun tarzi, belgeleri karistirmaktan ibaret olan iliskimiz karsilikli ciddi bir aska donustu. Su an Pythonista oldugum kadar Gopher olmasam da simdiden ciddi ciddi program yazdigim ve bildigim diller arasina girdi.

Nedir, ne degildir konusuna burada girmeye gerek yok. Bu konu icin Internet’de bulabileceginiz yiginla guzel kaynak var ama statik dillere ilgi duyan, buyuk capli ve hizli calismasi gereken ince tasarlanmis ag yazilimlarini C, C++ ve hatta Java ile cebellesmeden yazmak isteyen biriyseniz kesinlikle tavsiye ederim. Bundan daha iyisi C++ ve Java ile olur ki bu kadar guzel ve efektif threading yapabiliyorsaniz tabii.

Bu arada Go ile gercekten guzel oldugunu dusuntugum ciddi ve saglam bir seyler yapmanin pesindeyim. Su an calisabilir duruma getirebilmeyi umuyor ve bekliyorum hakkinda daha fazla cene calmak icin.

Simdi bunu okuma potansiyeli olan bir iki arkadasin “oha, hadi lan” dedigini duyar gibi oluyorum ama FreeBSD ile ince bir iliskimizin oldugunu, bir Unix manyagi olarak kendisine husu icinde baktigimi ve daha da iyisi kullandigim bilgisayardaki luzumsuz nvidia karti kapatmak icin gerekli olan acpi_call modulunun bir portunun ports‘da bulundugunu soylemeden edemeyecegim. Kendisiyle uzun sureli bir yolculuga cikmak icin tek gereken sey benim zaman bulup adam gibi bir FreeBSD kurumulu yapmam olacak gibi gorunuyor ve fakat corbada bir sinek var.

Soyle ki; Go ile gelistirme yapmak icin Sublime Text kullaniyorum ve bu harika editor FreeBSD‘de calismiyor. Sadece Linux ve diger populer isletim sistemlerine destek saglaniyor. Linux emulasyonuyla nereye kadar gidebilirim bilmiyorum ama lpms‘i vim ile yazmis biri olarak soyleyebilirim ki Sublime Text bence cok daha rahat. Python icin ise PyCharm calisiyordur diye umuyorum.

Buraya kadar okuyan oldu mu?

Written by Burak Sezer

June 25th, 2014 at 9:58 am

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