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.

Kodlayıcı, Programcı ve Mühendis

En çok tartışılan konulardan biri Kodlayıcı (Coder) veya Programcı olmaktır. Kodlayıcılar kodlama konusunda çok başarılı olduklarını söylerler (gerçekten de öyle olabilirler), programcıları küçümseyenleri bile vardır. Ben ise işin daha farklı bir boyutunu ele alacağım.

Çoğu kodlayıcı mühendisleri, mühendisliği de küçümsemektedir. Bu küçümseme mühendislerin iyi kod yazamadığı iddiasına dayanmaktadır.

Bu konuda ilginç yazılar ararken karşıma çıkan bir yazıda önemli tespitlerle karşılaştım. Yazar bir "aptalın" bile kod yazabileceğini söylüyor. Ve bu söyleminde haklıdır. Bahsettiği gibi UML sayesinde bilgisayarlar bile kodu üretmektedir. Mühendisin en önemli farkı burada ortaya çıkmaktadır.

Mühendis kodlama işini yapmak zorunda değildir. Ama bu işten hoşlanıp yapanlar vardır. Mühendisin temel işi problem çözmektir. Teorik bilgileri pratiğe dökmektir. Tasarım yapmak, modellemek mühendisin işidir. Kodlamayı mühendis yapmayabilir. Modelleri hazırlar (UML mesela) daha sonra bir bilgisayarın bile bu modellerden kodu üretmesini sağlayabilir (Model Driven Architecture). Bu noktada kodlayıcı ile mühendisi karşılaştırmak, hatta mühendisi iyi kod yazamıyor diye küçümsemek bilgi eksikliğinden kaynaklanmaktadır. Türkiye'deki mühendislere bakış açısından kaynaklanmaktadır (Bilgisayar mühendisleri programcıların işlerinde çalıştırılmaktadır).

Özetle kodlayıcıları takdir ederim, gerçekten iyi algoritmalar yazan kişileri de takdir ederim. Ama bir mühendis olarak yapmam gereken problem çözmektir, tasarım yapmaktır. Benden çok süper kod yazmam beklenmemelidir. Yazacağım kod yazılım mühendisliği pratiklerine uygun olacaktır. Aldığım eğitim bunu gerektirir.

Değinmek istediğim bir başka konuda bir forumda şans eseri karşılaştığım bilişimci olmak isteyenler tavsiyelerini içeren yazılar. Bu yazılarda yeterli bilgi olmadan sadece ekonomi dergilerinde yazan cümlelerle nasıl fazla para kazanırım düşüncesiyle sertifika programlarıyla "mühendis" olmaya çalışanlardan resmen para emmeye çalışan kişilerin düşüncesidir. Türkiye'de mühendislik ünvanını dört yıllık üniversiteler dışında kimse veremez. Microsoft'un veya diğer kısa süreli kurslarda alınan sertifikalar sizi mühendis yapmaz.
Bu forumu okuyunca "Bilgisayarcı" olmak teriminden ne kadar nefret ettiğimin farkına vardım.

Mesela aşağıdaki cümlelere bakalım:
" Şimdi öss ye girseniz kazansanız sistem müh. = 4 yıl demek hazırlık fln 5 yıl.. aynı şekilde yazılım okumak isterseniz yine 5 sene demek aşağı yukarı bunları aynı anda okumak imkansız gibi bişi oldugundan çift üni yani = 10 sene demek 19 da okul bitir 29 da üni ee askerlik fln noldu öldünüz gittiniz yane tecrübe yok bişi yok bide kafayı çalıştıran bir genci düşünelim..

Lise biter kafası rahat olur gider bir kursa yazılır sistem mühendisliğine 9 ay diyelim.. 9 ay bitince yazılır yazılım mühendisliği / uzmanlıgına 6 ayda bu = 15 ay = 1 yıl 3 ay demek ortalama 1,5 sene diyelim elinizde ne var ?
mirosoft sistem mühendisliği sertifikası + microsoft yazılım uzmanlıgı/mühendisliği sertifikası+ kursun ize sağladıgı iş olanakları+edindiğiniz harika çevre ve yıllık düzenlenen mezunlar buluşması vs.."

Ben Lisans+Yüksek Lisans toplam 7 senemi "Mühendis" olmak için "harcamış" biriyim. Yukarıdakileri yazan arkadaş işi ne güzel özetlemiş. Ne gerek var bu kadar okumaya, gidin bir kursa, 9 ayda mühendis olun, kartvizitinizde mühendis yazsın, ama nedense hiç bir problemi çöz(e)meyin.

Mühendisliğin bu kadar ucuz bir meslek olmaması gerekiyor.

Cümleler biraz karışık oldu, kusura bakmayın. Bazen insanın tepesi atabiliyor :D

JAR içerisindeki kaynaklara erişim URL'si

Daha önce takıldığım noktalardan biri jar içerisinde bulunan xml dosyalarına URL yardımıyla nasıl ulaşacağım konusuydu. Bunu çözmek için birinin tavsiyesiyle jar protokolünü denedim. Ve işe yaradı:

jar:{URL}!/{ICERIK}

Yukarıdaki gibi bir protokol yardımıyla jar dosyası içerisindeki kaynaklara erişebilirsiniz.

Mesela http://www.ornek.com/dosyalar/projeler/Deneme2.jar dosyası içerisindeki bir resime erişmek istiyoruz, bu durumda şu şekilde erişebiliriz: jar:http://www.ornek.com/dosyalar/projeler/Deneme2.jar!/net/tekrei/deneme/resim/icon.gif

Başka bir örnek: jar:http://www.ornek.com/dosyalar/projeler/EasyLab.jar!/resimler/NORMAL.gif

Kaynak: https://docs.oracle.com/cd/E19253-01/819-0913/author/jar.html#jarprotocol

İstanbul

Arkadaşlarımı görmek için gidecektim İstanbula. Ankara'dan sonraki uğrak olarak planlamıştım yolu. Birkaç ay önce EMO dolayısıyla gönderdiğimiz makalenin bildiri olarak önümüze düşmesi biraz değiştirdi durumu. Bildirimiz kabul edilmişti, sunum yapmak gerekiyordu.

Akademik katkısı büyük olmasa da, güzel bir çalışma olmuştu. Katılım beklediğimden çok daha iyi ve kaliteliydi. EMO izmir yönetimi de yalnız bırakmamıştı bizi. Sunum yardımcısının Emre'nin kardeşi olmasını, oturumda karşılaştığım ve üzerimizde çok emeği olan Ahmet Kaşlı hocamı görmek tamamlayınca ayrı bir güzel oldu.

