Buruk bir bayram daha...

Yine bir Bayram geldi ve ülkenin Bayram öncesi hali hiç iç açıcı değil. Dün memurlar iş bırakma eylemi yaptılar, bir gün önce de öğretmenler günü oldukça sönük geçti. Daha da genele; ülkedeki insanların suratlarına baktığınızda bayram sevinci yerine kaygı ve endişe görüyorsunuz. Kurban fiyatlarındaki değişim haberlerinden daha çok kimlerin kurban alabilecek güçte olmasının daha önemli olması gerekirken bu durum da göz ardı ediliyor. Bu ülkenin insanları daha refah içinde, geleceğe daha umutla bakarak karşılayacakları bayramları hak ediyorlar. Ama bu bayram bunlardan biri değil.

Herkesin kardeşçe, sağlıklı, mutlu bir bayram geçirmesi dileğiyle...

En iyi açık kaynak raporlama araçları

Yazılım geliştirirken gereksinim duyulan şeylerden biri raporlamadır. Kullanıcılar mutlaka rapor isterler. Bu raporları hızlıca kullandığınız programlama dili bileşenleriyle yapabileceğiniz gibi daha kapsamlı raporlar için hazır araçları kullanabilirsiniz.

Yaptığımız bir projede özgür yazılım olduğu için jasper reports'u kullanmıştık. Java'da kullanılabildiği için oldukça işimize yaramıştı. Açık kaynak raporlama araçlarına bakarsak, günümüzde seçeneklerin oldukça arttığını görebiliriz. Bir yazıda açık kaynak raporlama araçları listesi paylaşılmış. İlgilenenlere duyurulur.

Öncelikler ve zaman kullanımı

Bir yazıda yapacaklarınızın önceliğine karar verme başlığını görünce yazıyı çevirerek paylaşmak istedim. Biraz düşününce konu hakkında kendi düşüncelerimi paylaşmanın daha doğru olacağını düşündüm.

Yapmamız gerekenler, yapılması gerekenler var. Mutlaka bir şeyler üretmeyi kafamıza koyuyoruz. Belki de hiç bir şey üretmeden sadece zamanı tüketmeyi kafamıza koyuyoruz. Her halükarda en değerli şey olan zamanı planlamamız gerekiyor. 24 saat aralıksız üretemeyeceğimiz gibi, 24 saat aralıksız zamanı boşa da tüketemiyoruz. Bu durumda 24 saati nasıl değerlendireceğimiz planlamamız gerekiyor. Her ne kadar her zaman hoşunuza gitmeyen şeyleri yapmayın gibisinden öneriler olsa da bazen hoşunuza gitmeyen bazı şeyleri de yapmanız kaçınılmaz. Bunları da zaman planımıza koyuyoruz. Sadece soyut şeylere değil, somut şeylere, en önemlisi insanlara zaman ayırmamız gerekiyor. Bütün bu süreci en iyi şekilde planlamak ve disiplinli bir şekilde uygulamak gerekiyor. Hele ki uğraştığınız, yapmaya çalıştığınız onlarca konu, çalışma, yazı, çizi, düşünme, üretme gibi şeyler varken. İnsanları, sevdiklerinizi dışarıda tutmadan bütün bunları iyi bir şekilde yapmanız gerekiyor. O zaman ne yaparsınız? Öncelik sırası oluşturursunuz. Gerçekten önemsiz olduğunu düşündüğünüz şeyleri yapmazsınız veya geç yaparsınız. Önem sırasına göre işleri yapmaya başlarsınız. Yapamayacağınız, zaman ayıramayacağınız konulara girişmezsiniz. Başkalarından gelen istekleri kendi öncelikleriniz ve konuya göre değerlendirirsiniz.

Düşüncelerim genel ve çok söylenen şeyler oldu sanırım. İlgili yazıdaki ana başlıkları paylaşıp sizi daha fazla sıkmayayım.

Yazıda özetle yaptığınız şeyden zevk alın, güçlü noktalarınıza odaklanın, yaptığınız işte nasıl mükemmel olacağınızı araştırın, önceliklerinizi oluşturun diyor. Ve SWOT adını verdiği bir yöntemi öneriyor.

Zaman planlamasına yönelik olarak bir başka yöntem de Getting Things Done yöntemi. GTD kısa ismiyle belirtilen yöntem için bir çok yazılım aracı da var. Bir ara denedim, ama beceremedim. Kaotik zaman planlaması sanırım benim karakterime yerleşmiş :)

