313. dönem 3.takım 5.manga

Küçükyalı Levazım Maliye Okulu ayrı bir dünya, ve burada yaşananlar hiç unutulmayacak anılar. Hiç tanışmadığım ama aynı anları paylaştığım birkaç arkadaşım da doğrular şekilde yazmışlar tecrübelerimizi.

1. günlük (en alttaki yorumlardan başlayın)
2. günlük

Kötü bir insan yoktu bizimle muhattap olan. Mecbur olmasalarda; o kadar "okumuş adamın" fotoğrafçı bir askerden yediği kazığı, yetmiyormuş gibi, şiir kitabı satan bir askere de kuzu kuzu ödediği 10 ytl yi acı acı geri aldılar bizim için. Eğitimde merhamet yoktu ama dış etkenlere karşı da bir kalkan vardı üstümüzde. Yasin Teğmen, Apti Asteğmen, Erdal Teğmen, Sermet Teğmen ve Özcan Üsteğmen kadar arkaplanda sürekli bizim için çalışan Mustafa Astsubay ımıza da teşekkürler.

Her sabah "saol" diye bağırmak için güneşin doğuşunu bize izleten komutanlarımızın çabaları için de teşekkürler. Yemekhane kıdemlisi asker Vahit ve "Dede" kantinci Vedat da unutulmaması gereken şahsiyetlerdendir.

3.takım 5.manga nın 13 elemanı, manga başı, koğuş kıdemlisi, dönem birincisi, dönemin en çok konuşan adamı, en hızlı uyuyan adamı, en general adamı, en çok yıkanan adamı ve en ballı Antalyalı askeri ile bunları yaşadı. Kendi içinde iyi arkadaşlıklar kurdu, yetinmedi komşu mangalardan da dostlar edindi.

Her insan yaşamalı bu 18 günü...

apt-build

Gentoo'nun derlemeyi makineye uygun bir şekilde kurarken yapması hız avantajı sağlıyor. Ancak gerçekten aşırı derecede uzmanlık gerektiren ve vakit alan bir dağıtım. Ben Ubuntu'yu apt-get kolaylığı için seviyorum. Ayrıca son kullanıcılar için son derece kullanışlı. Ama gentoo'nun derleme özelliğini de çok istiyordum. apt-build komutunu anlatan yazıyla karşılaşınca çok iyi oldu. Artık dilediğim, hızlı olmasını ve makineme özel derlenmesini istediğim programları apt-build yardımıyla kurabiliyorum.

Türkçe apt-build nasıl belgesi (Anlatılanlar her ne kadar debian için de olsa ubuntu içinde geçerli)

Java'da pirinç saydıralım

Bir başka ödev çalışması bir resimdeki pirinç tanelerini bulmaktı. Bu iş biraz daha zor oldu benim için. Matlab içerisinde bwlabel komutuyla nesneleri sayıp etiketlendirebiliyorsunuz. Benim ise ön işlemeden sonra nesneleri kendi yazdığım bir algoritma ile bulmam gerekti. (Kodlar)

Programın sonuç ekran çıktısı aşağıdaki resimde görülebilir:

Gelelim sayma algoritmasının nasıl çalıştığı konusuna. Yukarıdaki resimde de göreceğiniz üzere ilk olarak yapılan işlem resmin siyah-beyaz tonuna çevrilmesi ve pirinç tanelerinin beyaz olarak net bir şekilde gözükmesidir. Bu iş için ön işlem yapılmıştır. Bütün bu işler için JH Labs Java görüntü işleme kütüphanesi kullanılıyor. İlk olarak Threshold filtresi uygulanıyor. Bu filtre yardımıyla varsayılan olarak 173'ten (pikseller 0-255 arası renk kodlarına sahip) aşağı olan renkler siyaha, yukarı olan renkler beyaz'a dönüştürülüyor. Daha sonra bu filtrenin değiştirdiği resim üzerinde kirlilikleri (gürültüleri) temizlemek için ReduceNoiseFilter uygulanıyor. Bu iki filtrenin uygulanması sonucu en soldaki resim ortadaki resime dönüşmüş oluyor. Bu noktadan itibaren pirinçler daha net olduğu için sayma işlemini başlatabiliriz.

