27 Kasım 2007 Salı

SiteMesh Nedir? Ne işe yarar?

Bir proje geliştiriyorsunuz, belki bir ekip halinde belki de kişisel, web tabanlı bir proje. Proje için bir grafiksel arabirim tasarlattınız. (genelde biz programcılar yaparız ya neyse :)) )

Proje artık son düzlüğe geldi, son testlerinizi yapıyorsunuz ve müşteri çıktı dedi ki "yahu ben bu tasarımın şurasına kuş kondurmak istiyorum." ya da o projeyi başka bir müşterinize de uyarlamak zorunda kaldınız. Haydaa işin gücün yoksa tüm web sayfalarındaki tüm tasarımları güncelle.

Oysaki Sablon isimli bir web sayfanız olsaydı ve tum icerik sayfalariniz bu Sablon u uyguluyor olsaydı ve sadece bu Sablon dosyanızda gerekli güncellemeyi yaptığınızda tüm web sitesinde geçerli olsaydı hoş olmaz mıydı?

İşte bu soruna önemli ve performanslı bir çözüm arıyorsanız SiteMesh tam size göre, örnek uygulamaları çok yakında bulabileceksiniz.

26 Kasım 2007 Pazartesi

Jetty - Tomcat - Resin: Performans Karşılaştırması

Son dönemlerde geliştirdiğim kişisel projeleri kurulabilir paketler haline getirme konusunda araştırmalar yaparken web sunucusu ihtiyacım için embedded tomcat tercih etmiştim. Yaptığım araştırmalarda da bu konuda başka alternatifler olabileceğini biliyordum, her zaman performans konusunda ki sıkıntıları düşündüğüm için yaptığım bir araştırma sonucu elde ettiğim veriler:

Ornek bir projenin test suresi
  • Jetty: 19 sn
  • Tomcat: 19 sn
  • Resin: 29 sn
Startup süresi yönünden
  • Jetty: 7 sn
  • Tomcat: 8 sn
  • Resin: 13 sn

Bu arada belirtmekte fayda var, Resin şu anda iki versiyon olarak bulunmakta, birisi ücretli diğeri ise açık kaynak ve ücretsiz, testler ücretsiz versiyonda yapılmıştır.

Embedded Tomcat - Türkçe Karakter Sorunu

Bir önceki yazımda Embedded Tomcat'den bahsetmiş ve nasıl kullanabileceğiyle ilgili örnekler vermiştim. İlerleyen günlerde gördümki Tomcat'in türkçe karakterler konusunda bazı sıkıntıları var ve bunun bir bug olmadığını, böyle olması gerektiğini savunuyor.

Java ile Web uygulamaları geliştirirken türkçe karakterlerde sorun yaşamamak için

response.setCharacterEncoding("ISO-8859-9");

gibi, encoding i türkçe olarak işaretlerdim, pek çok uygulama sunucusunda da böyle bir sıkıntı yaşamamıştım. Hatta bunu bir filter olarak belirleyip her sayfada yazmaktan da kurtulmuştum ancak embedded Tomcat'de bu tek başına yeterli olmadı malesef. Türkçe karakterlerle ilgili sorunu aşabilmek için

String text = new String(request.getParameter("ParamaterName").getBytes("ISO-8859-9"),"UTF-8");

gibi bir yöntem kullandım ancak bu çözümden çok ta hoşnut değilim. Arayışlarım sürüyor ancak bu şimdilik en azından bir çözüm. Bu konuda Tomcat'de bunun bir bug olmadığı ve tavsiyeler yönünde bir FAQ bulunmakta.

15 Kasım 2007 Perşembe

En İyi 12 Ruby on Rails Örneği

Ruby on Rails le ilgili 'Merhaba Dünya' örnekleri üzerinde çalışmaya başladığım şu günlerde güzel bir kaynak buldum.

Top 12 Ruby on Rails Tutorials

Yakında Ruby nedir? Ne işe yarar? yazıcam ama önce bir öğreneyim de :))

Oracle Veritabanındaki Türkçe Karakter Sorunu