2009 LOÇ Tırmanışı

Bursa Dağcılık ve Doğa Sporları İhtisas Kulübü (BUDAK) nün
Dağcılık Federasyonumuzun Kurucusu ve İlk Başkanı
merhum Latif Osman ÇIKIGİL(LOÇ) anısına
geleneksel olarak her yıl düzenlediği
LOÇ ANMA TIRMANIŞI
Bursa Uludağ’da 14 - 15 Kasım 2009 tarihinde gerçekleştirildi.


Zirve yüksekliği 2543 mt
Kamp alanı yüksekliği 2450 mt
Yürüyüş süresi 16 saat.
Gece sıcaklık ~= -10 C
Katılımcı sayısı ~= 160



Panel: Yeni Medyada Nefret Söylemi

İstanbul'da yaşayanlar için bir panel duyurusu.

“Yeni Medyada Nefret Söylemi” konulu bir panel düzenlememizin nedeni, Türkiye’nin gündelik yaşamında öteki olarak işaretlenenlere yönelik ırkçı, zenofobik ve homofobik nefret söyleminin geleneksel medyanın yanı sıra giderek daha yaygın bir şekilde yeni medya ortamında da dolaşıma girmesi ve yeniden üretilmesindeki dikkat çekici artış olmuştur.

Panelde, önce nefret söyleminin kökleri, nefret söyleminin ve nefret suçlarının hukuki zeminde yeri, ardından da yeni medya ortamında nefret söyleminin hangi mekanizmalarla nasıl üretildiği serimlenecektir. Son olarak da, yeni medya ortamında dolaşıma sokulan ve yeniden üretilen nefret söylemine karşı mücadele etmek için olası çözüm yolları tüm katılımcılarla birlikte tartışılacaktır.

Bu panelin düzenlenişinin bizati kendisi de nefret söylemine karşı bir farkındalık bilinci uyandırmayı amaçlamaktadır.

Tarih: 21 Kasım 2009, Saat:13.30 - 17.00

Yer: Tarık Zafer Tunaya Konferans Salonu Tünel/Taksim

Yöneten: Mutlu Binark / Başkent Üniversitesi İletişim Fakültesi

Düzenleyen: Alternatif Bilişim

Konuşmacılar:

  1. Nefret Söylemi Nedir ve Geleneksel Medyada Nefret Söylemi
    Aslı Tunç / İstanbul Bilgi Üniversitesi İletişim Fakültesi
  2. Nefret Söylemi ve Nefret Suçları: Hukuki Boyutu
    Ayşe Kaymak/İstanbul Barosu Avukat, Alternatif Bilişim Hukuk Danışmanı
  3. Ana Akım Medyanın Haber Portallarında Nefret Söylemi
    İlden Dirini/Özgür Radyo
  4. Toplumsal Paylaşım Ağlarında Nefret Söylemi
    Kolektif Üretim adına Eser Aygül/Gazi Üniversites SBE.
  5. Video Paylaşım Sitelerinde Dolaşıma Sokulan Nefret Söylemi
    Tuğrul Çomu/Ankara Üniversitesi SBE.
  6. 6.Genel Değerlendirme ve Tartışma
Alternatif Bilişim
www.alternatifbilisim.org

Java geliştiricilerinin bilmesi gereken 10 şey