Malzemeyi ben toplamıştım ama pişiren ve tabaklara koyan olmasa hiç birşey olacağı yoktu, sonlanmayacaktı. İki kişi olunca bile birşeyleri çok daha rahat üretebiliyorsunuz; teşekkürler Meltem.

Sempozyumun iyi hazırlanışı bir yana, arkadaşlarımı görebilmekti asıl mutlu eden. Zaten sırf bu nedenle ve birde İstanbul'u onlarla gezebilmek için gitmeyi planlıyordum. Gezme fırsatım oldu da :). Osman ve Levent, 5 dakika boş bırakmadılar beni, her şey düşünülmüştü; ve çok kapıştık hesap ödemek için. Mükemmel muzlu-krokanlı pastasından heralde, Barcelona pastanesinde de hesap ödemede başarısız olunca; ara sokaktaki kahvecide kasaya doğru attığım depardan, bizimkiler önce dumur oldu sonra gülmekten yarıldı :). Eve dönüş yolunu tuttuk. Güzel bir uyku; yatağından ettiğim Zeki'den özür dilemem gerek, ve Osman, herşey için teşekkürler.


Gelmişken birde Ayasofya'yı görelim dedik. Öğleden sonra 4 te kapanıyormuş meğer. Bunu da bizi yabancı sanıp ingilce konuşan birinde yine ingilizce konuşarak öğrendik. Adamı mahçup etmeyeyim diye bende öyle devam ettim, sonra "where are you from?" diye sordu, attım tabii aksanlı bir şekilde "Italiano" diyerek; nerden bileyim adamın italyanca da bildiğini. Vınn, arkana bakmadan, "thank you" deyip kaç :). Önümüzde Sultan Ahmet Camisi. Böyle bir yapı, adam gibi bir koruma önlemi alınmamış ve hafif yıpranmalara maruz kalmış olsa da inanç(ve tabi şan, gösteriş gibi etkenler) uğruna yapılabilecek ve görülebilecek en güzel yerlerden biridir heralde. Bu kadar çok işlenmiş mermeri bir arada görmemiştim hiç.

İstanbullu değilseniz size tüm ulaşım yolları 1.3 YTL. Koyduğunuz yol parasına şaşırabilirsiniz. Çünkü çoğunlukla iki araç kullanmak zorunda kalıyorsunuz. Herkes koşturuyor, herkes sinirli. "Yaşamak istemem artık aranızda" diye düşünüyor insan. Ve üzülüyorsunuz, harcanan kültüre, tarihe ve yapılara. Nereye baksanız tarih var bu şehirde, değeri hiç mi bilinmez?

Böylece bir macera daha bitti(çizgi film sonu gibi oldu), ve bir sunum daha yapıldı. Sempozyum kartlarını da biriktiriyorum, ne yapacaksam. Şimdilerde başka bir çalışmamız daha var: yapay zeka ve RFID üzerine, iki kişiyiz yine. Birde bize doğrudan hiçbir katkısı olmayacak bir yazılımın peşinde koşuyoruz, üç kişiyiz burada da. Ne kadar kalabalıksak o kadar büyük çalışabiliyoruz, ne kadar uyumluysak o kadar üretebiliyoruz. Vakit az, iş çok. Yapılanlara katılımı kabul ediyoruz, yapılmasını istediklerinizi tartışıyoruz. Umarım sonunu getirebiliriz tümünün.

Kevin Smith Filmleri

Dogma'yı izleyerek haberdar olduğum Kevin Smith, Dogma'daki farklı bakış açısı, eleştirel yazarlığı ve Star Wars hayranlığıyla ilgimi çekmişti. Bu Dogma filminin Jersey Üçlemesi adlı bir serinin filmi olduğunu öğrendiğimde üçlemenin önceki filmlerini de izlemeye karar verdim.

Clerks çoğu kişinin duymuş olabileceği bir film. Quik Stop dükkanında o gün dükkanda olmaması gereken tezgahtar ve yandaki video kiralama dükkanındaki tezgahtarın bir günlük ( sanırım bir günlüktü :S ) macerasını anlatıyor. Kadın erkek ilişkilerine de değiniyor. Ve Jay ile Sessiz Bob'la tanışmamız sağlanıyor.

Mallrats gün başlarken sevgilileri tarafından terkedilen iki arkadaşın teselli bulmak için büyük bir alışveriş merkezine gitmeleri, orada yaşadıkları olaylar ve kadın erkek ilişkilerine değiniyor. Günün sonunda elbette mutlu son yaşanıyor. Elbette Jay ve Sessiz Bob karşımıza burada da etkili rollerle çıkıyorlar :)

Chasing Amy bence değişik bir film. Bir lezbiyene aşık olan çizgiroman çizerinin bu kızla arkadaş olmasını, çizgiromanı beraber çizdiği arkadaşıyla bozuşmalarını, lezbiyen kızla sevgili olup daha sonra kızın geçmişiyle ilgili kendince dayanılmaz birşey öğrendikten sonra ayrılmalarını ve travmaları anlatıyor. Jay ve Sessiz Bob yine karşımıza çıkıyorlar.

Dogma filmi, iki kaçak meleğin Katolik mezhebi tarafından yaratılmış olan bir açığı değerlendirip Tanrı'yı hata yapan konumuna düşürüp insanlığı yoketmelerini önlemek için Hz. İsa'nın bilinen en son soy varisinin çağrılmasıyla başlıyor. Olaylar gelişiyor. Ve Jay ve Sessiz Bob bu filmde daha fazla karşımıza çıkıyorlar. Duyduğum kadarıyla bu film katolik mezhebi karşıtlığı ve tanrı tasviri nedeniyle bazı ülkelerde yasaklanmıştı. Ayrıca Kevin Smith tehdit mektupları da almış.

Son olarak Jay and Silent Bob Strike Back filmini izledim. Bu filmde Jay ve Sessiz Bob'un kendilerinden esinlenilerek yaratılmış olan çizgi romanın film yapılmasını, internette kendilerine (daha doğrusu onlardan esinlenilerek yaratılan Bluntman and Chronic'e) film küfür edenlerin olması nedeniyle engellemeye çalışmalarını ve yol hikayelerini anlatıyor.

