Güncel yazılar
7th Mar 2010 | Sınıfı: Okul 0

Bu dönem içeriğinin yarısında Java’da çizim, threading vs. konuları göreceğimiz Yazılım Mühendisliği dersinin ilk projesinde Java ile Türk Bayrağı çizdik. Bunun için Java’nın Graphics2D kütüphanelerini kullandım. Projeye başlamadan önce acaba bu işi kod ile yapan var mıdır diye düşünüp arasam da pek bir sonuca ulaşamadım. Ben de oturdum Türk Bayrağı’nın ölçünlerini analiz ederek Analitik Geometri bilgileriyle her bir öğenin (ay, yıldız) koordinatlarını hesapladım.

Bayrağın koordinatları G ile ifade edilen genişlik miktarına orantılı olarak hesaplanıyor. Ancak dikkat etmek gerekiyor ki bu genişlik dikey eksende belirlendiği için bazı durumlarda ekran onu yükseklik olarak kabul edebiliyor. Hilal şeklinde ay yapabilmek için iç içe geçmiş iki daire yapmak gerekti.

Beyaz Büyük dairenin merkezi (G/2, G/2), yarı çapı G/4
Kırmızı Küçük dairenin merkezi (0.5625*G, G/2), yarı çapı G/5

Sıra geldi yıldız yapmaya. Burası oldukça zorladı. Verilen özelliklere bakılırsa bir daire çizip bunu 72 derecelik beş parçaya ayırmak gerekiyordu. Sonra her bir noktayı kendisine uzak olan 2 diğer nokta ile birleştirip şekli doldurunca yıldız oluşuyor. Bunun için polar koordinat sisteminden kartezyen koordinat sistemine dönüşüm yapmam gerekti. Açıların sinüs ve kosinüs hesaplarını yaparak yıldızın noktalarının koordinatlarını hesapladım.

Eğer yıldızı çevreleyen dikdörtgen (0,0) noktasında başlamış olsaydı (yani sol üst köşeden başlayacak şekilde sadece yıldız çiziyor olsaydık), yıldızın sivri uçlarının koordinatları şöyle olacaktı (yarıçap r = G/8)

(0 , r); (1.80901*r, 0.4123*r); (0.691*r, 1.951*r); (0.691*r, 0.049*r); (1.80901*r, 1.5877*r); (0, r)

İlk ve son koordinat aynı, çizim yaparken bu sırada yaparsanız ve doldur derseniz elinize dolu bir yıldız çıkıyor.

Ancak bu verdiğim yerel koordinatlara bir de yıldızı çevreleyen dikdörtgenin konumunu eklemek gerekiyordu. Böylelikle yıldızı hilalin hemen sağına getirebilirdim. Bunun için yukarıda hesapladığım her bir koordinatın x bileşenine (0.35 + 1/3.0)*G, y bileşenine 3*G/8 eklemem gerekti. Bunları ekledikten sonra elimde gerçek ölçünlere uygun bir Türk bayrağı vardı. Ancak bayrağın en solunda bulunan beyaz kısmı dahil etmedim. Öyle bir şey olsa yukarıdaki tüm koordinatlara belli bir x değeri eklememiz gerekirdi.

Yazdığım kodları buradan indirebilirsiniz. Bir de şunu fark ettim, hemen hiçkimse bunca zamandır yıldızın eğik durduğunu fark etmemiş. :) Genişliği ortadan ikiye bölen çizgiyi hayal edin. O çizgi, yıldızın en soldaki sol açısının açıortayı durumunda.

18th Şub 2010 | Sınıfı: Okul 2

İlk Java dersinde -içeriği ne kadar basit olursa olsun- doğrudan bir Sınıf yazıp, ondan bir nesne üretip örnek çözmek çok da akıllıca bir fikir değilmiş. İkinci derste bunun farkına varıp C’de kod yazar gibi, bir static main metodunun içerisine yazdım tüm kodları. Basit toplama örnekleri, dizide arama örnekleri yaptım. Bu sefer de sıkıldılar. Çok benzer geldi. Çok farklılık göremediler.