Pirinçlerin sayma işleminde satır satır tarama yapılarak, her pikselin renk kodu inceleniyor. Beyaz bir pikselle karşılaşınca pirinç sayısı 1 arttırılıyor ve o beyaz pikselin 4 tarafı özyineli bir fonksiyon yardımıyla siyaha çevriliyor. Bu şekilde ileride aynı pirinci bir daha saymamış olacağız. Bu işlem tüm satırlar bitene kadar tekrarlandıktan sonra en sağdaki resmi ve aşağıda yazan pirinç sayısını buluyoruz. Elle saydığımızda 81 (tartışmalar var, 79 sayan da var :D ) pirinç saydığımız resimde yazdığım program 80 pirinç sayarak bence bir başarıya imza atıyor. Ancak bu programın en büyük dezavantajı önişlemdeki threshold değeri için bir insan müdahelesine ihtiyaç duyması. Genel bir çözüm üretmek çok mümkün gözükmüyor.

(Beseech - Read between the lines)

Java'da Görüntü İşleme

Sayısal görüntü işlemi dersi kapsamında resimler üzerinde basit filtreleme işlemlerini yapan bir program yazmamız istendi. Matlab ile yapmamız gerekiyordu, ancak ben matlab ile yapmak yerine bu işi java'yla yaptım. Matlab'a nedense bir türlü için ısınmıyor. İstenen lisans ücreti ve yeni bir dili öğrenmeme isteği ısınmama konusunda önemli nedenler sanırım.

Neyse konumuza dönelim. Bu filtreleri sıfırdan java'da yazmaya kalkışınca ne kadar zor olduğunu gördüm (:D). İnternette biraz araştırma yapınca bu iş için özel filtreler üretmiş olan jhlabs sitesini buldum. Her ne kadar filtreleri Java Image Editor için hazırlamış olsa da uygun ayarlamalarla rahatça kendi programımda da kullanabildim. Filtreleri indirip kendi programlarınızda da kullanabilirsiniz. Ama lisansına uymanız gerekmektedir. Benim programın zip dosyasını indirip içerisindeki kaynak kodları inceleyip, nasıl kullanıldığını da görebilirsiniz. Kendimin yazmaya çalıştığı bir kaç filtreyi de (Threshold filtreleri) görebilirsiniz. Aşağıdaki resimde programda bir resimde köşeleri keskinleştiren köşe tespit filtresinin (edge detection) uygulanma sonucu görebilirsiniz:

ÇizBakalım

İlk olarak fazlamesai'de haberiyle karşılaştığım çizbakalım oyunu bağımlılık yapabilecek bir oyun. Çizim yaratıcılığını ve kelime bilgisini arttırdığına inanıyorum. Bir kaç kere denedim, gerçekten eğlenceli olabiliyor. Bir kelimeyi anlatırken çok yaratıcı bir şekilde çizdiğiniz zaman tebrik almanız da ego tatmini açısından hayli güzel. Neyse sizin de bu güzel oyunu denemenizi isterim. Hoşunuza gidecektir. Tabi vaktinizi alacağı kesin. Ha bir de insanda tablet alma isteği uyandırıyor daha iyi çizebilmek için :D

Java 6 mustang (1.6)

Java 1.6 sonunda çıktı. Hemen denemek için dizüstüne ve okuldaki çalışma bilgisayarıma kurdum. Kurduktan sonra farkettiğim en önemli özellik Eclipse'in daha hızlı açılıyor olması ve işlemlerin hızlanmış olması. Her ne kadar kurulum aşamaları biraz zorlasa da kurduktan sonra 1.5 sürümünü doğrudan kaldırdım. Şu an dizüstünde sadece 1.6 var ve sorunsuz çalışıyor.

Ubuntu için kurulum bilgisi almak için aşağıdaki linkleri deneyebilirsiniz (Windows'ta zaten exe indirip kuracaksınız):

http://tuxicity.wordpress.com/2006/12/07/installing-jdk-6-rc-mustang-in-ubuntu-edgy/
http://munckfish.net/blog/archive/2006/12/15/howto-packaging-java-6-for-ubuntu/
Debian kurulumu için
Java 6 indirme sayfası
Java 6 özellikleri

Yazı Yazabiliyorum...

Lanet olası beta'ya geçiş yüzünden (benim hatam olmasına rağmen blogger çalışanlarını suçlayacağım :D (Ne kadar da yüzsüzüm (Bu parantezlerde lisp gibi oldu ya (çok sevinçliyim, yazı yazabiliyorum)))) 2 haftadır yazı atamıyorum. O kadar çok alışmışım ki, bu yazı yazamama süreci ben de stres birikmesine neden oldu. Bu geçiş tam da Mehmet'in acemiliğine denk gelince Mehmet'in ilk yazıyı atmasını beklemem gerekti. Bu iki hafta boyunca biriktirdiğim yazıları sırayla atacağım. Amiyane tabirle "yazı manyağı" yapacağım eğer ki herhangi bir okuyan kaldıysa :(

acemi asker geri döndü :)

