15 Ekim 2007

JBoss Binding IP Adress

Merhaba,
Bir Enterprise Java Projesi'nde çalışıyorum. Business kısmını EJB'ler üstlenmiş durumda. Uygulama sunucusu olarak JBoss 4.0.5 kullanıyorduk. Varsayılan konfigürasyonlarla bu JBoss versiyonuna aynı ağ üzerindeki herhangibir client makineden ulaşabiliyorduk. Yani business metodları çağırabiliyorduk. Fakat JSF 1.2 desteği olmadığından dolayı JBoss 4.2.1'e geçtik. Fakat bu seder EJB metodlarını çağıramaz olduk. Bu versiyonda uygulama sunucusu bir sadece bind ettiği bir IP, varsayılan 127.0.0.1, üzerinden hizmet veriyor. Bu nedenle 127.0.0.1 bind edildiğinden, yani localhost, dışarıdan erişemiyordum. Bu sorunu araştırdığımda eğer istenilen bir IP adresine bind edilmesi isteniyorsa JBoss'u "-b" seçeneği ile başlatın deniyordu. Örneğin; JBoss'un çalıştığı makinenin ağdaki IP'si 10.1.1.2 olsun. Komut satırında -b 10.1.1.2 şeklinde bir komut çalıştırırsanız JBoss 10.1.1.2 IP adresine yapılacak isteklere cevap verecektir.

18 Ağustos 2007

For each döngüsü ve Iterator

Bildiğiniz gibi Java 5 ile beraber for each döngüsü java'ya eklendi. Bu döngü ile bir collection'daki yada bir dizideki elemanlar üzerinde rahatça dolaşıp işlem yapabiliyorsunuz. Örneğin; elinizde String sınıfı tipinde nesneler barındıran "list" isminde bir List nesneniz olsun. Bu List üzerinde aşağıdaki gibi dolaşabilirsiniz:

for (String s : list) {
// s'i kullanan veya kullanmayan işlemler...
}
Bu örnekte type safety'de sağlanmış oluyor. Generics o biçim destekleniyor yani:). Bir diğer örnekte array'ler için. Örneğin elinizde A sınıfı tipinde "arr" isminde bir diziniz olsun, bu dizi üzerinde aşağıdaki şekilde dolaşabilirsiniz:

for (A item : arr) {
// item ile bir işlem yap...
}

Iterator java'da bildim bileli olan bir şey, Iterator ile Collection nesnesinin elemanları üzerinde dolaşabilir ve işlemler yapabilirsiniz ve o collection nesnesi de bu değişikliklerden etkilenir. Örneğin; içinde String nesneleri barındıran "mySet" isminde bir HashSet nesneniz bulunmaktadır. Bu set üzerinde aşağıdaki şekilde dolaşabilirsiniz.

Iterator iter = mySet.iterator();
while ( iter.hasNext() ) {
String s = iter.next();
// işlemlere devam et...
}

Gördüğünüz gibi "for each" yapısı Iterator'dan daha basit ve anlaşılır. Ancak Iterator'un pabucunun dama kaldırılmayacağını dün anladım.
İçinde oluşturduğum sınıf tipinde nesneler barındıran bir List üzerinde bir kaç işlem yapacaktım. Bu işlem de list elemanları üzerinde sırayla ilerleyip her elemanı bir koşuldan geçirip eğer koşul sağlanırsa o elemanı listeden kaldırmaktı. Bu işlemi for each ile aşağıdaki gibi yapmıştım:

List list = ...;
for (MyClass m : list ) {
if ( condition )
list.remove(m);
}

Bu kodu çalıştırdığımda java.util.ConcurrentModificationException aldım. Daha sonra aynı işlemi Iterator ile yaptım.

List list = ...;
Iterator iter = list.iterator();
while (iter.hasNext()) {
MyClass m = iter.next();
if ( condition )
iter.remove();
}

Bu kodda ise hata almadım. Nedeni kesin olarak bilmemekle beraber bildiğim kadarıyla Iterator bir Collection nesnesi içindeki elemanlar üzerinde pointer mantığıyla çalışıyor. For each'de ise böyle bir yapı yok, yani bir array gibi çalışıyor. Bu nedenle "for each" ile list üzerinde dolaşırken aynı anda bir nesneyi listeden kaldırmak istediğinizde nesnelerin indexleri değiştiğinden dolayı bu hatayı veriyor olabilir. Iterator ise kaldırılacak elemana point ettiğinden elemanı listeden kaldırıyor ve pointer'ını yeni nesne üzerinde konumlandırıyor, bir linked list mantığı. Siz ne dersiniz?

