Saturday, September 26, 2009

OpenCV Python, Baz Kod, Canny

Webcam'e sahip bir Ubuntu bazli bir bilgisayarda gercek zamanli (real-time) goruntu islemek icin OpenCV kurulumundan bahsettik. En az gereken test kodu surada bulabilirsiniz. En basit goruntu isleme orneklerinden objelerin sinirlarini gosterip geri kalan her seyi siyahlastirmak, yani Canny islemi icin gereken kod ise suradadir.

Thursday, September 10, 2009

Pocketbudda.com

Simdiye kadar yazilan pek cok Seam, JBoss, EC2, anahtar/deger tabanlari, mimariler hakkindaki yazilarimiz ustunde calistigimiz bir projeden ortaya cikan yazilardi. Proje tamamlandi, ilk hali su anda kullanima acik.

http://pocketbudda.appspot.com.

Herkes davetlidir.

Wednesday, September 9, 2009

Enum, Seam ve Map Kullanimi

Enum degerleri Seam sayfalarina donduruldugunde bu degerlerin String'e otomatik olarak cevrildigini soylemistik. Peki ters yonde gidersek ne olur? Mesela elimizde, anahtari "enum tipi olan" bir HashMap var ve bu enum tiplerinden birinin String karsiligini anahtar olarak kullanarak bir degere ulasmaya ugrasiyoruz.

Bu kullanim ne yazik ki biraz takla atmadan islemiyor. Seam forumlarinda biraz gezindik ve en temiz cozumun enum tipleri iceren HashMap istendiginde o anda (on the fly) onun kopyasi ama anahtari String bazli bir alternatif HashMap olusturmak ve xhtml sayfalara bunu dondurmek olduguna karar verdik. Anahtar String olunca xhtml duzgun calisacak, Java servis kodu tarafinda guclu tip bazli Enum kullanabilecegiz, sayfa tarafinda String kullanarak istedigimiz veriye erisebilecegiz. Guzel. Ornek, diyelim ki
enum Permission {NORMAL, ADMIN}

private Map<Permission, Boolean> permissions = new HashMap<Permission, Boolean>();

public Map<Permission, Boolean> getPermissions() ...

public void setPermission(Map<Permission, Boolean> arg) ...

public Map<String, Boolean> getStringPermissions() {
Map<String, Boolean> map = new HashMap<String, Boolean>();
for (Permission p : permissions.keySet()) {
map.put(p.toString(), permissions.get(p));
}
return map;
}
Sayfa tarafinda artik #{obj.stringPermissions['ADMIN']} gibi bir kullanim mumkun olacaktir.

Burada odenen ek bedel gecici olarak olusturulan yeni Map objesi, ve o objenin doldurulmasidir. Tabii bu cozum cok buyuk Map objeleri icin iyi olmaz; fakat ustteki "izinler listesi" kullanimi cogunlukla birkac tane obje icerir, performans problemi cikartmaz.

Sunday, September 6, 2009

Git ve Branch Kavrami

Bazen koda deney amacli bazi uzatmalar eklemek, iyilestirmeler gerekebiliyor, ve/fakat bu kodlama eklerinin uzun zaman almasi da mumkun, ayrica bu ek kodlar ozelliklerin ana koluna hemen de lazim olmayabiliyor. O zaman bu "paralel" gelisme kendine has bir ritmde, "en gerekli" gelistirme safhasindan kismen ayri bir sekilde ilerleyebilir.

Bu en son Schemafree'ye zlib sıkıstırma (compression) destegi eklerken basimiza geldi. Bir gunluk bir calisma sonrasi hala yapilacak is vardi, bu calismayi kaybetmek istemedik, kodlari commit etmek istiyorduk, ama bu ek kodlar uygulama ana kodlari icin kritik degildi, SF ana kodunu simdilik degistirmemek istiyorduk. Iste branch kavrami tam bu noktada ise yariyor.

O ana kadar ekledigimiz tum dosyalari (daha hicbir git komutu kullanmadan eklemek tabii, sadece dosya sistemi bazli eklemekten bahsediyoruz) yeni bir branch'e yazmak istiyorsak, hemen o anda bir

git checkout -b [BRANCH ISMI]

komutu uygulariz. Bu noktada artik o belirttigimiz isimdeki branch uzerindeyiz. Daha once "master" adli bir branch'te idik, bu Git'in siz hicbir branch belirtmezseniz olagan olarak kullandigi branch ismidir (evet, master'in kendisi de bir branch'tir). Yeni branch yarattiktan sonra yapilan her turlu commit islemi bizi bu yeni branch ismi uzerinde tutacaktir. Eger master branch'e geri donmek istersek

git checkout master

komutu yeterli. Uzaktaki bir Git deposuna yeni branch'i gondermek icin

git push ssh://[isim]@[makina]/bir/dizin/proje [BRANCH ISMI]

gibi bir komut lazim. Eger push sirasinda branch ismi belirtmezsek olagan deger olan master kullanilir.

Simdi biraz daha derinlere inelim (gerci branch kavramini kullanmak icin takip edecek bilgilere gerek yok); Su onemli bir nokta, Git uzerinde yapilan her commit, nerede olursak olalalim, o anda depodaki tum kodu temsil eden tekil (unique) bir SHA1 hash kimligi uretilmesini saglar; git log komutunu kullaninca bu kimlikleri goruyorsunuz. Yani herhangi bir branch'te commit noktalarinin kimliklendirilme mekanizmasi aynidir.

