<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5639783165278756192</id><updated>2012-02-16T08:51:23.206-08:00</updated><category term='parametre ayıklayıcı'/><category term='iframe malware'/><category term='JNI'/><category term='optimizasyon'/><category term='dinamik programlama'/><category term='jdbc'/><category term='Java Native Interface'/><category term='programcı'/><category term='jpa'/><category term='iframe virüsü'/><category term='Groovy'/><category term='komut satırı'/><title type='text'>Tuna AKIN</title><subtitle type='html'>İnsan neden programlar ki? :)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-8206003056196749304</id><published>2011-04-18T05:05:00.000-07:00</published><updated>2011-04-18T05:27:33.407-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='jdbc'/><title type='text'>JPA Türkçe Karakter Sorunu | JDBC Türkçe Karakter Sorunu | Seam Framework Türkçe Karakter Sorunu</title><content type='html'>Veritabanı kurulum yada konfigurasyon farklılıklarından ötürü JDBC yada JPA ile Türkçe karakterleri doğru persist edemiyorsanız. Çözüm aşağıdadır.&lt;br /&gt;&lt;br /&gt;Problem JDBC katmanında yaşanır. JDBC connection url'inize&lt;br /&gt;&lt;br /&gt;useUnicode=true&lt;br /&gt;characterEncoding=UTF-8&lt;br /&gt;&lt;br /&gt;parametreleri eklemelisiniz.&lt;br /&gt;&lt;br /&gt;Yani connection url'iniz&lt;br /&gt;&lt;br /&gt;jdbc:mysql://address:port/database_name?useUnicode=true&amp;characterEncoding=UTF-8&lt;br /&gt;&lt;br /&gt;gibi olmalıdır.&lt;br /&gt;&lt;br /&gt;JPA kullananlar persistence.xml içerisine&lt;br /&gt;&lt;br /&gt;&amp;lt;property name="hibernate.connection.useUnicode" value="true" /&amp;gt;&lt;br /&gt;&amp;lt;property name="hibernate.connection.characterEncoding" value="UTF-8" /&amp;gt;&lt;br /&gt;&lt;br /&gt;ekleyerek problemi çözebilirler.&lt;br /&gt;&lt;br /&gt;Seam Framework kullanlar ise ds.xml(Seam Data Source XML) dosyalarına "driver-class" tanımından hemen sonra aşağıdaki iki connection property'i eklemelidirler&lt;br /&gt;&lt;br /&gt;&amp;lt;connection-property name="useUnicode"&amp;gt;true&amp;lt;/connection-property&amp;gt;&lt;br /&gt;&amp;lt;connection-property name="characterEncoding"&amp;gt;UTF-8&amp;lt;/connection-property&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-8206003056196749304?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/8206003056196749304/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2011/04/jpa-turkce-karakter-sorunu-jdbc-turkce.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/8206003056196749304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/8206003056196749304'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2011/04/jpa-turkce-karakter-sorunu-jdbc-turkce.html' title='JPA Türkçe Karakter Sorunu | JDBC Türkçe Karakter Sorunu | Seam Framework Türkçe Karakter Sorunu'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-424105470956700387</id><published>2011-01-27T00:04:00.001-08:00</published><updated>2011-01-27T00:04:59.977-08:00</updated><title type='text'>Yüzyılın buluşu! :D</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_R2NB0YN2VT0/TUEnEzbd2pI/AAAAAAAAABM/TsQje49IvtY/s1600/usb_laptop_self-charger_cable_500.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://4.bp.blogspot.com/_R2NB0YN2VT0/TUEnEzbd2pI/AAAAAAAAABM/TsQje49IvtY/s320/usb_laptop_self-charger_cable_500.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5566773577885014674" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-424105470956700387?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/424105470956700387/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2011/01/yuzyln-bulusu-d.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/424105470956700387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/424105470956700387'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2011/01/yuzyln-bulusu-d.html' title='Yüzyılın buluşu! :D'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_R2NB0YN2VT0/TUEnEzbd2pI/AAAAAAAAABM/TsQje49IvtY/s72-c/usb_laptop_self-charger_cable_500.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-4270781779761345276</id><published>2010-10-12T06:08:00.000-07:00</published><updated>2010-10-12T06:10:20.303-07:00</updated><title type='text'>How to cook a BrainF*ck Interpreter in 5 minutes</title><content type='html'>&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vPyN-NPK1K8?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/vPyN-NPK1K8?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-4270781779761345276?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/4270781779761345276/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2010/10/how-to-cook-brainfck-interpreter-in-5.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/4270781779761345276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/4270781779761345276'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2010/10/how-to-cook-brainfck-interpreter-in-5.html' title='How to cook a BrainF*ck Interpreter in 5 minutes'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-202226012775407888</id><published>2010-10-12T06:05:00.001-07:00</published><updated>2010-10-12T06:05:54.379-07:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_8ScwVcHk5-E/TEZkOCNv7DI/AAAAAAAAEVw/gY8lQ67-WvU/s1600/wtfm.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 500px; height: 471px;" src="http://4.bp.blogspot.com/_8ScwVcHk5-E/TEZkOCNv7DI/AAAAAAAAEVw/gY8lQ67-WvU/s1600/wtfm.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-202226012775407888?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/202226012775407888/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2010/10/blog-post.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/202226012775407888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/202226012775407888'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2010/10/blog-post.html' title=''/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_8ScwVcHk5-E/TEZkOCNv7DI/AAAAAAAAEVw/gY8lQ67-WvU/s72-c/wtfm.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-3260489296296306357</id><published>2010-02-09T00:54:00.000-08:00</published><updated>2010-02-09T08:03:27.907-08:00</updated><title type='text'>DB2Model - Veritabanı Analizcisi ve Php Model Kodu Üretici (code generator)</title><content type='html'>DB2Model da ne? DB2Model işlerimi kolaylaştırması için geliştirdiğim sade bir kod üreteci(code generator). Uygulamalarını geliştirmek için MVC paternini kullananlardansanız bildiğiniz üzere yazılımınıza ekleyeceğiniz yeni bir kavram için model yada modeller, view ve ilişkili olarak controllerlar yazarsınız. Yazılım geliştirmek malumunuz dünyanın en basit işlerinden biri sayılmaz ve çoğunlukla fazlaca vakit alır. Bu gerçeklerin farklındalığıyla geçen gece uykum açıldı ve geçtim bilgisayarımın karşısına. Çok sürmeyen bir ( programlama -&gt; test etme -&gt; manyak kahkahası ) sürecinden sonra ilk çalışan sürüm hardiskimin üzerindeydi. Ertesi sabah işe gitmek üzere uyandığımda uzun zamandır ilk defa uykusuzluğumun bana mutluluk verdiğini hissettim. Artık model kodu yazarken bana yardımcı olacak bir asistanım vardı. Bu asistan herhangi bir veritabanı tablosunu analiz edip tablo üzerinde işlem yaparken temel olarak ihtiyaç duyabileceğim tüm methodları hiç hata yapmadan implemente edebiliyor.&lt;br /&gt;&lt;br /&gt;Gereksinimler:&lt;br /&gt;Bu yazılım Zend Framework'te uygulanmış Zend_Db ve Zend_Config modüllerine ihtiyaç duyar. (Üretilen kodu kısıtlı vaktimin elverdiğince DBMS'ten bağımsız kılmaya çalıştım.)&lt;br /&gt;&lt;br /&gt;Kurulum:&lt;br /&gt;Mysql için model kodu üretecek iseniz, mysqli eklentisinin kurulu olduğu her php ortamın da çalışır diye umuyorum.&lt;br /&gt;&lt;br /&gt;Kullanım:&lt;br /&gt;http://domain/db2model.php?table=TABLO_ISMI&lt;br /&gt;hemen ardından ekranda birkaç yüz satır kod belirecek.&lt;br /&gt;&lt;br /&gt;İndirmek için &lt;a href="http://tunaakin.com/bundle/db2model.rar"&gt;tıklayın&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-3260489296296306357?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/3260489296296306357/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2010/02/db2model-php-veritaban-analizcisi-ve.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/3260489296296306357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/3260489296296306357'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2010/02/db2model-php-veritaban-analizcisi-ve.html' title='DB2Model - Veritabanı Analizcisi ve Php Model Kodu Üretici (code generator)'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-6200921279447730541</id><published>2009-08-29T16:27:00.000-07:00</published><updated>2009-08-29T19:04:35.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Native Interface'/><category scheme='http://www.blogger.com/atom/ns#' term='JNI'/><title type='text'>JNI (Java Native Interface)</title><content type='html'>JNI nedir? Ne değildir?&lt;br /&gt;JNI, Java uygulamalarınıza sanal makine de uygulanmamış ve saf Java ile uygulanması imkansız yada çok zor olan yetenekleri katabilmenize yarar. Java, felsefesi gereği platform spesifik fonksiyonelliği bünyesinde barındırmaz. Bundan ötürüdür ki JNI, Java kullanarak platform spesifik işleri halledebileceğiniz neredeyse tek yoldur. Ayrıca JNI farklı diller ile geliştirilmiş, C altından çağrılabilir uygulama ve kütüphanelerin Java üzerinden erişilebilmesini mümkün kılar. Tüm bunların yanında JNI performans gerektiren işlerin native kod kullanılarak JVM’in sağlayabileceğinden daha yüksek verim ile halledilebilmesine imkan tanır. Peki bütün bunların yanında JNI’nin zararlı yan etkileri yokmudur? Evet vardır. Öncelikle native bağlantısı olan Java programları JVM’nin sunduğu yüksek taşınabilirlik yeteneğini kaybederler. Dolayısıyla programların platformlar arasında taşınabilirliği daha zor bir iş haline gelir. Ayrıca JNI üzerinden Java sanal makinesine bağlanmış kodlarda bulunan bir hatanın saptanması zordur, daha da kötüsü bu hata tüm sanal makine de etkili olabilecek ciddi hatalara ve çökmeye yol açabilir. Artık JNI’nin ne işe yaradığını avantajlarını-dezavantajlarını bildiğimize göre nasıl kullanıldığını bir örnekle inceleyebiliriz:&lt;br /&gt;&lt;br /&gt;Native.java dosyasının içeriği:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;public class Native {&lt;br /&gt;&lt;br /&gt;        static {&lt;br /&gt;                System.loadLibrary("native_library");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static native int sum(int x, int y);&lt;br /&gt;&lt;br /&gt;        public static void main(String[] args) {&lt;br /&gt;                System.out.println(sum(3, 5));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Yukarıda son derece sade bir Java sınıfı görüyoruz. Bu sınıf, sınıf yükleyicisi tarafından sınıfın yüklendiği anda çalıştırılacak static tanımlı blok, bir native metod deklerasyonu ve Java programının çalışmaya başlayacağı main metoduna sahip. Sınıfımızı javac ile derliyoruz:&lt;br /&gt;&lt;br /&gt;javac Native.java&lt;br /&gt;&lt;br /&gt;Elde ettiğimiz byte kodun(Native.class dosyası) içinde geçen native metodun(sum) javah kullanarak C deklerasyonunu elde ediyoruz:&lt;br /&gt;&lt;br /&gt;javah -jni Native&lt;br /&gt;&lt;br /&gt;Şimdi elimizde iki adet dosya var: Native.class ve Native.h&lt;br /&gt;&lt;br /&gt;Burda Native.class bilindiği üzere JVM üzerinde işletilecek bytecode, Native.h ise Native.class içinde çağrıda bulunulan native metodun(sum) C deklerasyonu. Şimdi yapmamız gereken Native.h dosyasında deklare edilmiş c fonksiyonu uygulamak.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;/* DO NOT EDIT THIS FILE - it is machine generated */&lt;br /&gt;#include &amp;#60;jni.h&gt;&lt;br /&gt;/* Header for class Native */&lt;br /&gt;&lt;br /&gt;#ifndef _Included_Native&lt;br /&gt;#define _Included_Native&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;extern "C" {&lt;br /&gt;#endif&lt;br /&gt;/*&lt;br /&gt; * Class:     Native&lt;br /&gt; * Method:    sum&lt;br /&gt; * Signature: (II)I&lt;br /&gt; */&lt;br /&gt;JNIEXPORT jint JNICALL Java_Native_sum&lt;br /&gt;  (JNIEnv *, jclass, jint, jint);&lt;br /&gt;&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;}&lt;br /&gt;#endif&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Yukarıda gördüğümüz Native.h dosyasının içeriğidir. Görüldüğü üzere bu başlık dosyası&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;JNIEXPORT jint JNICALL Java_Native_sum&lt;br /&gt;  (JNIEnv *, jclass, jint, jint);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;biçminde bir fonksiyon prototipi içeriyor.&lt;br /&gt;Native.cpp adında bir C++ kaynak kod dosyası oluşturdum ve dosya içinde&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;#include "Native.h"&lt;br /&gt;&lt;br /&gt;JNIEXPORT jint JNICALL&lt;br /&gt;Java_Native_sum(JNIEnv *env, jclass cls, jint num1, jint num2) {&lt;br /&gt;    return num1 + num2;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;yukarıda görüldüğü gibi Java_Native_sum fonksiyonunu implemente ettim. Bu işi de hallettiğime göre geriye yalnız herşeyi birleştirmek kaldı.&lt;br /&gt;&lt;br /&gt;Linux yada Mingw kurulu ve Path konfigurasyonu yapılmış bir Windows üzerinde aşağıda ki kabuk komutu ile derleme işini halledebiliriz.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -I"D:/Program Files/Java/jdk1.6.0_14/include" -I"D:/Program Files/Java/jdk1.6.0_14/include/win32" -shared Native.cpp -o native_library.dll&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Burada üç noktaya dikkat etmelisiniz. Birincisi -I parametresi ile gcc'ye bildirilen jni.h ve jni_md.h dosyalarının gerçek lokasyonları sizin makinanızda kurulum farklılıklarına göre değişebilir. İkincisi -Wl,--kill-at bağlayıcı(linker) direktifi verilmediği taktirde JVM üretilen shared kütüphanede ki tanımlara erişemez. Üçüncüsü kullandığınız işletim sistemine göre -o parametresinde verilen derleyici çıktı dosyası adını native_library.dll yada native_library.so biçminde düzenlemelisiniz.&lt;br /&gt;&lt;br /&gt;Evet herşeyi doğru yaptıysak elimizde java kaynak kodu ile beraber Native.class, Native.h, Native.cpp ve native_library.so yada native_library.dll dosyaları bulunmaktadır. Artık java Native deyip ekranda 8 yazdığını görebiliriz :D Küçük fakat iyi bir başlangıç yapmış olduk. Bununla beraber JNI tabiki iki sayıyı toplamak için geliştirilmemiştir. Aksine genellikle Java'nın tasarımı ve felsefesi gereği uygun olmadığı işleri halletmek yada farklı dillerde yazılmış kütüphanelerin Java altından erişilebilir hale getirilmesinde kullanılır ve oldukça ayrıntılı bir programlama arayüzüdür. Şimdilik bu yazımı zaman sıkıntım dolayısı ile bitirmek zorundayım. Fakat yakın bir zaman içerisinde temel JNI fonksiyonelliğine değinen bir yazı daha hazırlama planım var. Umarım zaman bulabilirim. Hoşçakalın.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-6200921279447730541?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/6200921279447730541/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2009/08/jni-java-native-interface.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/6200921279447730541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/6200921279447730541'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2009/08/jni-java-native-interface.html' title='JNI (Java Native Interface)'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-6315656637336381824</id><published>2009-08-23T09:58:00.000-07:00</published><updated>2009-08-30T08:04:05.058-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iframe virüsü'/><category scheme='http://www.blogger.com/atom/ns#' term='iframe malware'/><title type='text'>Iframe malware - Iframe virüsü</title><content type='html'>Uzun zamandır web tabanlı yazılım geliştiricileri rahatsız eden bir malware türü var ortalıkta. Bu malware'ın tipik davranışı bir activex açığından yararlanıp kişisel bilgisayarlara yerleşmek, kişinin sunucuya erişmekte kullandığı ftp bilgilerini elde etmek ve ardından bu ftp bilgilerini kullanıp sunucu üzerinde ki index dosyalarına kendisinin diğer pclere yayılmasını sağlacak bir iframe yerleştirmek. Bir iki gün önce bir telefon aldım. Önemli bir web projemin index dosyasında malware iframe bulunduğunu bana haber verdiler. Birden çok kişi pclerini kullanarak proje sunucusunun ftp hizmetiyle eriştiğinden index dosyasına iframe'i atan infekte olmuş pc belirsizdi. Bu durumda önümde iki seçenek vardı. Birincisi sunucuya ftp üzerinden erişimde bulunulan tüm makinelerin güvenliğini sağlamak, ikincisi sunucunun güvenliğini sağlamak. İlk önce hemen index içinde ki iframe kodunu el ile temizledim. Ardından olası infekte olmuş pclerin temizlenmesi için diğerlerini bu konuda uyardım. Fakat nihayi olarak herkezin kendi makinesinin güvenliğini sağlayabilmesi mümkün olmayabilirdi. Bu durumda ikinci seçeneğin daha kesin bir çözüm sağladığına karar verdim. Ama bunu yapmak pratikte pek de kolay gözükmüyordu. Nihayetinde birileri infekte olmuş bilgisayarı ile farkında olmadan yine index'e iframe yerleştirmesine neden olabilirdi. Sunucu tarafında ise herşey olağan gözüktüğünden bu durumun sunucu tarafından yakalanması da en azından anlık olarak zor gözüküyordu. Dosya yetkilerini ftp tarafından yazılamaz hale getirmek aklıma geldiysede üzerinde sürekli geliştirme uygulanan bir proje de bu hiç pratik olmazdı. Fakat bir şekilde bu duruma bir çözüm bulmam gerekiyordu, zamanım son derece kısıtlıydı. O gece aklıma infekte olmuş dosyaları tarayan ve içinde belirli bir formda iframe taşıyanları temizleyen küçük bir tarayıcı programlamak geldi. Bir kaç saat içerisinde elimde somut bişey oluşmuştu. Testleri de yapıp sonucun pozitif olduğunu görmemin ardından rahat bir uykuya daldım.&lt;br /&gt;&lt;br /&gt;Bu gün ise aklıma diğer meslektaşlarımın da bu tür bir çözümü kullanmak isteyebilecekleri geldi ve iframe avlayıcısının nasıl çalıştığını anlatmaya koyuldum :&lt;br /&gt;&lt;br /&gt;Öncelikle iframe avlayıcısı iki parçadan meydana geliyor&lt;br /&gt;1) Küçük bir C programı&lt;br /&gt;2) Küçük bir Bash scripti&lt;br /&gt;&lt;br /&gt;C programı C'nin C99 sürümünü destekleyen tüm C derleyicilerinde derlenebilirdir ve aşağıda kaynak kodu bulunmaktadır :&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;#include &amp;#60;stdio.h&gt;&lt;br /&gt;#include &amp;#60;stdlib.h&gt;&lt;br /&gt;#include &amp;#60;string.h&gt;&lt;br /&gt;#include &amp;#60;stdbool.h&gt;&lt;br /&gt;&lt;br /&gt;#define LINE_BUFFER_LEN 32768&lt;br /&gt;#define PATTERN_ELEMENT_LENGTH 128&lt;br /&gt;&lt;br /&gt;const char IFRAME_VIRUS_PATTERN[][PATTERN_ELEMENT_LENGTH] = {&lt;br /&gt;    "&amp;#60;iframe",&lt;br /&gt;    "src=\"http://",&lt;br /&gt;    "width=",&lt;br /&gt;    "height=",&lt;br /&gt;    "style=\"visibility: hidden\"&gt;",&lt;br /&gt;    "&amp;#60;/iframe&gt;"&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;typedef struct {&lt;br /&gt;    const char *start;&lt;br /&gt;    const char *end;&lt;br /&gt;} VirusLocation;&lt;br /&gt;&lt;br /&gt;bool isLineInfected(const char *line, VirusLocation *vloc);&lt;br /&gt;void clearInfectedLine(char *line, const VirusLocation *vloc);&lt;br /&gt;&lt;br /&gt;int&lt;br /&gt;main(int argc, char *argv[]) {&lt;br /&gt;    FILE * sourceFile;&lt;br /&gt;    const char *filePath = NULL;&lt;br /&gt;&lt;br /&gt;    if (argc == 2) {&lt;br /&gt;        filePath = argv[1];&lt;br /&gt;    } else {&lt;br /&gt;        printf("Usage : aiframe [filename]\n");&lt;br /&gt;        return EXIT_FAILURE;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    sourceFile = fopen(filePath, "r");&lt;br /&gt;    &lt;br /&gt;    if (sourceFile != NULL) {&lt;br /&gt;        char lineBuffer[LINE_BUFFER_LEN];&lt;br /&gt;        VirusLocation vloc;&lt;br /&gt;        while (!feof(sourceFile)) {&lt;br /&gt;            fgets(lineBuffer, LINE_BUFFER_LEN, sourceFile);&lt;br /&gt;            if (isLineInfected(lineBuffer, &amp;vloc)) {&lt;br /&gt;                clearInfectedLine(lineBuffer, &amp;vloc);&lt;br /&gt;            }&lt;br /&gt;            if (!feof(sourceFile)) {&lt;br /&gt;                printf("%s", lineBuffer);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        fclose (sourceFile);&lt;br /&gt;    } else {&lt;br /&gt;        printf("Can not open file : %s\n", filePath);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    return EXIT_SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool&lt;br /&gt;isLineInfected(const char *line, VirusLocation *vloc) {&lt;br /&gt;    const char *linePtr = line;&lt;br /&gt;    const int patternLen = sizeof(IFRAME_VIRUS_PATTERN) / PATTERN_ELEMENT_LENGTH;&lt;br /&gt;    &lt;br /&gt;    int i;&lt;br /&gt;    for (i = 0; i &lt; patternLen; i++) {&lt;br /&gt;        if ((linePtr = strstr(linePtr, IFRAME_VIRUS_PATTERN[i])) == NULL) {&lt;br /&gt;            return false;&lt;br /&gt;        } else {&lt;br /&gt;            if (i == 0) {&lt;br /&gt;                vloc-&gt;start = linePtr;&lt;br /&gt;            } else if (i == (patternLen - 1)) {&lt;br /&gt;                vloc-&gt;end =&lt;br /&gt;                linePtr + strlen(IFRAME_VIRUS_PATTERN[patternLen - 1]) - 1;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&lt;br /&gt;clearInfectedLine(char *line, const VirusLocation *vloc) {&lt;br /&gt;    const char *linePtr = line;&lt;br /&gt;    char clearedLine[LINE_BUFFER_LEN];&lt;br /&gt;    &lt;br /&gt;    int i = 0;&lt;br /&gt;    while (*linePtr != '\0') {&lt;br /&gt;        if (linePtr &lt; vloc-&gt;start || linePtr &gt; vloc-&gt;end) {&lt;br /&gt;            clearedLine[i++] = *linePtr;&lt;br /&gt;        }&lt;br /&gt;        linePtr++;&lt;br /&gt;    }&lt;br /&gt;    strcpy(line, clearedLine);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bash scripti ise yukarda kaynak kodu verilmiş C programını kullanır&lt;br /&gt;(C programının derlenmiş halinin adı "aiframe" olmalı) :&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;SOURCE_FILE=$1&lt;br /&gt;SCANNED_FILE=$1.tmp&lt;br /&gt;aiframe $SOURCE_FILE &gt; $SCANNED_FILE&lt;br /&gt;&lt;br /&gt;SOURCE_FILE_SIZE=$(du -b $SOURCE_FILE | awk '{ print $1  }')&lt;br /&gt;SCANNED_FILE_SIZE=$(du -b $SCANNED_FILE | awk '{ print $1  }')&lt;br /&gt;&lt;br /&gt;if [ $SOURCE_FILE_SIZE != $SCANNED_FILE_SIZE ]; then&lt;br /&gt;        echo File sizes not equal : $SOURCE_FILE_SIZE, $SCANNED_FILE_SIZE&lt;br /&gt;        echo File is possible to infected : $SOURCE_FILE&lt;br /&gt;        SOURCE_FILE_OWNER=$(ls -l $SOURCE_FILE  | awk '{print $3}')&lt;br /&gt;        SOURCE_FILE_GROUP=$(ls -l $SOURCE_FILE  | awk '{print $4}')&lt;br /&gt;        rm -f $SOURCE_FILE&lt;br /&gt;        mv $SCANNED_FILE $SOURCE_FILE&lt;br /&gt;        chown $SOURCE_FILE_OWNER:$SOURCE_FILE_GROUP $SOURCE_FILE&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;rm -f $SCANNED_FILE&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Peki bu programı nasıl kullanıyoruz?&lt;br /&gt;&lt;br /&gt;Öncelikle C programımızın IFRAME_VIRUS_PATTERN kısmını size bela olmuş iframe malware'ına göre düzenleyin.&lt;br /&gt;&lt;br /&gt;Eğer index dosyalarınıza malware tarafından eklenmekte olan iframe kodu :&lt;br /&gt;&lt;br /&gt;&amp;#60;iframe src="http://iambad.com/" height=123 width=343 style="visibility:hidden"&gt;&amp;#60;/iframe&gt;&lt;br /&gt;&lt;br /&gt;gibiyse IFRAME_VIRUS_PATTERN kısmını sırası ile&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;const char IFRAME_VIRUS_PATTERN[][PATTERN_ELEMENT_LENGTH] = {&lt;br /&gt;    "&amp;#60;iframe",&lt;br /&gt;    "src=\"http://iambad.com/",&lt;br /&gt;    "height=",&lt;br /&gt;    "width=",&lt;br /&gt;    "style=\"visibility: hidden\"&gt;",&lt;br /&gt;    "&amp;#60;/iframe&gt;"&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;gibi düzenleyebilirsiniz. Burada amaç malware'ın eklediği iframe'in sabit olan kısımlarını sırası ile belirlemek(ortalıkta farklı ve değişken formları mevcut). Ben yukarıda ki iframe tanımında "&amp;#60;iframe", "src=\"http://iambad.com/" .. gibi kısımlarının ne olursa olsun sabit olduğunu varsaydım. Burada kesinlikle dikkat etmenizin gerektiği bir nokta var. Eğer index dosyalarınızın içinde daha önceden eklemiş olduğunuz iframeleriniz bulunuyorsa IFRAME_VIRUS_PATTERN'in onlarla uyuşmamasını sağlamalısınız, aksi taktirde onlarda malware olarak algılanıp kaldırılırlar.&lt;br /&gt;&lt;br /&gt;IFRAME_VIRUS_PATTERN kısmını düzenlediyseniz programı derlemek için;&lt;br /&gt;gcc aiframe_kaynak_kodu.c -o aiframe&lt;br /&gt;bash komutunu kullanabilirsiniz.&lt;br /&gt;&lt;br /&gt;Ardından bash scriptini de aiframe_run.sh dosyası altında kayıt edin ve aiframe_run.sh ile birlikte derlenmiş aiframe adında ki C programımızı /usr/bin dizini altına atın.&lt;br /&gt;&lt;br /&gt;Artık tek yapmanız gereken&lt;br /&gt;find /web/dosyalarının/kök/dizini -type f -name index.* -exec aiframe_run.sh '{}' \;&lt;br /&gt;gibi tüm web dökümanlarını tarayan bir bash komutunu belirli aralıklar ile çalışacak hale getirmek. Bunun için crontab'ı kullanabilirsiniz. Bu sayede artık index dosyalarımıza malware'ın eklemiş olduğu iframe kodları otomatik olarak çok kısa bir süre içerisinde kaldırılacaktır.&lt;br /&gt;&lt;br /&gt;Tüm bunların yanında belirtmeliyim ki. Iframe avlayıcısından kaynaklanabilecek herhangi bir zarardan ötürü sorumluluk kabul edilmemektedir. Ne yaptığınızı bilerek ve sorumluluğu alarak yapın. Tüm web kök dizinine uygulamadan önce güvenli bir iki test yapmanızı öneririm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-6315656637336381824?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/6315656637336381824/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2009/08/iframe-malware.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/6315656637336381824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/6315656637336381824'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2009/08/iframe-malware.html' title='Iframe malware - Iframe virüsü'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-4596315179471725963</id><published>2009-08-22T10:32:00.000-07:00</published><updated>2009-08-25T13:13:04.961-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dinamik programlama'/><category scheme='http://www.blogger.com/atom/ns#' term='optimizasyon'/><title type='text'>Dinamik programlama</title><content type='html'>Uzun zamandır birşeyler yazamadım. Bir yerlerde dinamik programlama üzerine birşeyler okumuştum, açlığın tavana vurduğu iftar saatine doğru birden aklıma geldi. Ben de açlığımı bastırma, zamanı hızlandırma niyetiyle bir örnek program yazmaya karar verdim. Aşağıda dinamik programlama tekniği ile yazılmış küçük bir C programı görüyorsunuz :&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;#include &amp;#60;stdio.h&gt;&lt;br /&gt;#include &amp;#60;stdlib.h&gt;&lt;br /&gt;#include &amp;#60;time.h&gt;&lt;br /&gt;#include &amp;#60;math.h&gt;&lt;br /&gt;&lt;br /&gt;typedef unsigned long long ull_int;&lt;br /&gt;&lt;br /&gt;ull_int fiboCalc(ull_int x);&lt;br /&gt;void fiboBuildCache(size_t size);&lt;br /&gt;void fiboLoadCache(size_t prevCacheSize);&lt;br /&gt;void fiboFreeCache(void);&lt;br /&gt;&lt;br /&gt;ull_int *fiboCache = NULL;&lt;br /&gt;size_t fiboCacheSize = 0;&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[]) {&lt;br /&gt;    srand(time(NULL));&lt;br /&gt;    int i;&lt;br /&gt;    for (i = 0; i &lt; 100000000; i++) {&lt;br /&gt;        int randNum = (abs(rand()) % 40);&lt;br /&gt;        // printf("f(%d)\t= %d\n", randNum, fiboCalc(randNum));&lt;br /&gt;    }&lt;br /&gt;    fiboFreeCache();&lt;br /&gt;    &lt;br /&gt;    system("PAUSE");&lt;br /&gt;    return EXIT_SUCCESS;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ull_int&lt;br /&gt;fiboCalc(ull_int x) {&lt;br /&gt;    if (x &lt; 2) {&lt;br /&gt;        return x;&lt;br /&gt;    }&lt;br /&gt;    size_t requiredCacheSize = (x + 1) * sizeof(ull_int);&lt;br /&gt;    if (fiboCache == NULL || fiboCacheSize &lt; requiredCacheSize) {&lt;br /&gt;        fiboBuildCache(requiredCacheSize);&lt;br /&gt;    }&lt;br /&gt;    return fiboCache[x];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&lt;br /&gt;fiboBuildCache(size_t size) {&lt;br /&gt;    size_t prevCacheSize = fiboCacheSize;&lt;br /&gt;    if (fiboCache == NULL) {&lt;br /&gt;        fiboCache = malloc(size);&lt;br /&gt;        fiboCacheSize = size;&lt;br /&gt;        fiboLoadCache(prevCacheSize);&lt;br /&gt;    } else if (fiboCacheSize &lt; size) {&lt;br /&gt;        fiboCache = realloc(fiboCache, size);&lt;br /&gt;        fiboCacheSize = size;&lt;br /&gt;        fiboLoadCache(prevCacheSize);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&lt;br /&gt;fiboLoadCache(size_t prevCacheSize) {&lt;br /&gt;    int i, end;&lt;br /&gt;    if (prevCacheSize == 0) {&lt;br /&gt;        fiboCache[0] = 0;&lt;br /&gt;        fiboCache[1] = 1;&lt;br /&gt;        i = 2;&lt;br /&gt;    } else {&lt;br /&gt;        i = prevCacheSize / sizeof(ull_int);&lt;br /&gt;    }&lt;br /&gt;    end = fiboCacheSize / sizeof(ull_int);&lt;br /&gt;    for (; i &lt; end; i++) {&lt;br /&gt;        fiboCache[i] = fiboCache[i - 2] + fiboCache[i - 1];&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&lt;br /&gt;fiboFreeCache(void) {&lt;br /&gt;    if (fiboCache != NULL) {&lt;br /&gt;        free(fiboCache);&lt;br /&gt;        fiboCache = NULL;&lt;br /&gt;        fiboCacheSize = 0;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Programa göz gezdirdiğiniz de işlevinin fibonacci sayılarını hesaplamak olduğunu fark etmişsinizdir. Peki bu programı dinamik yapan nedir? Dinamik programlamayı bir problemin çözümünde, problemin kapsadığı alt problemleri birden fazla defa çözmemizi engellemeye dayanan bir teknik olarak ifade edebiliriz. Dolayısı ile dinamik programlama bir başka açıdan bakıldığında bir optimizasyon tekniğidir. Bu açıdan yukarıda ki programın yaptığı tam da budur. Problemimiz fibonacci sayılarını hesaplamaktır ve fibonacci sayıları fib(n) = fib(n-1) + fib(n-2) formülü ile hesaplanır. Dolayısı ise fibonacci sayılanın hesaplanması problemi alt problemlerin sonuçlarının tekrar tekrar kullanılabileceği bir türdedir. Yukarıda ki programda 0 ila 40 arasında rastgele oluşturulan 100.000.000 sayının fibonacci dizisinde ki karşılıkları hesaplanmaktadır. Bu program da aslında önemli bir kaç iyileştirme daha yapılabilir fakat bu haliyle dahi bir hayli verimlidir ve bunda dinamik programlama tekniğinin kullanılmasının önemi çok büyük. Kısacası alt problemlerin tekrarlandığı problem çözümlerinde alt problemlerin sonuçlarının saklanması ve tekrar tekrar kullanılması algoritmalarınızı çok hızlandırabilir.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-4596315179471725963?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/4596315179471725963/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2009/08/dinamik-programlama.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/4596315179471725963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/4596315179471725963'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2009/08/dinamik-programlama.html' title='Dinamik programlama'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-6323255001221837458</id><published>2009-04-05T18:51:00.000-07:00</published><updated>2009-08-22T19:17:40.016-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Yeni diller ve Groovy</title><content type='html'>Webte dolaşırken bir yazı ile karşılaştım. Php platformunu kullanan ve gücüne inanan bir meslektaşım son zamanlarda o kadar çok dilcik tasarlandı ki artık bunun sonu nereye varır diye yazmış ve Groovy'e "dilcik" yakıştırmasında bulunmuştu.&lt;br /&gt;&lt;br /&gt;Son yıllarda çok sayıda dilin tasarlanıp uygulandığı hepimizin bildiği bir gerçek olduğu düşüncesindeyim. Fakat bu dillerin biri hakkında birşeyler yazmak istedim. Bu dil Groovy.&lt;br /&gt;&lt;br /&gt;Günümüzde bir çok bilgisayar uzmanı ve programcının kullandığı bir ifade var bu ilginç dönem için "Diller çağı" diye nitelendiriyorlar bu dönemi. Son 10 sene içerisinde o kadar fazla yeni dil tasarlandı ve uygulandı ki takip etmek neredeyse imkansız. Fakat bunun ne anlama geldiği bence başlıbaşına bir tartışma konusu. Tüm bu dillerin arasından geçenlerde Groovy ile tanıştım. Şunu söylemeliyim ki gerçekten etkileyici bir proje Groovy. Pyhton yada Ruby gibi esneklik ve üretkenlikte adından söz ettiren dillerden hem dil bazında hem üretkenlik bazında asla geri kalmıyor Groovy. Günümüz programlama inceliklerinin tamamını yada çok önemli bir kısmını uygulayabilicek kapasiteye sahip olduğunu söylemeliyim. Ayrıca ardında çok güçlü bir platform ve sınırsız kütüphane barındırıyor bu dil. Çünkü groovy ile on yılı aşkın süredir yazılmış ve kullanıma hazır yüzbinlerce java sınıfını sorunsuz kullanabiliyorsunuz. Hem de nokta kadar bir değişiklik gerektirmeden. Ayrıca Groovy çok büyük oranda kendi sintaksına ek olarak java sintaksını da destekleyen bir dil, yani resmen java sintaksında kod yazıyorsunuz ve groovy yorumlayıcısı bu kodu derleme gerektirmeden işletebiliyor. Bu niteliği mevcut Java programcılarının dili öğrenmesinde büyük kolaylık getiriyor. Ayrıca bir özelliğe daha sahip ki değinmeden geçemem. Groovy kodu java sınıflarına(java bycode code) derlenebiliyor ve java ile yazılmış programlarda hiç bir değişiklik gerekmeden bu sınıfları kullanabiliyorsunuz. Bu dil ayrıca yaygın programlama ihtiyaçları için çok başarılı bir utility kütüphanesine sahip. Yani neredeyse Groovy Java dilinin yeni nesil bir uyarlaması diyebiliriz. Doğruyu söylemek gerekirse halen bir çok projesinde Php, C++ gibi dil ve platformları kullanmak zorunda kalan ben birçok defalar keşke diyorum. Keşke Php'de closureları desteklese. Keşke Php dil bazında DOM ve XML parsing ve generating desteklese, keşke Php'ninde temel kütüphane işlevselliği tamamen nesne yönelimli paradigmayı kullansa. Keşkeler böyle sürüyor gidiyor.. Burada asıl değinmek istediğim aslında uzun süredir kullandığımız birçok dil ve platformun artık kendilerini bir nebze olsun modernize etmeleri gerektiğidir. Php'de bunların arasında. Php hala anonim fonsiyonları desteklemiyorsa artık bence birşeylerin sorgulanmasını gerekir. Çünkü Groovy gibi dil ve teknolojilerin arkasındaki kaynaklar çok daha kısıtlı olduğu halde bu niteliklerin tümü Groovy ve Ruby gibi dillerde mevcut. Yaygın deyimle "diller çağı" bence dil tasarımda kalitenin yitirildiği, etrafta bir çok amacsız ve plansız dilin boy gösterdiği bir dönem değil. Aksine programcılık sanatında bir rönesans olarak dahi nitelendirilebilir. Yıllarca kısıtlı dil kümeleri ve kısıtlayıcı programlama yaklaşımları ve tekniklerinin kırıldığı bir dönem olduğu inancındayım bu dönemin. Bence programcı olarak çalışan, düşünen ve yaşayan dostlarımın Groovy gibi genç, heyecanlı ve nitelikli projelere daha iyimser, daha sağ duyulu bakmaları daha güzel bir yaklaşım olurdu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-6323255001221837458?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/6323255001221837458/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2009/04/webte-dolasrken-bir-yaz-ile-karslastm.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/6323255001221837458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/6323255001221837458'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2009/04/webte-dolasrken-bir-yaz-ile-karslastm.html' title='Yeni diller ve Groovy'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-4197894507441612513</id><published>2009-01-02T19:54:00.000-08:00</published><updated>2009-08-25T13:14:03.684-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programcı'/><title type='text'>Hug a developer today...</title><content type='html'>Programcılar ve yaşadıkları üzerine hoş bir kısa film. İzlemenizi öneriyorum :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=1lqxORnQARw" target="_blank"&gt;Buyrun izleyin&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-4197894507441612513?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/4197894507441612513/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2009/01/hug-developer-today.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/4197894507441612513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/4197894507441612513'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2009/01/hug-developer-today.html' title='Hug a developer today...'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5639783165278756192.post-4948651963264057899</id><published>2008-12-30T18:20:00.000-08:00</published><updated>2009-08-25T13:14:52.171-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='komut satırı'/><category scheme='http://www.blogger.com/atom/ns#' term='parametre ayıklayıcı'/><title type='text'>Konsol uygulamaları için arguman ayırıcı</title><content type='html'>&lt;div&gt;Aslında birkaç haftadır aklımdaydı bir komut satırı ayırıcısı yazmak. Fakat bir türlü bir iki gün ayırıp başlayamamıştım bu işe. En sonunda zaman bu zamandır dedim ve yazdım bir prototip. Aslında bu kararı böylesine kesinlikle alışımda finallerin stresinden kurtulma fikri etkili oldu diyebilirim. Programcıların bir çoğu program yazarak rahatlar :) Her neyse, şimdilik komut satırı ayrıcımız sade ve ufak, fakat GNU komut satırı uygulamalarında uygulanan komut argüman stiliyle uyumlu çalışıyor. Bununla beraber üzülerek belirtmeliyim ki henüz harici bir dökümantasyona sahip değil. Kaynak kod içinde mümkün olduğunca açıklama yazmaya çalıştım. Fakat sınav meşguliyeti dolayısıyla bu işe çok kısa bir süre ayırabildiğimden pek vakıf olabildiğimi söyleyemem. Eğer projelerinde bu kodu kullanmak isteyen varsa şimdilik ufak bir örnek program ve kaynak kod açıklamalarıyla idare etmek zorunda. Ayrıca kullanmayı düşünenler olursa diye ufak kütüphanemizin temel çalışma prensibini açıklayıp, örneklemek istedim.&lt;br /&gt;&lt;br /&gt;Öncelikle kütüphane’nin temel hedefi komut satırı uygulamalarını yazarken argüman ayırma derdine bir çözüm olmasıdır. Yani&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;ls -la /home&lt;br /&gt;ps -aux&lt;span style="font-family:monospace;"&gt;&lt;/span&gt;&lt;br /&gt;diff --brief -biw file1 file2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;gibi komut satırı çağrılarında kullanılabilecek farklı formlardaki argumanları işleyebilmemize yarar. Bununla birlikte kütüphanin kullanımı Callback Mechanizm adı verilen bir programlama tekniğine dayanır. Ne demek bu Callback Mechanizm? Kısaca geri çağrı mekanizması olarak açıklayabiliriz. Yani bir olayın gerçekleşmesine bağlı olan eylem(fonksiyon) çağrısı mekanizması. MVC mimarisine aşina olanlar için bu mekanizma zaten gayet tanıdıktır. Çünkü bu sistem olay temelli programlamada çok yaygın kullanılır. (Popüler Qt kütüphanesi benzer fakat farklı bir mekanizma kullanır SIGNAL/SLOT) Konumuzdan fazla uzaklaştırmadan kütüphanemizi açıklamaya devam edersek. Kütüphane C++ dilinin nesne yönelimli kullanımına bir örnek teşkil eder. Basit bir struct ve bir class tanımından meydana gelir. Kütüphaneye dahil olan tüm tanımlar CLParser namespace’i içinde tanımlanmıştır. Şimdi kütüphanin kullanımına tipik bir önrek vereyim :&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;int main(int argc, char **argv) {&lt;br /&gt;CLParser::CLParser clp(argc, argv); // Nesne tanımı&lt;br /&gt;clp.setShortPrefix("-"); // Kısa parametre ön eki&lt;br /&gt;clp.setLongPrefix("--"); // Uzun parametre ön eki&lt;br /&gt;clp.setMaxNotPrefixedCC(2); // Maks. ön eksiz argüman sayısı(dosya ismi vb.)&lt;br /&gt;// Argumanları ayıkla ve gerekli fonksiyon çağrılarını gerçekleştir&lt;br /&gt;clp.parse();&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;İşte bu kadar basit. Aslında örnek programımızda setShortPrefix, setLongPrefix ve setMaxNotPrefixedCC fonksiyonlarının kullanımının gereksiz olduğunu söyleyebilirim. Çünkü zaten ön tanımlı olarak kısa parametre ön eki "-" ve uzun parametre ön eki "--" olarak belirlenmiştir. Ayrıca yine maksimum ön eksiz argüman sayısı varsayılan olarak 1 olarak belirlenmiştir. Bu kodlarıda varsayılan değerlerin kullanımı vasıtasıyla kaldırdığımızda örnek programımız :&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;int main(int argc, char **argv) {&lt;br /&gt;CLParser::CLParser clp(argc, argv); // Nesne tanımı&lt;br /&gt;// Argumanları ayıkla ve gerekli fonksiyon çağrılarını gerçekleştir&lt;br /&gt;clp.parse();&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Bir hayli sade değil mi? :) Peki şimdi şu soruyu sorabilirsiniz. "İşlev nerede? Yani tamam kütüphane argumanları parse ediyor fakat işlev?" İşlevsellik için daha önce belirtilen callback mekanizmasını kullanıyoruz. Kütüphanemizle birlikte gelen CLCommands.h ve CLCommands.cpp dosyaları üzerinde bir kaç değişiklik yapmamız yeterli. Bu dosyalar parser(ayırıcı)'ımızın ayırdığı belli argümanlara karşı hangi callback fonksiyonlarının eşleştiğini belirlememize yarıyor.&lt;br /&gt;&lt;br /&gt;Aşağıda CLCommands.h dosyasının birazcık sadeleştirilmiş ve türkçeye çevrilmiş bir versiyonu mevcut. İncelediğinizde kütüphanenin nasıl kullanıldığını anlayacağınızı umuyorum.&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;namespace CLParser {&lt;br /&gt;&lt;br /&gt;///////////////////////////////////////&lt;br /&gt;// GERİ ÇAĞRI FONKSİYON PROTOTİPLERİ //&lt;br /&gt;///////////////////////////////////////&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Tüm geri çağrı fonksiyonları aşağıdaki prototiple aynı imzayı taşımalıdır.&lt;br /&gt;(Aynı geri dönüş ve giriş argümanı tip ve sıralamasını kullanmalıdır)&lt;br /&gt;void func(char *command, int argc, char **args);&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;void cbNPArgs(char *command, int argc, char **args);&lt;br /&gt;void cbA(char *command, int argc, char **args);&lt;br /&gt;void cbB(char *command, int argc, char **args);&lt;br /&gt;void cbC(char *command, int argc, char **args);&lt;br /&gt;void cbDE(char *command, int argc, char **args);&lt;br /&gt;void cbDEF(char *command, int argc, char **args);&lt;br /&gt;void cbDEFG(char *command, int argc, char **args);&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;// GERİ ÇAĞRI TABLOSU (TÜM GERİ ÇAĞRI METODLARI BU NOKTADA PARSER İLE BİRLEŞİR) //&lt;br /&gt;//////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;const CLCommand COMMAND_SET[] = {&lt;br /&gt;&lt;br /&gt;{"a", cbA, 2}, // Kısa ön ekli "a" argümanı. 2 parametre alır. Geri çağrı fonksiyonu "cbA"&lt;br /&gt;{"A", cbA, 2}, // "a" komutuna kısa yol.(alias)&lt;br /&gt;&lt;br /&gt;{"b", cbB, 3}, // Kısa ön ekli "b" argümanı. 3 parametre alır. Geri çağrı fonksiyonu "cbB"&lt;br /&gt;{"c", cbC}, // Kısa ön ekli "c" argümanı. Parametre almaz. Geri çağrı fonksiyonu "cbC"&lt;br /&gt;&lt;br /&gt;{"de", cbDE, 2}, // Uzun ön ekli "de" argümanı. 2 parametreli. Geri çağrı fonksiyonu "cbDE"&lt;br /&gt;{"Foo", cbDE, 4}, // Uzun ön ekli "Foo" argümanı. "de" argümanıyla aynı geri çağrı fonksiyonunu kullanır. 4 parametreli.&lt;br /&gt;&lt;br /&gt;{"def", cbDEF, 3}, // Uzun ön ekli "def" argümanı. 3 parametre alır. Geri çağrı fonksiyonu "cbDEF"&lt;br /&gt;{"defg", cbDEFG}, // Uzun ön ekli "defg" command. Parametre almaz. Geri çağrı fonksiyonu "cbDEFG"&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Bu komut özel bir anlam ifade eder.&lt;br /&gt;Ön ek almamış herhangi bir argumanı ifade eder. (dosya isimleri vb.)&lt;br /&gt;*/&lt;br /&gt;{"*", cbNPArgs} // Ön ek almamış herhangi bir arguman (dosya ismi gibi). Geri çağrı fonksiyonu "cbNPArgs"&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;} // namespace CLParser&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Görüldüğü üzere kullanımı oldukça basit. Tek yapmanız gereken bir karakter(kısa ön ek kullanır) yada birden çok karakter uzunluğunda bir arguman(uzun ön ek kullanır) ve parser'ın bu arguman'a rastladığında çağrıcağı fonksiyonu tanımlamaktır. Ayrıca tercihen arguman'ın alabileceği bir parametre sayısıda verebilirsiniz. Örneğin&lt;br /&gt;&lt;br /&gt;komut -a 1 2&lt;br /&gt;&lt;br /&gt;Yukarıda ki komut satırı çağrısı bir adet arguman("a") ve bu argumana ait iki parametre("1", "2") alır.&lt;br /&gt;&lt;br /&gt;Parser otomatik olarak "a" argümanıyla eşleşen geri çağrı fonksiyonunu çağarıcaktır ve bu geri çağrı fonksiyonuna&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-style: dashed; border-width: 1px; padding: 10px; overflow: auto; font-size: 9pt; color: black; background-color: rgb(238, 238, 238);"&gt;void geri_cagri_fonk(char *command, int argc, char **args);&lt;br /&gt;                     ^               ^             ^&lt;br /&gt;                     ARGÜMAN'IN      ARGÜMAN'IN    ARGÜMAN'IN&lt;br /&gt;                     KENDİSİ         PARAMETRE     PARAMETRE&lt;br /&gt;                                     SAYISI        LİSTESİ&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;şeklinde iletilir.&lt;br /&gt;&lt;br /&gt;Parser kısa ve uzun ön ekli argümanların olası sayıda parametrelerini destekler. Bunlara ek olarak kısa ön ekli argümanların birleştirilmiş yazımınıda desteklemektedir. Fakat tahmin edeceğiniz gibi bu durumda birleştirilen argümanlar parametre almayan türden olmalıdır. Örneğin&lt;br /&gt;&lt;br /&gt;ls -l -a&lt;br /&gt;ls -la yada ls -al&lt;br /&gt;&lt;br /&gt;biçminde yazılabilir. Unutulmamalıdır ki burada -l ve -a parametrelerinin birleştirilebilmeleri için parametre almayan türden kısa ön ekli argümanlar olmaları gerekmektedirler.&lt;br /&gt;&lt;br /&gt;Yazımı sonlandırırken belirtmem gereken bir nokta da geri çağrı prototiplerinin nerede implemente ediliceğidir. Ben bu iş için CLCommands.cpp dosyasını kullanıyorum. Fakat siz kendi tercihinizi yapmakta özgürsünüz.&lt;br /&gt;&lt;br /&gt;Yazımın açıklayıcı olduğunu umuyorum. Proje kodu GPL lisansı sahiptir. İstediğiniz değişikliği yapmakta özgürsünüz. Bu uzunlukta bir metini sıkılmadan okuduğunuz için size ayrıca teşekkür ediyorum.. İyi eğlenceler..&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bilisimpark.com/tuna/commandLineParser.rar"&gt;PROJE KODUNU INDIR&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5639783165278756192-4948651963264057899?l=tuna-akin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tuna-akin.blogspot.com/feeds/4948651963264057899/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://tuna-akin.blogspot.com/2008/12/konsol-uygulamalar-iin-sade-bir-arguman.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/4948651963264057899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5639783165278756192/posts/default/4948651963264057899'/><link rel='alternate' type='text/html' href='http://tuna-akin.blogspot.com/2008/12/konsol-uygulamalar-iin-sade-bir-arguman.html' title='Konsol uygulamaları için arguman ayırıcı'/><author><name>Tuna AKIN</name><uri>http://www.blogger.com/profile/04155541153094821841</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_R2NB0YN2VT0/SVVc4hPx_PI/AAAAAAAAAAM/erBLIml3-Iw/S220/IMG_8349.JPG'/></author><thr:total>0</thr:total></entry></feed>
