SublimeText 2 editörünü kullanmaya başladım. Daha bir hafta oldu ama php ile geliştirme yaparken pek problemler ile boğuştuğumu söyleyemem.
Debug konusu sıkıntılı şu an. Ancak buna henüz ihtiyacım olmadı. Olunca bakacağım.
Şu ana kadar çok az RAM yemesi, CPU yu neredeyse koklaması hasebiyle, ayrıca GIT pluginiyle tam bir geliştirme ortamı sunduğunu söyleyebilirim. Tavsiye ederim de...
Python dilinde de geliştirme yapmak o kadar zor değil SublimeText 2 editör ile...
java etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
java etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
30 Mayıs 2013 Perşembe
23 Mart 2009 Pazartesi
Url Rewrite Filter ile arama moturu dostu URL yapmak...
Öncelikle arama motoru dostu bağlantılar artık moda olduğundan eninde sonunda karşınıza çıkacaktır. Neden mi? Çünkü MODA!
Peki Java'da bunu nasıl yaparız? Php de bir çok örneği var. Mesela Apache Http sunucusunun mod_rewrite eklentisi ile bunu php , perl v.b. destekli sunucularda yapmak kolay. Hatta php de buna özel betikler var.
Java'da bu soruna merhem olan API ler mevcut. Ben http://urlrewritefilter.googlecode.com adresindeki api kullanarak bir örnek yapacağım. Diğer ulaşılabilir adres ise http://tuckey.org .
Mesela yapmak istediğimiz şunlar olsun :
Önce Eclipse'de bir web projesi oluşturun. Bunun /WEB-INF/lib dizini altına urlrewrite-3.2.0.jar'ı ekleyin. Sonrasında ise /WEB-INF/urlrewrite.xml dosyası oluşturun. Adı urlrewrite.xml olan dosya sizin arama motoru dostu bağlantılarınızın kaynağı olacaktır. Sebebi burada geçerli bağlantı dokularını - url pattern - belirteceksiniz. Belirtilen bağlantı dokularına uyan bağlantılar o kurallara göre işletilerek istediğimizi elde edeceğiz.
Bağlantı dokularında dikkat edilmesi gereken bazı noktalar mevcut:
Kural örneği resmi:

index.jsp:

Gerisi sizin hayal gücünüze kalmış...
Örnek bir Eclipse projesi : örnek proje
Projeyi indirip baktığınızda daha iyi anlayacaksınız.
Peki Java'da bunu nasıl yaparız? Php de bir çok örneği var. Mesela Apache Http sunucusunun mod_rewrite eklentisi ile bunu php , perl v.b. destekli sunucularda yapmak kolay. Hatta php de buna özel betikler var.
Java'da bu soruna merhem olan API ler mevcut. Ben http://urlrewritefilter.googlecode.com adresindeki api kullanarak bir örnek yapacağım. Diğer ulaşılabilir adres ise http://tuckey.org .
Mesela yapmak istediğimiz şunlar olsun :
- index.jsp yerine
/index - index.jsp?id=44&baslik=Teneke-adam yerine
/index/44/Teneke-adam olsun
Önce Eclipse'de bir web projesi oluşturun. Bunun /WEB-INF/lib dizini altına urlrewrite-3.2.0.jar'ı ekleyin. Sonrasında ise /WEB-INF/urlrewrite.xml dosyası oluşturun. Adı urlrewrite.xml olan dosya sizin arama motoru dostu bağlantılarınızın kaynağı olacaktır. Sebebi burada geçerli bağlantı dokularını - url pattern - belirteceksiniz. Belirtilen bağlantı dokularına uyan bağlantılar o kurallara göre işletilerek istediğimizi elde edeceğiz.
Bağlantı dokularında dikkat edilmesi gereken bazı noktalar mevcut:
- from etiketlerinde yazılan bağlantı dokuları ya da regex patternlerde
? yerine \?, = yerine \= , & yerine amp; kullanın. - Bağlantılarınızı otomatik outboundrule ile oluşturmak için kesinlikle response.encodeURL() kullanın. Örn: response.encodeURL("/index.jsp?id=44&baslik=dayimin-oglu"); gibi. Siz normal yazın ancak response.encodeURL() ile arama motoru dostu url olsun! Ancak unutmayın eğer bağlantı dokusunda - regex pattern - (^/index.jsp\?id\=([0-9]+)amp;baslik\=([0-9][a-zA-Z]+)$) olduğunda siz response.encodeURL("/index.jsp ....") index.jsp'nin önünde "/" işereti olmaz ise aynı dokuya denk değildir! Bunu unutmayın!
Kural örneği resmi:

