Eclipse ( rational ) açılmıyor

Standard

IBM in eclipse’i 🙂 Bir gün normal yoldan kapanmayınca ben de görevi sonlandırıverdim; “bu makina benim için bitti, bi daha da açılmam” deyip gitti 🙂 splash ekranindan öteye geçmiyordu. Kaldırdım, yeniden kurdum, guncelledim, javayi guncelledimse de bi daha açamadım. Workspace i seçtikten sonra biraz durup “.log” dosyasina bak deyip kapanıyordu.

Log da şöyle bişey :
java.lang.VerifyError : JVMVRFY036 stack underflow; class=org/eclipse/jface/viewers/ContentViewer

Hep overflow olacak değil ya bu sefer underflow 🙂 Neyse, açıkcası tam olarak ne olduğunu anlamadım; sonunda kurulum sırasında seçmemi istedigi benim de sen nasıl dersen o olsun dedigimde kuruldugu klasore “SDPShared” ismiyle actigi klasorun altindaki “plugins” klasorundeki ( yani SDPShared\plugins ) org.eclipse.jface li butun jarlari, gidip calisan birininkilerle degistirdim. Şimdilik barıştık bakalım.

Reklamlar

Hibernate; basit örnek

Standard

Genelde bir konuya başlamak için üzerinde denemeler yapabileceğimiz minimum seviyede hazır bişeyler arıyoruz. Çalışabilir olsun, en az seviyede hazır olsun, karmaşık olmasın, vs.. sonra biz onun üzerinde oynayarak devam edelim. O örgünün örneğini birisi çıkarıverse, gerisi kolay 🙂

Yapabildiğim kadar hibernate için öyle bir başlangıç yapmaya çalışayım. Bu belki hibernate’in asıl özelliklerini göstermeyecek bile, ama oraya gitmek için üzerinde deneme yapabileceğiniz bir ortam sağlayabilir. Konfigurasyonlar, annotations’lar, tablo-sinif map’lemeleri, vs… gibi seylere girmiyorum.. sadece bu zımbırtı üzerinden veritabanına erişip bırakıyoruz.