O zaman branch isimleri nedir? Bu isimler aslinda surekli hareket eden "isaretlerden" ibaret. Mesela "master" isminin isaret ettigi SHA1 kimligi aslinda surekli degisiyor, her commit komutu uyguladiginizda "kayiyor". Her zaman en son noktayi gostermek icin bu yapiliyor. Aslinda sadece SHA1 kimliklerini kullanarak ta git ile calisabilirdiniz, ama bu rahat olmazdi. git checkout -b, o zaman, aslinda yeni bir isaret yaratmaktan baska bir sey yapmiyor.

Ilginctir: Eger istersek, git log'da gorulen listedeki herhangi bir noktaya SHA1 kimligi kullanip "zamanda geriye giderek" donebilir, ve o noktadan baslayarak yeni commit'ler yapmaya baslayabilirdik. Sadece bu bile bizi degisik bir branch yonunde hareket ettirmeye baslardi.. Git, hangi SHA1'den gelip hangisine gittigini surekli kontrol eder, ve bu "oncesi / sonrasi" zinciri, bir branch olusturmak yeterlidir. VE sonradan, istersek, bu branch'e git checkout -b ile bir isim koyabiliriz, ve o andan itibaren, artik o ismi kullanarak o yeni branch'in, SHA1 degisim zincirinin "sonuna" da otomatik olarak gidebilmeye baslariz.

Wednesday, September 2, 2009

Link Verilebilen Uygulamalar

Internet siteleri hakkinda verilen bir tavsiye onlari 'linklenebilir' hale getirmektir, yani site icerigi dinamik bir sekilde (veri tabanindaki veriye dayanarak) uretiliyor olsa bile, bir baglantinin belli bir icerige direk erisebilmesinin saglanmasidir. Bir diger tarif "konum bilgisinin servis tarafinda degil, baglanan tarafinda tutulmasi" diye gider. Ornek su: Bir forum icerisinde hosunuza giden bir yorum gordunuz ve bu yorumu direk bir linki kopyala/yapistir yaparak bir arkadasiniza email uzerinden gondermek istiyorsunuz. Baglanti site.com/yorum?id=323423 gibi olabilir. Iste bu uygulama linklenebilir bir uygulamadir. Insanlar yeni yorum, yorum listele fonksiyonlarini kullaniyor olsalar bile, ozgun (unique) bir baglanti onu takip edeni bir yoruma direk goturebilir.

Bu isi Seam ile nasil beceririz? Seam linkleme kavramina direk destek sagliyor. Diyelim ki view.xhtml sayfasi ile bir yorum gosteriyoruz. Bu sayfayi linklenebilir hale getirmek icin CommentsHandler class'imizda bir get/set ikilisi eklememiz lazim. ID selectedCommentId olsun mesela. Bu ID ile bir yorumun yuklenmesi load() metodunda olsun. Simdi pages.xml dosyasinda
 <page view-id="/view.xhtml" ... >
<param name="commentId" value="#{commentsHandler.selectedCommentId}"/>
<action execute="#{commentsHandler.load}"/>
</page>
tanimi yapalim. Boylece bir yoruma, view.xhtml sayfasina nasil gelirsek gelelim, URL'e baktigimizda commentId=.... seklinde kimligin artik URL'in parcasi haline geldigini gorecegiz. Seam otomatik olarak selectedCommentId degiskeninin URL uzerindeki commentId degerine eslenmesini idare edecektir. Bu idare iki yonludur, iki degerden biri degisirse bu degisi otekine otomatik olarak yansitilir. Daha sonra action execute ile belirttigimiz metot cagirilacaktir ve bu metot biraz once selectedCommentId'ye eslenmis bilgiyi kullanarak veri tabanina baglanarak gerekli objeyi oradan alabilir.

Tuesday, September 1, 2009

Genel Hata Ekrani

Servis tarafinda bir hata ortaya cikinca, yani Java tarafindan Exception atilinca, ya da kullanici tarayiciya anlamsiz (sitemizde olmayan) bir sayfa ismi girdiginde sitenin gorselligini bozmayan uygun bir hata ekrani gostermek gerekir. Olagan haliyle bu ekranlar gorsel olarak uygunsuz ekranlardir. Uygun bir sayfa cogunlukla tepe logosu, renkleri uygulamanizin olan sadece ici bos bir ekranda tek bir hata mesaji iceren bir sayfadir.

Bunu elde etmek icin iki yerde degisiklik lazim. Birincisi olmayan sayfa isimlerine, yani pur 404 hatalarina ekran gostermek icin Apache tarafinda.

/etc/apache2/sites-available/default dosyasina girelim ve <VirtualHost> etiketi kapanmadan once
ErrorDocument 404 /error.seam
ibaresini ekleyelim. Sayfa error.xhtml, ustte bahsettigimiz gibi logosu yerinde, guzel ve bos bir ekrani tanimlayacak. Bu sayfa tabii ki /var/www altinda mevcut olmali. Tamam. Artik Apache tekrar baslatilinca 404 hatalari icin bu sayfa gosterilecek.

Seam tarafinda ise, eger hic kimsenin caresine bakmadigi, tutmadigi (handle) Exception'lar JVM'de en ust seviyesine cikmis ise, bu hatayi guzel ekrana yonlendirmek icin WEB-INF/pages.xml icinde
  <exception>
<end-conversation/>
<redirect view-id="/error.xhtml">
<message>Unexpected failure</message>
</redirect>
</exception>
Bu kadar. pages.xml icinde aslinda daha detayli tip bazinda Exception yakalayip kullaniciyi daha ozel sayfalara yonlendirmek mumkun; ust gosterdigimiz eger o diger tum yakalayicilar bir sey yapamamissa devreye girecek olan "genel yakaliyici (catch-all)" tanimidir. Hic planda olmayan hatalar icin gereklidir.