index.jsp:

Gerisi sizin hayal gücünüze kalmış...
Örnek bir Eclipse projesi : örnek proje
Projeyi indirip baktığınızda daha iyi anlayacaksınız.
20 Mart 2009 Cuma
Ah filtre vah filtre, amanında web.xml
Evet filtre javada bir nimet olsa gerek. Hele request ve response nesnelerini değiştirme olanığınıyla tanıştıktan sonra acayip bir sevgidir aldı başını gitti içimde...
Neyse yine bir sorunla başlayalım. Sorunlar olmasa hayat çekilmez olurdu herhalde.
Sorun: Daha önce her şeyi ile doğru dürüst çalışan yönetim paneliniz vardır. Daha önce diyorum, çünkü, artık düzgün çalışmıyordur. Eskiden, yönetim paneliniz aracılığıyla girdiğiniz içeriklerde hiçbir sıkıntı olmadığını varsayıyoruz.
Örneğin: Türkçe içerik girdiğinizde hiç bir sorun yaşamıyordunuz. Fakat bir başka işlemi gerçeklemesi için "IkinciFiltre" adında bir filtre yazıyorsunuz. Her şey çok iyi görünürken bir de karşınıza daha önce çözdüğünüz ; Türkçe karekter sorununu ile yine burunburuna kaldınız.
Bu canınızı sıkmıştır. Muhtemelen "IkinciFiltre" her şeyi bozuyordur. Doğrudur. Ancak nasıl? Ve neden?
Burada basitçe filtreler ile alakalı bir kaç şey bilmek lazım herhalde. Filtrelerin ayaklanması ile alakalı işlem adımları aşağıda sırasıya verilmiş
Yukarıda anlatınları daha iyi anlamanıza yardımcı olabilecek bir adet resim aşağıda verilmiştir.
Burada S1, S2, S3 servlettir. F1, F2, F3 filtredir. Okların akış yönü tarayıcının isteğinden - request - sunucuya ve ilgili web bileşenlere doğrudur.
Kaynaklar:
Neyse yine bir sorunla başlayalım. Sorunlar olmasa hayat çekilmez olurdu herhalde.
Sorun: Daha önce her şeyi ile doğru dürüst çalışan yönetim paneliniz vardır. Daha önce diyorum, çünkü, artık düzgün çalışmıyordur. Eskiden, yönetim paneliniz aracılığıyla girdiğiniz içeriklerde hiçbir sıkıntı olmadığını varsayıyoruz.
Örneğin: Türkçe içerik girdiğinizde hiç bir sorun yaşamıyordunuz. Fakat bir başka işlemi gerçeklemesi için "IkinciFiltre" adında bir filtre yazıyorsunuz. Her şey çok iyi görünürken bir de karşınıza daha önce çözdüğünüz ; Türkçe karekter sorununu ile yine burunburuna kaldınız.
Bu canınızı sıkmıştır. Muhtemelen "IkinciFiltre" her şeyi bozuyordur. Doğrudur. Ancak nasıl? Ve neden?
Burada basitçe filtreler ile alakalı bir kaç şey bilmek lazım herhalde. Filtrelerin ayaklanması ile alakalı işlem adımları aşağıda sırasıya verilmiş
- Web.xml'de önce filtreler ayaklanır - initialize -
- Ayaklanan filtrelerin önce init() fonksiyonları daha sonra ise bağlantı örüntüsü - url pattern - kimin sorumluluk alanına giriyorsa o filrelerin doFilter() fonksiyonları çalışır.
- Web.xml'de girilen sırada, yukarıdan aşağıya çağrılırlar. Eğer bir bağlantı örüntüsü birden fazla filtrenin sorumluluğunda ise web.xml'de hangisi ön sırada tanımlanmışsa onun doFilter() fonksiyonu çağrılır.
- Aynı bağlantı örüntüsü sorumluluk alanına giren birden fazla filtre var ise önce ilk tanımlanın doFilter() fonksiyonu çağrılır. Ardından ikinci filtreye birinci filtrenin doFilter() fonksiyonu içinde çağrılan chain.doFilter() fonksiyonuyla geçilir. Sonra n adet filte sırasıyla bu işlemi yapar. Ve zincirin - chain - en altındaki filtre işlemini tamamlarsa yani doFilter() son satırına kadar çalıştırılırsa bu sefer adımların tersinden, n. filtreden ikinciye oradan da birinci filtreye geri dönülür ve en son ilk çalışan filtrenin doFilter() fonksiyonu tamamlanır.
- Eğer zincirin en sonunda servlet var ise servlet çalışmasını bitirsikten sonra zincirin en son halkasında olan filtreye görev geri teslim edilir. doFilter() fonksiyonuna tamamlayan en son filtre görevi bir üste ve ... En son ilk çalışan filtre çalışmasını bitirir.
Yukarıda anlatınları daha iyi anlamanıza yardımcı olabilecek bir adet resim aşağıda verilmiştir.
Burada S1, S2, S3 servlettir. F1, F2, F3 filtredir. Okların akış yönü tarayıcının isteğinden - request - sunucuya ve ilgili web bileşenlere doğrudur.
Kaynaklar:
- http://java.sun.com/products/servlet/Filters.html
- http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-filters.html?page=1
18 Mart 2009 Çarşamba
Bir problemim var "String" ile...
Geçen gün bir hata ayıklama - debug - işlemi sırasında bir String tipinde nesneyi split fonksiyonu ile parçalara ayırdığınızda, bu parçalardan her birinin asıl nesnenin değerinin bir kopyasını da taşıdığını gördüm.
Aslında bunun böyle olduğunu ilk başta anlamadım. :)
İlk aklıma gelen soru şu idi: Alla alla nasıl olurda parçaladığım nesnenin değeri her bir parçanın içinde bulunur ve parçaların değerleri ile value özelliği - attribute - aynı değeri taşımaz?
Yani nesne değeri başka , nesne.value -> String.value <- değeri başka mı ? Nasıl olurda String tipinde bir nesne split fonksiyonuyla n adet parçaya ayrılır ve bu parçalardan her biri olan String tipindeki nesnecikler asıl nesnenin - parçaladığımız nesne - değerini taşır?

