15 Kasım 2007 Perşembe

Tomcat URL UTF 8 encoding problemi

Tomcat sunucuları ile çalışıyorsanız ve bir form üzerinden GET metodu ile türkçe karakter içeren veri yollarsanız, yolladığınız veri sunucu iç lojiğinde tam olarak UTF-8'e dönüşmüyorsa bu sorunun çözümü basit :
Tomcat Dizini/conf/server.xml dosyasını açın ve çalışan sunucunun <Connector port=.. şeklinde giden xml yaprağına URIEncoding="UTF-8" parametresini ekleyin ve tomcati yeniden başlatın.
Bu ayar ile URL üzerinden giden verileri (utf-8'e uygun encode edilmiş veri) sunucu düzgün şekilde dönüştürür.
Anlayamama ihtimaline karşı örnek ayar :

<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />

Çeşitli Javascript sınıfları

StringBuffer : Javascript'teki String nesneleri immutable yani daha sonradan büyütülemez özelliktedir ve siz 2 Stringi '+' işareti ile birleştirirseniz sonraki adımda javascript ile ilgili hafızada 2 kullanılmamış 1i yeni 3 tane String nesnesi yer alır eğer bu birleştirmeyi 5 tane String ile yaparsanız 2şer 2şer birleştirilir ve hafiza String çöplüğüne döner.
Bunu engellemek için StringBuffer sınıfını kullanarak String birleştirmesi yapmamız daha iyidir.

function StringBuffer(){
  this.__strings__ = new Array;
}
StringBuffer.prototype.append = function(str){
 this.__strings__.push(str);
 return this;
}
StringBuffer.prototype.toString = function(){
 return this.__strings__.join("");
}



onLoad Loader : Eğer sayfanın onload olayına birden fazla fonksiyon referansı atamak istiyorsanız, yani onload olayı için 1den fazla fonksiyonunuz var ise Loader sınıfı işinize yarayabilir. Yapmanız gereken onload olayı sırasında çağrılacak fonksiyonunuzu Loader.addOnLoad(fonk_adi) fonksiyonunu çağırarak eklemek.


var Loader = {
 loaded: false,
 addOnLoad: function(fn) {
  if (this.loaded) fn();
 else {
   var oldonload = (window.onload) ? window.onload : function () {};
   window.onload = function () { oldonload(); fn(); };
  }
 },
 init: function() {
  this.loaded = true;
 }
};
Loader.addOnLoad(Loader.init);


Vector : Java dili ile çalışanların mutlaka aşina olduğu bir sınıftır ve verileri saklamayı kolaylaştıran bir sınıftır. Alışkanlıktan olsa gerek bene javascriptte eksikliğini hissettim, Array tabanlı basit bir sınıf, tek sorunu prototype kütüphanesine ihtiyaç duyması fakat javascripte alışkın kişiler kolayca kendilerine uyarlayabilirler.



var Vector = Class.create();
Vector.prototype = {
 initialize : function(){
  this.array = new Array;
 },
 add : function(obj){
  this.array[this.array.length] = obj;
 },
 get : function(index){
  return this.array[index];
 },
 removeByIndex : function(index){
   this.array[index] = null;
 },
 size : function(){
  return this.array.length;
 },
 clear : function(){
   this.array = new Array;
 },
 getAsArray : function(){
  return this.array;
 }
}

 

11 Kasım 2007 Pazar

Ajax ile oluşturulan sayfaya javascript eklemek

Ajax ile dinamik olarak oluşturduğunuz sayfaya (bir div içine aldığnız form vs) dinamik olarak javascript eklemek istiyorsanız yapmanız gereken şudur :

var headID = document.getElementsByTagName("head")[0];
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = 'javascript_dosyasi.js';
headID.appendChild(newScript);

yukardaki kodu ajax ile alınan sayfanın içinde <script></script> blokları arasına koyun.
Bundan sonra javascript_dosyasi.js içinde yer alan fonksiyonlar dinamik olarak oluşturduğunuz nesnelerden çağırabileceksiniz.
Böyle bir şeye ne gerek var derseniz, örneğin bir ajax dialog kutusu yazdınız ve içine form gömeceksiniz ve form için bir sürü javascript fonksiyonu gereklidir, siz bu fonksiyonları içerecek javascript dosyasını önceden alabilirsiniz, eğer dialog kutusu her zaman çağrılmayacak ise gereksiz yere javascript dosyasını indirmiş olursunuz.
Javascript dosyasını dialog kutusu açıldığı zaman indirmek daha mantıklıdır işte bu noktada javascript fonksiyonlarının tanınmama ihtimali var bunun üstesinden gelmek için sayfanın head bloğuna dışarıdan alınacak javascript dosyasını dinamik olarak ekleriz.
Dialog kutusu ajax ile otomatik olarak oluşturulurken yukardaki kodları da çağırırsanız javascript dosyanız sayfaya eklenmiş olur ve sayfadaki her nesne o javascript dosyasındaki fonkiyonlara vs lere erişebilir.

7 Kasım 2007 Çarşamba

Appletten Javascript fonksiyonu çağırmak

Appletten Javascript fonksiyonlarını çağırmak için JSObject nesnesini kullanmalıyız.
JSObject nesnesi jre_dizini/lib klasörü içindeki plugin.jar içinde yer almaktadır. Yani JSObject nesnesini ve apilerini appletinizde kullanmak istiyorsanız projenizin kütüphanesine bu plugin.jar’ı da eklemelisiniz.
appletin init() metodu içinde tarayıcının JSObject nesnesine referansını almalıyız.


public void init(){
  jso = JSObject.getWindow(this);
}


jso referansını appletin herhangi bir yerinde kullanabiliriz. JSObject nesnesi ile javascript fonksiyonlarını çağırmak için applet içinden, aşağıdaki gibi bir fonksiyon çağrısı yapmalısınız.


if(jso != null )
try {
  jso.call(”fonksiyon_adi”, new String[] {parametreler,…});
}catch (Exception ex) {
  ex.printStackTrace();
}
}