Oracle veritabanını kurdunuz ve büyük bir keyifle JDBC veya OCI ile java dan bağlandınız ve çeşitli verileri kaydettiniz, bir de baktınız ki, türkçe karakterlerde sorun var, siz sorgunuzda 'ş' gönderiyorsunuz ama Oracle bunu 's' olarak gösteriyor. Eeee sorun nerde?

Sorun, Oracle Veritabanı kurulurken 'Character Set' için AL32UTF8 yi seçmeniz gerekiyor, vaktiyle bir projede bu konfigürasyonu bilmemem yüzünden ciddi sıkıntılar yaşadım, siz yaşamayın :)

10 Kasım 2007 Cumartesi

Netbeans 5.5 i Spring Framework destekler hale getirmek

Yazılım geliştirme süreçleri içerisindeki en büyük yardımcımız IDE'lerdir, Spring Framework ile haşır neşir olduğun şu günlerde en çok kullandığım ve sevdiğim IDE olan Netbeans'i Spring Framework ü destekler hale getirebiliriz. Bunun için http://sourceforge.net/projects/spring-netbeans/ adresinden nbm paketini indirip netbeans update i kullanarak güncelleyebiliriz.

daha detaylı bilgi için http://www.netbeans.org/kb/55/quickstart-spring.html

Embedded Tomcat - Uygulama içerisindeki Tomcat Sunucunuz

Son günlerde yazdığım web uygulamalarıyla ilgili bir kurulum programı hazırlamam gerekti. Müşterimiz bunun bir setup paketi olmasını ve çift tıklayarak kolayca kurulmasını istedi.

Java uygulamalarımız içerisine Tomcat sunucusunu (gömülü) Embedded olarak tanımlayıp, java uygulamamız başladığı zaman, istediğimiz port ve isimden uygulamamızı yayınlayabiliyoruz.

Bu bize, tek java uygulaması içerisinde gömülü bir web sunucu ve buna yükleyeceğimiz (deploy) edeceğimiz bir web uygulaması ve hatta belki de bir java veritabanı kullanıyorsak (hsqldb,derby vs...) tümleşik bir uygulamayı, tek bir java uygulama çatısı altında topluyoruz ve hatta bunu da bir kurulum paketi (setup) haline getirip müşterimize teslim edebiliyoruz.

Embedded Tomcat için
1.linkteki http://tomcat.apache.org/download-55.cgi alt kısımda bulunan embedded versiyonunu indiriyoruz.
2.Java application tanimlayarak, dosyanın içindeki jar ları projemize ekliyoruz,
3. EmbeddedTomcat class ını projemize dahil ediyoruz.
4. Main sınıfımız içerisinden

EmbeddedTomcat embeddedTomcat = new EmbeddedTomcat("test",8292);
embeddedTomcat.start();

satırlarıyla sunucumuzu başlatıyoruz.

5. http://localhost:8292 adresini web browser ımıza yazdığımız zaman Tomcat in ana giriş ekranını görebiliriz.

Bu noktadan sonra artık elinizdeki web projelerinizi deploy edebilir ya da yine embedded java veritabanlarınıza bağlarak çeşitli işlemler gerçekleştirebilirsiniz. Umarım bu yazı faydalı olmuştur.

import org.apache.catalina.*;
import org.apache.catalina.connector.*;
import org.apache.catalina.realm.*;
import org.apache.catalina.startup.*;
import org.apache.catalina.users.*;