Yukarıda bu hata ayıklama işlemini görebilirsiniz.
Sonra şu aklıma geldi: Bir parçadan asıl nesnenin değerine ulaşabilir miyim?
Evet bu fikir takıldı kafama ve uyuyamayacaktım ben de araştırmaya başladım internette...
Bu değeri nasıl alabilirdim? Ve bu değer neden nesnenin parçalarında bulunuyordu?
Sonra Allah'a şükür etmek istiyorum ki; java iyi ki açık kaynak kod - open source -.
OpenJDK'dan java.lang.String nesnesinin kaynak kodunu buldum.
Evet anahtar özellik "private final char value[];". Bu özellik eğer String tipinde bir nesne oluşturulunca değerinin bir kopyası value de tutuluyor olması. :) İşte sorumun cevabına yaklaşma anı! Ancak bu value private :) yani ben nasıl ulaşabilirim bu özelliğin değerine?
Evet onun cevabı da Reflection ...
Aşağıdaki kod parçasıyla bu değeri almayı başardım:
Peki bunu başardım ama bu String nesnesini parçaladım bir örüntüye göre - pattern - ancak hepsinde asıl nesnenin değerinin olması biraz pahalı bir işlem değil miydi?
Yani value private final idi...
Her parça aynı nesnenin value özelliğine bir adres ile işaret etmiyorsa - pointer - bu kadar hafızayı boş yere heba etmenin ne anlamı vardı? GC'ye o kadar güveniyorlardı yani?
Yukarıda verdiğim java kodunu çalıştırırsanız enterasan bir sonuç çıkıyor:
burada farklı olan [C42e816 yani yeni bir String tipinde nesnedir. Diğerleri ise split ile parçlanmış nesnenin parçacık nesneleri ...
Ve aynı özelliği - value - paylaşıyorlar!
Hem private final bir özellik ve hem de parçalara ayrılmış nesnenin tüm parçacık nesnelerinde aynı tip dolayısıyla aynı değer !
Neyse sonunda bazı şeyleri çözmüş ve rahatlamış olarak uyudum.
Anlamış olmasamda...
Aslında bunun böyle olduğunu ilk başta anlamadım. :)
İlk aklıma gelen soru şu idi: Alla alla nasıl olurda parçaladığım nesnenin değeri her bir parçanın içinde bulunur ve parçaların değerleri ile value özelliği - attribute - aynı değeri taşımaz?
Yani nesne değeri başka , nesne.value -> String.value <- değeri başka mı ? Nasıl olurda String tipinde bir nesne split fonksiyonuyla n adet parçaya ayrılır ve bu parçalardan her biri olan String tipindeki nesnecikler asıl nesnenin - parçaladığımız nesne - değerini taşır?