Başladım yeniden; önceden hazırlanmış, planlanmış yaşamıma. İlk bölümü bitti askerliğin, 18 günde pek çok anı ve öğretisiyle. Henüz çıktım dışarı, İstanbul içindeydim haritaya göre ama 4 dönüm arazi içerisinde geçti günler, arada bir uçakları görünce hatırladım sadece hangi şehirde olduğumu.

Her insan yaşamalı, ve düşünüp anlamalı; aslında ne kadar kolay ve güzel bir hayat yaşadığını. Ve bunu ona sağlayanın; hiç tanımadığı insanların, hiç bilmediği yerlerde ne zorluklarla göğüslediğini.

Rahat bir acemilik geçirdim, ama rahat olanı bile gerçekten zordu. Dağa çıkıp, bisiklete binen, tüfek ile atış yapan biri olsanızda zorlanıyorsunuz. Bunun yapılması gerektiğini biliyorsunuz, ama zorlandığınızı görünce aslında pek de zorluklara hazır olmadığınızı görüyorsunuz. Çok daha fazla çalışmak gerek.

Yeni çıktım daha, birkaç saat oldu. Toparlayamadım kafamı, düşünüp yorumlayamadım bazı şeyleri. İlerleyen günlerde yazacağım yaşadıklarımızı. Çok güzel şeylerin yanında çok zor anlar da geçirdik. Bir yandan bitmesin istedik, bir yandan hemen zaman geçsede koğuşa çıkıp uyusak dedik. Çelişkiler içinde geçti 18 gün. Çok güzel birikimlerle, çok güzel arkadaşlıklarla. Devamını Ankarada yaşayacağım.

Birkaç kelime/cümle aklımda kalan, sürekli sayıkladığım:
Emret komutanım.
Sol - sag - bir - ki
saol
her şey vatan için
vatan sana canım feda
şehitler ölmez vatan bölünmez
eğitimde merhamet vatana ihanettir
türk, öğün, çalış, güven

Askere neler götürüyorum

Malumunuz, askere aldılar bizi. Zorla aldılar ama, defalarca gittim şubeye alsınlar diye. Ve yerimiz belli oldu, gitme günü geldi. Bugün tamamladık alacaklarımızı. Bir çok efsane sonucu şöyle bir liste çıktı, belki işine yarayanlar olur:

bloknot ve kalem
askılı cüzdan
3 kalın 5 ince siyah çorap
sabun ve sabun kutusu
traş takımı çantası
traş köpüğü,bıçağı ve kolonyası
diş fırçası ve macunu
bepanthene el-yüz kremi
mantar kremi
şampuan
ayakkabı boyası
mavi renk yüz havlusu
2 çift (alt ve üst) içlik takım
6 takım iç çamaşır(2si iç cepli)
küçük dikiş takımı
talk pudra
tırnak makası

Java RMI

Java RMI (Remote Method Invocation - Uzak Metod Yürütme) programcının dağıtık Java uygulamaları yaratmasını sağlar. Remote java nesnelerindeki metodlar diğer Java sanal makinelerinden çağrılabilir (farklı sunuculardan da). RMI nesne serileştirme kullanarak gerçek nesne yönelimli çokbiçimliliğini destekleyerek parametrelerin aktarımını sağlar. Java RMI Java SE ile varsayılan olarak gelmektedir.
RMI bir arayüz, bir sunucu (arayüzün gerçekleştirimi) ve bir istemciden oluşur. Bizim örnek RMI projemiz çok basit olacak, basit bir toplama işlemi yapacak.

Arayüz sınıfımız aşağıdaki şekildedir:

Sunucu sınıfımız yukarıda gösterdiğimiz arayüzü gerçekleştirecektir. Böylece arayüz içerisinde tanımladığımız hizmetleri (metodlar) sağlamış olacaktır. Sunucu sınıfımız aşağıdaki şekildedir:

