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

31 Ekim 2007 Çarşamba

SWT Programlama 1

SWT ile program yazmayı düşünüyorsanız öncelikle çeşitli araç gereçlere ihtiyacınız olacak.
İlk olarak son sürüm Java JRE ya da Java SDK indirmeniz ve kurmanız gerekli, daha sonra swt kütüphanesini http://www.eclipse.org/swt adresinden stable sürümden (31 ekim itibarı ile 3.3 versiyonu stable 3.4 development versiyonudur) uygulamayı geliştirdiğiniz sisteme (windows xp, linux gibi) uygun swt paketini indirin.
Bundan sonra yapmanız gereken kodunuzu yazıp, derleyip çalıştırmaktır.
SWT programları sıra ile en az şu adımlara ihtiyaç duyar :
-bir Display nesnesi yaratmak
-1 ya da 1 den fazla Shell yaratmak
-Shell nesnesinin yerleşim yöneticisini ayarlamak (layout manager)
-Shell nesnesi içinde görünecek widget'leri yaratmak
-Shell penceresini açmak (open)
-Olay yönetim kodunu yazmak
-programdan çıkarken Display nesnesini dispose etmek.

Örnek kod şu şekildedir :

import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Test
{
public static void main(String args[])
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout( new RowLayout());
// ------------------------
// Sizin kodunuz buraya
// ------------------------
shell.pack();
shell.open();
while( !shell.isDisposed())
{
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}


Yukarıdaki kodu Test.java dosyasına kaydedip derlemeliyiz, bunun için konsolda javac -cp swt_jara_giden_tam_yol/swt.jar Test.java komutunu vermeliyiz. Yani "-cp" parametresi ve swt.jar'ın tam yolunu vererek swt.jar'ı classpath içine alırız böylece Shell, Display gibi tanımlamarı java tanır ve sorunsuz derler.
En sonda Test.class oluşacaktır (bir aksilik olmadıysa) çalıştırmak için java -cp swt_jara_giden_tam_yol/swt.jar:. Test komutunu veririz ve ilk swt programımızı çalıştırmış oluruz.
Bu aşamalarda çıkabilecek tek sorun swt.jar'ın java tarafından görülmemesidir ve bunun nedeni de swt.jar'ın classpath içinde olmamasıdır, yani classpath ile ilgili parametreleri ve yolları kontrol ederseniz sorunu bulursunuz, eğer çok sıkışırsanız swt.jar dosyasını java_ana_dizini/jre/lib/ext içine atın ve hiç java -cp paramtresi vermeden "javac Test.java" diyebilirsiniz çünkü java_ana_dizini/jre/lib/ext dizini javanın başlarken baktığı varsayılan dizinlerdendir böylece swt.jar otomatik olarak tanınır. Fakat bu son dediğimi yaparsanız yeni bir swt sürümü yüklediğinizde başınızı ağrıtabilir bu yüzden swt.jar'ı mümkün olduğunca /lib/ext altına almayın.

28 Ekim 2007 Pazar

Eclipse SWT

SWT yani Standard Widget Toolkit, java Swing kütüphanesinin yavaşlığına çözüm getirmek amacıyla dizayn edilmiş bir GUI kütüphanesidir.

SWT platform bağımsız bir kütüphanedir yani yazdığınız SWT programları Windows, Linux ve MacOs platformlarında aynı görünecektir, ama tamamen aynı değildir. Görsellik işletim sisteminin genel yapısına uygun şekildedir.

SWT temelde işletim sistemine ait doğal GUI kütüphanesinin üzerine inşa edilmiş bir java kütüphanesidir. Yani Windowsta win32 Linuxta GTK ve MacOs ta adını bilmediğim doğal GUI kütüphanesini kullanarak hem işletim sistemine uygun görünüm hem de doğal nesnelerin hızlılığını sağlar.

İlerleyen yazılarımda SWT ile ilgili daha detaylı anlatımlar, kod örnekleri vs. sunmaya çalışacağım. SWT yi önemsiyorum çünkü geleceğin işletim sistemi Linux için daha fazla yazılım geliştirilmesini hedefliyorum ayrıca SWT programları Windows üzerinde de çalışabildiği için yazılan programların ticari yönden bir kaygısı olmayacaktır.

Son bir not Eclipse IDE'sinin yazıldığı görsel kütüphane swt'dir, yani swt'nin gücünün kanıtıdır Eclipse IDE'si.

SWT nin resmi adresi : www.eclipse.org/swt/'dir

26 Ekim 2007 Cuma

Linux'ta program kurma

Linux’ta program kurmak windowstaki gibi bir setup.exe yi çalıştırma şeklinde değildir.Çeşitli yöntemler vardır en yaygın yöntem bir paket yöneticisi kullanmak.

Paket yöneticisi adını kurduğu paketlerden alır.Linux dağıtımları genelde kendi paket sistemleri ile ya da kalitesi kanıtlanmış paket yöneticileri ile gelir.Paket tiplerinin en yaygınları RPM,DEB ve Tar.Gz dir.RPM SUSE ve RedHat’ın varsayılan paket tipidir,DEB Debianın ve Tar.Gz fazla bilmiyorum ama Slackware’in.

Paketlerin derinlemesine incelersek onalrın aslında sıkıştırılmış dosyalar olduklarını öğreniriz,yani gz ya da zip gibi bir formatla sıkıştırılmış dosyalardır ve içlerinde genel olarak binary formda direkt çalıştırmaya hazır (yani önceden derlenmiş dosyalar) vardır,ayrıca bu binary dosyaların yanında bu dosyanın gereklilikleri ve adı gibi paket yöneticisinin paketi kurarken gerek duyacağı bilgileri taşıyan diğer dosyalar vardır.

Paket yöneticisi paketi açar ve içerisindeki bilgi dosyasındaki yönergelere göre kurulması gereken diğer kütüphane ya da programları kurar ya da siler , tabi bunu yaparken kullanıcıyı önceden uyarır ki daha sonradan sorun yaratmasın.

Linuxta program kurmanın diğer yöntemi ise kaynak koddan yapılan kurulumlardır.İnternetten bulduğunuz bir kaynak kodu kurmak istiyorsanız izlemeniz gereken yöntem yüksek ihtimalle aynıdır : Önce ./configure ile Makefile adı verilen dosyanın yaratılmasını sağlamak,daha sonra make ile derlemeyi gerçekleştirmek ve son olarak make install diyerek derleme sonucunda çıkan binary dosyaları gerekli yerlere kopyalanmasını sağlamak son komutu verirken genelde root olmanız gerekir çünkü kopyalama yapılan klasörler genelde /usr/local /usr/share gibi klasörlerdir ve bu klasörlerin yazma erişimi sadece root ve grubuna açıktır.

./configure
make
make install

bu 3 ü bir standart gibidir.Bazen direkt make demeniz yetebilir bunu bulduğunuz kaynak kodunun olduğu klasörün içinden anlayabilirsiniz.
Kaynak kodundan derleme işlemi parametize edilebilir yani isterseniz make install sonucunda binary dosyaların kopyalanacağı klasörü seçebilirsiniz bunun için ilk komutu ./configure prefix=/kopyalama/yapilacak/klasor/yolu komutu ile değiştirin,eğer binary dosyaları bir yere kopyalamak istemiyorsanız ./configure ve make dedikten sonra kaynak kodun olduğu klasörün içinde genelde src içinde binary dosyalar yer alır bunları alıp istediğiniz gibi kullanabilirsiniz.

Son olarak, paketleri kurmak için sisteminizdeki ana paket tipini öğrenip bunu kullanan araç hakkında döküman okumanız yeterlidir,kaynak koddan kurulum yapmak için ise sisteminizde gcc kurulu olmalıdır,ayrıca automake ve autotools isimli araçalrında kurulu olması gereklidir.Tabi kurmaya çalıştığınız programların istediği kütüphaneler de olmalı ki kurulum yapılabilsin.

20 Ekim 2007 Cumartesi

SWT yavaş text girişi sorunu

Eğer programlarınız SWT ile yazıyorsanız ve programınızda bir text ya da benzeri giriş alanı kullanıyorsanız, bazen giriş alanları tuhaf davranışlar segiler : girdi fare hareketinden sonra gelir, girdi bir kaç sn gecikme ile gelir vs.
Bu durumun sebebi kodunuzda yer alan

while(!shell.isDisposed()){
if(disp.readAndDispatch()){
disp.sleep();
}
}

gibi işletim sisteminden olayları alıp ilgili görsel nesneye gönderen kodda yer alan bir mantık hatasından dolayı olma ihtimali yüksektir
Buradaki hata disp.readAndDispatch() fonksiyonunun başında unutulan ! mantıksal tersleyici işarettir.
Düzgün kod şu şekilde olmalıydı :

while(!shell.isDisposed()){
if(!disp.readAndDispatch()){
disp.sleep();
}
}

Bu sorun kolay görülmez bu yüzden burada yazdım ki aynı sorundan muzdarip iseniz fazla aramadan bulun.

15 Eylül 2007 Cumartesi

Wordpress'e ulaşım engellendi

Bu blogtan önce wordpress'i kullanıyordum sağolsun türk aklı bir yasa yüzünden erişim engellenmiş ve maalesef wordpress'in kurumsal yapısının eksikliğinden olsa gerek hala kapalı (15 Eylül 2007 itibari ile).
Wordpress'e erişimin durdurulmasının ardında ticari bir hamle görüyorum ,diğer blog siteleri bir açıktan faydalandı diye düşünüyorum ama kesin bir şey olmadığı için teoriden ileriye gidemez tıpkı ikiz kulelerin aslında Amerikanın kendisi tarafından vurulduğu iddialarında olduğu gibi.
Neyse yine bir blog macerasına baştan başlıyorum, blogsuz yapamıyorum çünkü aklımdakileri yazarak hem kaybolmamasını sağlıyorum hem de aynı bilgiyi araştıracak insanlara faydalı oluyorum.