Önce bu aracı kullanabilmek için, normal olarak bu araca ihtiyacınız var 🙂 Buradan ( http://sourceforge.net/projects/hibernate/files/hibernate4/ ) zip dosyasını indirebilirsiniz. Ayrıca hangi veritabanını kullanıyorsanız onun Driver’larına ihtiyacınız olacak. Bunu da ilgili veritabanının sitesinden büyük ihtimalle bulursunuz. Bu jdbc icin kullanacaginiz driver. Sonucta bu aşamanın sonunda elinizde , hibernate ve ilgili veritabanı icin bir takım jar dosyaları olacak.

Burada bahsedecegimiz basit haliyle indirdiginiz zip dosyasını açtığınızda icinden cikan klasorunun icindeki (lib\required) deki jarlar yeterli. Buradaki jarlari ve veritabanı icin gereken jarlari projenizin lib’lerine ekleyin. (Netbeans veya Eclipse de, projenize sağ tıklayıp, menunun altlarındaki Properties’ten açılan yerden bunu yapabilirsiniz. Notepad kullanıyorsanız, buna gerek yok 🙂 )

Şimdi basit deneme kodunu yazmaya geçelim. Basit bir sınıf oluşturup main metodunu aşağıdaki gibi yazarak basit denemenizi yaparsınız.


public static void main(String[] args) {
Configuration conf = new Configuration();

conf.setProperty("hibernate.dialect", "org.hibernate.dialect.DB2Dialect");
conf.setProperty("hibernate.connection.url", "jdbc:db2://100.100.100.100:50000/VT");
conf.setProperty("hibernate.connection.username", "kull");
conf.setProperty("hibernate.connection.driver_class", "com.ibm.db2.jcc.DB2Driver");
conf.setProperty("hibernate.connection.password", "parola");

SessionFactory sesF = conf.buildSessionFactory();
Session ses = sesF.openSession();

List<Object[]> res = ses.createSQLQuery("select * from tablo").list();

System.out.println(" size : " + res.size());
System.out.println(" test : " + res.get(0)[0]);

ses.close();

}

Açıklamalar :
-dialect, driver_class, url deki degerler kullandiginiz veritabanina ozel:
mesela dialect için;
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQL5InnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle 8i org.hibernate.dialect.Oracle8iDialect
Oracle 9i org.hibernate.dialect.Oracle9iDialect
Oracle 10g org.hibernate.dialect.Oracle10gDialect

gibi..

-conf.buildSessionFactory() depricate olmus bunun yerine bunun parametreli hali gelmiş, bununla ilgili aşağıdaki şeklini deneyebilirsiniz.

-res.get(0)[0] ; tipinden de anladiginiz gibi bu dizi listesi, listede satirlar, dizide de alanlar var. yani mesela, “select isim, soyad, numara ..” demisseniz ve 3. kayittakinin soyadini ogrenecekseniz res.get(2)[1]…

ikinci ornek

public static void main(String[] args) {
Configuration conf = new Configuration();

Map sett = new HashMap();
sett.put("hibernate.dialect", "org.hibernate.dialect.DB2Dialect");
sett.put("hibernate.connection.url", "jdbc:db2://100.100.100.100:50000/VT");
sett.put("hibernate.connection.username", "kull");
sett.put("hibernate.connection.driver_class", "com.ibm.db2.jcc.DB2Driver");
sett.put("hibernate.connection.password", "parola");

ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(sett);
SessionFactory sesF = conf.buildSessionFactory(srb.buildServiceRegistry());

Session ses = sesF.openSession();

List<Object[]> res = ses.createSQLQuery("select * from tablo").list();

System.out.println(" size : " + res.size());
System.out.println(" test : " + res.get(0)[0]);

ses.close();

}

– bu ikisi arasinda fark, depricate oldugundan dolayi farkli bir metodun kullanilmasi; diger taraftan conf. bilgilerinin veriliş şekli. Bunu farklı şekillerde yapabilirsiniz ve hatta genelde de bu şekilde yapmazsınız. xml veya properties doysasina yazip, onlardan okutarak aktarmak şeklinde kullanırsınız.

MMYYYY ya da YYYYMM

Standard

DB2’dayım tarihlerle işim var.

TO_DATE( ay|| yil,'MMYYYY') not between bas_tar and bit_tar

gibi birşey yapıyorum. Fakat bir yerde takılıyor. Gelen hata :

cannot be interpreted using format string \"MMYYYY\" for the TIMESTAMP_FORMAT function.. SQLCODE=-20448, SQLSTATE=22007

Biraz sonra bunun 3,4,5 gibi aylarda oldugunu görüyorum. Sorun şu ; 2009’un 4. ayı için 42009 olusuyor ve ilk iki rakami (42) ay (MM) olarak yorumlamaya kalkinca sorun oluyor, yila da zaten 009 kaliyor. Yerlerini değitirince sorun kalmıyor. Yani

TO_DATE( yil|| ay,'YYYYMM') not between bas_tar and bit_tar

Artik once yili alinca sonda tek rakam kalmasi sorun cikarmiyor 🙂

Sonra uyanıyorum 🙂

Smarty’de değişkendeki template

Standard

PHP de templateler için smarty kullanırken template’inizi bir .tpl dosyasında tutup $smarty->display(‘main.tpl’); gibi birşey demek yerine, template’iniz bir stringde ise ( bir değişkende kod içinde oluşturmuş veya template’lerinizi veritabanında tutuyor olabilirsiniz ) bu durumda

$smarty->display('string:'.$tmplDegiskeni)

diyebiliyorsunuz.

Yemleri de koyalım : smarty, from variable, template, display, instead tpl file, değişken, string,

Websphere ve Türkçe

Standard

IBM Installation Manager da , Rational ve Websphere Application Server kurmaya çalışırken “Websphere Application Server … is currently running. please shut it down to continue” gibi bir mesaj alırsanız, daha yeni kuruyom, olmayan şey nasıl çalışıyor olabilir demeden önce bilgisayarınızın dil ayarları türkçe ise english yapip yeniden deneyin. İngilizce yaptıktan sonra Installation Manager’ı da yeniden başlatın, yoksa bu sefer de başka bişey için anlamsız hata verebiliyor.

Tek mi Çift mi? Ya da sanat sanat için mi?

Standard

Bir sayının tek mi çift mi olduğunu belirleyen bir fonksiyon yazmamız gerekirse genelde yaptığımız şu:

function tekMi(sayi){
if(sayi % 2 == 0)
return false;
else
return true;
}

Bu şöyle daha iyi olabilir.

function tekMi(sayi){
return (sayi % 2 == 0) ? false : true;
}

0 ve 1 in boolean yorumlanmalarına güvenerek şu hale getirirsek daha güzel olur.

function tekMi(sayi){
return (sayi % 2);
}

Yok dönüş tipi illa boolean olacak derlerse de, javascript icin !! ile halledebiliriz, hem de güzel görünür;

function tekMi(sayi){
return !!(sayi % 2);
}

Kodlar hem kısaldı hem de bence estetik hale geldi ama koddaki estetik hep böyle faydayla birlikte mi gelir.

Geçenlerde başka bir konu için gördüğüm örnek kodları çok beğenmistim.

function tekMi(sayi){
if(sayi == 0) return false;
else return ciftMi(--sayi);
}

function ciftMi(sayi){
if(sayi == 0) return true;
else return tekMi(--sayi);
}

Bu kodları güzel bir manzarayı izler gibi izledim, bence çok güzellerdi 🙂

Gerçi bu kodları gördüğüm yerdeki problem “tek mi cift mi” yi bulmak degildi ama yukarıdaki tek satırlık şeylerle aynı işi yapmak için bu kadar kod yazmak çok uygun degil. Üstelik tek problem de bu değil. Zaman olarak da maliyetli. Dahası da var; burada en az sorguladığımız sayı kadar fonksiyon çağrısı var ve bunların her biri stack te yer demek ve büyük bir sayıyı sorgulayınca “stack overflow” hatası alırız.

Fakat bütün bu sorunlara göre bence harikaydılar.

Pratikte kullanır mısın? demeye bile gerek yok, kesinlikle kullanılmaz ama bu sekilde bir kod yazana da buyuk saygı duyarim 🙂 Bazen sanat sanat icindir. 🙂

JQuery ile çakma tıklama

Standard

Sayfada bir yere tıklanmış gibi yapmak gerektiginde ( ya da başka bir olay ) jquerydeki trigger kullanılabilir. Bu olayın ismi verilerek çağrılabilir.

$("img").trigger("click");

img’ler onlara tıklanmış gibi davranır. Fakat resimlerde belli bir noktaya tıklanmış gibi yapmak isterseniz ya da o olayı işleyen yerde event.pageX gibi bir bilgi kullanılıyorsa ( veya başka olaylarda başka bilgiler) yukarıdaki şekilde sorun olabilir. Çünkü bu bilgi orada undefined olacaktır.

Bunun için bu metodun bir de event nesnesi alan versiyonu var. Önce bir event nesnesi oluşturup, onu kullanabilirsiniz.

var ev = $.Event("click");
ev.pageX = 100;
$("img").trigger(ev)

Artık resimlere o noktada tıklanmış gibi davranıyor. O noktada aslında resim olmasa da.

Burada sadece bilinen özelliklerin ayarlanması şart değil. Şu da olabilir.

var ev = $.Event("click");
ev.pageX = 100;
ev.kim = "tafa";
$("img").trigger(ev)

Bu bilgiyi kullanırken de

$("img").click( function(e){ console.log(e.kim) } );

Olayı işleyen fonksiyona veri aktarmak için başka yollar da var tabi ama buradaki çakma olaylar tetiklemekle ilgili bir örnek.

:: trigger,jquery,fake,event, fake event ::