08 Temmuz 2007

Observer Pattern

Design Pattern kavramı nesne tabanlı programlama mantığında sıkça kullanılır. Belli kalıplar vardır ve bu kalıplar nesne tabanlı programlamada belli ihtiyaçlardan doğmuştur. Observer Pattern de bunlardan bir tanesidir. Bu pattern'i kafamızda canlandıracak bir örnek vermek gerekirse ki bu bir gazete sitesine abone olmak olabilir. Burada gazete sitesi bir yayıncıdır ve yeni haberler çıktığından bunları yayınlar. Siteye abone olanlar ise bu haberleri çeşitli şekillerde görürler. Bu RSS şeklinde olur, mail şeklinde olur vs.
Tanım olarak Observer Pattern kapsadığı objeler arasında one-to-many ilişkisi kurar. Böylece bir objenin durumu değiştiğinde, bu objeye bağlı diğer objelere haber verilir ve objeler kendilerini güncellerler.
Sınıf diyagramı aşağıdaki gibidir:

Diyagramda iki adet interface vardır, Subject ve Observer. Observer olacak sınıflar yani değişikliklerden haberi olacak sınıflar kendilerini bu interface'i implemente eden sınıflara, ConcreteSubject, registerObserver() metodu ile kayıt ederler. İstedikleri zamanda kendilerini removeObserver metodu ile abonelikten kaldırırlar. Subject sınıfı da observer objelerinin kim olduklarını bilmez. O sadece kendisine kayıt olan objelerin Observer interface'inin implemente ettiklerini bilir. Böylece Subject objesinde bir değişiklik olduğu zaman notifyObservers() metodu ile kendisine kayıtlı olan observer objelerinin update() metodlarını çağırır. Observer objeleri de kendilerini yenilerler. Observer Pattern sayesinde subject ve observerlar birbirlerini bilmezler, interface'ler aracılığı ile haberleşilirler. Böylece tasarım unsurlarından loosely coupled objeler sağlanmış olur. İkincisi runtime esnasında observer ollan objeler kendilerini subject sınıfına kayıt ettirebilir yada kendilerini kayıt listesinden kaldırabilirler.
Örneğin bir haber sitesinin abonelik sisteminde iki tür abonelik olsun. Bunlar Mail ve RSS olsun. Mail abonelik sisteminde abonelere haberlerin özet hali mail atılsın. RSS abonelik sisteminde haberlerin özetleri rss standardında oluşturulsun. Abonelerin rss destekli programlari oluşturulan dosyadaki değişiklikleri otomatik olarak takip ettikleri için bizim abonelere mail veya başka bir ileti atmamıza gerek yoktur. Burada iki tane arayüzümüz, Subject ve Observer, dört tane de sınıfımız olacak, Haber, HaberYayinlayicisi, MailAboneleri ve RssAboneleri. Kodlar tam olmasa da aşağıdaki gibi olabilir:

public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}

public interface Observer {
public void update(List haberler);
}

public class HaberYayinlayicisi implements Subject {
private ArrayList observers;
private ArrayList haberler;

public HaberYayinlayicisi() {
observers = new ArrayList();
haberler = new ArrayList();
}

public void registerObserver(Observer observer) {
observers.add(observer);
}

public void removeObserver(Observer observer) {
observers.remove(observer);
}

public void notifyObservers() {
for (Observer observer : observers) {
observer.update(haberler);
}
}

public void yeniHaberlerGeldi() {
notifyObservers();
}

// bu metodu yeni haberleri olusturan baska bir sınıf cagiracak..
public void setYeniHaberler(List haberler) {
this.haberler = (ArrayList) haberler;
yeniHaberlerGeldi();
}

}

// Bu sınıf bir tane haberi gösterir.
public class Haber {
private String baslik;
private String ozet;
private String link;

public Haber() {}

// setters-getters, constructors

....
}

// Observer interface'ini implemente eden bir sınıf.
// Abonelerine mail yolu ile haberleri ulaştırır.