Yukarıdaki 2 gösterim applet içinde JSObject nesnesine nasıl referans alınacağı ve JSObject referansı ile nasıl javascript fonksiyonu çağrılacağını göstermektedir. Appletimizde JSObject nesnesine referans alabilmemiz için html kodunda mayscript parametresinin true değerini alması gerekmektedir. Aşağıda örnek bir html kodu yer almaktadır.


<object type=”application/x-java-applet;version=1.4.1″ width= “800″ height= “600″ name=”jsap” id=”jsap”>
<param name=”codebase” value=”applet/”>
<param name=”archive” value=”applet.jar,plugin.jar”>
<param name=”code” value=”com.test.AppletMain”>
<param name=”mayscript” value=”yes”>
<param name=”scriptable” value=”true”>
<param name=”name” value=”jsapplet”>
</object>

 

MySQL UTF 8 Problemi

MySQL varsayılan karakter saklama (encoding) metodu olarak latin alfabesini kullanmaktadır. Bunu utf-8 olarak değiştirmek için linux’ta mysql konfigurasyon dosyasında bazı değişiklikler yapmamız gerekmektedir.
MySQL konfigurasyon dosyası genelde /etc/my.cnf dir bazı sistemlerde (örneğin ubuntu) /etc/mysql/my.cnf ‘dir. Bu dosyayı açıp [mysqld] yazan satırı bulup alt o kısıma default-character-set=utf8 parametresini eklemeliyiz, daha sonra [client] satırını bulup onun altına da “default-character-set=utf8″ satırını eklemeliyiz.
Bu parametreler ile veri tabanımızın dosyasını değiştirmiş olduk fakat veritabanı henüz değişikliklerden etkilenmedi, veritabanının bu değişikliklerden etkilenmesi için yeniden başlatılması gerekli bunun için root hakları ile /etc/init.d/mysql restart komutunu vermemiz yeterli. /etc/init.d/mysql scripti mysql sunucusun sciptidir eğer mysql sunucunuz farklı şekilde başlatılıyorsa o yöntemi kullanmalısınız ya da en son çare bilgisayarı yeniden başlatırsınız.
Bu dosyaya eklenen satırlar bazen nedense sunucuya etki etmiyor, eğer böyle bir durumla karşılaşırsanız mysql sunucusunu (mysqld) başlatan scriptte bir değişiklik yaparak çözüme ulaşabilirsiniz. /etc/init.d/mysql scriptini bir metin editörü ile açıp en altlarda yer alan case blounda ’start’) ile başlayan satırlarda /usr/bin/mysqld_safe komutunun olduğu satırı bulun ve /usr/bin/mysqld_safe komutunun yanına –character-set-server=utf8 parametresini ekleyin, dosyayı kaydedin ve mysqli yeniden başlatın. Bu adım ile büyük ihtimalle utf-8 problemi ortadan kalkacaktır.

