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.

Reklamlar

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.