public class MailAboneleri implements Observer {

private Subject haberYayinlayicisi;

public MailAboneleri(Subject haberYayinlayicisi) {
this.haberYayinlayicisi = haberYayinlayicisi;
haberYayinlayicisi.registerObserver(this);
}

public void update(List haberler) {
String mailBody = constructMailBody(haberler);
sendMailToSubscribers(mailBody);
}

/**
* bu metod kayitli tum abonelere mail gonderir.
* Orn: Aboneler veritabanindan cekilebilir.
*/
private void sendMailToSubscribers(String mailBody) {

}

// bu metod gonderilecek mail icerigini olusturur.
private String constructMailBody(List haberler) {

return "";
}

}

// Bu sınıf da Observer interface'ini implemente eden diger siniftir.
// Abonelerine rss kanali ile haberleri ulaştırır.
public class RssAboneleri implements Observer {

private Subject haberYayinlayicisi;

public RssAboneleri(Subject haberYayinlayicisi) {
this.haberYayinlayicisi = haberYayinlayicisi;
haberYayinlayicisi.registerObserver(this);
}

public void update(List haberler) {
String rssXml = constructRssXml(haberler);
putXmlToDirectory(rssXml);
}

// bu metod rss standartlarina uygun xml'i uretir.
private String constructRssXml(List haberler) {
return null;
}

// bu metod uretile xml'i var olan xml dosyasi ile degistirir.
// Aboneler'in kullandiklari rss programlari degisikligi otomatik olarak
// algilarlar...
private void putXmlToDirectory(String rssXml) {

}
}


// Bu sinif da ornek bir calisan sınıftir.
public class Main {

public static void main(String[] args) {
HaberYayinlayicisi haberYayinlayicisi =
new HaberYayinlayicisi();


MailAboneleri mailAboneleri =
new MailAboneleri(haberYayinlayicisi);
RssAboneleri rssAboneleri =
new RssAboneleri(haberYayinlayicisi);

Haber a = new Haber("Olay, olay, olay!!!", "Bina patladi!!!",
"www.habermakinasi.com/?id=5");

Haber b = new Haber("Flas, flas, flas!!!", "Ikinci bina patladi!!!", "www.habermakinasi.com/?id=7");
List haberler = new ArrayList();
haberler.add(a);
haberler.add(b);

haberYayinlayicisi.setYeniHaberler(haberler);
}

}

Kaynak: Head First Design Patterns

21 Mayıs 2007

MyEclipse 5.5 çıktı!!!

Eclipse ortamında uygulama geliştirenler için MyEclipse önemli araçlardan bir tanesi. İçerisinde masaüstünden kurumsal yazılıma kadar çeşitli uygulama alanlarını desteklemektedir. Bu yeni versiyonda Java EE 5'i destekliyor. Bu araç anladığım kadarıyla daha çok Web ve Kurumsal taraftaki geliştirmeye ağırlık vermiş. Örneğin Java ME'yi desteklemiyor gözüküyor özelliklerine bakıldığında.
Özelliklerine şöyle bir baktığımda gözüme çarpanlar EJB 3.0, JPA, sürükle bırak web geliştirme (JSF ile), AJAX, JavaScript debugger, Uygulama Sunucu entegrasyonları, Veritabanı Bağlantı Yöneticisi, Spring desteği idi.
Bundan önce MyEclipse'i bir kere deneme fırsatım olmuştu. O zaman Struts ile web uygulaması geliştiriyorduk. Güzel ve zekice editor'ler sunuyordu o zamanlar. Örneğin struts config dosyasından kaynaklara ve classlara ulaşılabiliyordu, görsel olarak gösterimler de vardı galiba. Bu versiyonda herhalde JSF baya hoş şeyler düşünmüşlerdir, hele hele AJAX desteği de varsa.
İndirip denemek lazım...

20 Mayıs 2007

Modüler JRE