Java Sanal Makinesi başlangıcı ve Classpath ayarları

**Bu yazı daha önce wordpressteki blogumda idi kapanma hadisesinden sonra yararlı gördüğüm için buraya aldım.

Java, Java Sanal Makinesi (JVM) ve bu makinenin içine alınan kütüphanelerden (bizim kodlarımız ve ana kütüphaneler vs.) oluşur. Java Sanal Makinesi (JVM) java kütüphaneleri 3 adımda bulur ve sanal makine içine alır.

1. Bootstrap classes (başlangıç sınıfları) : bu kütüphaneler Java Sanal Makinesinin ana kütüphaneleridir. Bu tür kütüphaneler bizim en temel olarak kullandığımız sınıfları barındırır (mesela java.lang.Object, java.lang.String vs vs). Genellikle jre_dizini/lib içinde yer alan jarlar bu tür kütüphanelerdir. En temel kütüphane rt.jar’dır. java.lang.Object sınıfı bu kütüphane içinde yer alıyor.
2 . Extension classes (Uzatılmış sınıflar) : bu kütüphaneler bizim 3.parti kütüphane olarak kullandığımız kütüphanelerdir. Genellikle jre_dizini/lib/ext klasörü içinde yer alan jar’lardır.
3. User classes (Kullanıcı sınıfları) : Bu tür kütüphaneler bizim kendi yazdığımız ve java programına yerlerini parametre olarak aktardığımız kütüphanelerdir. Eğer bir java programı yazdıysanız ve bu program 2 jardan oluşuyorsa ve 2 jarın içinde de birbirine ihtiyaç duyan sınıflar var ise bizim java programına bu jar’ların yerlerini başlangıçta parametre olarak belirtmemiz lazım ki java programı bu classları bulabilsin.

Java Sanal Makinesi başlarken İlk olarak ilk 2 adımdaki sınıf yüklemelerini gerçekleştirdikten sonra varsa bizim parametre ile yollarını belirttiğimiz sınıflar yüklenir.

JVM ‘ye kendi kütüphanelerimizin yolunu -classpath parametresi ile belirtiyoruz. Bunu bir örnekle daha iyi anlatabiliriz : /home/tayfun/javaTest klasörü içinde test.jar ve aynı dizinde çalıştırmak istediğim Test.class sınıfı yer alsın. Test.class sınıfı test.jar içindeki sınıflara ihtiyaç duyuyor olsun. Test.class’ı konsoldan çalıştırmak için şu komutu vermeliyiz : java -classpath /home/tayfun/javaTest/test.jar:. Test . Bu şekilde test.jar ve Test.class’ın yollarını JVM’ye belirtmiş oluyoruz ve JVM bu sınıflara ihtiyaç duyduğunda yükleyebilir.

Eğer yazdığınız kodlar bir klasör içinde yer alıyorsa o kodların başlangıç klasörünün yolunu göstermeliyiz. mesela kodlarınız /home/tayfun/javaTest/classlar altında yer alıyor olsun ve o klasörün içinde de com/mytest/… diye giden kodlarınız yer alsın bu durumda java -classpath /home/tayfun/javaTest/classlar:. Test şeklinde ana klasörün yolunu göstermeniz yeterlidir.

Bu classpath karmaşası ile uğraşmamak isterseniz 2.adımdaki yükleme aşamasını kullanabilirsiniz. oluşturduğunuz jarı jre_dizini/lib/ext klasörü içine atın ve çalıştırmak istediğiniz class’ı direkt çalıştırın. bir önceki örnekteki test.jar’ı bu şekilde 2.adımda bakılan klasörün içine atmış olsaydık java -classpath . Test komutunu vermemiz yeterli olurdu.

