ArÅŸiv

Yazar ArÅŸivi

Java Collections.sort() – Collator

Pazar, 29 AÄŸu 2010 5 yorum

Java’nın Collections sınıfının faydalı bir bir metotundan bahsedeyim. Listeleri istediÄŸimiz gibi sıralamamız saÄŸlayan sort() metodu.

Bu gibi sıralama işlemlerinde en çok yaşanan sıkıntılardan bir tanesi String türünde verileri kıyaslarken ortaya çıkan Türkçe karakter sorunu. Şırnak, Çanakkale, Ordu illerini sıraladığımızda Çanakkale, Ordu, Şırnak sırasını beklerken mesela, Ordu-Çanakkale-Şırnak şeklinde bir sıranın ortaya çıkması gibi. Bu gibi durumlarda yerel karakter duyarlılığıyla kıyas yapabilen ve parametre olarak bir Locale alabilen Collator sınıfı yardımcı olacaktır.

BahsettiÄŸimiz sort() metodunun iki versiyonu bulunuyor;

[java]Collections.sort(List<T> list)[/java] ArrayList, LinkedList, Vector gibi List interface’ini implement eden bir sınıfı parametre olarak alıyor. Metodu bu ÅŸekli ile kullanabilmemiz için listenin barındırdığı elemanların tipi olan sınıf, Comparable sınıfını implement etmek durumunda.

Sadece kitap adını tutan, Kitap adında basit bir sınıfımız olduÄŸunu düşünelim. Bu sınıf implement ettiÄŸi Comparable interface’ nin compareTo() metodunu implement etmek durumunda.

[java]
public class Kitap implements Comparable<Kitap> {

private String ad;

public String getAd() {
return ad;
}

public void setAd(String ad) {
this.ad = ad;
}

@Override
public int compareTo(Kitap kitap) {
Collator collator = Collator.getInstance(Locale.getDefault());
//veya Collator trCollator = Collator.getInstance(new Locale("tr", "TR"));
return collator.compare(this.getAd(), o.getAd());
}
}
[/java]

Artık kitaplarımızı şu şekilde sıralayabiliriz;
[java]…
List<Kitap> kitapListesi = getKitaplar();
Collections.sort(kitapListesi);

[/java]

[java]Collections.sort(List<T> list, Comparator<T> comparator)[/java] ; metodun bu versiyonu biri List diğeri de Comparator interface lerini implement eden sınıfları parametre olarak alıyor. Kitaplarımızı sıralama işlemi için bu kez Comparator interface ini implement eden Comparator bir sınıf tanımlıyoruz. Yine kitap adına göre sıraladığımızı varsayarsak compareTo() metodu şu şekilde olacaktır;
[java]public class KitapComparator implements Comparator<Kitap>{

@Override
public int compare(Kitap kitap1, Kitap kitap2) {
Collator collator = Collator.getInstance(Locale.getDefault());
//veya Collator trCollator = Collator.getInstance(new Locale("tr", "TR"));
return collator.compare(kitap1.getAd, kitap2.getAd());
}
}[/java]
gibi kitaplarımızı karşılaştıran bir sınıf tanımladıktan sonra
[java]…
List>Kitap> kitapListesi = getKitaplar();
Collections.sort(kitapListesi, new KitapComparator());
…[/java]
gibi bir ifade ile de kitapListesi sıralanmış bir hal alıyor.

Benzer şekilde gereklilikler doğrultusunda comparator sınıflar tanımlayıp ihtiyaç halinde kullanılabilir.

Java – Lambdaj Kütüphanesi

Cumartesi, 21 AÄŸu 2010 1 yorum