Şurada okuduğum bilgiye göre JRE (Java Runtime Environment) müşteri odaklı, daha basit ve modüler, hale getirilecekmiş. Böylece daha iyi son kullanıcı ve GUI etkileşimleri, ufak dosya indirmeleri, hızlı yüklemeler, hızlı başlangıç gibi son kullanıcıyı memnun edecek özellikler sıralanıyor. Bu özellik Java 6 ile beraber sunulacakmış.
Şu da söyleniyor: Kullanıcı Swing uygulalamalarını çalıştırmak için 3-4 mb'lık JVM'i indirip makinesine kuracak ve uygulama çalışması için ek kütüphaneler istediğinde internetten indirilecekmiş. Ayrıca indirilen yeni paketler diskinizde birden fazla JRE versiyonları oluşturmayacakmış. Buna da on-demand, in-place yükleme demişler.
Bence bu özellik gayet faydalı olur. Çünkü basit bir swing uygulamasını çalıştırmak için 20-30 mb'lık bir JRE yüklemenize gerek kalmaz. Fakat uygulamanın çok fazla ek bağımlılığı varsa bu da çok fazla download'a sebep olacak demektir. Gerçi ilki her zaman kullanışlı olur, ikincisinde gerektiği zaman bir kere indirmiş olacaksınız ve daha sonra indirilen bu kütüphaneleri kullanacaksınız. Gerekmediği zaman niye 20-30 mb'lık bir kurulum kullanayım ki?
Ayrıca indirme olayı benim çalışan programımın çalışmasını etkilememesi lazım. Bu çok önemli bence, aksi takdirde baya eleştiri alır. Örneğin; ben bir uygulamayı çalıştırdım ve uygulama ek bir kütüphaneye ihtiyaç duydu. Kütüphane indirildi ve çalışan uygulama yeniden başlatılmak için sonlandırıldı. Bu göze hoş gözükmüyor. Diyeceksiniz ki indirilecek kütüphane boyutu büyükse uygulama zaten bekleyecek. Zaten indirme hızları git gide artıyor, kaldı ki kütüphane boyutları 50 mb'lık dosyalar değil.
Modüler JRE ile JavaFX (demo) dediğimiz Java'nın son teknolojilerinden birisinin kolay kullanımı hedefleniyor anladığım kadarıyla. JavaFX Adobe Flex'e karşılık geliştirilen bir teknoloji. Daha sonra bu konuya değinmeyi düşünüyorum.
Yalnız Modüler JRE'nin 2008'in ilk yarısı çıkarılmasının düşünülmesi iyi değil zannımca. Çünkü diğerler şirketlerin dereyi geçmiş olmaları muhtemeldir (Flex/Apollo).

18 Mayıs 2007

WSS0340 kodlu Hata!!!

Merhaba,
Yazdığım bir uygulamadan bir web servisine bağlanmayı deniyordum. Uygulamayı çalıştırdığımda şöyle bir hata aldım:


SEVERE: WSS0340: The creation time is ahead of the current time.
javax.xml.rpc.soap.SOAPFaultException: Invalid creation time value in Timestamp

Daha sonra nette arattığımda sorunun bilgisayarın sistem zamanının yanlış olmasından kaynaklandığını söylüyordu. Gerçekten de öyleymiş, uygulamayı çalıştırdığım zaman tarih 18.05.2007 14:12 idi, ama sistem zamanı 26.11.2006 14:12 idi. Sistem zamanını değiştirip uygulamayı yeniden başlattığımda uygulama düzgün çalıştı ve web servisine bağlanabildim.

13 Mayıs 2007

Uygulama Sunucu Matrisi

Şu bağlantıda piyasada kullanılan j2ee uygulama sunucularının bulunduğu bir matris var. Matrisde sunucuların versiyonları, çıkış tarihleri, indirme bağlantıları, kullandıkları JDK versiyonları, destekledikleri EJB, JSP, JMS versiyonları, (varsa) fiyatları, hakkında yazılmış eleştiriler, çalıştığı platformlar gibi güzel bilgiler var. Kimi sunucuların eski versiyonları olsa da çoğu markayı bir arada sunduğunda güzel bir matris olmuş. Zaten sunucuların yeni versiyonlarını da sitelerinden görebilirsiniz.

01 Nisan 2007

Java 6'da Print API Hatası