Daha ayrıntılı bilgi için :
Java.exe parametreleri
Finding Classes

6 Kasım 2007 Salı

SWT Programlama 2 - IDE seçimi

SWT programlarını yazmak için başlangıçta uygun bir IDE (yani geliştirmeyi yapacağınız program) bulmanız gerekli.
SWT programlama için en uygun IDE kuşkusuz Eclipse IDE'dir.
Neden Eclipse IDE'si diye sorarsanız öncelikle Eclipse, SWT ile yazılmış bir IDE'dir, 2. olarak Eclipse ile SWT programlama yaparken library path vs ayarlama ile uğraşmazsınız, direkt SWT sınıflarını oluşturup programlama yapmaya başlarsınız.
Ayrıca SWT programlamayı kolaylaştırmak için Visual Editor Project adı verilen SWT programlarını Visual Basic gibi görsel ve kolayca programlamanızı sağlayan bir eklentisi vardır. Visual Editor eklentisini SWT programlama yapacaksanız kesinlikle kurmalısınız çünkü işlerinizi inanılmaz kolaylaştırıyor ve hızlandırıyor. Visual Editor Project eklentisi Eclipse 3.2 sürümünde update seçeneği ile kolayca yüklenebiliyordu fakat Eclipse 3.3 sürümünün alt yapısındaki çeşitli değişikliklerden etkilenmiş olacak ki 7 Kasım 2007 itibari ile Eclipse 3.3 için uyumlu değil fakat 1-2 ay içinde uyum süreci biter diye tahmin ediyorum.
Eğer düzgün şekilde kurulabilen bir Visual Editor sürümü çıkarsa burada anlatmaya çalışacağım.

5 Kasım 2007 Pazartesi

Linux komutları

Linux komutları linuxa ilk başlayanların (eğer konsolu sık kullanmak zorunda ise) baş ağrısıdır. Peki nedir bu linux komutları.
Çoğu acemi linuxçu, linux komutlarını konsoldan çağrılan ve linuxun işlediği komutlar zanneder (yani arka planda nasıl işlediğini bilmeden komutları çağırırlar) aslında çağırdığınız komutlar hepsi olmasa da birer programdır.
Örneğin linux shellde (bash, sh vsye shell deniyor) sıklıkla kullandığınız "ls" komutu aslında bir programdır, ve yerini öğrenmek istiyorsanız "whereis ls" derseniz size bu programın diskinizdeki lokasyonunu gösteririr.
Büyük ihtimalle şunu merak ediyorsunuz bu komutlar program ise nasıl çalışıyorlar. Sorunun cevabı shell (konsol ya da kabuk) denen şeyin kendisinde saklı çoğu kişi shell denen olayı linuxun kendisi zannediyor aslında shell firefox, openoffice gibi normal bir programdır fakat kullanıcıdan bir girdi alıp bu girdiyi işlemek üzere tasarlanmıştır. Yani siz "ls" yazıp entera bastığınızda shelliniz "ls" adını PATH değişkeni ile gösterilen dizinler içinde arar eğer bulursa çalıştırır, bulamazsa "komut bulununamadı" vs gibi bir hata verir, yani programı PATH içinde bulamadığı için hata verir.
Eğer linux acemisi iseniz ve konsolda (yani shell) sık çalışacaksanız ya da meraktan konsol ile uğraşıyorsanız komutları öğrenmek için en güzel yol "/usr/bin", "/usr/sbin" gibi dizinler içinde yer alan programların adlarını alıp bu adlardan yararlanarak internette bilgi edinmektir. En azından program adlarını bilmek sizin komut denen olaya alışmanıza yardımcı olur.

2 Kasım 2007 Cuma

Javascript olayları