Java Collections API sınıflarını kullanırken bolca for döngüleri kurar veya bu tip veriler üzerinden istediğimiz işlemleri gerçekleştirmek için çeşitli kod blokları yazarız. Lambdaj kütüphanesi bu tip kod blokları ile yaptığımız işlemleri çoğu kere tek satırlık kodlarla halletmemizi sağlayan bir arayüz sunuyor bize. Böylece listelere bir veri kaynağıymışcasına hemen her türlü seçim, sıralama, gruplama, dönüştürme, indeksleme ve benzeri işlemleri gerçekleştirebiliyoruz. Hatta zaman zaman for döngüleri ile halledemeyeceğimiz işleri bile karşılayabiliyor.

Elbetteki kod okunurluğunu arttırıp, bakımının kolaylaşmasını sağlarken performansı aşağı çekiyor. Her ne kadar performanstan ciddi kayıplar yaşatabilse de, varlığının bilinmesi kimi zamanlar çözüm getirmekte zorlandığımız problemler için faydalı olacaktır. Bu konuda Lambdaj ile normal tekrarlamalı yöntemler arasındaki performans kıyaslaması yapan şu makaleye göz atılabilir.

Lambdaj‘ ın yetenekleri ile ilgili bazı örnekler vermek gerekirse;

Person tipinde nesneler tutan listemizde her bir Person nesnesinin adını tek satırda bilmem ne olarak setlemek;
[java]List personInFamily = getPersons();
forEach(personInFamily).setLastName("Dalton");[/java]
Person tipinde nesneler tutan listemizde yaşı 30’dan büyük olanları ayıklamak;
[java]List = getPersons();
List oldFriends = filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends);[/java]
Person tipinde nesneler tutan listemizde toplam yaşı bulmak;
[java]int totalAge = sum(meAndMyFriends, on(Person.class).getAge());[/java]
Person tipinde nesneler tutan listemizi yaşa göre sıralamak;
[java]List sorted = sort(persons, on(Person.class).getAge());[/java]
Person tipinde nesneler tutan listemizdeki Person nesnelerinin isimlerini birleÅŸtirmek
[java]String friendNames = joinFrom(myFriends).getFirstName();[/java]
Person tipinde nesneler tutan listemizden adı Ali olan kaydi bulmak;
[java]List personList = getPersons();
List personListOfAli = select(personList , having( on(Person.class).getFirstName(), equalTo("Ali")));[/java]
Örnek kodlar aynı zamanda projenin web sayfası olan şuradan alınmıştır. Ayrıca şuradaki dökümandan daha ayrıntılı bilgi alabilir.

Ejder Kapanı

Cuma, 16 Tem 2010 1 yorum

ejder kapanı

Åžaka gibiydi. Amerikan polisiye-gerilim filmlerinden etkilenirsin eyvallah, olur hani. Hakim film kültürüdür Hollywood. Huyundan kapmasan suyundan kaparsın. Da hani hiç mi kendinden birÅŸey katmaz insan sinemaya. Ä°stanbul’un artık kliÅŸe haline getirilip tadı tuzu kaçırılan mekanlarını kendine fon yapan, her bir diyaloÄŸu tatsız, tuzsuz ve dayandığı senaryosu temcit pilavı misalinden öteye geçemeyen yakışıksız bir film. Hatta her bir tiplemesi baÅŸkomiserinden adli tıp uzmanına, güzel stajyerden ofis memurlarına varana kadar bireribir kopya. Yine alışılageldiÄŸi üzere loÅŸ mekanlar tercih edilmiÅŸ, çekimler ağırlıklı olarak gece yapılmış. Ä°ki yaÄŸmur bir de ÅŸimÅŸek ekledik mi, samanlık seyran olmuÅŸ. Bir de UÄŸur Yücel neden o ses tonunu kullanmış, neden çoÄŸu yerde abartılı mimikler kullanmış, nasıl bir karakter ortaya çıkarmaya çalışmış anlayamadım. Sadece havada kaldığını hissettim o kadar.