Üçüncü derste ise Nesne Yönelimli Programlama kavramına tekrar giriş yaptım. Bu sefer kafamda kurduğum birçok benzetmeyi de kullandığım için çok iyi anladılar. En azından öyle gördüm :) . Dersten sonra da anlattıklarımı hazırladığım Google Docs belgesine ekledim. Hatta daha da güzelleştirerek, hikaye biçiminde anlatarak. Hikayemizin baş kahramanı Emre, yeni icat edilen bir Radyo’dan kendisine almakta, fazla kurcalayıp bozmakta, gerekli güvenlik önlemlerini (private vs.) almayan firma bu sebeple güvenlik açıklarını kapatıp yeni ürünü Emre’ye teslim etmekte. Umarım faydalı bir yazı olmuştur. Prosedürel C/C++ programlamayla uğraşmış olanlar için Java’ya ve Object Oriented kavramına güzel bir başlangıç noktası olabilir.

Buradan aşağısı konuyla alakasız, ilginç olaylar dizisi:

Üçüncü dersimizden önce 45 dakika kadar (bitişiğinde okulun jenaratörleri olduğu için UPS odası olarak da anılan) asistan odasındaydım. O sırada Amerikalı olduğunu sandığım, benim yaşlarda birisi geldi ve dedi ki: “UPS, tüm ülkelere diğer firmalar kadar hızlı gönderiyor mu?”. Afalladım. İlk başta acaba bir Türk geldi de dalga mı geçiyor diye düşündüm. “Bilmiyorum” dedim. “E, o zaman burada işin ne?” dedi, beni UPS kargo memuru sanarak. Dedim “burası benim odam değil, arkadaşımın. Hem burası kargo firması UPS’in ofisi değil, jenaratör odası.”. “Haaa, siz ona UPS mi diyorsunuuuuz?” dedi. Yuh diyecektim. UPS zaten İngilizce. Demek ki kargo firması UPS o kadar popüler ki UPS kelimesinin anlamını unutmuşlar.

Java dersinin ardından da akşam Veri Madenciliği ve Veri Ambarlama dersi vardı. Sınıfa girerken hoca “sizi bir yerden tanıyorum ben” dedi. Şaşırdım, ben hocayı tanımıyordum. Dedim “belki Işık’tan tanıyorsunuzdur”. “Evet, evet öyleydi” dedi. Tenefüsten sonra da buldu. 2008 sonbaharında Linux seminerlerini vermek için IT 101 derslerine girmiştim. O derslerden birisini de bu hocamız veriyormuş. Ben sunum yaparken izlemiş. Öyle deyince hatırladım. Hatta hatırlarken hatırlama mekanizmasıyla ilgili ilginç bir şey de hissettim. Burası birçok kişiye saçma veya sıradan gelebilir. Linux semineri demesiyle birlikte aklıma hemen seminerde gördüğüm yüz, ardından da hocanın ismi geldi: “haaa Songül Hanııım… E bu da Songül Hoca. E tabii ya…”. Çok tuhaf gelecek belki ancak şunları hissettim: beyindeki sinir ağının farklı noktalarında bulunan ve ancak aynı içeriğe sahip iki bilginin ard arda düşünülmesi sırasında yapılan sıçrama ve bu iki bilginin eşleşmesi. Sıçramanın da sanki bir Graph, hatta daha ziyade Tree üzerinde gezerek yapılması. Yani bilginin eski ve kısa bir süre içerisinde edinilmiş olması sebebiyle küçük bir yer kaplaması, bu sebeple yapraklara kadar gittikten sonra tekrar köke geri dönüp oradan diğer dallara yönelerek diğer eş bilginin bulunması. Diğer en güncel ve çok yer kaplayan bilgiye ulaşırken ise bu Tree üzerinde gezinme olayının hiç vakit almaması. Tüm bunlar yapılırken ilk bilginin unutulmaması, bir ön bellekte saklanması. Beni anlayabilen var mııı? :) Neyse, boşverin. Bu aralar beynin çalışma mekanizmasıyla fazlaca düşünüyorum galiba :D