Ve bu sunucudaki hizmeti kullanabilmek için basit bir istemci yazalım. Bu istemci sadece RMI registry'e kaydetmiş olduğumuz sunucunun hizmetini talep edecek. İstemci sınıfımız aşağıdaki şekildedir:


Yukarıdaki sınıfları yazdıktan sonra çalıştırma işlemleri biraz karışık olabiliyor. Aşağıdaki aşamaları takip ederek deneyebilirsiniz.

Çalıştırma Aşamalar:
  1. Sınıf kodlarının olduğu dizine gidelim (cd c:\KodDizini\)
  2. Classpath ayarlayalım. (SET CLASSPATH=.)
  3. İlk önce sınıflarımızı derleyelim. (javac *.java)
  4. Sunucu sınıfımızın stub dosyasını oluşturalım (rmic -v1.2 ToplamaImpl). Bu stub dosyası istemci tarafında kullanılacaktır.
  5. rmiregistry sunucusunu çalıştıralım (rmiregistry &). Windowsta başka bir command promptta çalıştırmalısınız.
  6. Yazdığımız ToplamaImpl sunucumuzu başlatıp RMI Registry'e kaydedelim(java -Djava.rmi.server.logCalls=true ToplamaImpl localhost).
  7. Şimdi istemciyi çalıştıralım (java -classpath . Istemci localhost 15 25) .(Classpath ayarlaması ile daha önceden rmic komutu ile ürettiğimiz sunucu stub dosyasını nerede bulacağını gösteriyoruz)
  8. Ekran çıktısı şu şekilde olmalıdır: 15+25=40
Kaynak kodlar

Bu çok basit bir RMI örneğidir. Proje büyüdükçe ve paketler, sınıflar arttıkça çalıştırmak için daha farklı yollar denemek gerekiyor. Örnek olarak benim Distributed Systems dersinde yaptığım ödev projesinin kaynak kodunu inceleyebilirsiniz. İçerisinde yorum yok ancak kodları ve calistir.sh (linux için yazılmış) betiğini inceleyerek paketler, classpath ve codebase'ler yardımıyla çalıştırmayı görebilirsiniz. Daha ayrıntılı RMI bilgisi için aşağıdaki kaynak bağlantılarını kullanabilirsiniz. (Biterken The Clash - Should i stay or should i go çalıyordu.)

Kaynaklar:
http://bornova.ege.edu.tr/~erdur/SYT_2005_RMI.zip
http://ube.ege.edu.tr/%7Ecinsdiki/2006-UBI511/Geylani-Sunum.ppt
http://ube.ege.edu.tr/%7Ecinsdiki/2006-UBI511/JavaRMI.rar
http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp
http://java.sun.com/docs/books/tutorial/rmi/
http://www.javacoffeebreak.com/articles/javarmi/javarmi.html
http://java.sun.com/j2se/1.4.2/docs/guide/rmi/
http://java.sun.com/docs/books/tutorial/rmi/running.html

And death shall have no dominion

Sonunda Solaris'i izledim. Şimdi Rus versiyonunu izlemek gerek. Belki de kitabı bulup okumak.

"It can be argued that 2001 deals with the relationship between humans and machines and the transformation of humanity due to those relationships, while Solaris deals with the relationships between humans themselves and the transformation of the individual due to those relationships. As the movie explains, "what we really need is a mirror"."

Java XML Parsing

Dağıtık sistemler dersinin bir önceki ödevi RMI kullanarak web üzerinden üç siteden RSS ve XML hizmetlerini kullanarak verileri çekerek basit bir arayüz ile kullanıcıya sunmaktı.

Bu proje iki temel parçadan oluşuyor. Birinci parçası bu yazıda anlatacağım XML parsing parçası. XML parsing işlemi için üç farklı API kullanmanız mümkündür.

SAX: Olay tabanlı, kullanımı kolay bir parserdır. Ancak rastgele bir etiketi bulmak zorlayabilir. SAX ayrıca verimlidir. Büyük XML dosyaları için kullanılması zorunludur. Çünkü belgenin hepsini belleğe almamaktadır.
DOM: XML belgelerini bir ağaç gibi ele alır. Yazma ve okuma API'sidir. Varolan XML belgeleri okuduğu gibi yenilerini oluşturmada da işe yarar. Her belge Document nesnesi olarak ele alınır, bu nesne sorgulanır, aranır ve güncellenir. DOM yardımıyla rastgele erişimler daha kolaydır. SAX'a nazaran daha fazla hafıza harcar. Streaming uygulamaları için uygun değildir.
JAXP: SAX ve DOM'u ortak kullanarak iş görür.
(Bunların dışında JDOM, dom4j, ElectricXML ve XMLPULL incelenebilir.)

