Yahoo dan “Request Token” alırken problem

Standard

Sitenizde gelen kullanicinin yahoo dan contact listesini alip davet filan gondereceksiniz mesela. Gittiniz yahoo ya projeyi kaydettiniz, app_id nizi, consumer key / secret inizi filan aldınız. Request token icin url i olusturdunuz ( https://api.login.yahoo.com/oauth/v2/get_request_token?….. ) ama dosya bulunamadı ( file not found ) gibi bir hata aldınız.

Öncelikle aslında dosya bulamama meselesi değil bu. Firebug dan bakarsanız “401 Forbidden” ı görürsünüz. Ayrıca “Yanıt Başlıkları” na bakarsaniz da, “WWW-Authenticate OAuth oauth_problem=signature_invalid” gibi bisey gorursunuz, baska parametrelerle ilgili problemleriniz varsa burasi ona göre degisir.

Büyük ihtimalle problem ( sitede aslında açıklamış ama hızlı geçince gözden kaçıyor ) ; oauth_signature parametresinde projeyi kaydederken aldıgınız Consumer Secret olacak, burayı yanlış yazmış olabilirsiniz. Dahası eğer oauth_signature_method için plaintext demişseniz oauth_signature ın sonuna %26 eklemeniz lazim.

Okur yazar gson

Standard

Elimdeki Collectiondaki elemanlari json olarak bi dosyaya yazayım dediğimde çok sorun yok.

Collection col = bizimElemanListesiGetir(...);
//String path = ".....";
File file = new File(path + "elemanlar.json");
file.createNewFile();
Writer writer = new FileWriter(file);
//dogrudan dosyaya json olarak gonder.
gson.toJson(col, writer);
writer.close();

fakat bunlari okurken şunu yapmaya çalışırsanız ve

File file = new File(path + "elemanlar.json");
Reader reader = new FileReader(file);
Collection col = (Collection) gson.fromJson(reader, Collection.class);

Generic olmasiyla ilgili bir sorun olursa ve java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap gibi hatalar alınırsa;

şunu denemeli


Type colType = new TypeToken<Collection>() {}.getType();
Collection col = new Gson().fromJson(reader, colType );

Burdaki Type java.lang.reflect.Type ve TypeToken da com.google.gson.reflect.TypeToken .

Sayfa yönlenmiyor

Standard

Sitenize gelen bir istegi baska bir uri ye yönlendirmek isterken, sadece

response.setHeader("Location", "http://www.tafali.net");

yaptiginizda, sitenizden cevap kodu olarak 200 gittiği için yönlendirme çalışmayabilir. Buna ek olarak şunu da eklemeli.

response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

SC_MOVED_PERMANENTLY yerine SC_MOVED_TEMPORARILY ya da SC_FOUND filan da olabilir tabi.

Apache / Tomcat – PHP / Java

Standard

Kardeşime eski kasayı gönderdim birkac site denemesi yapmak icin dükkana koyuver dedim. Bir wamp ve  bir tomcat7 kurmus. Sitenin PHP olanını wamp a koyup calistirdim, digerine de 8080 portundan erisebiliyoruz ama butun isteklerin apache ile karsilayip, tomcat e gidecek olanlari ona aktarma kisminda acemi olunca biraz ugrasmak gerekti.

Birkac yontem varmis bu is icin. Biz şöyle birşeyle hallettik.

  • Apache (wamp) deki httpd.conf dosyasinda “LoadModule proxy_module modules/mod_proxy.so” satırını actık. 

Fakat bu kadarla bırakırsanız, siteye ulasmaya calışınca 500 hatası alıyorsunuz, yanlış konfigurasyon filan diyor.

log dosyasinda “[warn] proxy: No protocol handler was valid for the URL /http-bind/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.”  uyarısı çıkıyor.

Biraz aşağıdaki “LoadModule proxy_http_module modules/mod_proxy_http.so”  satırını da açınca sorun kalmadı. 

  • Bir de aşağıdaki gibi VirtualHost tanımı girince halloldu. 

<VirtualHost *:80>
ServerAdmin aaa@bbb.com
DocumentRoot “C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\Kedi”
ServerName kedi.cik

ProxyRequests Off
ProxyPass / http://localhost:8080/Kedi/
ProxyPassReverse / http://localhost:8080/Kedi/
</VirtualHost>

 

PHP; oturum değişkeni

Standard

Yine bir ben yandım eller yanmasın durumu. Diyelim ki oturumda isim bilgisi tutuyorum,

$_SESSION['isim'] = "cevat";

Sonra da başka bir iş için bir değişken oluşturmak istiyorum ve değişkenimin ismi $isim;

$isim = new AAA(5);

Artık $_SESSION[‘isim’] kullandığım yerler bana kızabiliyor, mesela;

" bla bla " . $_SESSION['isim'] . " bla bla";

gibi yerlerde Catchable fatal error: Object of class AAA could not be converted to string in gibi hatalar… Ya da tersi, oturum değişkenini sonra değiştirmiş olsaydim bu sefer de $isim hatalı olabilecekti.

Diyeceğim o ki; register_globals = on iken değişken isimlerinizle oturum değişkenlerinin isimlerine dikkat etmek lazım.

ExtJs Model hakkında

Standard

Javascript’te ExtJs kullanırken, veri nesnelerimizi tanımlamak için Model kullanabiliyoruz. Javada POJO’larla yaptığımız gibi. Bunun yapmak için Ext.data.Model ‘i genişletmek ve alanları tanımlamak yeterli. Aşağıda Ogrenci modelini tanımlayalım.

Ext.define("Tf.model.Ogrenci",
{
extend:"Ext.data.Model",
fields:[
{name:"isim", type:"string"},
{name:"yas", type:"int"}
]
}
);

İstersek Ogrenci sınıfımıza ihtiyacimiz olan metodları ( fonksiyonları ) da ekleyebiliriz. Aşağıda yaz() metodunu ekledik. Öğrenci bilgilerini gosteriyor.


Ext.define("Tf.model.Ogrenci",
{
extend:"Ext.data.Model",
fields:[
{name:"isim", type:"string"},
{name:"yas", type:"int"}
],

yaz: function(){
console.log("isim : " + this.get("isim") + " yas : " + this.get("yas") );
}
}
);

Ayrıca bu alanlar için validasyonlar da belirtebiliriz. Aşağıda isim alanı icin email ( anlamsiz ama olsun ) ve uzunluk kontrolleri ekledim.


Ext.define("Tf.model.Ogrenci",
{
extend:"Ext.data.Model",
fields:[
{name:"isim", type:"string"},
{name:"yas", type:"int"}
],

validations:[
{type:"length", field:"isim", min:3},
{type:"email", field:"isim" }
],

yaz: function(){
console.log("isim : " + this.get("isim") + " yas : " + this.get("yas") );
}
}
);

Bu şekilde tanımladığımız bu sınıfları nasıl kullanacağız peki. Öncelikle bu sınıfların nesnesini oluşturmak için birkaç yöntem var.

Ext.create ile:

og = Ext.create("Tf.model.Ogrenci", {isim:"mustafa"});

kendi create metodu ile ile:

o2 = Tf.model.Ogrenci.create({isim:"cevat", yas:33});

new ile ile:

o3 = new Tf.model.Ogrenci({isim:"asdaasd", yas:3322});

Artık ogrenci nesnemizi kullanabiliriz. Alanları değiştirmek için veya değerlerini almak icin get/set metodları var.

og.get("isim");
og.set("yas", 32);

gibi. ya da kendi tanimladigimiz metodu kullanabiliriz.

og.yaz();

Validasyon için de validate() metodu var. Eğer bir sorun varsa bize hata nesnesi döner. Dönen nesnenin icinde items dizisinde hataları gorebilirsiniz.

hata = og.validate()

Mesela isim icin “aa” girmis olsaydik bize iki hata donecekti. hata.items[] da bulabilirsiniz bunlari.

{ field="isim", message="is the wrong length"}
{ field="isim", message="is not a valid email address"}

Tabii ki bunun asıl kullanıldığı yer, proxy elemanı ile servera bağlanıp, dogrudan bu nesneleri veritabanına yazdırıp, yukleyip silebilme ( kendi load()/save()/destroy() metodları var. Bir anlamda Javascript içim ORM sayılır 😛 ) ve store ‘larda kullanarak, grid ve tree ‘leri kullanmak.

ORM dedim de tanımladıgınız modeller baska model tanımlarını iceriyorsa yada aralarinda iliskiler varsa bunlari da belirtebilirsiniz. Sinif modeli tanımlayıp, Sınıf n Ogrenci ye sahip olabilir diyebiliyorsunuz.

eclipse android out.xml

Standard

Başlık anlamsız oldu ama şöyle bişey, layout un altında mesela aaa.xml varsa bunda bir degisiklik yaptıktan sonra görmeye çalıştığınızda hata veriyor, aaa.out.xml dosyasini olusturup, sizi geriyor. Sonra farkediyorsunuz ki Run butonuna bastığınızda sizin o an açık olan tabınızdaki dosyayı çalıştırmaya çalışıyor.

Direk Run butonuna basmak yerine, yanindaki ok isaretinden sizin projeyi secseniz, ya da projeye sag tiklayip Run as’ e gelip Android Application larak güzel güzel seçseniz, o da güzel güzel çalıştırıyor.

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.

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 🙂