Öte yandan projemiz için geliştirdiğimiz RobinViz adlı yazılımın beta sürümünü yayınladık. Umarım sorunsuz bir kararlı sürüme ulaşırız en yakın zamanda.

12th Şub 2010 | Sınıfı: BT, Okul 2

Java slaytları
C/C++ Programcıları için Java’ya Giriş

Geçen çarşamba günü üniversitede ilk dersimi verdim. Data Structures and Algorithms dersini verecek olan Cesim hocam ilk 2 hafta öğrencilere Java anlatmam için rica etti ve ben de memnuniyetle kabul ettim. Seminer vermeyeli uzun zaman olmuştu zaten :) Olley sonunda bir şeyler öğretebileceğim diye içten içe sevindim, her ne kadar Java’yı anlatmak zor olsa da.

Ders vakti geldiğinde önce öğrencilere Netbeans kurdurmaya çalıştım. Çoğu kişi internetten indirmekte sorun yaşadı. Ya bağlantı problemi ya da BİM engellemesi sebebiyle. Biz de USB Flash disk ile dağıttık. Millet kurmaya çalışırken baktım ki çok zaman geçiyor, hazırladığım sunum ile başladım anlatmaya. System.out.println’da sorun çıkmadı ancak Scanner sınıfını anlatmaya kalkınca Object Oriented’ın korkunçluğuyla yüzleştiler. Birkaç örnek yaptıysam da kendilerine çok yabancı gelen bu kavram kafalarını karıştırdı. Öyle olunca ben de madem öyle deyip doğrudan Object Oriented mantığını anlatmaya çalıştım. Class yapısını gösterdim, Python’da yaptığım gibi Insan sınıfı tanımladım ve bu sebeple o kısmı her zamanki gibi baya eğlenceli geçti diyebilirim ;)

Ders böylelikle bitti. Dersin sonuna doğru öğrencilerin geçen sene gördükleri C++’ı unuttuklarını fark etmem sebebiyle (Işık’ta 2. 3. ve 4. dönem üst üste programlama dersi olduğu için böyle olmuyordu sanki) çok da verimli olmadı gibi. Artık takviye birkaç belge hazırlayıp çalışmalarını bekleyeceğim, tabii bir de gelecek haftaki dersler var. Sanırım statik metodlar kullanarak nesne oluşturmadan gitmeyi deneyeceğim bu sefer. Bir öğrenciden de çok güzel bir geribildirim aldım, moral oldu :)

27th Oca 2010 | Sınıfı: BT 1

(P.S.: Download links are provided at the bottom)

Bugünlerde kabul edilen makalemiz için yazdığımız yazılımın arayüzünü yeni baştan yazmakla uğraşıyorum. Önceki arayüz LEDA kütüphanesinin eski görünümlü bir penceresi yerine PyQt4 ile geniş, birçok aracı bulunan bir arayüz yapmak amacım. Şu anda birçok özelliği çalışıyor. Sırada arayüz ile arkaplanda çalışan programın parametrelerini verebilmekte.

Getirmeyi planladığımız yeni bir araç ise Heatmap (ısı haritası). Baktım ki bunu değil PyQt4, Qt4 ile bile yapan yok, oturdum yazdım. Kendi yazdığım ilk QWidget oldu ve oldukça hoşuma gitti bu görselleştirme işleri. Örnek bir ekran görüntüsü (programda sağ tıklayıp resim olarak kaydet de diyebiliyorsunuz):