Bir yazıda bütün Java geliştiricilerinin bilmesi gereken 10 şey yazılmış. Bu tarz yazılar, 10 şey, 20 şey, hiç bir şey gibi şeyler çok çıkıyor biliyorum. Yine de paylaşmak istedim. Üzerinde tartışabiliriz, yanlarına yazdıklarımın bir kısmı kendi düşüncelerimdir.

  1. Java'nın ve Nesne Yönelimli Programlamanın hemellerini hatırlayın: Hatırlayın yerine hiç unutmayın demek daha doğru olur sanırım. Buna karşı çıkacak birini de düşünmüyorum.
  2. Teknoloji kümenizi bilin: Evet, hızlı yazılım geliştirmek, tekerleği tekrar tekrar tasarlamamak, uygun hedef uygun ortam ve teknoloji kullanabilmek için Java'yı, sanal makinelerini, farklı teknolojileri, kütüphaneleri bilmek yararlı olacaktır.
  3. Farklı J2EE anaçatıyla denemeler yapın: Spring, EJB, vb. farklı J2EE teknolojileriyle denemeler yapıp, uygun olanı seçmeniz iyi olacaktır.
  4. Bir betik dili öğrenin: Mutlaka Java içerisinde kullanabileceğiniz hatta başka zamanlarda da kullanabileceğiniz bir betik dilini öğrenin (bence Python öğrenin :D )
  5. Web servislerini nasıl geliştireceğinizi öğrenin: Web servisleri yükselen trend olduğu söylenen ve IBM, Sun gibi büyük firmalar tarafından "pompalanan" şeyler. Gerçekten iyice öğrenin, kullanım gerektiren zamanlarda kullanın.
  6. Multithread kavramlarını ve uygulamanızda ne zaman kullanmanı gerektiğini öğrenin.
  7. JDBC ve JPA ile veritabanı geliştirme: Buna açıklama gerekmez sanırım :)
  8. AJAX ve İstemci tarafında çalışan bir betik dilini (JavaScript) öğrenin.
  9. Java'nın rakiplerini öğrenin (.NET, Ruby, vb.) ve en iyi IDE hangisidir tartışmalarından uzak durun.
  10. Ant (hatta MAVEN) öğrenin, Tomcat vb. bir uygulama sunucusunu kavrayın.
Ağırlıklı olarak web tabanlı veya J2EE uygulamalar için belirlenmiş bu maddeleri dikkate almak yararlı olacaktır :)

Java ve İlişkiler

Nesne yönelimli programlama dersinin asistanlığını yapıyorum. Bu bağlamda sorular geliyor. En son Nesne Yönelimli Programlama'da Association, Composition ve Aggregation kavramları soruldu. Bu kavramları kodumuzda kullanıp kullanmadığımızı nasıl anlarız? Bu soruyu ortada bırakmak şartıyla, bu kavramların tanımlarını yapmaya çalışayım.

Association (Birliktelik): İki sınıf arasındaki yapısal ilişkiye verilen isim. Herhangi bir dereceye sahip olacak şekilde aralarında ilişki bulunan sınıflar bu birlikteliğe sahip olurlar. UML gösteriminde düz bir çizgi ile temsil edilmektedir. Bu ilişki bize o iki sınıf arasında mesaj alışverişini sağlayan bir kanalın olduğunu anlatır. Burada Java'da mesaj alışverişinin metot çağrımlarıyla gerçekleştiğini hatırlatmak gerekir. Birliktelikler genellikle referanslar ile gerçekleştirilir.

Aggregation (Münasebet): "Sahip olma" ("possession") ilişkisini temsil eden özel bir birlikteliktir. Dairesel olmama koşulu vardır. Bunun anlamı nesne kendisiyle münasebet kuramaz. Bu yüzden münasebet çizge değil, ağaç yapısı oluşturur. Aggregation "has-a" ilişkisidir. Her iki nesne de kendi bağımsız varoluşlarına sahiptir.

Composition (Oluşum): Sahiplik ("ownership") modellemesi için kullanılan özel bir birliktelik türüdür. Aggregation'a benzer ama tek farkı Bütün-Parça ilişkisini temsil etmesi ve parçanın kendi bağımsız varlığına sahip olmayışıdır. Bütünün varlığını temsil eden nesne ayrıca parçanın da yaşamından sorumludur. Oluşum "contains-a" ilişkisi olarak anlaşılmalıdır. Münasebete benzer olarak oluşum da Ağaç yapısı oluşturur, çizge değil ve dairesel olamaz.

Aggregation-Composition arasındaki farklar

  • Aggregation "has-a" (var) ilişkisidir, Composition "contains-a" (içerir) veya "bütün-parça" ilişkisi
  • Aggregation'da iki nesne de kendi bağımsız varoluşlarına devam ederler, Composition'da parça'nın ömrü bütün nesnesiyle temsil edilir.
  • Composition'ın daha güçlü ilişki olmasına karşın Aggregation daha gevşek bir ilişkidir.
  • UML'de Aggregation işi boş köşegen ve düz çizgi, composition dolu köşegen ve düz çizgi ile gösterilir.
  • Composition ilişkisindeki "parça"nın sadece bir "bütün"ü olabilir. Aggregation kapsanan tarafta 0..* derecesine sahip olabilir.