Kevin Smith bu filmlerinde yarattığı sanal bir dünyayı kullanıyor. Tüm karakterler filmlerde karşımıza farklı zamanlarda çıkabiliyor. Bu filmleri farklı bir komedi örneği olarak izlemenizi tavsiye ederm. Ancak belden aşağı (bol küfürlü, hem de çok bol) espriler tadınızı çok kaçırıyorsa hiç tavsiye etmem. Jay ve Sessiz Bob'tan zevk almamın belki de en önemli nedeni Jay'in inanılmaz derecede küfürlü konuşmasıdır (Örn: Jay'in küfürlü rapi).

Kevin Smith ekşisözlük girişi
Jay and Silent Bob

Sağlık Raporu

Sağlık raporu almak gerekti, bunun içinde tam teşekküllü bir devlet hastanesi bulmak gerekti. İzmir gibi büyük yerde bir kaç tane devlet hastanesi olduğu için ulaşım açısından en kolay olanı seçmek istedim. Bu da Karşıayaka devlet hastanesiydi. Herşeyi ayarladık sabahın köründe uyandım, dolmuşa 7.30'da bindim, 8'de ordaydım. Hemen işlemleri başlattım. Parayı ödemek için (telefonla sormuştuk) veznede kuyruğa girdim. Evet ben kredi kartı geçiyordur diye düşünürken ilk şokla karşılaştım 160-180 YTL arası parayı nakit olarak vermemiz bekleniyordu. Yani kredi kartı geçmiyordu. Tam o esnada arkadaşımla konuşan bir bayan Eşref paşa belediye hastanesinde 60 YTL karşılığı raporu (aynı raporu) alabileceğimizi söyleyince biz de Karşıyaka devlet hastanesinden çıkıp telefonla aradık. Ve doğru olduğunu öğrendik. Alsancak'a doğru yola çıktık. Karşıyaka'dan doğrudan nasıl gidebileceğimizi bilmiyorduk. İlk önce belki daha ucuzdur diye Alsancak devlet hastanesine sorduk. Orası 129.5 YTL alıyormuş. O zaman dedik farz oldu, Eşref Paşa belediye hastanesine gidiyoruz. Ama orası da 8:00-10:00 arası kabul ediyormuş heyet raporu alacakları. Biz en azından bilgi alalım diye gittik ve 10:30 civarı vardık öğrendik. Günümüz böylece bitti (öldü, mahvoldu ne derseniz artık)

Ertesi gün sabahın köründe kalktım, ve hastaneye gittim. Önceki gün 1 dolmuş, 2 otobüs ve 1 metro seferi yapmıştım. Bugün doğrudan metro ile Basmane'ye gittim, oradan 10 dakikalık yürüyüş ile Hastaneye ulaştım. Ama yürümeyi tavsiye etmem, tırstırıyor :S. Hastanede hemen işlemleri başlattım, 3 fotoğraf önceki gün heba olmuştu, bugün de üç tane daha verdim. Ve idrar, kan tahlilleri için numuneleri verdim, röntgeni çekildim ve muayenelerin başlayacağı saat 11:00'e kadar beklemeye başladım. Orada aynı işlemleri yapmak için gelen 3 kişiyle oturup çay içtik, muhabbet ettik. Bu kadar farklı (benden) insanlarla muhabbet ilginç oldu. Farklı bir deneyimdi. İnsanların sıkıntılarını daha iyi anlamak için önemli bir deneyim. Aslında arada sırada böyle farklı mahalledeki (köylerdeki) kıraathanelerde insanlarla konuşmak gibi düşüncelerim oluyor ama tırsak yapımdan dolayı pek yapamıyorum. Neyse gelelim sağlık raporuna. 11:00 olunca oradan oraya koşturmaya başladık. Doktorlar muayene etmeden bir sorunun var mı diye sorarak imzaladılar. Bu arada röntgen, kan ve idrar tahlili yaptırmış oldum :) Saat 11:50 gibi işler bitti. Eğer gezmem gereken tüm poliklinikleri gezmeseydim ertesi güne kalacaktı öğleden sonra muayene yapmıyorlar diye duymuştum. Herşey bitti ve şimdi rapor için ertesi gün 13:00'da tekrar gitmemi istediler. Şu raporu alsam da kurtulsam demeye başladım. Bürokrasi şu son bir kaç aydır iyice bir sıkıntı yaratmaya başladı :(

Size tavsiyem rapor almadan telefonla bilgi alıp hazırlıklı gitmeniz. En ucuzunu bulun, üstünüzde yeterli para olsun.

Not:Sağolsun kan alan hemşirenin eli o kadar hafif ki kan aldığı yer bir süre şişti. Acaba bu normal mi ?

Java ve Oyun Programlama

Java çıktığından beri aldığı standart eleştiriler nedeniyle oyun programlama için uygun bir dil olmadığı savunulmuştur. Ancak her zaman savunduğum gibi Java ile'de oyun geliştirilebilmektedir. Bunu örneklemek için youtube 'ta bulunan bir videoyu paylaşmak istedim (java gaming diye aratınca da bir sürü çıkıyor).




Görüntülerle verilen oyun linklerini de inceleyebilirsiniz. C, C++ bilmediğiniz için oyun geliştiremiyorsanız, büyük bir oyun geliştirmek için tam zamanı. Nasıl yaparım ne ederim diyorsanız başlamak için bağlantılar aşağıda:

-JOGL ne ola ki?
-Jumping into JOGL
-Java Gaming forums

Not:Ben Chrome ve Squareheads oyunlarını beğendim, denemek lazım. Ayrıca bir süreliğine Runescape oyununu da oynamıştım. Hoşuma gitmişti. Tam bir MMORPG oyun olarak göze çarpıyor.

IzPack ve Java kurulumları hazırlama

Bir projeyi bitirdikten sonra yaşanan en büyük sıkıntılardan biri tüm platformlarda çalışacak bir kurulum dosyası oluşturmaktır (installer). Java uygulamaları için son aşamaya geldiğinizde kullanabileceğiniz güzel bir aracı ben araştırmalar sonucu buldum. IzPack işimi gerçekten kolaylaştırdı ve hem linux hem de windows tabanlı makinelerde kurulum dosyası oluşturmamı sağladı.

IzPack sitesinden kurulumunu indiriyoruz. İndirdikten sonra java -jar izpack-dist-5.0.10-installer.jar komutuyla kurulumu başlatıyoruz. Daha sonra aşamaları izleyerek kurulumu tamamlıyoruz.

Kurulum tamamlandıktan sonra paketini hazırlayacağımız projenin çalıştırılabilir jar dosyasını oluşturuyoruz. Ve bu aşamadan sonra IzPack için gereken xml tanıtma dosyasını yazıp projemizin paketini hazırlayabiliriz.