Java Print API bir uygulamadaki yazılı çizili ne varsa bunları yazdırmanızı sağlayan bir kütüphanedir. Bu kütüphane yardımı ile bir Graphics nesnesinde çizdirdiğiniz her şeyi bir yazıcıya gönderip yazdırabilirsiniz. Ayrıca bu API sistemdeki tanımlı yazıcıları kullandığı için sizin kodda yazıcı bulmak için çok fazla uğraşmanıza gerek yoktur. Örneğin; Windows'ta tanıttığınız yazıcıları Java Print API kullanabilir.
İşte bende geçenlerde iş yerimde yazdığımız bir uygulamada Graphics nesnesine çizdirdiğim şeyleri bir kart yazıcısında yazdırmak için bu API'yi kullandım. İlk başta Java 5 ile uygulamayı geliştiriyordum ve gayet güzel çalışıyordu. Yazdığımız uygulama da demo amaçlı bir uygulama idi ve bir gün sonra demo yapacaktık. Herşey gayet düzgün gidiyordu, ta ki Java 6'ya geçene kadar. Son gün Java 6'ya geçtiğimde biraz daha kod yazmaya deva ettim ve uygulamayı bir kez daha denedim. Bir de ne göreyim bir gün düzgün çıktı verdirten kod şimdi düzgün çıktı verdirmiyordu. Sonra birkaç kez daha denedim ama sonuç nafile. Tabi o sırada sorunun Java 6'dan kaynaklandığı hiç aklımın ucundan bile geçmiyordu. 7 saat uğraştıktan sonra arkadaşların yardımı ile Java 6 aklımın ucuna geldi. Daha sonra Java 5'e geçince sorun bitti ama bende bittim.
Diyeceğim Java 6 kullanırken böyle hatalar ile karşılaşabilirsiniz. Muhtemelen geliştiricileri bu API'yi Java 6 için test etmediler. Çünkü bu API bayadır var. Bunu bir bug olarak SUN'ın sitesine girmek lazım...

27 Mart 2007

Eclipse İstanbul'da...

Eclipse için İstanbul'da 30 Nisan 2007 Pazartesi günü özel bir konferans düzenlenecek. Bu konferansta Eclipse teknolojilerinin gücüne dikkat çekecek yerli ve yabancı konuşmacılar yer alacak. Sitesinde konferansa katılım ücretsiz!!! gözüküyor. Yer olarak İTÜ Ayazağa kampüsü Kültür Merkezi belirtilmiş. Kaçırmayın derim... Konferans programı.

17 Mart 2007

Dosyalarınızı Nasıl Sıkıştırırsınız?

Merhabalar,
Java'da dosyalarınızı ve klasörlerinizi hiç sıkıştırmayı denediniz mi? Denemediyseniz buyrun böyle alalım:) . Java'yı kullanarak dosya ve klasörlerinizi arşivleyen bir program yazabilirsiniz. Bunun için "java.util.zip" paketini kullanabilirsiniz. Bu iş için bu paketteki ZipFile, ZipEntry ve ZipOutputStream sınıflarını kullanabilirsiniz.
ZipEntry sınıfı zip dosyasında saklanacak her bir elemanı temsil eder. Bu elemanlar dosyalar ve klasörlerdir. ZipFile sınıfı bir zip dosyasını temsil eder. ZipOutputStream ise bir zip dosyasına için gerekli olan I/O sınıfıdır.
İsterseniz örneklere bakarak inceleyelim:

1. Bir dosyayı sıkıştırmak için:

byte[] readBuffer = new byte[2156];
int bytesIn = 0;

FileInputStream fis = null;
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(new FileOutputStream(""));
fis = new FileInputStream(<"Sıkıştırılacak dosyanın yolu">);
// dosya bir zip elemanı haline dönüştürülüyor
ZipEntry anEntry = new ZipEntry(fileToZip.getPath());
// Zip elemanı yazılmak üzere ZipOutputStream nesnesine veriliyor.
zos.putNextEntry(anEntry);
// Son olarak dosyanın içeriği stream'e yazılıyor.
while((bytesIn = fis.read(readBuffer)) != -1)
{
zos.write(readBuffer, 0, bytesIn);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// yazma işlemi bittikten sonra streamler kapatılıyor.
try {
fis.close();
zos.close();
} catch (IOException ex) {}
}

2. Bir klasörü sıkıştırmak için:
Klasör ve klasörün her bir elemanı ayrı bir entry olduğu için ayrı ayrı sıkıştırılır.