Bir bağlantıda Araba örneği üzerinden Composition ve Aggregation arasındaki farkı şöyle anlatıyordu:
Bir örnek Arabadır. Araba Parçalarından oluşur. Bu parçalara sahiptir. Eğer bir Parça yoksa araba bozuktur. Araba Parçalarıyla Composition oluşturur.

Ayrıca Arabanın Yolcuları vardır. Yolcular Arabanın Parçası değildir. Eğer bir Yolcu yoksa Araba bozuk değildir. Araba Yolcularına sahip değildir. Araba'da değillerse başka bir yerdedirler. İlişki geçicidir. Yolcular gelir ve gider. Araba ve Yolcular arasında Aggregation ilişkisi vardır.


Her iki ilişki aslında compositiondır. Arabanın hem Parçaları hem de Yolcuları vardır. Farklılık süresindedir. Parçalarla olan ilişki daimidir, Yolcularla olan ilişki geçicidir.

Kaynaklar:
http://faq.javaranch.com/view?AssociationVsAggregationVsComposition
http://ootips.org/uml-hasa.html
http://www.javaworld.com/javaworld/jw-06-2001/jw-0608-java101.html
http://geekexplains.blogspot.com/2008/07/composition-vs-aggregation-whats.html
http://www.bilgisayarkavramlari.com/2008/12/20/birliktelik-munasebet-ve-olusum-association-aggregation-and-composition/
http://stackoverflow.com/questions/1384426/distinguishing-between-delegation-composition-and-aggregation-java-oo-design
http://www.coderanch.com/t/468736/Java-General/java/Aggregation-Java

DISTINCT yerine IN veya EXISTS

SQL cümlelerinde JOIN kullanımı sonucu tekrarlayan kayıtlar ile karşılaştığımız oluyor. Bunları tekil hale getirmek için DISTINCT kelimesini kullanabiliriz(1), ancak distinct sıralama ve filtreleme işlemi yapacağından sorgunun performansını azaltacaktır.
DISTINCT kullanmak yerine mümkünse JOIN ifadesinde kullanılan tablo ve koşullar ayrılarak altsorguya dönüştürülebilir, aranan değere ulaşmak için performansı bu tür durumlarda JOIN den daha yüksek olan IN veya EXISTS kullanılabilir(2).

(1)
select distinct m.musteri_no
from tbl_musteri m
join tbl_hesap h
on h.musteri_no = m.musteri_no
and h.kayit_durum = 'A'
and m.musteri_no = 123456

(2)
select m.musteri_no
from tbl_musteri m
where exists (select h.musteri_no
from tbl_hesap h
where h.musteri_no = m.musteri_no
and h.kayit_durum = 'A')
and m.musteri_no = 123456

Özgür Yazılım Göçleri

Dünya yavaş yavaş özgür ve açık kaynak kodlu yazılıma geçiyor. İtalya'da yapılan bir ankete göre şirketlerde %50 OpenOffice.org, %63 GNU/Linux kullanılıyor. Ayrıca dün okuduğum bir habere göre Fransa'da Ö/AKK yazılıma geçiş yaşanıyor, Mono bile kullanılmamak üzere kaldırılıyor.

Basit kod için 7 kural (KISS - Keep It Simple Stupid)

Basit kod geliştirmenin 7 adet ölçütünden bahseden bir yazı buldum. Yazıyı ayrıca okuyabilirsiniz. Özetle bu 7 özellik şunlar:
  1. Okunması kolay olmalı
  2. Kullanımı kolay olmalı
  3. Değiştirmesi kolay olmalı
  4. Gereksiz yere üçüncü parti kütüphane, araç veya teknoloji kullanmamalı
  5. Basit görünmeli
  6. Zarif olmalı (sadece gerekli olanı yapmalı, fazlasını değil, az ve öz olmalı)
  7. Dobra olmalı (gereksiz yere yönlendirmeler içermemeli)
Bu özellikler tartışılabilir, ama yazılım geliştirirken bir şeyi unutmamak lazım. Kaynak kodun genişletilebilir, değiştirilebilir, güncellenebilir ve anlaşılabilir olmasıdır.

Aynı yazıda ayrıca önemli bir vurgu yapılmış. Bu vurgu basit kodun geliştirilebilmesi için sürekli sınama ve sürekli yeniden yapılandırmanın (refactoring) yapılması (zaten sürekli yeniden yapılandırma yapıyorsanız sürekli sınama da yapmanız ve dolayısıyla bol bol testlerinizin olması gerekir, bu noktada birim testler devreye girer) gerektiğidir.