22 Eylül 2012 Cumartesi

Hudson ve Sonar (Continuous Integration Softwares)

http://yazilimsozluk.com/Default.aspx?KonuId=1579 da bir soruya cevap olarak benim tarafımdan yazılmıştır.


•Bir senaryo üzerinden açıklamaya çalışayım.
Hudson ile başlayayım. Mesela ortada bir tane web projesi var. Büyük bir proje yaklaşık 9 kişi gerçekliyor olsun. Proje elemanları arasındaki hiyerarşik düzen de 1 üst yönetici, 1 takım lideri, onun altında 2 tane tecrübeli eleman, bunun altında da 5 tane junior çalışan olsun. Bunlardan 3 ü client side ta 2 si de server side da çalışıyor olsun. Proje için bir ant task hazırlanmış olsun ve herkes kendi serverına ayrı ayrı deploy ederek çalıştırıyor olsun. Bir tane de test server ı olsun ara ara projenin son halinin buraya deploy edilmesi şart olsun. Şimdi hudson dediğimiz amcaya bir ant task vasıtasıyla bu projenin kurulumunu yaparsın. Projede çalışan elemanları tanıtırsın. Hudson amcam senin belirlediğin zamanlarda(svn e her committe,günlük,haftalık,aylık istediğin periodlarda) bu projeyi svn den çeker, kullandığın ant task ı çalıştırır, projeyi derler, testleri çalıştırır, war haline getirir,server a deploy eder ve kodları sonar a atar(sonar ı aşağıda açıklayacağım). Böylece kodun istediğin zamanlarda en güncel hali server da bulunmuş olur. Diyelim ki birisinin commit tinden sonra kod düzgün çalışmamaya başladı, server a deploy edilemedi ya da testlerden biri patladı. Hudson amcam gider bu developer arkadaşa mail atar. Der ki bak senin şu commmit tinden sonra şu kodlar patladı ya da şu test patladı diye. Ne olur başka birinin ruhu bile duymadan developer o hatayı düzeltebilir. Hatta bir ws aracılığıyla cep telefonuna mesaj bile attırtabilirsin(Henüz denemedim). Ayrıca durumdan yöneticiyi takım liderini ya da her kimi istiyorsan onları da haberdar edebilir. Herşey configurasyona kalmış. Bence yazılım geliştirmede inanılmaz faydalar sağlayan bir amcamızdır.

Gelelim sonar a. Yukarıda bir bölümde dedik ki hudson herşeyi yapar kodları sonar a paslar. Sonar ne yapar? Sonar da alır bu kodları analiz eder. Der ki arkadaş bak senin projende 60000 satır kod var bu kodun şu kadarında comment var, bu kadarında yalnış yazımlar var ,şuralarda türkçe karakter kullanmışsın, buralarda treadsafe olmayan bir operasyon var , bak şu metodunun complexity si fazla bak bu metodda çok fazla satır var, bak arkadaş sen if açmışsın ama içini doldurmamışsın bunu niye açtın, bak burda bir for var boşu boşuna dönüyor bu nedir, arkadaş şu metoda niye bu kadar az comment yazdın ve daha sayamıycağım bir çok noktada developerları uyarıyor ve kod kalitesini inanılmaz ölçüde arttırıyor.
Yani bu 2 yazılımı kullanarak verdiği uyarıları kulak arkası yapmayıp uygun şekilde şekillenirse proje, ileriki zamanlarda bakım işleri de çok kolaylaşıyor ve sağlam bir proje olmak için bir adam öne çıkıyor.

Elimden geldiğince anlatmaya çalıştım. Herkese kolay gelsin..

16 Eylül 2012 Pazar

StringBuilder vs String +=


package deneme;

import java.util.Calendar;

package deneme;

import java.util.Calendar;



/**
 *
 *
 *
 * @author Murat Güzel
 *
 * StringBuilder vs String += operand
 *
 */
public class Deneme {

public static void main(String[] args) {
Calendar calendar1 = Calendar.getInstance();    //1
String s = "";
for (int i = 0; i < 50000; i++) {
s += "asdasd";
}
Calendar calendar2 = Calendar.getInstance();    //2
System.out.println("String += : " + (calendar2.getTimeInMillis()
- calendar1.getTimeInMillis()));

Calendar calendar3 = Calendar.getInstance();
StringBuilder ss = new StringBuilder();
for (int i = 0; i < 50000; i++) {
ss.append("asdase");
}
Calendar calendar4 = Calendar.getInstance();    //3
System.out.println("StringBuilder.append : " + (calendar4.getTimeInMillis()
- calendar3.getTimeInMillis()));
}

}


Output :

String += : 4454
StringBuilder.append : 1

MemoryKullanımı : 
//1 de ki konumlandırılan breakpointte jawaw.exe memory kullanımı 6000K
//2 de ki konumlandırılan breakpointte jawaw.exe memory kullanımı 22576K
//3 de ki konumlandırılan breakpointte jawaw.exe memory kullanımı 22900K


Görüldüğü gibi bu işlem StringBuilder ile çok kısa bir zamanda ve çok daha az memory kullanılarak yapılmaktadır. Bu da bir projede çokça yapılan string operasyonlarında 2 teknik arasında büyük bir fark açığa çıkmasına neden olur.

Web projelerinde string operasyonları

     Mesela diyelim ki bir web projeniz var ve proje bolca string operasyonu yapıyor. Bazı veriler alıyor onları birleştiriyor, parçalıyor ve output olarak ta bir text file oluşturuyor.

     String operasyonları yaparken += operatörünü kullanmaktan kaçınmamız gerekiyor elden geldiğince. Özellikle de döngülerin içinde. Çünkü bu işlem inanılmaz memory yiyor ve cpu yu çok yoruyor. Bunun yerine StringBuilder vb birşey kullanmamız gerekiyor.

     Javadan örnek vermek gerekirse bu yapıya alternatif olarak StringBuilder ve StringBuffer ımız var. Bunların birbirlerinden farkı StringBuilder ın synchronized metodu yoktur yani ThreadSafe değildir. StringBuffer ın ise hemen bütün metodları synchronized tır.Diyelim ki global bir string üzerinde değişiklikler yapıcaksınız, sessionların verileri birbirine karışmaması için StringBuffer kullanmalısınız. Eğer metod içi işlemler varsa StringBuilder işinizi görücektir.Gereksiz yerde StringBuffer kullanımı sistemi inanılmaz yavaşlatır.Tüm metodları synchronized olduğu için bir nevi lock unlock mekanızması vardır ve metodlar üzerinden tek threadden fazlası dolaşamaz.

 Yani kısaca ;

 String s = "";
 for(int i=0;i<100;i++){
    s+="asdasdasd";
}

yerine ;


StringBuilder s = new StringBuilder();
 for(int i=0;i<100;i++){
    s.append("asdasdasd");
}

kullanılmalıdır. Eger bu işlemi bir test ortamında 1000000 kere döndürüp memory ve zaman sonuçlarını karşılaştırırsanız farkı kolaylıkla görebilirsiniz.