Javascript 5 adet olay tipi tanımlamaktadır bunlar form, image, mouse, link ve window olayları.
Form Olayları şunlardır :
* blur - input nesnesi aktifliğini kaybetti, klavye artık ona yönlenmez
* change - Bir eleman değişime uğradı
* focus - input nesnesi aktifliği ele geçirdi, klavye girdisi ona yönlenir.
* reset - Kullanıcı nesneyi resetledi, sıfırladı
* select - Bir text seçildi
* submit - Kullanıcı nesneyi göndermeye başladı, form gönderilmeye başladı
Image olayları
* abort - Resimin yüklenmesi durduruldu
* error - Resimi yüklerken bir hata oluştu
* load - Resim yüklendi.
Mouse olayları
* mouseOut - Mouse bir nesnenin üzerinden çıktı
* mouseOver - Mouse bir nesnenin üzerinde
Link Olayları
* click - bir nesne tıklandı
Window olayları
* load - Nesne yüklendi
* unload - Nesneden ayrılındı, pencereden ayrılındı.

HTML taglarına göre hangi olay gerçekleşebilir aşağıdaki listede yer almaktadır.

* <A>
 o click (onClick)
 o mouseOver (onMouseOver)
 o mouseOut (onMouseOut)
* <AREA>
 o mouseOver (onMouseOver)
 o mouseOut (onMouseOut)
* <BODY>
 o blur (onBlur)
 o error (onError)
 o focus (onFocus)
 o load (onLoad)
 o unload (onUnload)
* <FORM>
 o submit (onSubmit)
 o reset (onReset
* <FRAME>
 o blur (onBlur)
 o focus (onFocus)
* <FRAMESET>
 o blur (onBlur)
 o error (onError)
 o focus (onFocus)
 o load (onLoad)
 o unload (onUnload)
* <IMG>
 o abort (onAbort)
 o error (onError)
 o load (onLoad)
* <INPUT TYPE = "button">
 o click (onClick)
* <INPUT TYPE = "checkbox">
 o click (onClick)
* <INPUT TYPE = "reset">
 o click (onClick)
* <INPUT TYPE = "submit">
 o click (onClick)
* <INPUT TYPE = "text">
 o blur (onBlur)
 o focus (onFocus)
 o change (onChange)
 o select (onSelect)
* <SELECT>
 o blur (onBlur)
 o focus (onFocus)
 o change (onChange)
* <TEXTAREA>
 o blur (onBlur)
 o focus (onFocus)
 o change (onChange)
 o select (onSelect)

üstteki listede "blur" gibi isimler olayın asıl adı, onBlur ise "<a onBlur" gibi kullanabileceğimiz olay adıdır.
bir nesne için olayı dinlemek istiyorsanız bu prototype kütüphanesinde şu şekildedir.
Event.observe($(nesne_idsi), 'olay_adi', fonksiyon_referansı);
nesne_idsi : nesneye verdiğiniz id="..." parametresidir.
olay_adi : nesne üzerinde gerçekleşebilece olayın adı
fonksiyon_referansı : olay olduğunda çalıştırılaak fonksiyonun referansı
Örnek : Event.observe($('my_button'), 'click', function(){ alert('test');});

1 Kasım 2007 Perşembe

Javascript kütüphanesi

Güzel bir javascript kütüphanesi : prototype. Javascript ile uğraşanlar iyi bilir, kodunuzu çeşitli tarayıcılara göre şekillendirmeniz gereklidir, çünkü tarayıcılardaki javascript desteği farklı farklıdır.
Bu tür sorunlara çözüm olması için geliştirilen javascript kütüphanelerinden biri de prototype'dır. Prototype kütüphanesi ile Nesne yönelimli kodlar yazabilirsiniz böylece günümüzün popüler olayı nesne yönelimli programlamayı javascript kodlarınıza da taşırsınız.
Bir prototype nesnesi şu şekilde yaratılıyor :

var Nesne_Adi = Class.create();
Nesne_Adi.prototype = {
initialize : function(varsa_parametreler){
},
varsa_fonk1 : function(){},
varsa_fonk2 : function(){}
}
var nesnem = new Nesne_Adi();
nesnem.varsa_fonk1();

burada dikkat etmeniz gereken initialize fonkisyonuna atanacak fonksiyonun sizin nesneninizin yaratılırken ilk çağrılan fonksiyon olacağı. Ayrıca nesnenin tanımlanış şekli java, c# vs gibi dillerden farklıdır bunun nedenide javascriptin varsayılan olarak nesne mantığı desteği olmamasıdır yani yöntemler hep bir olayı emüle etme şeklindedir.
Prototype kütüphanesi adresi : www.prototypejs.org