public class EmbeddedTomcat
{
// Instance variables:
private String name;
private int portNumber;
private Embedded embedded;
private Engine baseEngine;
private Host baseHost;
private Connector httpConnector;

/** Creates a new instance of EmbeddedTomcat */
public EmbeddedTomcat(
String name,
int portNumber)
{
this.name = name;
this.portNumber = portNumber;

init();
}

private void init()
{
MemoryRealm realm;
Context context;
String baseEngineName;
String hostName;

embedded = new Embedded();

// set default logger and realm
/*
FileLogger fileLog = new FileLogger();
fileLog.setDirectory(".");
fileLog.setPrefix(name);
fileLog.setSuffix(".log");
fileLog.setTimestamp(true);
embedded.setLogger(fileLog);
*/
realm = new MemoryRealm();
embedded.setRealm(realm);

// create an Engine
baseEngine = embedded.createEngine();

// set Engine properties
baseEngineName = name + "Engine";
hostName = name + "Host";

baseEngine.setName(baseEngineName);
baseEngine.setDefaultHost(hostName);

baseHost = embedded.createHost(hostName, "webapps");
baseEngine.addChild(baseHost);

// RootContext
context = addContext("", "ROOT");

// ManagerContext
context = addContext("/manager", "manager");
context.setPrivileged(true);

// add new Engine to set of Engine for embedded server
embedded.addEngine(baseEngine);

// create Connector
httpConnector = embedded.createConnector((java.net.InetAddress) null,
portNumber, false);

// add new Connector to set of Connectors for embedded server, associated
// with Engine
embedded.addConnector(httpConnector);
}

public void start()
{
// start server
try
{
embedded.start();
}
catch (org.apache.catalina.LifecycleException ex)
{
ex.printStackTrace();

//fileLog.log("Startup failed");
//fileLog.log(ex.getMessage());
}
}

public Context addContext(
String path,
String docBase)
{
Context c;

c = embedded.createContext(path, docBase);
baseHost.addChild(c);

return c;
}
}

7 Kasım 2007 Çarşamba

Dojo 1.0 versiyonu duyuruldu

Dojo 1.0 versiyonu dün duyuruldu (06.11.2007)

"Javascript toolkit" olan dojo'nun yeni versiyonu duyuruldu, geliştirilen yeni versiyonda güzel özellikler mevcut. Önceki sürümü kullanmış ve pek çok hoş özelliğini bildiğim dojo nun bu yeni versiyonunu da büyük bir keyifle kullanacağımdan eminim.
Yeni versiyondan bir kaç özellik;

*Yüksek performanslı grid özelliği, binlerce verilik bir grid i performanslı olark gösterme (Eski versiyon, xml den de okuyabiliyordu, yenisinde cok daha fazla ek ozellik mevcut)
*2 ve 3 boyutlu pasta dilimi grafikleri sunabilme
*Yerel diller ile uyumlu çalışma, 13 dil desteklediği söyleniyor
*Kolay özelleştirebilme imkanı (kesinlikle haklılar)
*Diğer toolkit leri desteklemesi
*Diğer ajax componentleri vs...

daha detaylı ilgilenenler için DEMO su incelenebilir.

3 Kasım 2007 Cumartesi

RMI nedir? ne işimize yarar? olmazsa olmaz mı? (1)

Mümkün olduğunca basit, sade ve gerçek dünyada işimize yarayacak örneklerle anlatmaya çalışacağım.

RMI (Remote Method Invocation) kelime olarak "Uzak Metod Çağırımı" anlamına gelmektedir. RMI adından da anlaşılabileceği gibi uzakta (network üzerinden erişebildiğimiz herhangi bir yerde) olan bir makina üzerinde çalışan programa erişim kolaylığı sağlayan bir teknolojidir.

RMI konusuna hızlı bir başlangıç yapabilmek için aşağıdaki aşamaları kısaca bakmakta fayda var.

Interface : Sunucu ile istemci arasındaki bilgi iletişiminin sağlanması
Sunucu : Uzak makina dediğimiz, üzerinde bir java uygulaması çalışan kısım
İstemci : İstemci makina üzerinde çalışan java uygulamamız, sunucuya bağlanarak çeşitli işlemlerin gerçekleştirilmesini isteyebilir.

Geliştireceğimiz örnekte sunucu tarafında iki metod bulunacak ve bunlardan birisi kart sorgula, digeri kart iptal olacak ve istemci tarafından bu metodlara nasıl ulaşıp çağıracağımızı inceleyeceğiz.

Uygulayacağımız senaryo ise, sunucu kısmı dediğimiz iş mimarisini oluşturan kısım bir bankanın Kredi Kartlarıyla ilgili uygulaması olduğunu varsayacağız.İş mimarisini oluşturan yazılım, interface i uygulayarak iki metod için gerekli işleri yapacaktır. İstemci ise yine bu interface yoluyla sunucu programın sahip olduğu bu metodları görebilecek ve işlem yapacaktır. İstemci, öncelikle bir kredi kartı numarasını sorgulayacak ve daha sonra bu kredi kartını iptal i için gerekli metodları çağıracaktır.