Film kliÅŸeleri tekrar etmek konusunda da ciddi bir rekor denemesi içine girmiÅŸ. Åžimdi burada sayamacağım veya sayıp da hepten kliÅŸe haline getirmeyeceÄŸim onlarca diyalog, onlarca sahne. Hele katili öğrenen UÄŸur Yücel’in stajyer kız ile geçirdiÄŸi telefon konuÅŸması, çin iÅŸkencesi tadında. Ä°ki saat oturtuyorsun insaları o koltuklara, birÅŸeyler vermek, eÄŸlendirmek, sanat yapmak veya her ne ise amaç, onun için bir fark oluÅŸtur yahu, bir özelliÄŸinle sıyrıl deÄŸil mi ? Senaryon kötüyse mekanlarınla farkı hissettir, ne bileyim bir karakterine hasta olayım, veya bir diyaloÄŸundaki iki cümle “unutulmaz replikler” arasına dahil oluversin. O da olmadı hoÅŸ bir musiki içinde cerayan etsin olaylar da biz de akıp gidelim hani.

Sanırım bizim polisiye-gerilimden anladığımız daha önce de gördüğümüz üzere basit bir ters köşe denemesinden ibaret. Arabayla da iki takla atıp, bir ters şerit yaptık mı oooh değmeyin keyfimize. Yüzeysel, manalı olmasa bile kendi içinde tutarlı bir tabana ve fikre oturtulamamış yavan mı yavan bir akıştan öteye geçemiyoruz henüz. Şaka gibiydi.

Kategoriler:Sinema Etiketler:

Object references an unsaved transient instance

Cuma, 07 May 2010 Yorum yapılmamış

Hibernate API ‘yi kullananlar TransientObjectException:Object references an unsaved transient instance – save the transient instance before flushing hatası iÅŸle karşılaÅŸmışlardır mutlaka. Şöyle bir örnek üzerinden açıklayacak olursak; Araba ve Kullanici adli iki modelimiz olduÄŸunu ve Araba modelinde

@ManyToOne()
@JoinColumn(name = “KULLANICI_ID”)
private Kullanici kullanici;

şeklinde bir Kullanici alanımız olduğunu varsayalım. Aksiyon sınıfında;


araba.setKullanici(kullanici);
entityManager.persist(araba);
entityManager.flush();

ÅŸeklinde bir kod bloÄŸu yukarıdaki hatayı almamıza sebep olacaktır. Kullanici nesnesi sessionda varolmasına raÄŸmen henüz veritabaninda mevcut deÄŸildir, yani “transient object” tanımına girmektedir. Araba tablosunda “foreign key” olarak bulunan KULLANICI_ID alanına yerleÅŸtirilecek bir ID yoktur ortalıklarda. Dolayısıyla iliÅŸki kurulamaz. Hatayı iki ÅŸekilde gidermek mümkün. Birincisi kod bloÄŸunu;


araba.setKullanici(kullanici);
entityManager.persist(araba.getKullanici());
entityManager.flush();

entityManager.persist(araba);
entityManager.flush();

şeklinde düzenleyip önce Kullanici nesnesini veritabanına yazmak, ikincisi de ilişkiyi

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = “KULLANICI_ID”)
private Kullanici kullanici;

şeklinde tanımlayarak bu Araba veritabanına kaydedilirken ve güncellenirken Kullanici nesnesinin de veritabanina yazilmasini sağlamak. Elbette ki sağlıklı olan annotation da ilişkinin özelliğini bildirerek bu gibi kontrolleri ve performansı API nin kendisine bırakmak.

Benzer bir durum OneToMany() ilişkilerde de sözkonusu. Çözüm yine benzer şekilde.

PMD ile kod analizi

Cumartesi, 24 Nis 2010 Yorum yapılmamış

