Sansür, bir toplumun kendine olan güvensizliğini yansıtır ve otoriter rejimlerin belirgin bir özelliğidir.
--Potter Stewart
19.08.2009
SpringSource Tool Suite 2.1.0
15.08.2009
SCJP, SCWCD, Spring Roo, STS, vs. vs.
SCJP sınavına "SCJP Sun Certified Programmer for Java 6 Exam 310-065" kitabıyla hazırlandım. Uygulama geliştirirken ezbere ya da bilmeden yaptığımız birçok konuyu öğrenmek, "bu da bu şekildeymiş" demek, örnek soruları çözmek benim için hem eğitici hem de keyifliydi. Kitabı okumanızı tavsiye ederim. Ardından bol soru çözmek sınav için yeterli olacaktır.
Sırada SCWCD var. Sınava çalışmak için ilk başta "Sun Certified Web Component Developer Study Guide" kitabını düşünsem de kitabın okuyuculardan aldığı kötü yorumlar, beni "Head First Servlet & JSP" yönlendirdi. En kısa zamanda da ikinci sertifika için çalışmaya başlamayı düşünüyorum.
İlk sertifikaya çalışırken gösterdiğim tembelliği tekrarlamamaya; Refactoring, TDD ve merak ettiğim Spring Roo, OSGi gibi konulara da tekrar eğilmeye çalışıcam. Bu sırada Eclipse 3.5 tabanlı SpringSource Tool Suite 2.1.0'ı da kullanarak getirdiği kolaylıkları gözlemlemek de istiyorum.
29.06.2009
CETURK Java Teknolojileri Etkinliği -7
Etkinliğin ayrıntılı duyurusuna http://www.ceturk.com/etkinlikkayit.asp?id=75 adresinden erişebilirsiniz.
16.06.2009
CETURK Java - Ankara Etkinliğinin Ardından..
5.06.2009
CETURK Java Teknolojileri Ankara Etkinliği 2
25.03.2009
Hibernate Parameter Binding
<properties>
...
<property name="hibernate.show_sql" value="true"/>
</properties>
İfadesi bile üretilen SQL cümleciğinde parametre gelecek yerleri ‘?’ ile gösteriyor. Hal böyle olunca bazen debug esnasında akışı izlemek sıkıntılı olabiliyor. Bu sıkıntıyı aşmanın bir yolu ise Hibernate Type sınıfı için Log4j 1.2.12 sürümünden itibaren kullanılmaya başlanan TRACE düzey loglama yapmak:
<logger name="org.hibernate.type">
<level value="TRACE"/></logger>
Her ne kadar ‘?’ yerine değerler gelmese de basılan loglardan soru işareti ile belirtilen yerlere atanan değerleri elde etmek mümkün. Dönen değerler de bonus olarak gösteriliyor
Hibernate:
/* load deneme.DovizTipi */ select doviztipi0_.ID as ID52_0_, doviztipi0_.ACIKLAMA as ACIKLAMA52_0_, doviztipi0_.KISA_ACIKLAMA as KISA8_52_0_ from DOVIZ_TIPI doviztipi0_ where doviztipi0_.ID=?
25 Mar 2009 15:11:27,159 - TRACE - IP:127.0.0.1, ReqURI:/ips/spring/anasayfa-flow - /ips - org.hibernate.type.NullableType.nullSafeGet(193) | returning 'Yeni Türk Lirasi' as column: ACIKLAMA52_0_
25 Mar 2009 15:11:27,159 - TRACE - IP:127.0.0.1, ReqURI:/ips/spring/anasayfa-flow - /ips -
org.hibernate.type.NullableType.nullSafeGet(193) | returning 'TL' as column: KISA8_52_0_
18.02.2009
Açıklama Satırı Yazmadan Kod Yazana 10 Puan Bonus
9.01.2009
Richfaces Editor Bileşeni
Detaylı bir editorconfig.properties içeriği şu şekilde oluşturabilinir:
http://dl.getdropbox.com/u/135887/editorconfig.properties
TinyMCE ayarları ile ilgili detaylı bilgiyi buradan bulabilirsiniz. Bileşeni kullanmak istediğiniz yerde şu kod parçasını yazmanız yeterli:
Yukardaki kodda da görüldüğü gibi
8.01.2009
Richfaces Calendar bileşeni ve TinyMCE
TinyMCE ise html girdileri yapabileceğiniz popüler bir "zengin metin editörü".
Geliştirdiğimiz web uygulamalarında TinyMCE'i bir Richfaces bileşeni olarak paketlemiştik. Böylece kolay ve tekrar kullanılabilir zengin metin editörümüz oldu. Bir adım daha ileri giderek Richfaces'in dosya yükleme bileşen
Zengin metin editörümüzü mutlu mesut kullanırken, richfaces'ın dosya yükleme yeteneği ile kullanıcılara resimler yükletirken bugün gördüm ki rich:calendar ve tinyMCE ile birbirleriyle aynı sayfada geçinemiyor. Firefox iki bileşeni problemsiz çalıştırırken, bu uyumsuzluk bir şekilde IE'de ortaya çıkıyor ve can sıkıyor. (Uyumsuzluğu bulmak 2 saatimi alınca canlar sıkıldı elbet.)
Richfaces'in Jira'sında bununla ilgili bir hata kaydı girilmiş: https://jira.jboss.org/jira/browse/RF-3697
Kayıttan da anlaşıldığı gibi sorunu 3.3.0 ile birlikte gelecek olan
TinyMCE bileşenini Richfaces'tan önce geliştirdiğimize mi sevineyim, var olan sorunlar nedeniyle Richfaces'ın yeni sürümünde gelecek olan gerçekleştirime geçmek zorunda kaldığımız için harcanan emeğe mi üzüleyim bilemedim :)
14.11.2008
En Basit Tasarım Örüntüsü Singleton (mu?)
public class DateUtils {
private static DateUtils instance = null;
private DateUtils() {}
public static DateUtils getInstance() {
if(instance == null)
instance = new DateUtils();
return instance;
}
...}
Böyle bir kullanım çoklu işletim dizilerinde (multithreads) sorunlara neden olabilmektedir. Aynı anda iki farklı işletim dizisinin instance niteliğini kontrol etmesi ve null görmesi sonucu iki farklı olgunun yaratılma olasılığı vardır. Bunun önüne iki şekilde geçilebilir. İlki sınıfın static niteliğinin uygulama ayağa kalkarken yaratılması:
public class DateUtils {
private static DateUtils instance = new DateUtils();
private DateUtils() {}
public static DateUtils getInstance() {
return instance;
}...
}İkincisi ise getInstance() yönteminin synchronize hale getirilmesi. Tüm yöntemin senkron hale getirilmesi, sadece nesnenin null durumunda kontrol edilmesi gereken, nesne yaratıldıktan sonra da performansa olumsuz etki yapan bir durum olduğu için kullanımından kaçınılmaktadır. Bunun yerine instance niteliği null ise senkronu başlatan bir yöntem tercih edilmiştir:
public class DateUtils {
private static DateUtils instance;
private DateUtils() {}
public static DateUtils getInstance () {
if(instance == null) {
synchronized(DateUtils.class)
{
if(instance == null)
instance = new DateUtils();
}
}
return instance;
}
}Ne var ki “Double-Checked Locking” olarak bilinen bu yöntem JDK 5’ten önce çalışmıyor. Ayrıntılı bilgiye “The Double-Checked Locking is Broken Declaration” bağlantısından ulaşabilirsiniz. JDK 5 ile gelen volatile bu
sıkıntıya derman oluyor:
public class DateUtils {
private volatile static DateUtils instance;
private DateUtils() {}
public static DateUtils getInstance () {
if (instance == null) {
synchronized(DateUtils.class)
{
if (instance == null)
instance = new DateUtils();
}
}
return instance;
}
}Singleton örüntüsünde dikkat edilmesi gereken bir başka husus ise sınıf Clonable arayüzünü gerçekleştiren bir başka sınıftan türetilmişse ortaya çıkıyor. Singleton sınıfımızın clone() yöntemi ile çoğaltılmasının önüne geçmek istiyorsak bu metodun üstüne yazmamız gerekiyor:
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}