Yukarıda bu hata ayıklama işlemini görebilirsiniz.
Sonra şu aklıma geldi: Bir parçadan asıl nesnenin değerine ulaşabilir miyim?
Evet bu fikir takıldı kafama ve uyuyamayacaktım ben de araştırmaya başladım internette...
Bu değeri nasıl alabilirdim? Ve bu değer neden nesnenin parçalarında bulunuyordu?
Sonra Allah'a şükür etmek istiyorum ki; java iyi ki açık kaynak kod - open source -.
OpenJDK'dan java.lang.String nesnesinin kaynak kodunu buldum.
Evet anahtar özellik "private final char value[];". Bu özellik eğer String tipinde bir nesne oluşturulunca değerinin bir kopyası value de tutuluyor olması. :) İşte sorumun cevabına yaklaşma anı! Ancak bu value private :) yani ben nasıl ulaşabilirim bu özelliğin değerine?
Evet onun cevabı da Reflection ...
Aşağıdaki kod parçasıyla bu değeri almayı başardım:
String msg = "*141#3#123455666656564645#";
StringTokenizer st = new StringTokenizer(msg, "*");
String ilk = st.nextToken();
StringTokenizer st2 = new StringTokenizer(ilk, "#");
String ikinci = st2.nextToken();
String ucuncu = st2.nextToken();
String aman = "tamam";
Class t = String.class;
Field f = t.getDeclaredField("value");
f.setAccessible(true);
System.out.println(f.get(ucuncu));
System.out.println(f.get(ikinci));
System.out.println(f.get(ilk));
System.out.println(f.get(msg));
System.out.println(f.get(aman));
Peki bunu başardım ama bu String nesnesini parçaladım bir örüntüye göre - pattern - ancak hepsinde asıl nesnenin değerinin olması biraz pahalı bir işlem değil miydi?
Yani value private final idi...
Her parça aynı nesnenin value özelliğine bir adres ile işaret etmiyorsa - pointer - bu kadar hafızayı boş yere heba etmenin ne anlamı vardı? GC'ye o kadar güveniyorlardı yani?
Yukarıda verdiğim java kodunu çalıştırırsanız enterasan bir sonuç çıkıyor:
System.out çıktıları:
[C@addbf1
[C@addbf1
[C@addbf1
[C@addbf1
[C@42e816
burada farklı olan [C42e816 yani yeni bir String tipinde nesnedir. Diğerleri ise split ile parçlanmış nesnenin parçacık nesneleri ...
Ve aynı özelliği - value - paylaşıyorlar!
Hem private final bir özellik ve hem de parçalara ayrılmış nesnenin tüm parçacık nesnelerinde aynı tip dolayısıyla aynı değer !
Neyse sonunda bazı şeyleri çözmüş ve rahatlamış olarak uyudum.
Anlamış olmasamda...
Kaydol:
Kayıtlar (Atom)