File dirTozip = new File(<"Sıkıştırılacak klasörün yolu">);
ZipOutputStream zos = null;
try
{
zos = new ZipOutputStream(new FileOutputStream(""));
// gerçekten klasör mü?
if ( !dirTozip.isDirectory() ) {
throw new IllegalArgumentException(dirTozip+" bir klasör olmalı!");
}
// klasörün içeriği alınıyor
String[] dirList = dirTozip.list();
// klasörün içindeki her bir eleman ayrı ayrı sıkıştırılıyor.
for(int i=0; i
{
File f = new File(dirTozip, dirList[i]);
if(f.isDirectory())
{
// eğer bu File nesnesi bir klasörse içindekileri sıkıştırmak için
// bu fonksiyon yeniden çağrılır (recursive)
// yeni bir klasörü elemanı oluşturuluyor.
ZipEntry anEntry = new ZipEntry(f.getPath()+"/");
zos.putNextEntry(anEntry);
zipDir(f, zos);

continue;
}
// Buraya ulaştıysak bir dosya sıkıştırabiliriz demektir.
zipFile(f, zos);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
// yazma işlemi bittikten sonra streamler kapatılıyor.
try {
fis.close();
zos.close();
} catch (IOException ex) {}
}

3. Bir zip dosyasını açmak için:

Enumeration entries;
ZipFile zipFile;

try {
zipFile = new ZipFile(<"Açılacak zip'in yolu">);
entries = zipFile.entries();

byte[] buffer = new byte[1024];
int len;

while(entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();

// eğer entry bir klasör ise klasör oluşturulmalı
if(entry.isDirectory()) {
(new File(entry.getName())).mkdir();
continue;
}

// Entry açılıyor....
InputStream in = zipFile.getInputStream(entry);
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(entry.getName()));

while((len = in.read(buffer)) >= 0)
out.write(buffer, 0, len);

in.close();
out.close();

}

zipFile.close();
} catch (IOException ioe) {
ioe.printStackTrace();
return;
}

Bu 3 işlemle basit bir arşivleme programı yazabilirsiniz. Kolay gelsin...

28 Şubat 2007

JCataloger v1.0 beta

Merhaba,

Açık kaynak olarak geliştirdiğim JCataloger programının v1.0 betasını google project hosting yardımı ile siz değerli insanların kullanımına sunmaya başladım. Kısaca bu programın ne işe yaradığından bahsedeyim: JCataloger size elinizin altında bulunan arşivlerinizi indekslemeyi sağlar. Bunu arşivinizdeki CD, DVD, sabit sürücü... gibi veri saklama ortamlarındaki klasör yapısını kopyalayıp bu klasör yapısını indeksleyerek yapar. Böylece aklınızda olan bir dosyayı kolayca ve hızlı bir şekilde arşivinizde aramaya yardımcı olur. Bu kolaylık şundan dolayıdır; arşivinizde 1000 tane CD varsa bir dosyayı bu kadar CD'ye teker teker bakarak aramak uzun sürebilir. İşte JCataloger sizi bu zahmetten kurtarabilecek bir program.
Yalnız programın beta sürümünü yayımladığımdan dolayı bazı hatalar olabilir. Zaten amacım benim göremediğim hataları ve yenilikleri siz değerli insanların gözleri ile görebilmektir ve bu programı geliştirmektir. JCataloger indeksleme işi için arka tarafta Apache Lucene projesini kullanmaktadır.
Programın kaynak ve çalıştırabilir kodlarını
http://code.google.com/p/jcataloger/downloads/list adresinden indirebilirsiniz.
JCataloger hakkında hata ve yeni istekleriniz için
http://code.google.com/p/jcataloger/issues/list adresini kullanabilirsiniz.
JCataloger'ın kodu Subversion kullanılarak host edilmektedir. Aşağıdaki adresteki bilgiler ile kodu yerel makinenize çekebilirsiniz.

http://code.google.com/p/jcataloger/source

JCataloger'dan haberdar olmak için ana sayfasını ziyaret edebilirsiniz.

İyi günler dilerim...

14 Şubat 2007

Özgür Yazılım ve Açık Kaynak Günleri

Merhabalar,
3-4 mart tarihlerinde İstanbul Bilgi Üniversitersi'nde özgür yazılım ve açık kaynak günleri düzenlenecek. Bu organizasyon bayadır yapılıyor. Açık kaynak yazılımın gelişmesi için daha fazla organizsayonun yapılması gerekir. Ülkemizin yazılım ithal etmemesi için bu konunun üstüne gidilmelidir. Ticari yazılımlarla yapılacak işleri alternatif olan açık kaynak yazılımlarla da yapabilirsiniz. Buna Java en büyük örnektir bence. Size kurumsal, mobil, masaüstü çözümlerini sunuyor, seç beğen al yani:). Umarım bu organizasyon kaçmaz...

01 Şubat 2007

NetBeans'de Bir Hata

Merhabalar,
PARDUS'ta yada başka bir işletim sisteminde NetBeans kullanırken özellikle yeni bir proje oluştururken şöyle bir hata ile karşılaşabilirsiniz: javax.xml.transform.TransformerConfigurationException : Could not compile stylesheet. Bu hatayı ben yeni bir görsel JSF projesi oluştururken aldım. Bildiğiniz gibi NetBeans proje oluşturulduğunda ant scriptlerinin bulunuduğu XML dosyalarını da üretiyor. Muhtemelen bir sorundan dolayı bunları üretemiyor ve bu hatayı veriyor. Çözümü ise çok basitmiş. Sadece NetBeans'in konfigürasyonlarının bulunduğu netbeans-5.5/etc/netbeans.conf dosyasındaki netbeans_default_options parametresine locale tr_TR seçeneğini eklemektir. Parametrenin son hali aşağıdaki gibi olacaktır:
netbeans_default_options="-J-Xms32m -J-Xmx128m -J-XX:PermSize=32m -J-XX:MaxPermSize=96m
-J-Xverify:none --locale tr_TR"

Bundan sonra projelerinizi düzgün bir şekilde oluşturabilirsiniz.

28 Ocak 2007

Eclipse C/C++ Debugger'ındaki Bir Hatanın Çözümü

Yazdığınız C kodunu debug etmek için Eclipse'in C/C++ eklentisini kullanıyorsanız aşağıdaki gibi bir hata ile karşılaşabilirsiniz:
Kullandığım işletim sistemi PARDUS. gcc ve gdb paketleri yüklü. Eclipse yazdığım c kodlarını çalıştırmak ve debug etmek için bu paketleri kullanıyor. Yazdığım bir C kodunu çalıştırabildim, fakat debug yapmak istediğimde "Failed to set program arguments, environment or working directory" gibi bir hata verdi. Bunun nedeni de şu imiş. Benim Eclipse çalışma alanım Eclipse Projelerim isminde bir klasördür. Debugger, oluşturduğunuz bir C projesinin yolunda boşluk karakteri görürse deminki hatayı veriyor. Yani Eclipse Projelerim klasörünün ismini Eclipse_Projelerim şeklinde değiştirdim ve sorun çözüldü. Aynı şekilde C kaynak dosyası da boşluk karakteri içermemeli.

25 Ocak 2007

iPhone Java'yı destekleyecek mi?

Bildiğiniz gibi Apple iPhone ismindeki telefonuyla telefon piyasasına da girmek istiyor. Bu ürün henüz dünya çapında satışa çıkarılmadı. Bu yazıyı yazarken herhalde Amerika'da satılmaktadır. Bu üründe de Apple tasarımdaki yaratıcılığını yine konuşturmuş. Neyse şimdi ürünün reklamını yapmayayım, en iyisi sadete geleyim. Şurda sitede Steve Jobs ile yapılmış bir söyleşi anlatılmış. Steve Jobs'un dediğine göre iPhone Java'yı içindeki tarayıcısında desteklemeyecekmiş. Çünkü artık Java kullanılmıyormuş, burda herhalde Applet'leri kastetmiş kendisi. Bu konuda haklı olabilir, çünkü gerçekten appletler artık o ilk çıktığı cazibesini nerdeyse kaybetti bence. Artık onun yerine insanlar flash kullanmayı tercih ediyor. Telefona üçüncü parti bir program yükleme konusunda da Jobs şunu söylemiş. "Telefon bir PC değildir, iki üç program kurduktan sonra telefon araması yaptığında telefon çalışmaz hale geliyor." Bence bu yanlış bir düşünce olmuş, çünkü mobil piyasası çok hareketli. Artık yazılım şirketleri mobil programlar geliştirerek bu piyasadaki pastadan pay almaya bakıyorlar. Bu nedenle telefon üreticileriyle yazılım firmaları çeşitli anlaşmalar yapyorlar. Bu nedenle Java ve .Net gibi yazılım ortamlarının bu alanda kullanımı da gittikçe artıyor. Mobil telefon piyasasına bakarsanız yeni çıkan telefonların nerdeyse hepsi Java destekliyor. Ed Burnette de bu konuda şunu söylemiş, telefon için yazılım geliştirirken C, C++ gibi unmanaged (yani memory kontrolünü sizin yaptığınız, pointer kullanımı...) yazılım dilleri yerine Java ve .Net gibi managed diller kullanırsanız telefon çökmez. Gerçekten de öyle, C'de eğer tanımladığınız pointer'ları iyi bir şekilde yönetemezseniz ve hafıza kullanımını iyi bir şekilde yönetemezsiniz o program telefona çok zarar verir. Bu nedenle Java gibi garbage collection'ı olan, hafıza yönetimini, pointer kullanımını kendisi ayarlayan diller kullanırsanız bir sorun çıkmaz. Bu anlatılanlara göre iPhone Java'yı desteklemezse yazık olur. Çünkü rekabet edeceği firmalar program desteği konusunda iPhone'a fark atar:)

05 Ocak 2007

Ölü Pixellere Son!

Bir dizüstü bilgisayar satın aldınız diyelim. Çok heyecanlısınız, çünkü uzun süredir bu anı bekliyordunuz. Eski masaüstü bilgisayarınızdan kurtuldunuz. Artık bilgisayarınızı istediğiniz yere taşıyabileceksiniz ve daha bir sürü güzel, heyecanlı düşünceler beyninizi kemiriyor.
Bu düşüncelerle dizüstünüzün kapağını açtınız ve açma düğmesine bastınız. İşletim sistemi çalıştı, herşey yolunda. Fakat o da ne? Ekranda bir tane benek duruyor, elinizle siliyosunuz gitmiyor, tükürüp siliyosunuz gene gitmiyor. Maalesef o benek silmekle gitmez! Bu benek aynen aşağıdaki gibidir:

Resimdeki kırmızı benek bir ölü pixeldir ve bunun tamiri için makineyi servise gönderebilirsiniz yada bu sitede iddia edildiğine göre bir java programı aracılığı ile bu ölü pixeli tekrar canlandırabilirsiniz. Programın ismi de JScreenFix. Çalıştırdığınızda karıncalı televizyon görüntüsünü andıran bir arayüz çıkarıyor ve bu ekranın bu ölü pixelleri düzelteceğine inanılıyor. Ölü pixeli olan arkadaşlar, bir deneyip buraya yazarsanız sevinirim. Bilgimiz olsun:)