Ben kolay olması amacıyla ve XML dosya yapılarını bildiğim için DOM örneğini göstereceğim.

Bu XML parsing örneğinde TCMB günlük döviz kurlarının parse edilmesini göstereceğim.

İlk olarak XML dosya yapısını inceleyelim: (Aşağıdaki örnek sadeleştirilmiştir)

Yukarıdaki resimde görüldüğü gibi ağaç yapımız oldukça basittir. Bizim ilgilendiğimiz Currency etiketleri ve onun altındaki etiklerdir. Currency etiketi içerisindeki CurrencyCode ve Kod özellik olarak alınıyor, diğer bilgilerin hepsi alt etiket olduğu için element olarak alınıyor. Aşağıdaki kod parçası parse işlemini göstermektedir:


Yukarıdaki kod parçasındaki yorumlar yardımıyla işlemler anlaşılabilir. Aşağıda da yukarıda kullandığımız ve verileri metin olarak almamızı sağlayan metotlar görülmektedir:

Yukarıdan da anlaşıldığı gibi bir XML dosyasının okunmasını tek bir sınıf içerisinde gerçekleştirebildik.

DOM kullanarak çok basit bir şekilde XML dosyası parse edip, içeriğini bellekteki nesnelere aldık. Bu nesneleri kullanıp dosyayı tekrar okumaya gerek kalmadan çevirme işlemlerini yapabiliyoruz. DOM kullanarak tüm belge belleğe alınıp ağaç şeklinde oluşturulduğu için tüm belgeyi sırayla da dolaşabilirsiniz. Ya da belgenin rastgele bir etiketine (bizim yaptığımız gibi) erişebilirsiniz. Aşağıda bu örneğin Eclipse proje kaynak kodlarını (ayrıca iki tane RSS okuma örneğide var.) aşağıdaki linkten edinebilirsiniz. Bu örnekleri kullanarak kendi XML dosyalarınız için parserlar yazabilirsiniz. (Biterken Lacuna Coil When A Dead Man Walks çalıyordu)

Kodlar

Kaynak: http://www.cafeconleche.org/books/xmljava/chapters/ch05s02.html

İlginç kodlama örnekleri

Dzone üzerindeki haberlere göz atıp ilginç olanlarını açıp okurum. Bu tip haberlerden biri Java'da "eşittir" kontrolünün zorluğundan bahsediyordu. Evet gerçekten "eşittir" kontrolü zordur. Önce nesnenin null olmadığını kontrol etmelisin. Sonra iki nesneyi karşılaştırabilirsin.
Neyse, asıl konumuz benim bu haberden yönlendiğim The Daily WTF sitesinde karşılaştığım ilginç kodlama örnekleri. Burada bu örneklerin bağlantılarını vermek istedim. Gerçekten şaşırtıcı kodlar ve yorumlar içeriyor:
http://thedailywtf.com/forums/thread/103463.aspx

Bu bağlantıdaki yazıdan önceki yazılara da ulaşabilirsiniz. Ancak bütün bu yazılar ingilizce.

Unutmadan örnekler ile ilgili yorumlar da güzel. Aklınıza gelmeyen bazı yöntemler açıklanabiliyor.

Mesela
if (Math.max(1, 2) == 2) return;
İfadesi için Java'da boş blok compiler hatasını aşmak için kullanılmış olabileceğini söylüyor. Bu şekilde bu satırın yazıldığı satırdan sonraki kısımlar yoruma alınmış oluyor. Bu şekilde alışılmışın dışındaki programlama özellikleri insanın ilgisini çekiyor :S

ClamWin

Ubuntu kullanmaya başladıktan sonra Linux için antivirüs programı olarak ClamAV kullanmaya başlamıştım. Windows için AVG Free ve Avast kullanıyordum. Ancak AVG'nin artık ücretsiz dağıtım sağlamayacak olması Avast'la yetinmeyi gerektiriyordu. Acaba Clam'in Windows sürümü var mı diye bakarken ClamWin ile karşılaştım, hoşuma gitti. Windows yüklü bilgisayarlarda iki tane antivirüs barındırma hastalığım olduğu için AVG Free yerine artık ClamWin kullanmaya karar verdim.