Aşağıda açıklamasıyla bir örnek vardır. Bu örneği denemek için Dosya Parçalayıcıyı indirip oluşturduğunuz bir klasöre koyun. Ayrıca paketle beraber bir lisans dosyası göndereceğimizi varsayalım. Onu da siz yazabilirsiniz veya hazır bir lisans dosyası indirebilirsiniz. Bu örnek için GPL lisansını kullanacağız. Verdiğim adresten html dosyasını indirin ve aynı klasöre koyun. Daha sonra çok basit bir html dosyasını elimizle yazalım. İçeriğinde kurulum aşamalarını, programınız hakkında bilgiyi içerebilirsiniz. Örnek için dosyamız şu şekildedir:
Bu program dosyaları parçalamaya yarıyor. KodVeUs tarafından eğitim amaçlı yapılmıştır.
Ve kullanıcıların çalıştırma işlemini kolaylaştırmak için iki tane (linux için ve windows için) script yazıyoruz. İçerikleri oldukça basit:
Linux (calistir.sh):
#!/bin/bash/
java -jar DosyaParcalayici.jar

Windows(calistir.bat):
java -jar DosyaParcalayici.jar

Dil seçiminde kullanmak üzere de bir resmi aynı klasöre koyuyoruz. Aşamaları bitirdikten sonra aşağıdaki gibi bir klasörünüz olmalıdır:

Yukarıdaki klasor yapısından sonra aşağıdaki örnek IzPack derleyicisi için hazırladığımız xml dosyasını aynı klasorde yaratacağız:
<installation version="1.0">
<info>
<appname>Dosya Parçalayıcı</appname>
<appversion>0.1</appversion>
<authors>
<author name="Kod ve Us" email="kodveus@gmail.com" />
</authors>
<url>http://www.blogcu.com/kodveus</url>
<javaversion>1.5</javaversion>
</info>

<guiprefs height="600" resizable="yes" width="800">
<laf name="metouia">
<os family="unix" />
</laf>
<laf name="looks">
<os family="windows" />
<param name="variant" value="extwin" />
</laf>
</guiprefs>

<locale>
<!-- Hem ingilizce hem de Turkce calissin kurulum programi -->
<langpack iso3="tur"/>
<langpack iso3="eng"/>
</locale>

<resources>
<!-- HTML olarak bilgi panelinin icerigi (html dosyasi olmali)-->
<res src="oku.html" id="HTMLInfoPanel.info"/>
<!-- lisans panelinin icerigi (txt dosyasi olmali) -->
<res src="gpl.txt" id="LicencePanel.licence"/>
<!-- Dil ekranindaki resim -->
<res src="kvu.gif" id="installer.langsel.img"/>
</resources>

<panels>
<!-- Gosterilmesini istedigimiz paneller -->
<panel classname="HelloPanel"/>
<panel classname="HTMLInfoPanel"/>
<panel classname="LicencePanel"/>
<panel classname="PacksPanel"/>
<panel classname="TargetPanel"/>
<panel classname="InstallPanel"/>
<panel classname="SimpleFinishPanel"/>
</panels>

<packs>
<pack name="Core" required="yes">
<description>Dosya parçalayıcı için gereksinim duyulan çekirdek dosyalar.</description>
<fileset dir="" targetdir="$INSTALL_PATH">
<!-- Calistirilabilir dosyamizi ekliyoruz -->
<include name="DosyaParcalayici.jar" />
</fileset>
<!-- Linuxte calistirmayi saglayacak olan script -->
<file src="calistir.sh" os="unix" targetdir="$INSTALL_PATH/"/>
<!-- Windowsta calistirmayi saglayacak olan script -->
<file src="calistir.bat" os="windows" targetdir="$INSTALL_PATH/"/>
<!-- Kullanicilarin daha sonra da erismesi icin lisans ve oku dosyalarini ekliyoruz -->
<file src="oku.html" targetdir="$INSTALL_PATH/doc/"/>
<file src="gpl_tr.html" targetdir="$INSTALL_PATH/doc/"/>
<file src="gpl.txt" targetdir="$INSTALL_PATH/doc/"/>
<!-- Linuxte scriptin calismasi icin executable isaretini koyuyoruz -->
<executable targetfile="$INSTALL_PATH/calistir.sh" stage="never" />
</pack>
</packs>
</installation>


Daha sonra komut satırını açıp aşağıdaki komutları çalıştırıyoruz:

$ cd YarattigimizKlasor
$ IzPackKurulumKlasoru/bin/compile dp.xml

Bu komutu çalıştırdıktan sonra aynı klasorde dp.jar isimli bir dosya oluşacaktır. Bu dosyayı java -jar dp.jar ile çalıştırdığımızda kurulum aşamaları başlayacaktır.

Kurulum tamamlandıktan sonra seçilen konumda bizim dosyalarımızla birlikte bir Uninstaller klasoru oluşuyor. O klasorun içerisindeki uninstaller.jar dosyası (çift tıklayarak veya java -jar uninstaller.jar komutuyla) yardımıyla programımızın kaldırılması sağlanmaktadır.

Kaynaklar:
-IzPack kurulumuyla birlikte klasör altında oluşan belgeler (doc klasörü altında)
-IzPack tutorial
-IzPack sitesi

Linux fedora üzerinde Jade, Jigloo, Eclipse kurulumu ve konfigurasyonu

