Selman Gün

Ağu 29

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;

Collections.sort(List < T > list); 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.

public class Kitap implements Comparable {

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());
}
}

Artık kitaplarımızı şu şekilde sıralayabiliriz;


List<Kitap> kitapListesi = getKitaplar();
Collections.sort(kitapListesi);

Collections.sort(List < T > list, Comparator < T > comparator) ; 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;

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());
}
}

gibi kitaplarımızı karşılaştıran bir sınıf tanımladıktan sonra


List<Kitap> kitapListesi = getKitaplar();
Collections.sort(kitapListesi, new KitapComparator());

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.

Ağu 21

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 iterative 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;

List personInFamily = getPersons();
forEach(personInFamily).setLastName(“Dalton”);

Person tipinde nesneler tutan listemizde yaşı 30′dan büyük olanları ayıklamak;

List = getPersons();
List oldFriends = filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends);

Person tipinde nesneler tutan listemizde toplam yaşı bulmak;

int totalAge = sum(meAndMyFriends, on(Person.class).getAge());

Person tipinde nesneler tutan listemizi yaşa göre sıralamak;

List sorted = sort(persons, on(Person.class).getAge());

Person tipinde nesneler tutan listemizdeki Person nesnelerinin isimlerini birleştirmek

String friendNames = joinFrom(myFriends).getFirstName();

Person tipinde nesneler tutan listemizden adı Ali olan kaydi bulmak;

List personList = getPersons();
List personListOfAli = select(personList , having( on(Person.class).getFirstName(), equalTo(“Ali”)));

Ö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.

Tem 16
Ejder Kapanı
icon1 Selman | icon2 Sinema | icon4 07 16th, 2010| icon31 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.

May 7

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.

Nis 24

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ş.

Nis 7
Firefox eklentisi budaneki
icon1 Selman | icon2 Web | icon4 04 7th, 2010| icon31 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.

Mar 29

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.

Mar 25
Gmail eklentileri
icon1 Selman | icon2 Web | icon4 03 25th, 2010| icon3Yorum yapılmamış »

Gmail’in diğer e-posta hizmeti sağlayıcılarına nazaran bir dolu güzel özelliği var, malum olduğu üzere. “Labs” özelliği ile sağladığı eklentileri içerisinde pratikte çok işe yarayacak bir kaçından bahsetmek istedim. Bahsedeceğim eklentilere “Ayarlar-Labs seçeneği ile ulaşılabilir.

Birincisi “Göndermeyi geri al” özelliği. Bu özellik e-postayı yazıp “Gönder” düğmesini tıkladığınızda, iletilerin hemen değil, birkaç saniye sonra gönderilmesini sağlıyor. Böylece yanlış kişiye e-posta göndermelerin önüne geçmiş oluyoruz.

    İkinci özellik ise diğer posta hesaplarınızdan(hotmail, yahoo vs.) aldığınız e-postaları istediğiniz herhangi bir an kontrol edebilme şansı veriyor size. “POP hesaplarını yenile” özelliğini aktif hale getirdiğinizde yukarıki butonların hemen yanında bir de “Yenile” butonu ekleniyor.

      Bir diğer güzel özellik de “Arama otomatik tamamlama”. Bu özellik sayesinde de -resimde de görüleceği gibi- e-postalarımızda arama yaptığımız metin kutusunda yazmaya başladığımızda otomatik tamamlama önerileri beliriveriyor.

        Ayrıca Gmail hesabınıza Google Gadget‘lar da ekleyebilirsiniz. Ayarlar-Labs sayfasından “Tüm gadget’ları URL yoluyla ekle” özelliğini etkinleştirdikten sonra “Ayarlar” sayfanızda “Gadgets” adıyla bir sekme daha belirecektir.  Bu sekmede Gmail hesabınızın sol sütununda gözükmesini istediğiniz gadget’ın url’sini eklemeniz yeterli olacaktır.

          Benim önemli sayıp bahsettiklerim dışında pratikte faideli olabilecek pek çok özellik mevcut, Labs‘ta. Denemek, kurcalamak isteyenlere…

          Mar 18

          Bir köşe yazısı okurken internette ve bir dolu daha başka yerde levhalar halinde görüğümüz şu meşhur “Şeyh Edebali’nin Osman Bey’e Öğütleri” başlıklı yazının uydurma olduğunu konusu çekti dikkatimi. Hani şu

          Ey Oğul! Beysin…

          Bundan sonra öfke bize, uysallık sana..

          Güceniklik bize, gönül almak sana…

          Suçlamak bize, katlanmak sana…

          şeklinde devam eden öğütler.

          Google amcaya sordum, karşıma iki önemli köşe yazısı çıktı. Tarihçi Murat Bardakçı şuradaki yazısında bu öğütlerin bir İttihad Terakki uydurması olduğunu, gazeteci-yazar Beşir Ayvazoğlu da şuradaki yazısında bunun Tarık Buğra’nın yakıştırması olduğunu yazmışlar. Fakat ikisinin de ortak olarak belirttikleri şey Aşıkpaşazade, Şükrullah, Nişancı Mehmed Paşa, Oruç Bey gibi önemli Osmanlı tarihçilerinin kaynaklarında böyle bir bahis geçmediği.

          Peki bu öğütlerin hakikaten de Şeyh Edebali tarafından söylenmemiş olması neyi değiştirir? Elbette ki yazının edebi değerini ve anlamını değiştirmez. Kimin söylediğine değil de ne söylediğine bakıyorsak tabi. Hani bu tıpkı sizin yaşam tecrübelerinizden çıkarsadığınız kimi beylik sözlerin altına bir büyük düşünürün adını koyup arkadaşlarınızın fikrini öğrenmenize benzer. Ve fakat tarihin ne kadar saptırılmaya, manipüle edilmeye ve üzerinden toplum mühendislikleri uygulanmaya çalışılan bir bilim dalı olduğunu gösterir. Bir diğer gösteriği şey de internette yazılan herşeye inanmamak gerektiği, az biraz kurcalamak, dikine gitmek gerektiği sanırım.

          Mar 17

          Google Reader kullanıcıysanız ve takipçisi olduğunuz sitelerdeki kimi haberleri blogunuzda göstermek istiyorsanız WordPress’in buna uygun bir eklentisi mevcut. Şu adresten eklentiyi indirip plugins dizinine atın. Eklentiyi aktif hale getirdikten sonra yapılacak tek şey “Google Reader User ID” nizi eklentinin ayarlar kısmında düzenlemek.

          Peki nedir bu “Google Reader User ID” derseniz, Google Reader sayfanızın sol menüsünde bulunan “Paylaşılan Öğeler” e tıkladığınızda gelen sayfanın başlığının hemen sağ yanında göreceğiniz link “http://www.google.com/reader/shared/02774557510273097991″ gibi bir şey olacaktır. İşte bu “02774557510273097991″ numarası sizin User ID’niz. (Belki de daha kolay bir yolu vardır. Ben böyle buldum:) )

          Bir diğer önemli sayılabilecek ayar da “Cache time”. Bu da ne kadar süreyle (saniye cinsinden) Google Reader’daki paylaşılan öğelerinizi kontrol edip, bileşeni güncelleyeceğinin ayarı oluyor.

          Tabi “Paylaş” dediğiniz bu öğeleri “Paylaşım Ayarları” sayfanızda “Genel(Herkes Görüntüleyebilir)” şeklinde ayarlamış olmanız gerekiyor.

          « Önceki yazılar