Sadece Eclipse deÄŸil aynı zamanda diÄŸer bir çok IDE’ye de (JDeveloper, JBuilder, IntelliJ IDEA vs.) eklenebilen gayet faydalı bir eklentiden söz etmek istedim; PMD. Åžurada da bahsedildiÄŸi üzere PMD neyin kısaltması ola ki sorusunun bir sürü cevabı var, veya aslında yok. (Pretty Much Done, Project Mess Detector, Project Monitoring Directives vs.) Yaptığı iÅŸ Java kodunu tarayıp olası hatalara sebebiyet verecek kod parçalarını iÅŸaret etmekle kalmayıp bunların nasıl daha temiz, daha düzgün, daha okunur hale getirilebileceÄŸi konusunda öneriler getirmesi. Taradığı kural setlerinden birkaçını kabaca yazacak olursak;

* Daha iyi ve/veya daha az kodla ifade edilebilcek kod blokları
* Kullanılmayan değişken, parametre, metotlar
* Boş bırakılmış try/catch/finally/switch ifadeleri
* Fazlaca karmaşık, okunması zor ifadeler, metotlar
* Gereksiz if cümlecikleri, while ile değiştirilebilecek for cümlecikleri
* Kopya kod blokları
* Kopyala/yapıştır kaynaklı oluşabilecek hatalar
* Fazlaca uzun veya kısa isimlendirilmiş değişkenler, metotlar

Elbette bunların dışında Java kodunu değerlendirmeye tabi tuttuğu bir dolu kural seti var. Pratikte daha çok karşımıza çıkabilecek olanlardan bahsettim.

Bir iki örnek vermek gerekirse;

Query sınıfının getResultList() metotundan dönen liste değişkeninin içeriğini if(list.size()>0) gibi kontrol etmek yerine list.isEmpty() ile kontrol etsene,

veya String deÄŸiÅŸkenler için eÅŸitlik kontrolü yaparken (a diye String bir deÄŸiÅŸkenimiz olduÄŸunu varsayarsak) if(a.equals(“Ahmet”)) ÅŸeklinde kontrol etme arkadaÅŸ, if((“Ahmet”).equals(a)) diye kontrol ederek muhtemel null pointer hatalarından da sıyrılsan ya,

veya bir baÅŸka örnek BigDecimal tipinden bir deÄŸiÅŸkene new BigDecimal(“0”) ile deÄŸer atadığımız bir ifade için, arkadaÅŸ ne diye statik olarak zaten elinde var olan BigDecimal.ZERO ‘yu kullanmıyorsun ki diyebiliyor. Bu gibi örnekleri çoÄŸaltmak mümkün.

Eklentinin sahip olduğu kural setlerini Window->Preferences->PMD menüsünden düzenleyebiliyoruz da. Böylece hangi kuralı değerlendirmeye alacağını veya nasıl değerlendireceğini belirleyebiliyoruz. İşte efendim ben değişken isimlerini anlaşılır olması adına uzun yazarım, sen karışma benim işime, o yüzden sen beni ancak 20 karakterden daha uzun olarak isimlendirilmiş değişkenler için uyarıver diyebiliyoruz.

Merak edip denemek isteyenler için Eclipse ‘ e nasıl ekleyebileceÄŸimiz ÅŸurada anlatılmış.

Åžurada da PMD’nin sahip olduÄŸu kural setleri ayrıntılı bir ÅŸekilde izah edilmiÅŸ.

Kategoriler:Eclipse Etiketler:,

Firefox eklentisi budaneki

Çarşamba, 07 Nis 2010 1 yorum

Yeni keÅŸfettiÄŸim çok şık bir firefox eklentisinden bahsedeyim. Ä°nternette gezinirken sık sık yeni bir sekme açıp Google, sözlük, vikipedia vesair kaynak sitede kelime arıyoruz. Bu eklenti bu iÅŸi çok basit hale getiriyor. Ãœstelik oldukça da seçenekli ve düzenlenebilir bir arama yapısı var. Eklentiyi ÅŸu adresten Firefox’a ekledikten sonra fare ile seçtiÄŸiniz herhangi bir kelimenin üzerinde bir buton beliriyor.

Açılan pencereden istediğiniz kaynaktaki sonucu görebilirsiniz.