04 Ocak 2007

Solr Index Server!!!

Apache Solr isminde bir ürün çıkardı. Solr bir arama sunucusu. Yani siz istediğiniz dökümanları, verileri sunucu tabanlı bir uygulamaya HTTP üzerinden XML istek (request), aynı AJAX gibi, olarak gönderiyorsunuz, sunucu da bu verileri kendi içerisinde Lucene projesini kullanarak indeksliyor. Bir şeyi aramak istediğinizde aynı şekilde XML istek olarak HTTP üzerinden sunucuya istek yolluyorsunuz. Sunucu da size sonuçları XML olarak döndürüyor.
Bir düşünsenize, büyük bir şirket ve yüklü bir döküman yığınının tutulduğu bir veya bir kaç sunucu var ve bu dökümanlardan tüm çalışanlar faydalanıyor. Solr sayesinde bu dökümanları indeksleyebilir ve hızlı arama sonuçlarına ulaşabilirsiniz, aynı google gibi:). Solr kullanarak sunucu üzerinde arama yapıp sonuçlarını kullanıcıya güzel bir arayüzle gösteren kullanıcı tabanlı (thin client) uygulamalar yazabilirsiniz. Örnekler çoğaltılabilir.
Bu uygulamanın özellikleri ve bir de eğitimi mevcut! Kolay gelsin...

02 Ocak 2007

Aptana Web IDE

Selamlar,
Eclipse RCP kullanılarak Aptana isminde bir web ide geliştirilmiş. Bu IDE sayesinde html, javascript ve css dosyalarınızı gayet kolaylıkla yönetebilirsiniz. Örneğin javascript kullanarak bir kütüphane (mesela AJAX kütüphanesi) yazmak istiyorsanız bu Aptana gayet iyi bir seçim olabilir. Çünkü ilk önce eclipse ortamından kopmamış oluyorsunuz, ikincisi Aptana içinde bir tane javascript debugger'ı getiriyor. Böylelikle yazdığınız javascript kodlarının nasıl çalıştığını gözlemleyebilirsiniz. Bir diğer özellik html, css, javascript için kod yardımı (code assist) özelliği de var.
Ayrıca bu Aptana'yı kullananlar bir de eğitim amaçlı olarak videolarını koydukları bir site yapmışlar. Bu sitede çeşitli kısa eğitimler bulabilirsiniz.