Yüksek lisans derslerimizin biri de etmen tabanlı yazılım geliştirmeydi ve geçen yıl u ders kapsamında Jade çerçevesini kullanarak bir proje geliştirmemiz gerekiyordu. Ben linux üzerinde geliştirmeyi tercih ettim, zor oldu biraz ama oldu.
İzlediğim yolu adım adım özetlersek:
--------zorunlu adımlar
j2sdk-1_4_2_06-linux-i586-rpm.bin'i indirdim.
eclipse-SDK-3.0M2-linux-gtk.zip'i indirdim.
JADE-bin-3.2.zip'i indirdim.
mySql server'i indirdim.
--------isteğe bağlı
jigloo301.zip'i indirdim.
terminalden j2sdk-1_4_2_06-linux-i586-rpm.bin dosyasini kaydettiğiniz yere gidin ve şu komutu çalıştırın : "./j2sdk-1_4_2_06-linux-i586-rpm.bin" . Lisans sözleşmesini kabul edin, kurulum /usr/java klasörüne yapılacaktır. Bu klasörün yolunu web tarayıcınızın java applet ayarlarında da kullanabilirsiniz.
Not : Önce Jade ile j2sdk1.5 i birlikte kurup çalıştırmayı denedim ama olmadı.
Eclipse dosyasını linux dosya sisteminizde bir yere açın (örn. /home/Eclipse).
JADE dosyasını linux dosya sisteminizde bir yere açın (örn. /home/jade). Etmen platformunu çalıştırırken kullanacağımız ve Base64,http,iiop,jade and JadeTools jar dosyalarını içeren lib klasörünü göreceksiniz.
------------
Jigloo, kullanıcı arayüzü (GUI) tasarlamak için kullanılan bir eclipse eklentisi. JADE in çalışması için zorunlu ve gerekli değildir.
Jigloo dosyasını açın. Plugins klasörü altındaki "com.cloudgarden.jigloo_3.0.1" klasörünü Eclipse'i kurduğunuz yerin altındaki plugins klasörüne (örn. /home/Eclipse/plugins) kopyalayın. Eclipse i yeniden başlattığınızda jigloo seçeneğini de göreceksiniz.
/******Etmenleri Eclipse te çalıştırma*******
Kurulan ortamı test edebilmek için JADE-examples-3.2.zip içerisinde gelen "bookTrading" örneğini kullandım.
1)Yeni bir proje yaratıp bookTrading klasörünü 3 java dosyası ile Eclipse'in "workspace" klasörüne kopyaladım
(/root/workspace/MyProject1/bookTrading).
2)Project->Properties->Java Build Path->Add External JARs seçeneğinden, Base64,http,iiop,jade ve JadeTools jar dosyalarını seçtim.
3)Projeyi Run->Run... . ile çalıştırdım. "Main" sekmesinde "Main class" bölümüne "jade.Boot" yazdım.Ve
"(x)=Arguments" sekmesinin "Program arguments" bölümüne "-gui" yazarak jade'in grafiksel arayüz ile başlamasını sağlamış oldum. Apply ve Run'a basıp çalıştırdım.
Şimdi etmen ortamı RMA arayüzü ve ana kapsayıcı(main container) ile düzgün çalışıyor olmalı.
4)Sonraki adım ServerOfBank etmenini Run->Run seçeneğinden çalıştırmak. "Main" sekmesindeki "Main class" bölümüne yazılı olan "jade.Boot" girdisini değiştirmeyin. "(x)=Arguments" sekmesindeki "Program arguments" bölümünü "-container BServer:beys.ServerOfBank" olarak değiştirin("BServer", bizim tarafımızdan belirlenen, etmenin ismi; "beys.ServerOfBank" ise etmen sınıfının yolunu belirtiyor). Apply ve Run'a basarak çalıştırın.
Bu bir satıcı etmen yaratacaktır ve bu etmen size kitap fiyat ve etiketini soracaktır. RMA içerisinde yeni bir kapsayıcı oluştuğunu göreceksiniz.
5) Son adım CustomerOfBank etmenini, "(x)=Arguments" sekmesine "-container BCustomer:beys.CustomerOfBank" girdisini yazarak çalıştırmak.
Yazan: Mehmet KIŞ - Ege Universitesi, Türkiye 29/02/2005

Ericsson bilgisayar dağıtıyor (Yalan!!! :)

Ev arkadaşlarımdan birine şu klasik "bunu 20 kişiye gönderin kazanın", " şans meleği için bunu en sevdiğiniz n kişiye gönderin" maillerinden geldi. Ben de mail için bir araştırma yaptım. Nisan 2000'den beri bu mail ve türevlerinin dolaştığı iddia ediliyor. İlginç olan aslı mutlaka başka bir dilde olan bu maili hangi akıllı Türkçe'ye çevirdi.

Gelelim bu tip maillerde ne tür önlemlerle hoax ("sahte", "hile") olduğunu anlayabilirsiniz. Aşağıdaki maili inceleyelim:

KONU: Tasinabilir bilgisayar ( Laptop)

Herkese selamlar ERICSSON firmasi bedava tasinabilir bilgisayar dagitmaktadir.
Bunu, ayni sekilde davranan NOKIA sirketine karsilik vermek icin yapmakta.
ERICSSON boylelikle ununu daha yayginlastirmak amacini gutmekte ve yeni, WAP modeli tasinabilir bilgisayarini parasiz olarak dagitmaktadir. Bunun icin yapmaniz gereken sey, bu e-mail i 8 arkadasiniza gondermektir. Bunu yaptiginizda iki hafta icinde , bir adet T18 modeli ERICSSON bilgisayar alacaksiniz. Mesaji 20 yada daha fazla kisiye gondermeniz halinde ise,
alacaginiz bilgisayar ERICSSON R320 modeli olacaktir.

ONEMLI : bu e-mailin bir kopyasini
anna.swelung@ericsson.com
adresine gondermeniz sarttir!

Yukarıdaki mail için ilk yapılması gereken bu anna.swelung@ericsson.com adresini google veya benzeri bir arama motorunda aratmak olmalıdır. Aratma sonucunda mutlaka ilgili siteler çıkacaktır. Mesela google araması sonucu çıkan ilk sitede bu maillerin sahte olduğu açıklanmış.

İkinci olarak verileceği söylenen ürün gerçekten var mı kontrol etmek lazım. Ben Ericsson'un T18 dizüstü bilgisayar ürettiğine inanmıyorum. Gene bir google araması ile, veya bahsedilen firmanın web sitesinden ürünleri inceleyerek sonuca ulaşabilirsiniz.

Özetle vahşi kapitalizmin insanların sırtından en küçük kuruşu bile sömürerek kazanmaya çalıştığı bir durumda bu şekilde basit sebeplerle bedava ürün vermeyeceği gerçeğini unutmamak lazım. Unutulmamalı ki, bu tip mailler genellikle gereksiz mail trafiği yaratmak, mail adreslerini toplamak vb. nedenlerle yapılmaktadır. Unutmayın ki bu mail bir şekilde ilk gönderene geri dönecektir.

Java'da İş Parçacığı (Thread) Senkronizasyonu

Bu örnek uygulama üretici ve tüketici problemine Java kullanarak bir çözüm üretmeye çalışacağız. Projede üç adet üretici (SugarProducer, OilProducer ve FlourProducer), iki adet tüketici (HalvahShop, HotFlakyPasteShop) iş parçacığı bulunmaktadır.
Silolar (üretilen ürünlerin deposu) için bir adet sınıf yeterli olmuştur. Bu sınıf yaratıldığı zaman içinde ne barındırdığına dair bilgiyle yaratılmaktadır. Böylece her silo için ayrı sınıf yazma maliyeti kalkmıştır. Programda senkronizasyon Silo içerisindeki get ve put metodlarında sağlanmaktadır. get metodu üreticilerin ürettikleri ürünü silo'lara eklemek için kullandıkları metottur.
Aşağıdaki kod örneği incelendiği zaman get metodunun synchronized anahtar kelimesiyle aynı anda sadece 1 iş parçacığının erişebileceği kritik alan olarak işaretlendiği görülecektir. Metodun içerisine giren iş parçacığı silo dolu değilse (her silo azami 20 birim almaktadır) siloya ürettiği ürünü yerleştirmektedir. Eğer silo dolu ise iş parçacığı bekleme konumuna alınmaktadır. Ürün yerleştirme işleminden sonra iş parçacığı beklemede olan (syncronized anahtar kelimesi nedeniyle) diğer iş parçacıklarını notify metodu ile uyandırmaktadır.
public synchronized void put() {
while( unit==20 ){
try {
wait();
} catch (Exception e) {
}
}
unit++;
System.out.println(Thread.currentThread().getName()+" putting "+this.what);
notify();
}
Aşağıdaki kod örneği incelendiği zaman set metodunun synchronized anahtar kelimesiyle aynı anda sadece 1 iş parçacığının erişebileceği kritik alan olarak işaretlendiği görülecektir. Metodun içerisine giren iş parçacığı silo boş değilse silodan ürünü alacaktır. Eğer silo boş ise iş parçacığı bekleme konumuna alınmaktadır. Ürün alma işleminden sonra iş parçacığı beklemede olan (syncronized anahtar kelimesi nedeniyle) diğer iş parçacıklarını notify metodu ile uyandırmaktadır.
public synchronized void get() {
// Eger elimizde yoksa bekletecegiz
while( unit==0 ){
try {
wait();
} catch (Exception e) {
}
}
unit--;
System.out.println(Thread.currentThread().getName()+" getting "+this.what);
notify();
}
Üreticiler basit birer iş parçacığı olarak gerçekleştirilmiştir. Sonsuz bir döngü içerisinde rastgele üretilen bir bekleme zamanından sonra ilgili siloya (mesela Un üreticisi (FlourProducer) un silosuna) birim eklemektedir. Her üretici ilgili silosunu yapıcı metod içerisinde almaktadır. Aşağıdaki sınıf FlourProducer sınıfı olup, diğer üreticilerin tek farklılığı yapıcı içerisindeki iş parçacığını adlandırma kısmıdır (mesela super("Oil Producer"); gibi).
package net.tekrei.ds.producer;
import net.tekrei.ds.silo.Silo;
public class FlourProducer extends Thread {
Silo silo;
public FlourProducer(Silo silo) {
super("Flour Producer");
this.silo = silo;
}
public void run() {
while (true) {
try {
sleep((int) (Math.random() * 100));
} catch (InterruptedException e) {
}
silo.put();
}
}
}
Helva dükkanı yapıcısında kullandığı siloları (yağ silosu, un silosu ve şeker silosu) alan bir iş parçacığı şeklinde gerçekleştirilmiştir. Sonsuz bir döngü içerisinde rastgele üretilmiş beklemeden sonra helva yapmak için gereken birimler sırasıyla ilgili silolardan çekilmektedir. Aşağıda bu ilgili silolardan birim çekme kod parçacığı incelenebilir.
//2 birim oil
oilSilo.get();
oilSilo.get();
//1 birim flour
flourSilo.get();
//3 birim sugar
sugarSilo.get();
sugarSilo.get();
sugarSilo.get();
Poğaça dükkanı yapıcısında kullandığı siloları (yağ silosu, un silosu) alan bir iş parçacığı şeklinde gerçekleştirilmiştir. Sonsuz bir döngü içerisinde rastgele üretilmiş beklemeden sonra poğaça yapmak için gereken birimler sırasıyla ilgili silolardan çekilmektedir. Aşağıda bu ilgili silolardan çekme kod parçacığı incelenebilir.
//1 birim oil
oilSilo.get();
//1 birim flour
flourSilo.get();

Ana sınıf içerisinde ortam hazırlanarak bu üretici ve tüketicilerin birbirleriyle çalışması incelenebilmektedir. İlk olarak kullanılacak olan silolar oluşturulmaktadır.
Silo sugarSilo = new Silo("Sugar");
Silo oilSilo = new Silo("Oil");
Silo flourSilo = new Silo("Flour");
Daha sonra ilk önce üreticiler yaratılarak başlatılmaktadır. Her üreticiye dolduracağı silo aktarılmaktadır.
new SugarProducer(sugarSilo).start();
new OilProducer(oilSilo).start();
new FlourProducer(flourSilo).start();
Poğaça dükkanı ve helva dükkanı da silolar verilerek başlatılmaktadır. Ödevde istendiği gibi helva dükkanı bir süre sonra (1 saniye sonra) başlatılmaktadır.
new HotFlakyPastyShop(oilSilo,flourSilo).start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
new HalvahShop(oilSilo,flourSilo,sugarSilo).start();
En son olarak bu üretici ve tüketicilerin davranışlarını inceleyebilmek için sonsuz bir döngü içerisinde o anki silo durumlarını ekrana basan komut çalıştırılmaktadır.
while(true){
System.out.println(oilSilo.toString()+" "+flourSilo.toString()
+" "+sugarSilo.toString());
}
Ve programın ekrana yazdığı mesajlardan çalışma gözlenebilmektedir.

Oil:0 Flour:6 Sugar:18
Oil Producer putting Oil
Hot Flaky Pasty getting Oil
Hot Flaky Pasty getting Flour
Oil:0 Flour:5 Sugar:18
İnceleme yapıldığı zaman poğaça dükkanının önceden başlatılması bir süre sonra yağ sıkıntısını başlatmaktadır. Böylece yağ 0'a inerek üretiminin yavaşlamasına sebep olmaktadır.
Bu yazıda basit bir şekilde Monitor kullanarak senkronizasyonu açıklamaya çalıştım, umarım faydalı olmuştur.
Kaynak Kodlar (Eclipse projesi şeklinde)

Türkiyede özgür yazılım geliştiren firmalar ?

Türkiyede, özgür yazılım geliştiren ve bunu GPL/BSD v.b. lisanslar ile dağıtıp, yaşamına devam edebilmek için teknik destek, ek özellik gibi hizmetlerle geçimini sağlayan firmalar varmı? Yoksa neden yok? Para mı getirmez, iş mi yapmaz? Özgür yazılım kullanmak isteyen büyük şirketlerin en büyük engeli/tatminsizliği yeterli ve garantili destek alamama. Güvenilir bir şirket kurularak bu aşılamaz mı?

Peki bunun yurtdışı örnekleri nelerdir, en azından onları inceleyip kendimizi sorgulayabiliriz. Bilen varmı?


Türkiye için biraz arama yaptım ama henüz hiç birşey bulamadım. Bulursam bu yazıya ekleyeceğim. Bulamazsam yurtdışı örneklerine bakarız.

ISO dosyayı bağlama ("iso mount")

Linux kullanıyorsanız ve indirdiğiniz bir ISO dosyasını cd'ye yazmadan incelemek istiyorsanız bunun iki yolu vardır. Biri daha sık kullandığım ve daha kolay olan "Archive Manager" (Gnome File Roller) kullanarak dosyayı açma işlemidir. Diğer yöntem ISO dosyasını bağlama (basiretini bağlamak değil, ingilizce "Mount" etmek) işlemidir. Ben burada bu ISO bağlama işleminin komutunu vereceğim. Geçen hafta böyle bir komuta ihtiyacım olmuştu ancak karşılaştım. Unutmayın bazı dosyaların arşiv yönetici ile açılması işe yaramaz bu durumlarda ISO dosyasını bağlayarak normal bir CD'ymiş gibi çalıştırmalısınız. Gelelim komuta:

mount -t iso9660 isodosyasi.iso /media/iso -o loop

isodosyasi.iso dosyasini /media/iso dizini şeklinde bağlıyoruz. Siz dilediğiniz yere bağlayabilirsiniz. Komut bu kadar kolay.

Wikitravel

Gezi meraklılarına http://www.wikitravel.org/ sitesini tavsiye ederim. Sitedeki ifadeye göre tam, güncel ve güvenilir bir gezi rehberi kendileri. İnsanın aklına (mesela benim) Otostopçunun galaksi rehberi geliyor.

Not: Sanırım Türkçe desteği yok, aslında sanmaktan öte öyle bir destek göremedim. Belki de gönüllüler bu işe bir el atıp Türkçe desteği ekleyebilirler. Benim gönüllü olmam için öncelikle vakit bulmam gerekiyor :)

Sığacık - Teos çadır kampı

Sezonun son yüzme ve çadır eylemini bu haftasonu Seferihisar ilçesinin Sığacık beldesinde gerçekleştirdik ;). Hava durumu pek iç açıcı olmasa da, http://www.weather.com/ sitesi yine tam olarak yağmur, çamur oranını tutturdu.

Cumartesi günü sabahtan yola çıkamasak da, saat 13.30 gibi otogardaydık. Önce bayramda gitmek istediğim için Antakya biletlerini ayarlamaya çalıştık ama dört firmada da hiç yer yoktu. Sonra Seferihisar arabası bulmak için aranmaya başladık ki, Seferihisar'a otogardan araç kalkmadığını öğrendik. İşler yolunda gidemedi bir türlü.

Seferihisar'a gitmek istediğimizi duyan uyanık Gümüldür minibüslerinden biri(ki daha önce de benzer uyanıklığa sahip birtanesi bizi çileden çıkarmıştı, ama ders olmamış demek ki) ben sizi SeferiHisar arabasına bindiririm dedi ve 14 de İzmir otogarından Sığacığa gitmek üzere yola koyulduk. Aslında Gümüldür üzerinden gitmek yanlış oluyordu haritadan hatırladığım kadarıyla ama; yolu tam olarak bilmediğimiz, Üçkuyulara gitmek zor geldiği için ve Gümüldürdeki Denizatı kamp alanının açık olma ihtimali nedeniyle bindik bu minibüse. Yolu neredeyse iki kat uzatmıştık. Neyseki İzmirden, evimizden çok uzaklaşmamıştık.

Araçtaki yazlıkçı bir çift sayesinde en sonunda Seferihihar araçlarının olduğu, Ürkmez deki minibüs durağını da bulduk. Burada Cem Yılmaz benzeri, Karadenizli bir şöfor bizi karşıladı. Gerçekten iyi ve komik biriydi :). Seferihisar'a 24 km vardı daha.

Biz indik ve bu sefer de Sığacık'a araç beklemeye başladık. Araç bekleme ve minibüler çok acı çektirdi bize. Sonunda Teos orman kampı tabelasını gördük, ama o kadar. Son minibüste bizi gitmek istediğimiz yere uzak bir yerde bıraktı, 2 km kadar. İndiğimiz yerde pek de sevimli olmayan bir adam ve aynı sevimsizlikte bir çoçuğun işlettiği bir yemek yeri vardı. Biz şurayı arıyoruz, çadır kurulacak yer varmış burda dedik; adam istediğiniz yere kurun dedi. Dağ başında bir biz, bir onlar var. Görünürde deniz yok, biz çadır kuracakmışız. Yok birader biz sahibini, Özkan'ı aradık başka bir yer varmış burda deyince, o zaman daha yürüyeceksiniz siz dedi neyseki.

Yürü yürü, gelmez kamp alanı, Katrancı'yı anımsattı bize. En sonunda geldik. Bizden başka bir çadır daha vardı,ü o da numune olan :). Çadırımızı kurduk ve hooop denize. Sığacık'ta öyle hamam suyu gibi deniz olmaz diyordu yazılardan birtanesi; inanılmaz soğuktu su gerçekten. Yinede girdik, o kadar minibüs çilesi çekmişiz üstüne 2 km yol yürümüşüz, denize girmeyecek miydik?

Hava hemen karardı tabi, geç kalmıştık çünkü. Işık yok, Balıklıova'da da benzer birkaç saat geçirmiştim, karanlıkta da oltanın iğnesini elime saplamamayı öğrenmiştim orda :). Yaşayıp tecrübe kazanmak iyi oluyor gerçekten. Sığacık'ın havası daha sıcaktı ama. Üşümeden, sadece biraz korkarak uyuduk.


Sabah gerçekten mükemmeldi. Biraz yağmur çiselemiş, toprak nemli. Serin ve temiz bir hava. Güneş birkaç dakika saklanıp yine gösteriyordu kendini. Denizin dibi görünüyor, rüzgar karadan estiği için dalga oluşmuyordu. Kahvaltı ettik ve yine hooop denize. Su yine soğuk, olsun.


Bu koy gerçekten çok güzel ve temizmiş. Ama hafiften bir kirlilik başlamış, o da resmen bindiği dalı kesen işletmecinin, tuvalet çıkışını denize vermesinden kaynaklanıyor. Umarım bunu düzeltirler.

Eşyaları toplamak gerek. Bir buçuk saat alacak bir işti bu. Ona göre planlama yaptık, kahveler içildi(termosumuz 24 saat sıcak tutabiliyormuş suyu), atıştırdık ve tabiki yine denize. Çadırın ve eşyeların toplanması ile saat 16.30 olmuştu. Önümüzde 2 km lik yürünecek yol ve saatlerce beklenebilecek minibüler vardı. Ama birşeyler güzel gitmeye başladı ve biraz yürümüştük ki, yolda bizi kamyonetine alan Ege 74 yılı Mimarlık mezunu adam sayesinde Seferihisar garajina kadar gidebildik(tekrar teşekkürler). Burada da minibüsü hiç beklemedik :) ve tüm dönüş trafiğine rağmen 18. 30 da İzmir deydik. Evim evim güzel evim.


GNU/Linux için flash player 9 (32 bit BETA)

Sonunda sabırla beklenen GNU/Linux için flash oynatıcının son sürümünün betası çıktı. (En azından ben bekliyordum, flash 7'de çalışmayan bir sürü site oluyor :) )

Kurmak için buradan ilgili dosyayı indirip içerisindeki libflashplayer.so dosyasını firefox'unuzun plugin klasörüne kopyalamanız yetmektedir.

* Eklenti (plugin)
o Normal kullanıcı olarak kurmak için:
+ libflashplayer.so dosyasını plugins dizinine kopyalıyoruz/taşıyoruz. (Genellikle ~/.mozilla/plugins şeklindedir)
+ plugins dizini yoksa yaratıyoruz.
o root olarak kurmak için:
+ libflashplayer.so dosyasını sistemde tarayıcının kurulu olduğu yerdeki plugins klasörüne kopyalıyoruz/taşıyoruz (/usr/lib//plugins şeklinde oluyor genellikle, eğer bulamazsanız locate libflashplayer.so yazıp öncekini bularak üstüne yazabilirsiniz).
+ plugins dizini yoksa yaratıyoruz.
Kaynak: http://labs.adobe.com/technologies/flashplayer9/

Basit bir soket hesap makinesi

Dağıtık sistemler dersinde ilk ödev olarak basit bir hesap makinesi yapmamız istendi. Özelliği soketler üzerinden haberleşen sunucu ve istemciye sahip olmasıydı. Bu işin yapılmasında en çok karşılaşılan bir problemle arkadaşım Cumhur da karşılaşınca acaba o problemi nasıl çözüyorduk, threadlerle nasıl yapıyorduk sorularına cevaplar bulmak için projeyi genişletmeye karar verdim.

Proje çok basit 4 işlem yapıyor. Sadece iki sayı alıyor. İki farklı uygulama (JFrame) içeriyor. Biri CalcServerFrame.java adındaki sunucumuz, diğeri de CalcClientFrame.java adındaki istemcimiz. İstemci kolay anlaşılır bir yapıda. Kullanıcı hesapla düğmesine bastığı zaman kullanıcının verdiği sunucu adresine verilen porttan bağlanıp Islem sınıfı gönderiyor. Karmaşıklık sunucu tarafında. Sunucuda iki düğme var. Çalıştır düğmesi sunucu threadini yaratarak threadi başlatıyor. Buradaki ince nokta threadin çalışmaya devam ederken bizim arayüzde herhangi bir problem olmaması. Bunu Thread'ten ürettiğimiz ServerThread sınıfı içerisine run metodunu gerçekleştirip, threadi çalıştırmak için start() metodunu çağırarak yapıyoruz.
Bağlan düğmesini eylemi gerçekleştiren kısmı:
btnBaglan.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
// Sunucu olarak calisacak olan is parcacigini
// yaratip baslatalim
st = new ServerThread();
// FIX start dedigimiz zaman swingteki dugmenin
// takilma problemi olmuyor
st.start();
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, "Bir hata oluştu:"
+ ex.getMessage());
}
}
ServerThread sınıfımız:
class ServerThread extends Thread {

private ServerSocket ss;

private boolean acik = true;

/**
* Baslat dugmesine basilinca calisacak olan baslangic metodu
*/
public void run() {
try {
System.out.println("Sunucu başlatılıyor!");
// Sunucunun dinleme yapacagi soketi yaratiyoruz
ss = new ServerSocket(Integer.parseInt(txtPort.getText()));
// Bu sunucu surekli olarak calisacak
acik = true;

while (acik) {
try {
// Istemciden talep gelmesini bekliyoruz
Socket socket = ss.accept();
// Istemci talebi geldigi zaman istemciden Islem
// nesnesini okuyoruz
ObjectInputStream in = new ObjectInputStream(socket
.getInputStream());
// Ve bu islem nesnesi uzerinde islemi
// gerceklestiriyoruz
Islem islem = isle((Islem) in.readObject());
// Ekranan bize bir istemci talebi geldigini adresiyle
// yaziyoruz
System.out.println("Bağlantı geldi:"
+ socket.getInetAddress().getHostName());
// Daha sonra islem sonucunu aktarmak icin islem
// nesnesini
ObjectOutputStream out = new ObjectOutputStream(socket
.getOutputStream());
// istemciye geri donduruyoruz
out.writeObject(islem);
} catch (Exception e) {
// Hata olusmasi durumunda ekrana yaziyoruz
System.out.println(e.getMessage());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

public void stopServer() {
try {
// Sunucunun dinleme yaptigi soketi kapatalim
ss.close();
// dinleme dongusunden cikmamiz gerekli
acik = false;
// thread durdurulsun
this.interrupt();
System.out.println("Sunucu kapatıldı!");
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* Bu metodun amaci aldigi Islem nesnesinin talep ettigi matematiksel
* islemi gerceklestirip sonucu Islem nesnesine yazarak Islem nesnesini
* geri dondurmektedir.
*
* @param islem
* @return
*/
private Islem isle(Islem islem) {
// Islem toplama
if (islem.getIslem().equals(Islem.TOPLA)) {
islem.setSonuc(islem.getSayi1() + islem.getSayi2());
}
// Islem carpma
if (islem.getIslem().equals(Islem.CARP)) {
islem.setSonuc(islem.getSayi1() * islem.getSayi2());
}
// Islem cikarma
if (islem.getIslem().equals(Islem.CIKAR)) {
islem.setSonuc(islem.getSayi1() - islem.getSayi2());
}
// Islem bolme
if (islem.getIslem().equals(Islem.BOL)) {
islem.setSonuc((float) islem.getSayi1()
/ (float) islem.getSayi2());
}
return islem;
}
}

Daha ayrıntılı olarak kodu incelemek ve nasıl çalıştığını görmek için şu eclipse projesini indirebilirsiniz. Sunucuyu (CalcServerFrame.java) önce çalıştırmanız gerekiyor. Daha sonra herhangi bir makineden sunucuya istemciden (CalcClientFrame.java) bağlanabilirsiniz.