Normalde çok daha uzun ancak bu görüntü sadece bir kesit. Veriler bir Microarray bicluster’ından. Satırlar gen isimlerini, sütunlar ise koşulları gösteriyor. Böylelikle hangi koşulda hangi gen nasıl tepki vermiş onu görebiliyorsunuz. Burada açık yeşiller en küçük değerleri, açık kırmızılar en büyük değerleri, siyah renk tam ortayı (median), koyu renkler de ortaya yakın olanları temsil ediyor. Yaptığım şey tüm değerleri sıralı bir küme haline getirip ortadakine siyah renk, küçüklere yeşilin [255, 1] aralığında tonlarını, büyüklere de kırmızının [1,255] arasında tonlarını verdim. Bu tamamen kafamdan uydurduğum bir algoritma / yöntem. Başka renk ve algoritmalar da var ancak açık olarak belirtildiği yerleri bulamadım henüz.

Bu görüntüyü oluşturan girdi ise şöyle:

satır sayısı kolon sayısı

heatmap kolon 1 kolon 2 kolon 3 kolon 4
satır 1 değer 1 değer 2 değer 3 değer 4
satır 2 değer 1 değer 2 değer 3 değer 4

rowNum colNum
heatmap column1 column2 column3 column4 …
row1 value1 value2 value3 value4 …
row2 value1 value2 value3 value4 …

Henüz kod tamamlanmadı ancak şimdilik ulaşmak isteyen olursa diye kodu ve örnek bir girdiyi siteme koyuyorum: Heatmap Source File and Input.

Tamamlanınca da GPL lisansıyla bir proje sayfasında yayınlayacağım.

18th Oca 2010 | Sınıfı: Hayat 2

Biraz önce televizyonda ünlü grafolog Zeynep Bornovalı bir programa konuk oldu. Ailem şans eseri programa rastlamış ve ilgilenebileceğimi söyleyerek bana haber vermişler. Gidip baktığımda Zeynep Hanım’ın canlı yayında el yazısını okuyarak karakter ve sağlık tahlili yaptığını gördüm. Internet’ten de el yazılarını kabul ediyorlardı. Hemen Üniversite 1. sınıf Discrete Mathematics defterimden bir sayfayı taratıp bir rumuz ile (isimsiz olarak) gönderdim. Şanslıymışım ki ilk gönderenlerden birisi oldum ve sıra bana geldi. Ancak kareli kağıt olması ve İngilizce yazmış olmam sebebiyle az daha es geçiliyordu. Ama okundu. Şimdi gelelim sonuçlara (özetle):

Başarılı, akıllı, dikkatli, çalışkan, arkadaşlığa önem veren, enerjik birisi. Eğer Akademisyen olursa çok başarılı olur, veya bilemiyorum belki de bu yolda ilerliyordur, devam etmesini tavsiye ediyorum. Öyle satış / ticaret / üst düzey yöneticilik gibi işlerde çok daha iyi paralar kazansa bile mutlu olamaz. Bilimsel işlerle uğraşmak onu çok daha mutlu eder. Dikkatliden kastım da muhasebeci dikkati değil (sanırım detaycılığı kastediyor). İnsanlarla çok iyi geçinir ancak ilişkileri geliştirme uğruna çok bir şey yapmaz. Politika gibi işlere şimdi değil ancak kendisini aranan kişi konumuna getirdikten sonra girişmelidir. Tarafsızdır. Sevimli bir karaktere sahiptir.

Ben bu notları alırken baya bir etkilendim: “Nasıl olur ya? Nasıl bilebilir bu kadarını da?” Burada bahsettiği her şey doğru diyebilirim. Belki bir gün özel test yaptırır daha iyi bir analiz elde ederim ancak şu haliyle “Ben ancak Akademisyen olarak, insanlığa faydalı şeyler üreterek mutlu olabilirim” düşüncemi bir hayli gaza getirdi.

Tüm bu dediklerini doğrulamak amacıyla tekrar bir e-posta gönderdim ve dediklerinin doğru olduğunu belirttim. Ancak sağlık analizi yapmadığını söyledim. Dediklerimden o kadar mest oldu ki sağlık analizini unuttu :( Neyse, bir başka teste. Zaten çok daha güncel bir yazı kullanmak faydalı olacaktır. Aslında gönderdiğim yazının bilimsel ders notu olmasından dolayı akademisyenlik tahminini yaptığını da düşünmedim değil :)