Seçili metinin üzerinde buton belirmesinden rahatsız isek settings kısmından çalışma modunu değiştirebiliyoruz. Ghost modu ile fareyle seçili metnin üzerine tıklayınca, Hidden modu ile de fare ile metni seçtikten sonra arayacak olduğumuz sitenin adını yazmaya başladığımız anda budaneki butonunu aktif hale getirebiliyoruz.

Yine settings sayfasından kaynak siteleri düzenleyebiliyoruz. Yeni sürümünde eklenmiÅŸ olan bir güzelliÄŸi daha Google Translate desteÄŸi. Metni seçtikten sonra iki kere enter tuÅŸuna bastığımızda seçili metni otomatik olarak Google Translate’den gelen çevirisi ile deÄŸiÅŸtiriyor.

Güncelleme: Firefox 4 uyumlu sürümü şurada mevcut

Kategoriler:Web Etiketler:,

Bana dokunmayan yılan bin yaşasın çelişkisi

Pazartesi, 29 Mar 2010 Yorum yapılmamış

TDK’nın “birçok kimse, kendilerine kötülüğü dokunmayan kiÅŸiye iliÅŸmek istemez.” ÅŸeklinde izah ettiÄŸi bu atasözünün çoÄŸu kere yanlış kullanıldığını görüyorum. Kendimce düzeltme gereÄŸi gördüm.

Bir kere bu sözde bir tavsiye, bir öğüt yaklaşımı yoktur. TDK’nın da izah ettiÄŸi gibi bu bir gözlemdir. “Böylesi insanlar” iÅŸareti vardır. Yanlış kullananların en sık yaptığı hata ise cümleyi olduÄŸu gibi alıp, atasözü olmasına binaen bir nasihatmış gibi deÄŸerlendirmek. KarşılaÅŸtırdığım iki mana var.

Birincisi;Size doğrudan kötülüğü dokunmayan, size ilişmeyen kötülükleri engellemek adına mücadele etmeyip göz yumabilirsiniz, yer yer gamsız ve aymaz olabilirsiniz böylesi durumlarda.

İkincisi:Kendisine doğrudan kötülüğü dokunmayan, ilişmeyen kötülükleri engellemek adına mücadele etmeyip göz yuman, yer yer gamsız ve aymaz olabilen kişinin teşbihi.

Atasözünü birinci şekli ile yorumlayıp kullanmak ve örneklendirmek yanlıştır. Burada asıl kasıt bir durumdur, onun izahı yapılmış, o duruma bir yakıştırma yapılmıştır. İkinci manada kastettiğim gibi. Bu yönüyle de bir deyim havası vardır hatta.

Yanlış bir mana ithaf ettikten sonra da, bu atasözünü kullanıp parantez içinde, tırnak arasında “vay efendim böyle bir salığı veren atalar hangi atalar çok merek ediyorum” gibilerinden artislenmeler de ÅŸurada bahsini ettiÄŸim kategoriye dahil edilebilir.

Varsayalım ki hakikaten de benim yanlış kullanıldığını iddia ettiğim gibi mana var bu sözde. Yani birinci manayı kastetmiş olsun atalar. Bu kez de atasözü tanımına ters bir durum teşkil etmiş olur. TDK şöyle açıklamış atasözü kelimesini :

(ata’sözü) Uzun deneme ve gözlemlere dayanılarak söylenmiÅŸ ve halka mal olmuÅŸ, öğüt verici nitelikte söz, darbımesel:

(atasözü) Eski kuşakların denemelerinden kalma yol gösterici, akıl verici yargı ve öğüt.

Peki böylesi bir tanıma sahip bir söz dizisi birincideki gibi bir mana vermek istemiş olabilir mi hakikaten ?
El cevap: Hayır. En azından ben, böyle bir manası olmuş olsa idi, halk tarafından benimsenip günümüze kadar ulaşmış olmazdı diye düşünüyorum.