tag:blogger.com,1999:blog-22967918682919299592024-03-14T00:59:34.314+03:00All your base are belong to usİlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.comBlogger61125tag:blogger.com,1999:blog-2296791868291929959.post-23464865160758243902013-01-06T16:52:00.000+02:002013-01-06T17:00:10.194+02:00Android APK dosyası inceleme (reverse engineering)<p>
Android'e bir şekilde bulaştıysanız <a href="http://www.appbrain.com">AppBrain</a>'i duymuşsunuzdur. Google'ın Android Market'ine alternatif olan ve size uygulama tavsiye edebilen bir site. AppBrain'in bir de <a href="http://www.appbrain.com/stats/">istatistik</a> hizmeti var. Bu istatistikler içinde benim en çok ilgimi çeken <a href="http://www.appbrain.com/stats/libraries/dev">Developer tools</a> istatistikleri. Örneğin <a href="http://acra.ch/">ACRA</a> kütüphnesini kullanan top 10 uygulamayı <a href="http://www.appbrain.com/stats/libraries/details/acra/acra">görebiliyorsunuz.</a> AppBrain'in bu istatistikleri nasıl topladığını merak ediyorsanız okumaya devam edin.
</p>
<p>Bu yazıda apk dosylarının, reverse engineering ile nasıl inceleneceğini adım adım anlatacağım.</p>
<h4>1. Apk dosyasını indirme</h4>
<p>
Android projelerinin emulatörde ya da cihazda çalışabilmesi için projenin paketlenmesi ve imzalanması gerekiyor. Proje paketlendiğinde '.apk' uzantılı bir dosya oluşur. Apk dosyalarının oluşturulması ile ilgili detaylı bilgi almak isteyenler resmi android geliştirici sayfalarındaki <a href="http://developer.android.com/tools/building/index.html">Building and Running</a> bölümüne bakabilir.
</p>
<p>
Apk dosyasını indirebilmek için <a href="http://apps.evozi.com/apk-downloader/">apk downloader</a> adında bir araç kullanacağız. Apk-downloader bir Chrome eklentisi. Android Market'te uygulamanın sayfasına girdiğinizde adres barında apk indirmek için bir düğme çıkartıyor. Apk-downloader, Google hesap bilgilerinize (şifreniz dahil) ve Google'a kayıtlı Android cihaz'ınızın Google Service Framework ID'sine ihtiyaç duyuyor. Google hesap bilgileriniz bizi hiç ilgilendirmiyor dese de işim bittikten sonra Google şifremi değiştirdim, size de aynısını tavsiye ediyorum. İncelemek istediğimiz uygulamayı Android Markette bulduktan sonra apk'yı indiriyoruz.
</p>
<p><a href="https://play.google.com/store/apps/details?id=com.instagram.android">Instagram</a>'ın popüler Android uygulamasının apk dosyasını aşağıdaki şekildeki gibi apk-downloader'ın apk indirme düğmesini kullanarak indirdim.</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-8y4JKwRzbVc/UOl-_dbNKxI/AAAAAAAAFJw/i-HOfb8XPyM/s1600/instagram.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="277" width="400" src="http://2.bp.blogspot.com/-8y4JKwRzbVc/UOl-_dbNKxI/AAAAAAAAFJw/i-HOfb8XPyM/s400/instagram.png" /></a></div>
</p>
<h4>2. dex2jar </h4>
<p>
İkinci aracımız <a href="http://code.google.com/p/dex2jar/">dex2jar</a>. Dex2Jar sayesinde dex formatındaki dosyalari java class dosyalarına çevireceğiz ve java decompiler ile class dosyalarını java dosyalarına çevireceğiz. <b>dex</b> dosyasının açılımı "Dalvik executable". Android uygulamarını çalıştıran virtual machine (Dalvik), java class dosyalarını değil dex formatındaki dosyaları okuyabiliyor.</p>
<p>dex2jar ile apk dosyasını aşağıdaki gibi jar (java archive) dosyasına çeviriyoruz.</p>
<pre>
tututil:TEMP ilkinulas$ ~/Development/tools/dex2jar-0.0.9.12/d2j-dex2jar.sh com.instagram.android.apk
dex2jar com.instagram.android.apk -> com.instagram.android-dex2jar.jar
</pre>
<p>Oluşan jar dosyasını okumak incelemek için <a href="http://java.decompiler.free.fr/">Java Decompiler</a> kullanacağız.</p>
Java decompiler'ın arayüzü ile bakarsak Instagram'ın Android uygulamasınin aşağıdaki kütüphaneleri kullandıgını görebiliriz: (Aşağıdaki resim java decompiler'in arayüzünü gösteriyor.)</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-eTTdod5aGWE/UOmJuugeDCI/AAAAAAAAFKE/V98-xlh9I_0/s1600/jad_gui.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="370" width="400" src="http://4.bp.blogspot.com/-eTTdod5aGWE/UOmJuugeDCI/AAAAAAAAFKE/V98-xlh9I_0/s400/jad_gui.png" /></a></div>
<ul>
<li><a href="http://code.google.com/p/httpclientandroidlib/">Android HttpClient Lib.</a></li>
<li><a href="https://github.com/FasterXML/jackson-core">FasterXML</a></li>
<li><a href="http://code.google.com/p/oauth-signpost/">oauth-signpost</a></li>
<li><a href="http://acra.ch/">ACRA</a></li>
<li><a href="http://commons.apache.org/lang/">Apache Commons Lang </a>(org.apache.commons.lang3)</li>
</ul>
<h4>3. apktool</h4>
<p>apk dosyasının içinde sadece derlenmiş dex dosyaları bulunmuyor. Uygulamayı meydana getiren AndroidManifest.xml dosyasi, res, assets, lib dizinleri de apk dosyası içinde bulunmakta. Bu dosyalara erişmek için <a href="http://code.google.com/p/android-apktool/">apktool</a> aracını kullanacağız.</p>
<p>Aşağıdaki komut ile apk dosyasını INSTAGRAM dizinine açıyoruz.</p>
<pre>
tututil:TEMP ilkinulas$ apktool decode com.instagram.android.apk INSTAGRAM
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/ilkinulas/Library/apktool/framework/1.apk
I: Loaded.
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs...
tututil:TEMP ilkinulas$ ls -ltr INSTAGRAM/
total 32
drwxr-xr-x 8 ilkinulas staff 272 Jan 6 16:32 smali
-rw-r--r-- 1 ilkinulas staff 8248 Jan 6 16:32 AndroidManifest.xml
drwxr-xr-x 46 ilkinulas staff 1564 Jan 6 16:32 res
drwxr-xr-x 4 ilkinulas staff 136 Jan 6 16:32 lib
drwxr-xr-x 8 ilkinulas staff 272 Jan 6 16:32 assets
-rw-r--r-- 1 ilkinulas staff 247 Jan 6 16:32 apktool.yml
tututil:TEMP ilkinulas$
</pre>
<p>
apk-downloader, dex2jar, java decompiler ve apktool ile siz de seçtiğiniz bir uygulamayı decompile edip inceleyebilirsiniz. Happy hacking :)
</p>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com0tag:blogger.com,1999:blog-2296791868291929959.post-17362587458120425122012-12-30T23:58:00.000+02:002012-12-30T23:59:29.772+02:00Okey Oyunu İçin Açık kaynak kodlu AI<P>
<a href="https://play.google.com/store/apps/details?id=com.appsonfire.okey">Okey Mini</a> kodlarını parça parça Github'a taşımaya başladım. Bluetooth multiplayer altyapısını daha önce <a href="https://github.com/ilkinulas/P2P4Android">P2P4Android</a> projesi ile paylaşmıştım. Şimdi de oyundaki botların kodlarını (AI) <a href="https://github.com/ilkinulas/okeybot">OkeyBot</a> projesi altında toparladım. User Interface (UI) kodlarını da elden geçirdikten sonra onları da paylaşacağım.
</P>
<P>
Yazdığınız koda 1 yıl sonra dönüp baktığınızda beğendiğiniz oluyor mu hiç? Ne güzel yazmışım diyor musunuz? Benim çok nadir oluyor. Okey Mini'nin kodlarına da yaklaşık bir yıldır bakmıyordum. Kaynak kodlarını paylaşmadan önce bir bakayım dedim ve kendi yazdığım koda bakınca kendimden utandım. Sağda solda OO yazılım prensipleri, tasarım kalıpları hakkında atıp tuttarken yazdığım koda bunları pek yansıtmamışım. Kaynak kodlarını paylaşıp görücüye çıkarmadan önce bir elden geçirme icap etti. Geniş kapsamlı bir ref.cktoring'ten sonra içime sinen bir hale geldi. Hala eksik testleri var. Zamanla testlerini tamamlayıp test coverage'ı artırmayı düşünüyorum.
</P>
<P>Okey Mini'de botlar hile yapıyor diyenlere de kapak olsun bu paylaşım :)</P>
İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com5tag:blogger.com,1999:blog-2296791868291929959.post-82303407453409292652011-09-09T23:52:00.000+03:002011-09-11T19:47:19.727+03:00Android için Okey<p>6 Haziran'daki <a href="http://ilkinbalkanay.blogspot.com/2011/06/okey-mini-10-bini-gordu.html">yazımda</a> <a href="https://market.android.com/details?id=com.appsonfire.okey">Okey Mini</a>'nin 10 bin Android cihazda kurulu olduğunu yazmıştım. Aradan geçen 3 ay boyunca Okey Mini 45 bin kullanıcıya ulaştı. Bu yazıyı 50 binde yazmayı düşünüyordum ama sabredemedim :)
<p>Android Markette uygulaması olanlar bilirler Developer Console'da çeşitli istatistikler yer alıyor. Bu istatistikleri paylaşmak istiyorum. Türkiye'deki Android kullanıcılarının bir kısmı hakkında (en azından okey sevenler hakkında) ilginizi çekebilecek veriler var.
<p>İlk olarak Okey Mini'nin Nisan 2011'den bugüne kullanıcı sayısı grafiğini görüyorsunuz. 78 bin download olmasına rağmen 45 bin cihazda kurulu. Bu da demek oluyor ki her 100 kişiden 57'si uygulamayı beğenmiş ve kurduktan sonra kaldırmamış. Bu yüzde 57 değerini gerçekten çok az buluyorum keşke diğer uygulama geliştiricileri de bu şekilde raporlar paylaşsa da genel olarak active installation yüzdesi hakkında fikir sahibi olabilsek.
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-GO7C1R3oFis/TmpIClqHkjI/AAAAAAAACyA/ya2ve60YDzo/s1600/installs.png" imageanchor="1" style=""><img border="0" src="http://2.bp.blogspot.com/-GO7C1R3oFis/TmpIClqHkjI/AAAAAAAACyA/ya2ve60YDzo/installs.png" /></a></div>
<p>Aşağıdaki resim kullanıcıların 5 üzerinden verdiği puanları gösteriyor. Yeni versiyonu 1.2.x markete gönderdikten sonra 4.6 olan ortalama 4.5'e düştü. Android Market'teki tüm uygulamaları değerlendirdiğinizde genel olarak 4 ve üzeri puandaki uygulamalar iyi uygulamalar olarak kabul edilebilir (bana göre).
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Oi_Ip7bzd6o/TmpIDHuJbRI/AAAAAAAACyQ/kMOVu2VZQ84/s1600/rating.png" imageanchor="1" style=""><img border="0" src="http://2.bp.blogspot.com/-Oi_Ip7bzd6o/TmpIDHuJbRI/AAAAAAAACyQ/kMOVu2VZQ84/rating.png" /></a></div>
<p>Okey Mini'nin kullanıcılarının büyük bir çoğunluğunun Türk kullanıcılar olduğunu tahmin ediyorum. Okey'i bizim oynadığımız kurallarla oynayan başka bir ülke yoktur heralde. İlk istatistiğimiz Android versiyonları ile ilgili. Android 2.3.3 burada başı çekiyor. Android 3.0 ve 3.1'in olması tabletlerde de oyunun oynanabildiğini gösteriyor.Bu istatistikten çıkartılabilecek en sinir bozucu sonuç ise piyasada bulunan Android cihazlarda 10 farklı Android versiyonu bulunması.
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-_yPbaJWrz8w/TmpH37ifrLI/AAAAAAAACxo/Ke6CMeWYWQc/s1600/android_version.png" imageanchor="1" style=""><img border="0" src="http://3.bp.blogspot.com/-_yPbaJWrz8w/TmpH37ifrLI/AAAAAAAACxo/Ke6CMeWYWQc/android_version.png" /></a></div>
<p>
Sıradaki istatistik Okey Mini'yi oynayan Android kullanıcılarının cihazları ile ilgili. En fazla kullanılan ilk iki cihaz Samsung Galaxy S ve S2. HTC Desire HD de 3. sırada yer alıyor. Okey Mini için konuşacak olursak Samsung cihazların ezici bir üstünlüğü var.
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-mLKLLrbyUWk/TmpICBxNr1I/AAAAAAAACx4/aiNB5n0-5RM/s1600/devices.png" imageanchor="1" style=""><img border="0" src="http://2.bp.blogspot.com/-mLKLLrbyUWk/TmpICBxNr1I/AAAAAAAACx4/aiNB5n0-5RM/devices.png" /></a></div>
Olur da Okey Mİni kullanıcı sayısı 100 bin'e ulaşırsa istatistikleri tekrar paylaşırım. Bu rakamlar son zamanlarda operator kampanyaları ile ne kadar çok android cihaz satıldığını da göstermiş oluyor bence. Son olarak <b> Android candır</b> diyerek sözlerime nokta koyuyorum.
İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com9tag:blogger.com,1999:blog-2296791868291929959.post-63543604487204146052011-06-11T12:07:00.001+03:002011-06-11T12:13:33.924+03:00Yunan Adaları Turu - Atina - Haziran 2011<p>Az önce Çanakkele Boğazı'ndan geçtik. Akşamüstü saat beşte Karaköy'de olacağız. Dün <b>Atina</b>'yı görme fırsatımız oldu. Gemi sabah 9'da <b>Lavrion</b> limanına yanaştı. Atina'ya gelen cruise'lar genelde <b>Pire</b>'deki limanda konaklıyor, fakat Pire limanı çok kalabalık olduğu için bizim gemi daha tenha ve Atina'ya daha uzak olan (70 km) Lavrion limanına yanaştı. </p><p>Saat 10'da gemiden ayrıldık. Geç kaldığımız için kiralık araç bulamadık. Biz gözümüzü açana kadar tüm araçlar diğer yolcular tarafından kiralanmış. Lavrion'dan Atina'ya gitmek için 3 alternatif var.<br />
<ul><li>40 avroya araç kiralayabilirsiniz (20 avroluk benzin yeterli olacaktır.)<br />
<li>Taksiler Atina'ya 80 avroya götürüyorlar. (Tabi bunun bir de dönüşü var.)<br />
<li>En yakın tren istasyonuna (<b>Koropi</b>) 40 avroya gidip, oradan 1.60 avroya Atina merkeze gidebilirsiniz.<br />
</ul>Biz üçüncü seçeneği seçtik. Lavrion'dan Atina'ya 1 saat 20 dakika'da gidebildik. Atina'ya vardığımızda saat 12'ydi. </p><p>Atina'da ilk görülmesi gereken yer <b>Atina Akropolisi</b>. Akropolis "yukarıdaki şehir" anlamına geliyormuş. Yüksek kayaların üzerine 2500 yıl önce kurulmuş tapınaklar Atina'nın simgesi olmuş. Bu tapınakların en görkemlisi <b>Partenon</b> tapınağı. (Fotoğraflarda gözüken büyük sütunlu yapı). Bu tapınak Atina'yı koruyan tanrıça <b>Athena</b> için yapılmış. Atina'nın adı da bu tanrıçadan geliyormuş. </p><a href="https://picasaweb.google.com/lh/photo/mPo_a7SsdKpEexRbzYleT0nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-rx8cWGYAPNM/TfMbBoA3GVI/AAAAAAAACtM/AY0vDVJ700s/s640/DSC05291.JPG" height="480" width="640" /></a> <p>Tapınaklar'ın bulunduğu yere çıkmak 12 avro ve yürüyerek çıkmak zorundasınız. Nurten hamile olduğu için tepeye çıkmadı aşağıda beni bekledi. 150-200 metrelik bir tırmıştan sonra manzarayı izleyip ve bir kaç fotoğraf çekip aşağıya indim. Akropolis'ten Atina manzarasını aşağıdaki fotoğraflarda görebilirsiniz.</p><a href="https://picasaweb.google.com/lh/photo/jG_5nOO0ebPqUfE2dDAKFknGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-VMpKWLdFWUo/TfMaVfYtS2I/AAAAAAAACtI/Z173H-2YXZ0/s640/DSC05285.JPG" height="480" width="640" /></a> <a href="https://picasaweb.google.com/lh/photo/Iqe17Wic_sC4VhK4nHiOmUnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-05Nzy8wujcg/TfMaUoxZK6I/AAAAAAAACtE/Ffz0ZEWKD-M/s640/DSC05286.JPG" height="480" width="640" /></a> <a href="https://picasaweb.google.com/lh/photo/XzX_JkQb2F9XhnGdGl5v4UnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-0DO2BzAJcJ4/TfMaT9uX40I/AAAAAAAACtA/9AKKFfKAoOU/s640/DSC05281.JPG" height="480" width="640" /></a> <a href="https://picasaweb.google.com/lh/photo/np33ksbWPmFsotIuWTPmeknGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-3MWkvr38jAg/TfMbCPG3sYI/AAAAAAAACtQ/kMkciPFKiB0/s640/DSC05296.JPG" height="480" width="640" /></a> <p>Gemi'ye dönüş için 3 saatimiz kalmıştı. 1 saat etraftaki mağazalarda takılıp dönüş için taksi aramaya başladık. </p><a href="https://picasaweb.google.com/lh/photo/JfIYrorI5GaksuFfujmSBEnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh4.googleusercontent.com/-MXQ-4s1UpJ8/TfMv4H-Yl8I/AAAAAAAACtg/iRqCcVGEWHY/s640/DSC05301.JPG" height="480" width="640" /></a> <p>Burada taksiler çok lüks, çoğu Mercedes. Taksimetre açanına da rastlamdım hiç. Herşey pazarlık usulü. İngilizce bilen bir taksi şoförü bulabilirseniz şanslısınız. Geminin kalkmasına 2 saat kala bir taksi ile 65 avroya anlaşıp Atina'dan limana doğru yola çıktık. </p><p>Bu bizim ilk cruise seyahatimizdi. Bizim tatil anlayışımıza ters olduğu için bir daha böyle bir tatil yapmayı düşünmüyoruz. 500 kişi ile beraber seyahat etmek, yemek yemek, müzik dinlemek, güneşlenmek gerçekten zor. Açık büfede biten yemekler, herşey dahil olmasına rağmen biten içecekler, her gece "aynı" dans şovları turun kötü yanlarıydı. Öte yandan denizin ortasında geceleri yıldızları izlemek çok güzeldi. Ayın denizdeki ışıltısının gemiyi takip etmesi de görülmesi gereken bir manzaraydı. Ayrıca Casino'lara merakınız varsa cruise seyahatleri tam size göre. </p><p>Tatil bitti :( Gezdiğimiz gördüğümüz yerleri kısa kısa anlatmaya çalıştım. Umarım bu yazı dizisi ileride Yunan Adaları turuna katılmak isteyenlere tur ile ilgili bir fikir verebilir. </p></p>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com8tag:blogger.com,1999:blog-2296791868291929959.post-90508639560526406602011-06-09T21:25:00.000+03:002011-06-09T21:25:52.333+03:00Yunan Adaları Turu - Girit - Haziran 2011<p>Tatilin sonunu düşünmeye başladım yine. Bugün Girit, yarın Atina, cumartesi sabah da İstanbul'dayız. Girit çok büyük bir ada. Kuzeyi Ege Denizi'ne güneyi Akdeniz'e bakıyor. Böyle büyük bir adayı bir günde gezmek imkansız. Gemi sabah 8'de Girit'in en büyük şehri <b>Heraklion</b>'daki limana yanaştı. Bugün tura katılmadığımıza pişman olduk. Rodos'u kendimiz gezebilirdik fakat Girit'i gezmek için burayı iyi bilen birisi şart. </p><p>Kahvaltıdan sonra çantamızı hazırlayıp gemiden ayrıldık. Liman çok büyük olduğu için limanın girişine transfer otobüsleri ile gittik. Limandan çıkınca sora sora otobüs garını bulduk, atladık en yakın plajdan geçen otobüse. <b>Arina Sand Beach</b>'in önünde otobüsten indik. Bugün hava kapalı, hatta biz plajdayken ufak ufak da yağmur atıştırdı. Denize girmeden gerisin geri otobüs garına geri geldik. Aşağıdaki fotoğrafta güneş olmadığı için plajın boş kaldığını görebilirsiniz.</p><a href="https://picasaweb.google.com/lh/photo/J3JqIKza5O9Kc602gtLGH0nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-4vL98d-omvI/TfDwo8TCO0I/AAAAAAAACsk/FcHw3jXyyII/s640/DSC05247.JPG" height="480" width="640" /></a><br />
<p>Otogardan taksi ile 5 Avro'ya şehir merkezindeki <b>Aslanlı Çeşme</b>'nin bulunduğu meydana gittik. Burası kafeler ve restoranlarla dolu bir meydan. Öğle yemeğini aşağıdaki resimde gözüken <b>İzmir Kebap</b>'ta yedik. Eşim (Nurten) hamile olduğu için Girit'in meşhur deniz ürünleri restoranlarında yemek yiyemedik. <br />
</p><a href="https://picasaweb.google.com/lh/photo/K-CXrjqTaMQKVUyJ3V5la0nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-aN78TDU2lc4/TfDw1e4thFI/AAAAAAAACss/dfyBd0wXXPI/s640/DSC05251.JPG" height="480" width="640" /></a><br />
<br />
<a href="https://picasaweb.google.com/lh/photo/qa5odCo21cZbYep9w-RWIEnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh4.googleusercontent.com/-z5JyDh-f0dg/TfDw0EavZVI/AAAAAAAACso/Upm7BpID95w/s640/DSC05250.JPG" height="480" width="640" /></a><br />
<p>Dinlene dinlene Girit sokaklarında dolaşırken arada serpiştiren yağmur ile serinliyorduk. Adada Venedikliler bıraktığı izler çoğunlukta. Aşağıdaki fotoğrafta Adayı denizden gelen baskınlara karşı koruyan kale duvarları (Fortress) gözüküyor. Osmanlı İmparatorluğu'nun bu duvarları aşıp Heraklion'u (diğer adıyla Kandiye) alması 24 yıl sürmüş. <br />
</p><a href="https://picasaweb.google.com/lh/photo/et7_2nGLI22iSmETow6BN0nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-J3x4h5EcDlo/TfDx21Ajp3I/AAAAAAAACsw/I_0beVCX0Qw/s640/DSC05252.JPG" height="480" width="640" /></a><br />
<br />
<a href="https://picasaweb.google.com/lh/photo/ASgmLCW9jFWc5JKngyBWPEnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-fSjU6AGgpfw/TfDx3Zv7EcI/AAAAAAAACs0/asoCBCyIN0k/s640/DSC05254.JPG" height="480" width="640" /></a><br />
<br />
<p>Girit'ten beklediğim randımanı alamadık. Gezilecek çok yer var fakat zaman çok kısıtlı. Şu anda limandan ayrılmak üzereyiz. 3 yolcu henüz geri dönmemiş. Eğer 15 dakika içinde gelmezlerse gemi yolcuları almadan Atina'ya hareket edecek. Gemiyi kaçırma korkusu ile Girit'i doya doya gezememenin bir eksikliği var şu an içimde.<br />
</p>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com3tag:blogger.com,1999:blog-2296791868291929959.post-43370238125959363792011-06-08T22:24:00.000+03:002011-06-08T22:24:12.350+03:00Yunan Adaları Turu - Rodos - Haziran 2011<p>Ben bu satırları yazarken gemimiz <a href="http://www.seascanner.com/schiff.php?schiff=Alexander+von+Humboldt">Alexander Von Humboldt</a> Rodos'tan Girit'e doğru ağır ağır ilerlemekte. Bugün ilk defa geminin neden bu kadar yavaş ilerlediğini anladım. Jeton 4. günde ancak düştü. Gemi limandan ayrılır ayrılmaz bir sonraki limana kadar <b>Casino</b> açılıyor. Gemi uluslararası sularda hareket halinde olduğu sürece kumar devam ediyor. İşletmeciler, kumarhane ne kadar çok açık kalırsa o kadar çok para kazanacakları için aksamları 4-5 saatlik yolu 9-10 saatte alıyoruz.<br />
</p><p>Gemimiz güneye inmeye devam ediyor. Bugün Rodos'u gezme fırsatı bulduk. Yıllarca elden ele geçmiş bu ada Osmanlı'nın da elinden geçmiş. Adayı yıllarca korumayı başarmış <b>Rodos Şövalyeleri</b> Kanuni Sultan Süleyman'ın ordularına direnememiş ve ada 1522 yılında Osmanlı İmparatorluğu'nun eline geçmiş. 1912 yılında Trablusgarp Savaşı sırasında İtalyanlar tarafından işgal edilmiş ve 1948 yılında Oniki adalar'ın diğer adaları ile beraber Yunanistan'ın eline geçmiş. Rodos ile ilgili çarpıcı bir bilgi daha : Türkiye ile Rodos arasındaki en kısa mesafe 18 km.<br />
</p><p>Limana girer girmez Şövalyeler zamanında yapılan kale ve surları göze çarpıyor. Adada Osmanlı zamanından kalma binalar ve camiler de var. Halen Rodos'ta yaşan 3000 civarında Türk varmış. Aşağıdaki fotoğraf limandan çekildi. Surlar, arkasındaki cami ve kilise Rodos'un geçmişinin küçük bir özeti gibi.<br />
</p><br />
<a href="https://picasaweb.google.com/lh/photo/vhO8EFNhpoVwvvkyJZHKmEnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-IlbIOtOK2lk/Te_Kr_NqXzI/AAAAAAAACsQ/QMISk8zC36A/s640/DSC05242.JPG" height="480" width="640" /></a><br />
<br />
<p>Rodos ziyaretimiz ile Dünyanın Yedi Harikası'ndan birisi olan <b>Rodos Heykeli</b>'ni de gömüş olduk. Gördük dediysem yanlış anlaşılmasın turistik eşyalar satan dükkanların vitrinlerinde görebildik. M.Ö. 280 yılında yapılmış ve yapıldığı yıldan 96 yıl sonra yaşanan deprem ile yıkılmış (Bkz. İskenderiye Feneri) 30 metreyi aşkın bronzdan yapılmış Rodos Heykeli'nin yerine (limanın girişi) aşağıdaki fotoğrafta gözüken iki tane geyiği koymuşlar. Geyik heykellerinin oraya kimin zamanında dikildiğini öğrenemedim. Ne amaçla dikildiğinin mantıklı bir açıklaması vardır elbet.<br />
</p><br />
<a href="https://picasaweb.google.com/ilkinulas/YunanAdalarHaziran2011?authkey=Gv1sRgCL6d49ypr4HdXA&feat=embedwebsite#5615912908261419666"><img src="https://lh4.googleusercontent.com/-Lb7-uFw19A0/Te-7CSJz6pI/AAAAAAAACsA/3fpx8r3WUwo/s640/DSC05222.JPG" height="480" width="640" /></a><br />
<br />
<p>Rodos'a Şövalyeler adası da diyorlar. Kudüs'ü koruyan Tapınak Şövalyeleri Kudüs düşünce Rodos'a geliyorlar ve 200 yıldan fazla adayı muhafaza ediyorlar. Rodos Şövalyeleri o zamanın güvenlik görevlileri, meslekleri savaşmak olan bir topluluk. Kuşatmalara karşı yaptıkları kale ve surları da görülmeye değer. Surlar lahana yaprakları gibi. Birisinin kapısından girince kalenin içine girdiniz sanıyorsunuz ama başka bir sur çıkıyor karşınıza. O suru geçiyorsunuz başka bir köprü ve başka bir sur ile karşılaşıyorsunuz. Fakat Sultan Süleyman'a dayanamamış bu surlar. Aşağıdaki fotoğrafta kalenin girişi sandığım bir kapıyı görebilirsiniz.<br />
</p><br />
<a href="https://picasaweb.google.com/lh/photo/abbh5E15o52Milv9M-2TzEnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-as23znSjOj8/Te-7bwhEAXI/AAAAAAAACsI/2-BXukZxBUQ/s640/DSC05225.JPG" height="480" width="640" /></a><br />
<br />
<p>Kalenin içi restoranlar, kafeler ve hediyelik eşya satan dükkanlar ile dolu. Aynı bizim Kapalıçarşı'mız gibi. Aşağıdaki fotoğrafta Kanuni Sultan Süleyman tarafından yaptırılmış camiyi ve minarenin başında nöbet tutan şövalyeyi görebilirsiniz :)<br />
</p><br />
<a href="https://picasaweb.google.com/lh/photo/UUPK1C6LCGSAVoHDBkzZW0nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-SPeenBiTNks/Te-7GYZ2VOI/AAAAAAAACsE/CEBFi7FeC9c/s640/DSC05227.JPG" height="480" width="640" /></a><br />
<br />
<p>Öğleden sonra Rodos'un meşhur plajlarından birisi olan <b>Falaraki Plajı</b>'na gittik. Mykonos'taki Paradise Beach'ten sonra burası gözüme Kilyos Halk Plajı gibi geldi doğrusu. Hiç bir özelliği olmayan bir plaj bence. Rodos'a günübirlik giderseniz plajda vakit öldürmeyin, kaleyi, çarşıyı ve müzeleri gezin derim. Aşağıdaki foto'da plajdan bir görüntü var.<br />
</p><br />
<a href="https://picasaweb.google.com/lh/photo/gAkXkxyueKwfNqjYVP2z_EnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-sq7Y4xVKCYw/Te_KwakMx0I/AAAAAAAACsU/M9NWsIpEqag/s640/DSC05244.JPG" height="480" width="640" /></a><br />
<br />
<p>Yolculuğumuzu kısa kısa anlatmaya çalışıyorum, çünkü biz de kısa kısa gezebiliyoruz. Gezdiğimiz adaların hiçbiri bir günde gezilebilecek adalar değil. Herbir ada için bir hafta ayırmaya değer. Emekli olduğumuzda bastonumuz ile gelir gezeriz artık :)<br />
</p>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com1tag:blogger.com,1999:blog-2296791868291929959.post-50540206939343889192011-06-07T21:32:00.001+03:002011-06-08T08:45:37.461+03:00Yunan Adaları Turu - Santorini - Haziran 2011<p>Gece eğlencesine akan yolcular da geldikten sonra, sabaha karşı saat 4'te gemimiz Mykonos'tan ayrıldı. Sıradaki durak <b>Santorini</b>. <a href="http://ilkinbalkanay.blogspot.com/2011/06/yunan-adalar-turu-mykonos-haziran-2011.html">Mykonos</a> eğlencenin merkezi ise <b>Santorini</b> de romantizmin merkezi imiş.<br />
</p><p>Aşağıdaki fotoğrafta gemi Santorini'ye doğru yol alırken Ege Denizi'nde bıraktığımız iz gözüküyor.<br />
</p><br />
<a href="https://picasaweb.google.com/lh/photo/fcuAwagXKGKNIUfDyeqvQ0nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh4.googleusercontent.com/-KjLi898Sl2g/Te5E7-eGEtI/AAAAAAAACrU/zALFDCGyLm4/s640/DSC05147.JPG" height="480" width="640" /></a><br />
<br />
<p>Santorini Adası, aslında bir krater. Ortasındaki volkan patladıktan sonra oluşan krater aşağıdaki resimdeki gibi bir görünüm oluşturmuş. Ada, su ve yeşillik fakiri bir ada. Mykonos gibi burada da yeraltı kaynak suyu olmadığı için adaya su anakaradan tankerler ile taşınıyormuş. <br />
</p><br />
<a href="https://picasaweb.google.com/lh/photo/5P-KIBI2nR_bz9HNZUCMJUnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh4.googleusercontent.com/-J2NwrGJs6eE/Te5IEWEsY0I/AAAAAAAACr8/Bm6IaC0bEPA/s800/santorini_kus_bakisi.jpg" height="469" width="500" /></a><br />
<p>Gemi en soldaki adanın sol tarafından kraterin içine girdi. Bu tarafta geminin yanaşabileceği büyüklükte bir liman olmadığı için kraterin içinde demir attı. Adayı gezmek isteyen yolcuları filikalarla adaya taşıdılar. Biz de öğle yemeğinden sonra atladık bir filikaya doğru romantizmin merkezine.<br />
</p><br />
<a href="https://picasaweb.google.com/lh/photo/4bYj2BcB_iLCB8b_J5seQEnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-OqMLxgd_Fio/Te5FATIv9fI/AAAAAAAACrY/DyKpRQC6rjE/s640/DSC05173.JPG" height="480" width="640" /></a><br />
<br />
<p>Filikalar ile adaya indikten sonra iş bitmiyor. Yerleşim yerlerini adamlar manzanın en güzel olduğu ve ulaşımın en zor olduğu dağın tepesine yapmışlar. Tepeye çıkmak için üç seçenek var. Birincisi kişi başı 4 avro vererek teleferik kullanmak, ikincisi yukarıya doğru çıkan merdivenleri kullanmak, üçüncüsü de eşeklere binmek. Biz eşeklere acıdığımız için teleferikle çıktık. <br />
</p><br />
<a href="https://picasaweb.google.com/lh/photo/q1NpyIT-e8UGMe7wsed_-EnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-lQZQDE2mHQc/Te5GpWKLWiI/AAAAAAAACrw/8aWN5BIGzus/s640/DSC05209.JPG" height="640" width="480" /></a><br />
<br />
<p>Tepeye çıktığınız zaman buraya neden romantizm adası dediklerini anlıyorsunuz. Manzara çok güzel, bakmaya doyamıyor insan. Diğer adalarda olduğu gibi adaya tek bir renk hakim, beyaz. Gemiye dönüşte geç kalarız korkusuyla siyah kumları olan plaja inemedik, böylece bugünü denize girmeden kapatmış olduk. Yarın Rodos'ta bugünün acısını çıkartırız.<br />
</p><br />
<p>Santorini dünya üzerinde en çok fotoğrafı çekilen yerlerden birisiymiş dedi rehber. Aşağıdaki fotoğraflar da benim makinemden çıkanlar. </p><br />
<a href="https://picasaweb.google.com/lh/photo/K2UQG04TN9ABArJ8eB3aVUnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh4.googleusercontent.com/-GuebczmHCGA/Te5F3kV78_I/AAAAAAAACrk/WEHux7y1wkI/s640/DSC05192.JPG" height="480" width="640" /></a><br />
<br />
<br />
<a href="https://picasaweb.google.com/lh/photo/liVow8syP7zQlyedSxDd10nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-Y4FvvM3cO8E/Te5F471ljPI/AAAAAAAACro/XrYKzJKk9zU/s640/DSC05191.JPG" height="480" width="640" /></a><br />
<br />
<a href="https://picasaweb.google.com/lh/photo/MQdT_3G-_3aceNv6wG1an0nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-2eIb7tzT97g/Te5GgXmOkVI/AAAAAAAACrs/2Y-szqGBKgI/s640/DSC05199.JPG" height="480" width="640" /></a><br />
<br />
<a href="https://picasaweb.google.com/lh/photo/HNpU7b-xpM3A4dV2gOp_S0nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-RyJIwz7CN7c/Te5FrFIbuxI/AAAAAAAACrg/twIKtryvq4o/s640/DSC05194.JPG" height="480" width="640" /></a>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com0tag:blogger.com,1999:blog-2296791868291929959.post-78146096367473116152011-06-06T23:00:00.002+03:002011-06-07T09:56:17.788+03:00Yunan Adaları Turu - Mykonos - Haziran 2011<p>Sabah uyandığımızda gemi <b>Mykonos</b>'a yanaşmıştı. Bugün için sabah kasaba turuna katılmadık. Öğle yemeğinden sonra yapılacak olan Paradise Beach turu için bilet aldık. Kahvaltıdan sonra aşağıdaki fotoğrafta gözüken plajda denize girdik. Bu fotoğrafı geminin terasından çektim. </p><br />
<a href="https://picasaweb.google.com/lh/photo/EVyBQzxjT71wzLVylpy8wUnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-XhsY_86ok1E/Te0oL98YxuI/AAAAAAAACqo/yFCW9Zyg618/s640/DSC05104.JPG" height="480" width="640" /></a><br />
<br />
<p>12:30'da öğle yemeği için restorana gittik. Açık büfe serviste yemeklere saldıran insanların açlıklarının geçmesi için oturduğumuz yerde bir yarım saat yemeklerin başının tenhalaşması bekledik. Denizde olmanın verdiği pisikoloji yüzünden midir nedir insanlar bir daha yemek bulamayacaklarmış gibi tabaklarını doldurup, daha sonra da tabaklarının yarısını yemeden kalkıp gidiyorlardı. Sanırım bu bütün "herşey dahil" tatil paketlerinde böyle oluyor. (Bu bizim ilk herşey dahil tatilimiz)<br />
Saat 2'de <b>Paradise Beach</b>'e gitmek için otobüslere bindik. Aşağıdaki fotoğrafı limandan ayrılırken çektim. Vodafone'da çalıştığım için ufak bir Vodafone reklamı yapayım dedim. Şaka bir yana burada en çok tercih edilen operator Vodafone GR imiş.<br />
</p><br />
<br />
<a href="https://picasaweb.google.com/lh/photo/mP-7M9jNy2NasOQV_DVh9UnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh4.googleusercontent.com/-gcXXlmfYSy4/Te0oCtpgsMI/AAAAAAAACqg/W4ZaNw-a4Oo/s640/DSC05111.JPG" height="480" width="640" /></a><br />
<br />
<p>Paradise Beach, adı gibi cennetten bir köşe bir yer değil. Çok daha güzel plajlar gördüm (Mesela Fethiye-Ölüdeniz). Burasının cennetliğinin doğal güzelliğinden değil eğlencesinin sınırsız olmasından olduğunu daha sonra rehberlerden öğrendik. Dum-Tıs'lı müziklerden hoşlanıyorsanız ve kokteyl seviyorsanız bu plaj tam size göre. Saat 17'de müziği hafiften vermeye başlıyor DJ'ler. Saat ilerledikçe müziğin ritmi ve sesi artıyor.<br />
</p><br />
<br />
<a href="https://picasaweb.google.com/lh/photo/bGz8RItt9LcTvQjUOU9s-knGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-KfF7Ic12gVA/Te0o-NQI1oI/AAAAAAAACq0/iDXCXHBGo-g/s640/DSC05141.JPG" height="480" width="640" /></a><br />
<br />
Aşağıdaki fotoğrafta tüm kumsal gözüküyor. Deniz çok temiz. Şnorkel ile küçük bir tarama yaptım ve durum <a href="http://ilkinbalkanay.blogspot.com/2011/06/yunan-adalar-turu-midilli-haziran-2011.html">Midilli</a>'dekinden farksız : bol ve büyük balıklar...<br />
<br />
<br />
<a href="https://picasaweb.google.com/lh/photo/YM_UyvIbL8dfxVzctWGGyUnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-rk44cNkV-fE/Te0oFwGFXWI/AAAAAAAACqk/Juy6HZ_yrA4/s640/DSC05128.JPG" height="480" width="640" /></a><br />
<br />
<br />
Plaj beklediğim kadar pahalı değil. Bir şemsiye iki şezlong fiyatı 12 Avro, bira 3-4 Avro, kokteyler 6-10 Avro arası fiyatlardaydı. Bu fotoğrafı da Dum-Tıs'lı eğlencenin hafiften başladığı saatlerde çektim.<br />
<br />
<br />
<a href="https://picasaweb.google.com/lh/photo/no4A-yuTykM3_R0KF0vC2UnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh4.googleusercontent.com/-IAeaPTNT7jg/Te0o7HfqoYI/AAAAAAAACqw/oWP6nG33Ml8/s640/DSC05131.JPG" height="480" width="640" /></a><br />
<p>Gemideki odamızın Mykonos manzarasını gösteren bir fotoğraf. Odamız 4. katta ve beklediğimden daha güzel. Otel odasını aratmıyor diyebilirim.<br />
</p><a href="https://picasaweb.google.com/lh/photo/siklGwY53dQaenjYNBf6vUnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-3VZRJGLYdHA/Te0o_vRVorI/AAAAAAAACq4/kovPV0P6QMc/s640/IMG_20110606_120736.jpg" height="480" width="640" /></a><br />
<br />
<p>Bu da bu yazının bonus fotosu olsun. Okuyan herkese şans getirsin :D</p><a href="https://picasaweb.google.com/lh/photo/IY0T1-VsZS2s3Rl0vT0-50nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh3.googleusercontent.com/-XnteO1iM9hU/Te0o4pT3J9I/AAAAAAAACqs/hXKEONNWEYM/s640/DSC05137.JPG" height="480" width="640" /></a>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com1tag:blogger.com,1999:blog-2296791868291929959.post-37670517265936200912011-06-06T12:39:00.001+03:002011-06-06T12:41:21.169+03:00Okey Mini 10 bini gördü<p>17 Nisan 2011'de Android Market'te yayınladığım okey oyunum <a href="http://appsonfire.blogspot.com/2011/04/okey-mini.html">Okey Mini</a> 10.000 android işletim sistemli cihaz üzerinde çalışıyor. Reklam istatistiklerine göre Internet bağlantısı kapalı cihazlar haricinde günde 40 bin tane el bitiyor.<br />
</p>Market istatistikleri aşağıdaki resimdeki gibi.<br />
<ul><li>5 puan üzerinden yapılan oylamada ortalama puan 4,6 (466 kişi puan vermiş)</li>
<li>17.800 defa indirilmiş, 7800 kişi beğenmemiş oyunu kaldırmış, active installation sayısı 10 bin.<br />
</ul><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-kEZWVqfAR4g/TeydJhtO43I/AAAAAAAACqY/aEVbWAwHP-A/s1600/Screenshot-HT9C6P802025%253A2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="388" width="336" src="http://3.bp.blogspot.com/-kEZWVqfAR4g/TeydJhtO43I/AAAAAAAACqY/aEVbWAwHP-A/s400/Screenshot-HT9C6P802025%253A2.png" /></a></div><p>Android telefonu olup da oyunu merak edenler için market linki <a href="https://market.android.com/details?id=com.appsonfire.okey">https://market.android.com/details?id=com.appsonfire.okey</a> </p><p>Doğrusunu söylemek gerekirse oyunun bu kadar populer olmasına çok şaşırdım. Markette yapılan yorumlardan çıkardığım sonuç, kullanıcıların telefona karşı değil arkadaşlarına karşı oynamak istedikleri oldu. Grafik işlerinden anlayan bir arkadaşım ile çalışıp grafikleri düzelttikten sonra multiplayer versiyonu da birkaç ay içinde çıkartmayı düşünüyorum. </p>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com3tag:blogger.com,1999:blog-2296791868291929959.post-58360062631886823032011-06-05T22:07:00.001+03:002011-06-07T09:56:17.789+03:00Yunan Adaları Turu - Midilli - Haziran 2011<p>Bugün ilk güne göre daha güzel geçti. Sabah kahvaltısının ardından acil durum tatbikatı anonsu yapıldı ve odamızdaki can yeleklerini giyip krokide işaretlenen toplanma yerine gittik. 500 kişilik yolcu taşıyan gemide tatbikata sadece 50 yolcunun katılması, bize birşey olmaz mantığından başka birşey değildi bence. <br />
</p><p>Saat 11 gibi gemi <b>Midilli Adası</b> limanına yanaştı. Yunanistan'ın en büyük 3. adası olan Midilli Ayvalık'a Yunanistan ana karasından daha yakın. Geminin terasından Türkiye kıyıları çok net görülebiliyor. Türkiye'ye o kadar yakınız ki <b>Vodafone</b> Midilli'de full çekiyor. <br />
</p><br />
<p><a href="https://picasaweb.google.com/lh/photo/loK9CmHhZK7MKVJ8U-6IA0nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh4.googleusercontent.com/-A6oYLpmrqgI/TeuyGo16iTI/AAAAAAAACp0/iSC5fB51dZo/s640/IMG_20110605_140957.jpg" height="480" width="640" /></a><br />
</p><br />
<p>Kaptan cruise gemisini adeta şehir hatları vapurunu iskeleye yanaştırır gibi Midilli Limanına park etti. Gemiden iniş de resimde görüleceği gibi İstanbul'un güzelim vapurlarını aratmadı. Tek fark gemi henüz yanaşmadan karaya atlayan tipler yoktu :)<br />
</p><p><a href="https://picasaweb.google.com/lh/photo/2-k4klTgSFf7kzVjcom4eUnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-FGoK4Rnt_OY/TeuyKIENXXI/AAAAAAAACp4/FpdHCgDtx8M/s640/IMG_20110605_150632.jpg" height="480" width="640" /></a><br />
</p><p>Bugün rehberler eşliğinde yapılan Midilli adası turuna katılmadık. Adayı kendimiz gezelim istedik. (Aslında iki kişi 120 Avro veresim gelmedi 4 saatlik ada turu için) Gemiyi saat 3'te terkedebildik. 7 buçuğa kadar vaktimiz vardı. Bir karar vermemiz gerekiyordu: Antik tiyatro, tarihi kilise mi yoksa plaj mı? "Bu sıcakta kim gidecek antik tiyatroya" diye içimden söyleniyordum ki Nurten "Plaja gidelim mi?" diye sordu. "Sen nasıl istersen bir tanem..." derken içimden de "ohhh be" diyordum.<br />
</p><p><a href="https://picasaweb.google.com/lh/photo/UBiMKbbCRCPX4mVLsGC940nGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-_Kn1I6QRxNw/TeuyQYKQvnI/AAAAAAAACp8/onqr6qYF_YU/s640/IMG_20110605_151448.jpg" height="480" width="640" /></a><br />
</p><br />
<p>Bu yıl deniz sezonunu Midilli adasında açmış olduk. Henüz denize girememiş arkadaşların gücüne gitmesin ama deniz çok güzeldi. Ege Denizi'nin bizim kıyılarımızda bir çok yerinde denize girdim, daldım fakat Midilli'de deniz altı bizim oradakinden farklıydı. Deniz daha temiz, balıklar daha çok ve daha büyüktü. Bu mevsimde kolum kadar kefalleri, kafam kadar karagözleri görünce bizde niye yok bunlar diye düşünüyor insan. (Neden olmadığı belli aslında, aç gözlü ve bilinçsiz avcılar...)<br />
</p><p>Aşağıdaki fotoğraftaki heykel biraz tanıdık, gemiye döndükten sonra ufak bir google araştırmasının ardından NewYork'taki Özgürlük Heykeli'nin minyatürü olduğunu öğrendim. Amerika'da çalışmış bir vatandaş memleketine döndükten sonra orada görüp beğendiği heykelin küçük bir kopyasını adanın kıyısına yaptırmış.<br />
<p><a href="https://picasaweb.google.com/lh/photo/Y1sFdidQ5K_tVwyFG3zOzknGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh5.googleusercontent.com/-Z5-zrla0nFM/TeuyXYyQRQI/AAAAAAAACqA/lUuYZ5Vv6VI/s640/DSC05094.JPG" height="480" width="640" /></a><br />
</p><br />
<p>Deniz sefasının ardından gemiye döndük. Biz akşam yemeğimizi yerken gemimiz Santorini Adası'na gitmek için Midilli'den ayrılıyordu. Saat 23:00'te Seda Sayan konseri varmış, biraz bakalım sarmazsa casino'ya gider zar atarız :)<br />
</p><p><a href="https://picasaweb.google.com/lh/photo/DUkMtVldv4vSGicV95NLIUnGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh6.googleusercontent.com/-seIsdhxOvAo/TevKgi1w6_I/AAAAAAAACqQ/Lovssk6ijN8/s640/IMG_20110605_203840.jpg" height="480" width="640" /></a><br />
</p>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com2tag:blogger.com,1999:blog-2296791868291929959.post-42875756482411756042011-06-05T19:56:00.002+03:002011-06-07T09:56:17.790+03:00Yunan Adaları Turu - İstanbul'dan ayrılış - Haziran 2011<p>Geçtiğimiz kurban bayramında Bamtur ile Mısır'a gitmiştik. Yarıda kesilen Mısır tatilimizi ve Sharm-el Sheikh havaalanında geçen 1 günümüzü <a href="http://ilkinbalkanay.blogspot.com/2010/11/kasm-2010-msr-turu.html">Kasım 2010 Mısır Turu</a> yazısında anlatmıştım.Bu tatsız olayları tatlıya bağlamak için Bamtur tur paramızı iade etti ve bize bir tur hediye etti. Biz de (ben ve eşim Nurten) beleş tur baldan tatlıdır diyerek bindik Bamtur'un Yunan Adalarına giden gemisine. <br />
</p><p>Bugün gemide ilk günümüz. Saat 18'de Karaköy'deki Denizcilik İşletmeleri Limanındaydık. Bamtur'un klasikleşen organizasyon eksikliği yüzünden gemiye binmemiz 21:00'i buldu. Resimde görüldüğü gibi insanları saatlerce beklettiler.<br />
<p><a href="https://picasaweb.google.com/lh/photo/eZsUJW08wbKyl3OrSR2SCknGl5EznJay7T9yqxr9Qw4?feat=embedwebsite"><img src="https://lh4.googleusercontent.com/-uoiQRmbML2A/Teux6byLLTI/AAAAAAAACps/LhWmG99gK5g/s400/3.jpg" height="300" width="400" /></a><br />
</p><p>Gemi limandan saat 23:00'da ancak ayrılabildi. Geminin restoranına saat 21'de oturduk.<br />
21:15'te çay fincanı içinde bir mercimek çorbası içebildik. Saat 22:30'da hala ana yemek gelmemişti. Kepek ekmeği ve bira ile karnımı doyurmak üzereydim ki 22:45'te soğuk ızgara köfteler geldi. Neyse ki yatmadan önce karnımızı doyurabildik.Gemiye bindik yemeğimizi yedik dedim ama yanlış anlaşılmasın odamıza yerleşemedik. Bizim tur hediye tur olduğu için midir bilmem, ikinci sınıf vatandaş gibi hissetmemiz için elinden geleni yapan Bamtur görevlileri koca gemide bizi saat 00:00'a kadar bir odaya yerleştiremedi. <br />
</p><p>Ben bu satırları yazarken gemi Midilli adasına doğru yol alıyor. Yarın Midilli adası maceralarımızı yazmaya çalışacağım. Bol bol fotoğraf çekip paylaşmayı düşünüyorum. Umarım tatilin kalan kısmı başlangıcından daha iyi olur. Tekrar Bamturzede olmak istemiyoruz.<br />
</p>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com1tag:blogger.com,1999:blog-2296791868291929959.post-86069228000499943452011-03-20T00:01:00.002+02:002011-03-20T00:08:10.783+02:00Android Uygulama KaynaklarıAndroid'in kaynakları yönetimi, uygulama geliştirmeye yeni başlayanlar için karmaşık olabilir. Android platformu üzerinde başarılı uygulamalar geliştirmeyi hedefliyorsak aşağıdaki nedenlerden dolayı Android'in kaynak yönetim yapısını iyi bilmemiz gerekiyor.<br />
<ul><li>Uygulama, farklı ekran çözünürlüklerindeki cihazları destekleyebilirse, potansiyel kullanıcı sayısı artmış olur.</li>
<li>Türkçe uygulama geliştirmek çok güzel fakat, kullanıcı sayısını binlerden yüzbinlere çıkartmak için farklı dilleri desteklemek şart.</li>
<li>Uygulama bileşenlerinin (View) ekrandaki dizilimini (layout) zaten karmaşık olan java kodundan ayırmak kodun okunabilirliğini arttırır.</li>
<li>Telefonun dikey ve yatay duruşu (screen orientation) için farklı bileşen dizilimleri kullanmak isteyebiliriz.</li>
<li>Kullanıcıların uygulumayı özelleştirebilmesi için farklı stiller (renkler, ikonlar) desteklememiz gerekebilir.</li>
</ul><br />
Eclipse ile bir Android uygulamasını oluşturduğumuzda resimdeki gibi 4 ana klasör görürüz.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-N-uB-e19PXs/TYUgY3nTW6I/AAAAAAAACk0/9JEHtw6fAjM/s1600/android_project_dizinler.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="239" width="266" src="http://2.bp.blogspot.com/-N-uB-e19PXs/TYUgY3nTW6I/AAAAAAAACk0/9JEHtw6fAjM/s400/android_project_dizinler.png" /></a></div><br />
<ul><li><b>src</b> dizininden bahsetmeye gerek yok. Yazdığımız tüm java kodları bu dizin altında paketler içerisinde bulunuyor.</li>
<li><b>gen</b> dizininde <b>aapt</b> <i>(Android Asset Packaging Tool)</i> tarafından oluşturulan ve uygulama kaynaklarına src altındaki java kodundan erişimi sağlayan meşhur <i>R.java</i> sınıfı yer alır. Eclipse ile uygulama geliştirenlerin aapt'yi kullanmalarına gerek yok. Eclipse yeni tanımlanan kaynakları algılayıp <i>R.java</i> sınıfını otomatik güncelleyecektir.<br />
</li>
<li><b>assets</b> dizini başka bir yazının konusu olabilir ama kısaca ne amaçla kullanıldığından bahsedelim. Bu dizin altındaki dosyalara sadece <a href="http://developer.android.com/reference/java/io/InputStream.html">java.io.InputStream</a> aracılığı ile erişilebiliyor. mp3 dosyaları, pdf'ler, csv formatındaki data dosyalarını bu dizin altına atıp InputStream aracılığı ile okuyabiliriz.<br />
</li>
<li><b>res</b> dizini bu yazının konusu olan dizinimiz. Tüm uygulama kaynaklarımız bu dizin altına koyuluyor.<br />
</ul><b>res</b> dizini altında yer alan kaynak dosyalarından bahsetmeye en kolayından ve en çok kullanılanından başlayalım. <h2>strings.xml</h2>res/values dizini altında tanımlayabileceğimiz kaynaklar arasında en fazla kullanılanı <i>strings.xml</i>'dir. Uygulama içerisinde geçen tüm metinleri <i>strings.xml</i> dosyasına kaydedip java kodu içinden <i>R</i> sınıfı aracılığı ile erişebiliriz. Aşağıda örnek bir <i>strings.xml</i> dosyası ve buradaki metinlere java kodundan nasıl erişildiği gösteriliyor. <i>strings.xml</i> dosyasında sabit metinler dışında değişkenler de tanımlanabilir. Değişken tanımlarken <a href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html">java.util.Formatter</a> sayfasında anlatılan kurallara uyulması bekleniyor. <pre class="prettyprint"><?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="karsilama_mesaji">Merhaba dünyalı. Biz dostuz.</string>
<string name="karsilama_mesaji_ozel">Merhaba %1$s. Biz dostuz.</string>
</resources></pre><pre class="prettyprint">public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView ozelMesaj = (TextView)findViewById(R.id.textView_karsilama_ozel);
ozelMesaj.setText(getString(R.string.karsilama_mesaji_ozel, "ilkin"));
}
</pre>Telefonlarının yerel dil ayarı "FR" olan kullanıcılar için uygulamaya fransızca desteği eklemek istersek, strings.xml dosyasının bir kopyasını olusturup Türkçe metinleri Fransızca karşılıkları ile değiştirmemiz gerekir. Örnek fransızca strings.xml dosyası aşağıdaki gibidir. (google translate sağolsun) <pre class="prettyprint"><?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="karsilama_mesaji">Bonjour terriens. Nous sommes des amis.</string>
<string name="karsilama_mesaji_ozel">Bonjour %1$s. Nous sommes des amis.</string>
</resources>
</pre><p>Metinlerin fransızca karşılıklarını içeren <i>strings.xml</i> dosyasını aşağıdaki şekildeki gibi <b>res/values-fr</b> dizini altına koymamız gerekiyor. Dili Fransızca olan telefonlarda metinlerin Fransızca karşılıklarını gösterme işini Android platformu bizim için yapacaktır. </p><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-CjU50-gQEQQ/TYUi-JJ0-0I/AAAAAAAAClA/Sak3YcxBBug/s1600/strings_xml.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="345" width="282" src="http://4.bp.blogspot.com/-CjU50-gQEQQ/TYUi-JJ0-0I/AAAAAAAAClA/Sak3YcxBBug/s400/strings_xml.png" /></a></div><p>Vakit bulursam bir sonraki yazının konusu <i>drawable</i> kaynaklar (renkler, resimler, ikonlar) olacak. Bol Android'li günler :) </p>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com0tag:blogger.com,1999:blog-2296791868291929959.post-46340072604947536612010-11-21T18:13:00.001+02:002010-11-26T08:23:35.015+02:00Kasım 2010 Mısır Turu<pre>Last week I've been to Egypt. This post is about what I've seen there.
It's in Turkish, english readers can enjoy the photos.
</pre><p>9 günlük Kurban Bayramı tatilini fırsat bilip <i>"boyu devrilesice"</i> <b>Bamtur</b>'dan Mısır turu satın aldık. Tur paketinde 2 gün Kahire, 1 gün İskenderiye ve 4 gün de <a href="http://www.flickr.com/search/?q=sharm%20el%20sheikh&w=all">Sharm El Sheikh</a> vardı. Kahire'de piramitleri, İskenderiye'de büyük kütüphaneyi görüp, tatili Sharm'da denizin ve mercanların keyfini çıkartarak sonlandıracaktık. Tatilimizin nasıl sona erdiğini merak ediyorsanız okumaya devam edin.<br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_xwxnlWIalMQ/TOb97s8myqI/AAAAAAAACYE/7NpwHR8moJg/s1600/DSC04804.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://1.bp.blogspot.com/_xwxnlWIalMQ/TOb97s8myqI/AAAAAAAACYE/7NpwHR8moJg/s320/DSC04804.JPG" width="320" /></a></div><br />
<p>Mısır'ın başketi Kahire'ye EgyptAir ile uçtuk. Yaklaşık 20 milyon kişinin yaşadığı Kahire'ye, Nil çevresindeki ufak tefek yeşillikleri saymazsak, tek bir renk hakimdi, <b>kum rengi</b>. Unutmadan yazayım, Mısır ile Türkiye arasında saat farkı yokmuş.<br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_xwxnlWIalMQ/TOb-19_e2PI/AAAAAAAACYM/yZvk8VG3bgA/s1600/DSC04816.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/_xwxnlWIalMQ/TOb-19_e2PI/AAAAAAAACYM/yZvk8VG3bgA/s320/DSC04816.JPG" width="240" /></a></div><br />
<p>14 Kasım 2010 Pazar günü öğleden sonra 3'te otele yerleştik. Piramitlere giden caddenin üzerindeki 4 yıldızlı otelin balkonundan çektiğim bu resim Kahire'deki trafiği gösteriyor. İki gün şehirde gezmemize rağmen bir tane trafik ışığı göremedik. Trafiği kontrol etmek için her kavşağa trafik polisi koymuşlar. İstanbul'un trafiğinden şikayet edenlerin gidip Kahire'yi bir görmeleri lazım, tam bir kaos. Tüm taksiler vuruk içinde, sanki çarpışan araba. Şehirde taksimetreli (beyaz) ve taksimetresiz (Siyah) olmak üzere iki tip taksi var. Taksimetreliler biraz daha konforlu gözüküyor fakat çok pahalı. Taksimetresizlere binmeden once pazarlık yapıyorsunuz, çatpat ingilizce bilen bir şoföre rastlarsanız şanslısınız yoksa anlaşana kadar akla karayı seçersiniz. <br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOb_BKElIqI/AAAAAAAACYU/9qDxL8Njqu0/s1600/DSC04819.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOb_BKElIqI/AAAAAAAACYU/9qDxL8Njqu0/s320/DSC04819.JPG" width="320" /></a></div><br />
<p>Bu resim bayramdan bir gün önce Kahire caddelerinden birinde çekildi. Kasaplar resimde görüldüğü gibi açık hava kasabı şeklinde.<br />
</p><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOb_LmcsE-I/AAAAAAAACYY/OgYeloFJFmM/s1600/DSC04843.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOb_LmcsE-I/AAAAAAAACYY/OgYeloFJFmM/s320/DSC04843.JPG" width="320" /></a></div><br />
<p>Kahire'de turist olmak gerçekten çok zor. Halk sürekli kazıklama modunda. Ne alırsan al pazarlık şart. 3 Mısır pound'u değerindeki Nil nehri üzerindeki tekne gezintisini 60 pound'a satan Mısır'lı elemana buradan selamlarımı gönderiyorum. (Bu yazının yazıldığı tarihte 1 TL yaklaşık olarak 4 Mısır Pound'u değerindedir). Nil olmasaydı Mısır da olmazdı, %94'ü çöl olan bu memlekete adeta hayat veriyor Nil.<br />
</p><br />
<table><tr> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_xwxnlWIalMQ/TOcAU0YVY3I/AAAAAAAACZI/tw-yxN3Jgas/s1600/DSC04884.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://1.bp.blogspot.com/_xwxnlWIalMQ/TOcAU0YVY3I/AAAAAAAACZI/tw-yxN3Jgas/s320/DSC04884.JPG" width="320" /></a></div></td> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcA6CD_5kI/AAAAAAAACZk/n0WH2cD_2Fw/s1600/DSC04894.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcA6CD_5kI/AAAAAAAACZk/n0WH2cD_2Fw/s320/DSC04894.JPG" width="320" /></a></div></td> </tr>
<tr> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcBXf7RHwI/AAAAAAAACZ4/6eZ7iVfN7zg/s1600/DSC04902.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcBXf7RHwI/AAAAAAAACZ4/6eZ7iVfN7zg/s320/DSC04902.JPG" width="320" /></a></div></td> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_xwxnlWIalMQ/TOcCwWQ4YFI/AAAAAAAACa4/Jy6JV-xfqWM/s1600/DSC04919.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/_xwxnlWIalMQ/TOcCwWQ4YFI/AAAAAAAACa4/Jy6JV-xfqWM/s320/DSC04919.JPG" width="240" /></a></div></td> </tr>
<tr> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcDNKFuhWI/AAAAAAAACbM/fkhNOdnQWgY/s1600/DSC04930.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcDNKFuhWI/AAAAAAAACbM/fkhNOdnQWgY/s320/DSC04930.JPG" width="320" /></a></div></td> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcDXjWGHVI/AAAAAAAACbU/gk7lo1zWkGM/s1600/DSC04932.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcDXjWGHVI/AAAAAAAACbU/gk7lo1zWkGM/s320/DSC04932.JPG" width="320" /></a></div></td> </tr>
</table><br />
<p>Mısır'a gidip de piramitleri görmemek olmaz. 4600 yıl önce yapılmış bu dev yapıları dimdik ayakta görmek çok heyecan vericiydi. Mısır'lı satıcıların ve dilencilerin yoğun markajı altında piramitleri gezmeye çalıştık. Piramitlerin yapımında halkın firavun tarafından köle gibi çalıştırıldığını düşünürdüm hep. Gerçeği öğrenebilmem için taaa Mısır'lara gitmek gerekiyormuş. (Ne derler bilirsiniz, gitmeden, görmeden bilemezsin...) Gelelim piramitler ile ilgili gerçeğe. Piramitlerin yapımında Mısır halkının çalıştığı doğru fakat halk bunu bir iş olarak yapmış. Bugün çoğumuzun yaptığı gibi sabah 8 akşam 5 çalışıp maaşlarını almışlar. Firavun bu sayede tüm halkına iş imkanı vermiş. Herkesin işi gücü olduğu için de suç oranı <i>yüzde sıfır</i> imiş. <br />
</p><p>Piramitler ile ilgili aklımda kalan diğer ilginç bilgiler ise şöyle:<br />
<ul><li> Piramitler kralların mezarları olarak yapılmış. Ana karnından dünyaya gelip tekrar toprak ananın karnına girişi anlatmaya çalışan bu dev yapılar, ana karnının dünya üzerindeki temsiliymiş.<br />
<li>Yapımı 20 yıl süren en büyük piramit tam 140 metre yüksekliğinde. Fransızlar 1889 yılında Eiffel kulesini yapana kadar dünya üzerindeki en yüksek bina ünvanı Büyük Piramit'teymiş. <br />
<li> Piramitleri koruması! için firavun <b>Sphinx</b>'i yaptırmış. Aslan vücudu üzerindeki insan kafası kralın halkına karşı olan merhametini ve mantığını, aslan vücudu ise düşmanlara ve hırsızlara karşı kralın vahşiliğini gösteriyormuş. <br />
<li> Büyük Piramit yaklaşık 1 milyon 300 bin tane, ağırlığı 2.5 tonla 15 ton arasında değişen taş bloklardan oluşuyor.<br />
<li> Piramitler ilk yapıldıklarında şimdi göründükleri gibi basamak basamak değillermiş. Hırsızların tırmanmalarını önlemek için dümdüz sıvalı dış duvarları varmış. Zamanla düşen ve alınan taşlar yüzünden bugünkü basamaklı halini almış.<br />
<li> Piramitlerin içine girmek isterseniz görebileceğiniz pek bir şey yok. Mezarlardaki tüm eşyalar ve mumyalar Kahire ve İngiltere'deki müzelerde olduğu için piramitlerin içi (en azından ziyarete açık kısımları) bomboş. 1 metre eninde ve 1 metre yüksekliğindeki tünellerden 20 metre aşağı inerek mezara ulaştık. Sadettin Teksoy'un piramitlerdeki kanter içinde kalarak yaptığı çekimi hatirlarsınız. Aynen o şekilde 20 metre inip çıkıyorsunuz. Görebileceğiniz tek şey boş mezar odaları. <br />
</ul></p><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcEp8Iq8BI/AAAAAAAACb8/82hJoUt4iOo/s1600/DSC04966.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcEp8Iq8BI/AAAAAAAACb8/82hJoUt4iOo/s320/DSC04966.JPG" width="240" /></a></div><p>Piramitlerin içinde göremediğimiz tüm tarihi eserleri Kahire Müzesi'nde görme şansımız oldu. Müzeye kamera, fotoğraf makinası ve telefon sokmak yasak. Çok sıkı bir şekilde denetim var. Müzeye girdikten sonra mumyaları da görmek isterseniz ayrıca para verip bilet almanız gerekiyor. (Kişi başı 20 liraydı galiba) Her eserin başında 1 saniye kalarak müzeyi dolaşırsanız müze geziniz yaklaşık 2 gün sürüyor. 200 bin civarında eser sergileniyor. </p><table><tr> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcFILANLLI/AAAAAAAACcU/LzTuyt9JG00/s1600/DSC04975.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcFILANLLI/AAAAAAAACcU/LzTuyt9JG00/s320/DSC04975.JPG" width="320" /></a></div></td> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcFmuLJIqI/AAAAAAAACcs/dqwkSgBZa0Q/s1600/DSC04998.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcFmuLJIqI/AAAAAAAACcs/dqwkSgBZa0Q/s320/DSC04998.JPG" width="320" /></a></div></td> </tr>
</table><p>İki gün Kahire'de kaldıktan sonra, bayramın birinci günü İskenderiye'ye doğru yola çıktık. Kahire-İskenderiye arası 260 kilometre. 3 buçuk saatlik bir otobüs yolculuğunun ardından İskenderiye'ye geldik. Adını Büyük İskender'den (Alexander the Great) alan Mısır'ın ikinci büyük şehri olan İskenderiye Kahire'ye göre çok daha temiz gözüküyordu. İskenderiye, feneri ve kütüphanesi ile meşhur bir kent. Ama ortada fener mener yok. Zamanının ve günümüzün en büyük feneri olarak anılan İskenderiye feneri 1300'lü yıllarda depremlere dayanamayarak yıkılmış. Bugün fenerin olduğu yerde İskenderiye kalesi var. </p><p>İskenderiye'deki kütüphane 2002 yılında yeni binasına taşınmış. Yukarıda sağdaki resimde gözüken kütüphanenin dış duvarları. MÖ 282 yılında yapılan kütüphane birileri tarafından yakılmış. Kimin yaktığı kesin olarak blinmiyor, kimin yaktığına dair 3 teori var. Birincisi Julius Caesar, Mısır donanmasını topa tutarken arada kütüphaneyi de yakmış. İkinci bir teoriye göre İskenderiye'de çıkan din çatışmaları ve ayaklanmalar sırasında kütüphane de ateşe verilmiş. Üçüncü bir teoriye göre de, kütüphane İskenderiye Müslümanlar tarafından alındıktan sonra yakılmış. Kim yaktıysa çok ayıp etmiş. 150 bin tane el yazması kitabı yakmak aklı başında birisinin yapacağı iş değil. </p><table><tr> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_xwxnlWIalMQ/TOcGuKMKYTI/AAAAAAAACdU/5wtk3AbRSTw/s1600/DSC05057.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://3.bp.blogspot.com/_xwxnlWIalMQ/TOcGuKMKYTI/AAAAAAAACdU/5wtk3AbRSTw/s320/DSC05057.JPG" width="320" /></a></div></td> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcHjbpw5VI/AAAAAAAACd4/IJWB4vqqPWw/s1600/DSC05064.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://2.bp.blogspot.com/_xwxnlWIalMQ/TOcHjbpw5VI/AAAAAAAACd4/IJWB4vqqPWw/s320/DSC05064.JPG" width="320" /></a></div></td> </tr>
<tr> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcH29DK57I/AAAAAAAACeI/v_sLc3cVl4A/s1600/DSC05071.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcH29DK57I/AAAAAAAACeI/v_sLc3cVl4A/s320/DSC05071.JPG" width="320" /></a></div></td> <td><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcII8yORyI/AAAAAAAACeQ/Sapxsqh8gPs/s1600/DSC05076.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://4.bp.blogspot.com/_xwxnlWIalMQ/TOcII8yORyI/AAAAAAAACeQ/Sapxsqh8gPs/s320/DSC05076.JPG" width="320" /></a></div></td> </tr>
</table><p>Tatilimizin 4. günü (17 Kasım 2010) sabah Kahire havaalanından Sharm El Sheikh'e doğru yola çıktık. 45 dakikalık bir uçuştan sonra Sharm'a ulaştık. Uçağın pencerelerinden Sharm'ın güzel plajlarını, denizinin güzelliğini gördükçe bir an önce otele yerleşip kendimizi denize atmak için sabırsızlanıyorduk. Ama Sharm'ı sadece havadan görebildik. <b>Mükemmel!!! tur şirketi Bamtur</b> otel rezervasyonlarını yaptırmadığı için (Bamtur yetkilileri dolandırıldıklarını söylüyorlar) havaalanında geçen 10 saatin ardından tıpış tıpış İstanbul'a geri dönmek zorunda kaldık. 10 saat boyunca Sharm'da bir tek boş oda bile bulamayan Bamtur görevlilerine karşı olan hislerimi burada yazmaya kalkarsam <b>Google'ın Blogger</b> servisinin de yasaklı siteler arasında girmesinden korkuyorum. </p><p>İşte böyle dostlar. Mısır'ı da görmüş olduk şu hayatta. Tüm aksiliklere rağmen Kahire-İskenderiye gezilerimiz ve tur sırasında tanıştığımız güzel insanlar tesellimiz oldu. Uzun lafın kısası siz siz olun <b>Bamtur</b> ile tatil planı yapmayın.İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com10tag:blogger.com,1999:blog-2296791868291929959.post-37309515094243442912010-10-12T18:32:00.002+03:002010-10-12T18:36:29.568+03:00JMeter JDBC Request Demo - ScreencastMerhaba<br />
<br />
Daha önce bu günlükte JMeter ile ilgili <a href="http://ilkinbalkanay.blogspot.com/2010/03/load-testing-relational-databases-with.html">bir</a> <a href="http://ilkinbalkanay.blogspot.com/2010/03/load-test-whatever-you-want-with-apache.html">iki</a> yazı yazmıştım. Genelde ingilizce yazmaya çalışıyorum çünkü ingilizce yazılar daha fazla kişi tarafından okunuyor ve okuyucu yorumları daha fazla oluyor. <br />
<br />
JMeter yazılarının Türkçe cevirilerini yapmak için bilgisayarın başına oturduğumda küçük bir demonun yüzlerce satırdan çok daha etkili olabileceğini düşündüm ve aşağıdaki videoda izleyebileceğiniz demoyu kaydettim. <br />
<br />
İyi seyirler.<br />
<br />
<iframe src="http://player.vimeo.com/video/15733497" width="400" height="310" frameborder="0"></iframe><p><a href="http://vimeo.com/15733497">JMeter JDBC Request Demo</a> from <a href="http://vimeo.com/user3079943">ilkinulas</a> on <a href="http://vimeo.com">Vimeo</a>.</p><br />
NOT: Ekranı kaydetmek için <a href="http://recordmydesktop.sourceforge.net/about.php">RecordMyDesktop</a> kullandım.İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com0tag:blogger.com,1999:blog-2296791868291929959.post-86707428080424273912010-06-15T21:29:00.001+03:002010-06-15T21:29:30.461+03:00Java Garbage Collection : Unexpected Full GCI've been digging garbage collection logs these days. We have a production server which suffers long pauses of garbage collection. According to garbage collection log file, there are three different cases that force the JVM to do a <i>StopTheWorld</i> collection:<br />
<br />
1. <b>Full GC after a <i>promotion failure</i></b>: This is the evidence of not enough contiguous space in the old (tenured) generation. The simplest solution to this is increasing heap size. (I am glad it worked for us.)<br />
<br />
2. <b>Full GC after a <i>concurrent mode failure</i> </b> (in other words; full promotion guarantee failure) : CMS collector can not catch up with the object allocation speed of the application. If this is the case try setting <i>CMSInitiatingOccupancyFraction</i> to a lower value. CMS will start early but will finish its job on-time.<br />
<br />
3. The third one was very difficult for me to figure out. Here is what it looks like: Everything seems to work fine but suddenly <b>Full GC</b> kicks in and 37 seconds of break for application threads.<br />
<pre>216066.711: [GC 216066.713: [ParNew: 911554K->71428K(943744K), 0.0860545 secs] 2346321K->1508264K(4089472K), 0.0878449 secs] [Times: user=3.63 sys=0.32, real=0.09 secs]
216066.896: [Full GC 216066.897: [CMS: 1436836K->1003062K(3145728K), 37.8691646 secs] 1527124K->1003062K(4089472K), [CMS Perm : 86016K->31249K(86016K)], 37.8707796 secs] [Times: u
ser=37.64 sys=0.35, real=37.87 secs]
216106.398: [GC 216106.399: [ParNew: 838912K->46337K(943744K), 0.0555625 secs] 1841974K->1049399K(4089472K), 0.0573404 secs] [Times: user=1.33 sys=0.45, real=0.06 secs]
</pre>The above log says that in order to clean permanent generation a full collection occured and (86016 - 31249) kilobytes of space freed in permanent generation.<br />
<br />
What I've learned today is : <b> The garbage of the <i>permanent generation</i> is only collected by a Full GC.</b> If you see unexpected full collections try expanding permanent generation.İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com7tag:blogger.com,1999:blog-2296791868291929959.post-64123751794042336792010-06-07T21:35:00.002+03:002010-06-08T15:31:57.330+03:00Project Voldemort<p>Üniversitede bilgisayar mühendisliği okuyup da veritabanları dersini almayan yoktur. Veritabanı dersinde bize ilk öğretilen şey <i>"normalization"</i> oldu, dediler ki : </p><ul><li>Aman tablolarda tekrar eden bilgiler olmasın. (Primary Keys, unique constraints)<br />
<li>Sakın farklı yapıdaki bilgileri getirip aynı tabloya koyma. Herbir farklı yapı için ayrı bir tablo oluşturmaya özen göster.<br />
<li>Müşterinin adres bilgilerini Adres tablosuna, sipariş bilgilerini Siparis tablosuna, kişisel bigilerini Musteri tablosuna koy. Denizli'den sipariş veren 30 yaşından küçük müşterileri bulmak için Adres, Sirapis ve Musteri tablolarını çarp (join dediğimiz olay da sonuçta tabloların bir çarpımıdır), işte sana istediğin bilgi.<br />
</ul><p>Bu yöntem yıllarca bilişim sektörünü idare etti. Hala birçok alanda idare etmeye devam ediyor. Bugün Oracle olmasaydı ne yapardık :D Artan ihtiyaçları karşılamak için günümüzde uyguladığımız yöntem, eğer bütçe yeterli ise Oracle'ı çalıştıracak daha güçlü bir makina satın almak oluyor. İşlemci gücünü artırmak için her ihtiyaçta daha güçlü bir makinaya taşınmak gün gelir çözüm olmaktan çıkar. Bu tür durumlarda iş gücünü birden fazla sunucuya dağıtmak gereklidir. İlişkisel veritabanları dağıtık ortamlarda (distributed) beklenen performansı veremeyebilirler, çünkü network üzerinde farklı makinalarda olan sunucular arasında basit bir <i>SQL join</i>'i çalıştırmak çok güçtür. </p><p>Web 2.0 ile beraber internet kullanıcılarının içerik paylaşması internet sitelerinin işlemesi gereken bilgiyi inanılmaz derecede artırdı. Bunun en çarpıcı örneği <a href="http://www.twitter.com">Twitter</a>. Twitter aracılığı ile gönderilen <i>tweet</i> sayısı <a href="http://www.socialtimes.com/2010/02/twitter-users-sending-50-million-tweets-each-day/">günde 50 milyon'a</a> ulaşmış durumda. (Saniyede yaklaşık 600 tweet) Depolanan veri miktarı arttıkça bu verileri bölümleyip (partition) birden fazla yerde saklama ihtiyacı ortaya çıkıyor. Milyonlarca kayıt barındırıdan ve farklı disklerde olan tablolar ile yapılan join işlemleri uygulamaların okuma (read) performansını olumsuz etkilediği için <b>NoSQL</b> depolama sistemleri geliştirilmiştir. NoSQL sistemler, RDBMS'lere göre veriyi daha hızlı işlerler, okuma ve yazma performansları RMDBMS'lere göre çok daha iyidir. Bunun diğer bir sebebi de RDBMS'lerin <b>ACID</b> (atomicity, consistency, isolation, durability) kısıtlarını yerine getirmek zorunda olmaları ve bunun için ekstra işlemler yapmak zorunda kalmalarıdır. NoSQL depolama sistemleri RDBMS'leri ortadan kaldırmayacak fakat bazı uygun projelerde RDBMS'lerin yerini alacak gibi gözüküyor.</p><p>Bu yazıda <a href="http://www.linkedin.com">LinkedIn</a>'in kullandığı ve duyurduğu bir proje olan <a href="">Project Voldemort</a>'tan bahsedeceğim. LinkedIn, iş dünyasının facebook'u olarak biliniyor. <a href="http://press.linkedin.com/faq">SSS sayfasında</a> söyledikleri doğruysa 8 Nisan 2010 itibari ile 65 milyon üyesi varmış. 65 milyon üyenin birbirleri ile olan bağlantılarını, iş tecrüblerini, oluşturdukları profesyonel grupları hesaba katınca ortaya inanılmaz boyutlarda bir veri çıkıyor. LinkedIn mühendisleri (eminin onların bizlerden bir farkı yok :D ) bu kadar çok veriyi saklamak ve işlemek için Amazon'un <a href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html">Dynamo</a>'sundan ve <a href="http://memcached.org/">memcached</a>'den esinlenerek Voldemort'u yazmaya karar vermişler. Böyle güzel bir projenin ismi neden Voldemort olur onu da anlamış değilim. Bknz : <a href="http://tr.wikipedia.org/wiki/Lord_Voldemort">Lord Voldemort</a></p><p>Project Voldemort'un ne olduğunu kısaca şöyle açıklayabiliriz: <ul><li>Dağıtık (distributed) bir sistemdir. Veriler birden fazla lokasyona dağıtılmış saklanabilir.<br />
<li>Verilere erişim aynı bir Hashtable'a erişim gibi key'ler ile yapılır. SQL gibi bir sorgulama dili desteklemez.<br />
<li>Verileri diske yazar. Sistemin kapatılıp açılması verilerin kaybolmasına sebeb olmaz.<br />
</ul><p>Projesinin ana sayfasında yazan Voldemort'un ne olduğunu anlatan maddeler ise şöyle: <ol><li>Veriler otomatik olarak sunucu grubundaki diğer makinalara kopyalanır(replicated)<br />
<li>Veriler otomatik olarak bölümlenir (partitioned). İstediğin bir veriyi bulmak için bütün makinalar aranmaz, sadece tek bir makinaya bakarak veriler bulunabilir.<br />
<li>Sunucu grubu içindeki bir sunucunun kapanmasından uygulama etkilenmez.<br />
<li>Veri bütünlüğünü sağlamak için veriler versiyonlanır.<br />
<li>Her bir sunucu diğer sunuculardan bağımsızdır. <i>Single Point Of Failure</i> (bunun türkçe karşılığını bulamadım. Kendim birşey uydurayım dedim beceremedim) <b>SPOF</b> yoktur.<br />
<li>Basit bir arayüzü vardır. SQL desteklemez. Join'leri kod içinde sizin yapmanız gerekir.<br />
<pre>value = store.get(key)
store.put(key, value)
store.delete(key)
</pre><li> Verileri diskte depolarken ön belliğinden, disk okuması yapmadan, verilere erişim sağlar. Ayrıca bir <i>caching</i> katmanı kullanmaya gerek kalmaz.<br />
<li> Bu çok hoşuma gitti : Verileri depolama katmanı taklit edilebilir(<i>mockable</i>). Unit testler sadece hafızada çalışan bir Voldemort instance ile yapılabilir.<br />
</ol></p>Bu projeyi deneme fırsatım olmadı. En kısa zamanda kurup örnek bir projede kullanıp, izlenimlerimi bu sayfalarda paylaşacağım. Buraya kadar okuduklarınız ilginizi çektiyse <a href="http://project-voldemort.com/">projenin sayfasına</a> gidip daha detaylı bilgiye erişebilirsiniz.İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com0tag:blogger.com,1999:blog-2296791868291929959.post-78336690596639030552010-03-21T22:59:00.006+02:002010-03-22T16:12:18.905+02:00Load Test Whatever You Want With Apache JMeterThis is the second post about load testing with Apache JMeter, read the first post here: <a href="http://ilkinbalkanay.blogspot.com/2010/03/load-testing-relational-databases-with.html">A step by step tutorial about load testing relational databases.</a><br />
<br />
JMeter has lots of <a href="http://jakarta.apache.org/jmeter/usermanual/component_reference.html#samplers"><b>Samplers</b></a>. If you need a sampler that is not provided by JMeter you can write your custom sampler. (custom samplers are called <i>"Java Request"</i> in JMeter terminology) <br />
This post will show you, step by step, how to write a JMeter Java Request.<br />
<h4 class="underline">Step 1: Preparing the development environment</h4>Add these two jar files to the java classpath.<br />
<ol><li>$JMETER_HOME/lib/ext/ApacheJMeter_core.jar <br />
</li>
<li>$JMETER_HOME/lib/ext/ApacheJMeter_java.jar <br />
</li>
</ol>(If you are using Eclipse, add these files as external jar files to the java build path.) <br />
<h4 class="underline">Step 2: Extending AbstractJavaSamplerClient</h4>After setting up the classpath, create a custom sampler by extending AbstractJavaSamplerClient and override the following methods. <br />
<pre class="prettyprint">public Arguments getDefaultParameters() {...}
public void setupTest(JavaSamplerContext context) {...}
public void teardownTest(JavaSamplerContext context) {...}
public SampleResult runTest(JavaSamplerContext context) {...}
</pre><b>getDefaultParameters</b> <br />
Implement <i>getDefaultParameters</i> if you want initial values for test paramters. JMeter will display the parameters in its Java Request configuration GUI. (See the contents of the red rectangle in the picture below.) Here's an example implementation:<br />
<pre class="prettyprint">public Arguments getDefaultParameters() {
Arguments defaultParameters = new Arguments();
defaultParameters.addArgument("memcached_servers", "localhost:11211");
defaultParameters.addArgument("username", "testuser");
defaultParameters.addArgument("password", "testpasswd");
return defaultParameters;
}
</pre><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6zp2IKwCAWB8DzLDyLt8G2w_ulexoNQmLtIffWPzfQpZ3jFtEe-Mp9aUJsy37soq1dpIUXaJ5NipipwASYYf67ndD3_Vl_SR27zoFFwUBCOg3tAxvPvH4kUGQcHBsTO2xL0cEJC67m_Q/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6zp2IKwCAWB8DzLDyLt8G2w_ulexoNQmLtIffWPzfQpZ3jFtEe-Mp9aUJsy37soq1dpIUXaJ5NipipwASYYf67ndD3_Vl_SR27zoFFwUBCOg3tAxvPvH4kUGQcHBsTO2xL0cEJC67m_Q/"/></a></div><b>setupTest</b><br />
This is where you read test parameters and initialize your test client. JMeter calls this method only once for each test thread.<br />
<br />
<b>teardownTest </b><br />
Clean up the mess.<br />
<br />
<b>runTest</b><br />
Write your test logic in this method. JMeter will call <i>runTest</i> method for every execution of test threads. Here is a typical runTest implementation:<br />
<pre class="prettyprint">@Override
public SampleResult runTest(JavaSamplerContext context) {
SampleResult result = new SampleResult();
boolean success = true;
result.sampleStart();
//
// Write your test code here.
//
result.sampleEnd();
result.setSuccessful(success);
return result;
}
</pre>The time elapsed betweed <i>result.sampleStart()</i> and <i>result.sampleEnd()</i> is used to calculate average response time of the application under test.<br />
<h4 class="underline">Step 3: Deploy your custom sampler</h4>When you are done create a jar file (containing your custom sampler) in the $JMETER_HOME/lib/ext/ directory. JMeter will display your java request in the <i>java request</i> configuration page. <br />
<br />
You can see the results of your test by adding listeners to your test plan. <a href="http://ilkinbalkanay.blogspot.com/2010/03/load-testing-relational-databases-with.html">"A step by step tutorial about load testing relational databases" </a> post shows how to add listeners to test plans.İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com5tag:blogger.com,1999:blog-2296791868291929959.post-44681792300942324992010-03-14T10:52:00.008+02:002010-03-21T23:03:51.920+02:00Load Testing Relational Databases With JMeterApache JMeter is a performance testing tool which is entirely written in Java. Any application that works on request/response model can be load tested with JMeter. A relational database is not an exception: receives sql queries, executes them and returns the results of the execution.<br />
<br />
I'am going to show you how easy it is to set up test scenarios with the graphical user interface of JMeter. But before diving into details let's give a shot to basic terms:<br />
<br />
<b>Test plan</b> : describes a test scenario<br />
<b>Thread Group</b> : represents users running your test scenario. <br />
<b>Samples</b> : a way of sending request and waiting response. HTTP request, JDBC request, SOAP/XML-RPC request and java object request are examples of samples.<br />
<b>Logic Controller</b> : used to customize the logic that JMeter uses to decide when to send requests<br />
<b>Listeners</b> : receives test results and displays reports. <br />
<b>Timers</b> : cause JMeter to delay a certain amount of time before each request that a thread makes.<br />
<b>Assertions</b> : test that application returns expected responses<br />
<pre><b>Note</b> : This post is not meant to be an alternative documentation for JMeter. JMeter has a great documentation. You can find the details in its User's Manual (http://jakarta.apache.org/jmeter/usermanual/index.html
</pre>Suppose we have an application that logs every transaction into a relational database. We are going to create a test plan - step by step - in order to answer the questions below.<br />
<ul><li> How many transaction records can be inserted to transaction table in a second? </li>
<li> How much time does it take to insert a single transaction record to transaction table?</li>
<li> How does number of concurrent threads (users) affects the inserts/secs and average response times?</li>
<li> How does number of records affects the insert/secs and average response times?</li>
</ul><h4 class="underline">Step 1</h4>Copy mysql jdbc driver into the lib folder of your JMeter installation. JMeter needs a suitable jdbc driver in the classpath to connect to the database.<br />
<pre>Example ~/tools/jakarta-jmeter-2.3.4/lib/mysql-connector-java-5.0.5.jar</pre>We are going to store orders of the customers and the result of the order in the transactions table.<br />
<pre>CREATE TABLE transactions (
id INT NOT NULL AUTO_INCREMENT,
customer_id INT NOT NULL,
order_id INT NOT NULL,
result INT,
PRIMARY KEY (id)
);
</pre><h4 class="underline">Step 2</h4>Create a test plan and name it <i>"Test MYSQL DB".</i> Then add the following jmeter components to the test plan.<br />
<ol><li><b>Thread group</b> named 'Database Users'</li>
<li><b>Sampler</b> of type JDBC Request</li>
<li>Config element of type <b>JDBC Connection Configuration</b></li>
<li>Three config elements of type <b>Random Variable</b></li>
<li><b>Listener</b> of type Summary Report</li>
</ol>After adding these components JMeter test plan looks like the following picture.<br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAayEIvvHCAKeH8rfzbNWMtzOB5WO0woo7a6cwPoVROYpjLIaeOrFb8qwLQBWBTQM5PRQOs1vH2i71gI2W9yJyWznZf0H_pfSJ5vrlpBJ3K2PlRFhpE77oDIzjqV42elAkS7IfCUJjXbU/"/><br />
<h4 class="underline">Step 3</h4>Configure database users. The thread group component simulates the database users. <br />
1. Number of users (threads)<br />
2. How many times a user will send request (loop count). If you select <i>'Forever'</i>, threads will run in a <i>while(true) {...}</i> loop until you decide to stop the test.<br />
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPA5fVatt4f0K4rDWTJPtDydAcYYOfmbWNtpuK3i25jw3Gwz07pwMBo1-PvYK6IK5eZa6GrBLpOlRBMWXDbeI6u4BwGoPnSkuyWRJ-H18k6i7UmERFaPAnG8i5KVDScncGv0snlXCuQOM/" border="0"/><br />
<h4 class="underline">Step 4</h4>Configure JDBC connection pool. JDBC Connection Configuration component is used to create jdbc connection pools. Database url, jdbc driver, database user and password are configured with this component. Connection pools are identified by <i>"Variable Name"</i>. JDBC Samplers (requests) use this variable name (connection pool name) to pop and push connections. I named the test connection pool as <i>"my db pool"</i><br />
<img src="http://lh4.ggpht.com/_xwxnlWIalMQ/S5yfZ8w4v0I/AAAAAAAACHc/1Z16xcc7ofc/JDBCConnectionConf.png" border="0"/><br />
<h4 class="underline">Step 5</h4>Define random variables that will be used in INSERT statements. In this test I am using three random variables : <i>user id, order id and result</i>. Following picture shows the a random number configuration for user id. Random number generator will give us a random integers between 1 and 1000000. We can refer to generated random number with the name <i>user_id</i>.<br />
<img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqXP-5GO-03IoOUt3X1-wDBAl3P7S9epBKB9gKXp1Zq8nnNUQnX7TCG5KZ1WvFg6A2-L37HBRGLPE9snxnLOTeeROVopfcoNCRpggXZs9fAe_roYBtzZth6NiBKkmo1pJoEgi_LPuemxA/" border="0"/><br />
<h4 class="underline">Step 6</h4>JDBC Request component is the place where we tell our users (threads) what to do. The name of the pool that was configured in <b>Step 3</b> <i>"my db pool"</i> will be used as the <i>"variable name bound to pool"</i>. All threads will execute prepared statements. User id, order id and result will be generated by the random number configurator (described in Step 5)<br />
<img src="http://lh5.ggpht.com/_xwxnlWIalMQ/S5yfZs-qufI/AAAAAAAACHU/AtoaU74ko5c/jdbc_request.png" border="0"/><br />
<h4 class="underline">Step 7</h4>Now we have our threads configured to insert transaction records to the <i>transactions</i> table. In this last step we will add a Listener of type <i>Summary Report</i> in order to view test results.<br />
<img src="http://lh4.ggpht.com/_xwxnlWIalMQ/S5yiwOe75bI/AAAAAAAACHk/tUpMspl_Xrc/summary_report.png" border="0"/><br />
The results tells us that 10 concurrent users (threads) working in an infinite loop can insert nearly 3300 rows in our transactions table. And the average time spent for inserting a row is 2 ms. You can also choose <i>"Graph Results"</i> listener to view visual representation of the results. <br />
I created and run a simple DB test plan. I hope you'll find this post helpful. Keep this motto in mind <pre>if you can’t measure it, you can neither manage it nor improve it</pre>Happy testing...İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com21tag:blogger.com,1999:blog-2296791868291929959.post-13458342975613611292010-02-01T20:22:00.004+02:002010-02-02T09:28:58.842+02:002010 Winter Olympics - Bahçeköy/İSTANBULHi everybody, I've been busy training hard for the winter olympics. You can watch me practicing <a href="http://en.wikipedia.org/wiki/Bobsleigh">bobsleigh</a> with my two assistants Johny and Karsaf :)<br /><br /><br /><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/qju7m51iAns&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/qju7m51iAns&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><br /><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/4x-3H3uYtiA&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/4x-3H3uYtiA&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com1tag:blogger.com,1999:blog-2296791868291929959.post-75221159439640677922009-11-30T13:30:00.005+02:002011-06-07T09:54:15.718+03:00Camping at YediGöller National ParkCampground near the lake. Autumn leaves every where.<br /><img src="http://lh5.ggpht.com/_xwxnlWIalMQ/SxO_MrazwNI/AAAAAAAABB4/6Bi1OjwF_k4/s400/DSC03293.JPG"/><br /><br />Delicious spring water.<br /><img src="http://lh4.ggpht.com/_xwxnlWIalMQ/SxO_C3otqOI/AAAAAAAABB0/xvB6ikiXLpg/s400/DSC03290.JPG"/><br />Ladies were responsible for dinner. Gentlemen were responsible for lighting the fire and keeping it burning all night long. The night was freezing.<br /><img src="http://lh5.ggpht.com/_xwxnlWIalMQ/SxPA2zhiBtI/AAAAAAAABCg/YMylDKZA_Wk/s400/DSC03269.JPG"/><br /><br />Warming under the sun. <br /><img src="http://lh3.ggpht.com/_xwxnlWIalMQ/SxPBCA83FPI/AAAAAAAABCw/gLRsddlt0Vg/s400/DSC03294.JPG"/><br /><br />Breakfast with my cousin Ozan. (I am the man in black on the right side)<br /><img src="http://lh5.ggpht.com/_xwxnlWIalMQ/SxPBIpvLaZI/AAAAAAAABC0/CFOhnda2msw/s400/DSC03295.JPG"/><br /><br />Posing on bridge, with my wife Nurten.<br /><img src="http://lh5.ggpht.com/_xwxnlWIalMQ/SxPBQt6zqUI/AAAAAAAABC4/6QBa5v34nAU/s400/DSC03298.JPG" /><br /><br /><br />Upside down...<br /><table><br /><tr><br /><td><img src="http://lh3.ggpht.com/_xwxnlWIalMQ/SxPCKx4okcI/AAAAAAAABDg/5jzKkn5C-aI/s400/DSC03311.JPG"/></td><br /><td><img src="http://lh4.ggpht.com/_xwxnlWIalMQ/SxPCZKrsQqI/AAAAAAAABDo/53u0PzB3l54/s400/DSC03313.JPG"/></td><br /></tr><br /></table><br />Leaving everything behind...<br /><img src="http://lh5.ggpht.com/_xwxnlWIalMQ/SxPD9PMJwkI/AAAAAAAABEs/nn6KKysc6xE/s400/DSC03339.JPG"/><br />Tranquility..<br /><img src="http://lh5.ggpht.com/_xwxnlWIalMQ/SxPFeHiRphI/AAAAAAAABF4/1kUEkdLF29o/s400/DSC03380.JPG"/><br />Saving Nurten :)<br /><img src="http://lh3.ggpht.com/_xwxnlWIalMQ/SxPEpV0KJsI/AAAAAAAABFQ/8vDwZQ9pYiw/s400/DSC03365.JPG"/><br />View of the lakes from the mountains of Bolu.<br /><img src="http://lh4.ggpht.com/_xwxnlWIalMQ/SxPFig6yVXI/AAAAAAAABF8/6kSYq7hxfk4/s400/DSC03382.JPG"/><br />And special thanks to Jazz, for keeping us comfortable while passing over mountains...<br /><img src="http://lh6.ggpht.com/_xwxnlWIalMQ/SxPF3LJKKcI/AAAAAAAABGM/sGBjpS7W_2M/s400/DSC03389.JPG" /><br />There are more (high resolution) photos in my public <a href="http://picasaweb.google.com/ilkinulas/YediGollerKasM200902">picasa library.</a>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com6tag:blogger.com,1999:blog-2296791868291929959.post-4420026638807730932009-09-12T17:06:00.016+03:002009-09-14T22:52:20.763+03:00Python API for Flickr Services - Part IThese days I am working on a facebook application that mashes up servises from <a href="http://www.facebook.com">Facebook</a> and <a href="http://www.flickr.com">Flickr</a>. The application is hosted by <a href="http://appengine.google.com">Google Appengine</a> and I am developing on <a href="http://www.djangoproject.com">Django</a> web application framework. <br /><br />Flickr has an easy to use API which is called <a href="http://www.flickr.com/services/api/">Flickr Services</a>. Here are some interesting things you can do with the Flickr Services:<br /><ul><br /><li>You can upload photos from anywhere (web application, desktop application or mobile application)<br /><li>You can search for images. Flickr Services lets you search images by<br /> - tags<br /> - geo location<br /> - photo taken time / photo upload time<br /> - and <a href="http://www.flickr.com/services/api/flickr.photos.search.html">more...</a><br /><li>execute methods that require authentication<br /> - create, edit, remove tags<br /> - create, edit, remove photo sets<br /> - replace, remove photos<br /></ul> <br />There are two Python APIs listed in the Flickr Services page:<br /><ol><br /> <li><a href="http://www.stuvel.eu/projects/flickrapi">http://www.stuvel.eu/projects/flickrapi</a><br /> <li><a href="http://code.google.com/p/flickrpy/">http://code.google.com/p/flickrpy/</a><br /></ol><br />I have implemented Flickr services in Python. Don't think this as <i>"reinventing the wheel"</i> because it was a coding practice for me. Plus, i have my own, customized, shortcut methods ;)<br /><br />You can download the library from <a href="http://code.google.com/p/ilkinulassandbox/source/browse/#svn/trunk/python/flickr">http://code.google.com/p/ilkinulassandbox/</a>. There are also some other javascript and python code snippets there.<br /><br />Here is a basic usage of the API:<br /><pre class="prettyprint"><br />>>> import flickr<br />>>> api = flickr.FlickrAPI('API_KEY','SECRET_KEY')<br />>>> api.search({'tags':'python', 'per_page':'3'})<br />{'photos': {'page': 1,<br /> 'pages': 8326,<br /> 'perpage': 3,<br /> 'photo': [{'farm': 4,<br /> 'id': '3911963732',<br /> 'isfamily': 0,<br /> 'isfriend': 0,<br /> 'ispublic': 1,<br /> 'owner': '30041312@N03',<br /> 'secret': '44aae23e98',<br /> 'server': '3090',<br /> 'title': 'Centralian Carpet Python (Apophis)'},<br /> {'farm': 3,<br /> 'id': '3911184515',<br /> 'isfamily': 0,<br /> 'isfriend': 0,<br /> 'ispublic': 1,<br /> 'owner': '30041312@N03',<br /> 'secret': '0aae3c8127',<br /> 'server': '2513',<br /> 'title': 'Centralian Carpet Python (Apophis)'},<br /> {'farm': 3,<br /> 'id': '3911127131',<br /> 'isfamily': 0,<br /> 'isfriend': 0,<br /> 'ispublic': 1,<br /> 'owner': '31355375@N02',<br /> 'secret': '2921fea364',<br /> 'server': '2564',<br /> 'title': 'Sendra Python Nails 122 01'}],<br /> 'total': '24977'},<br /> 'stat': 'ok'}<br /></pre><br />Methods of the API returns a dictionary instance. Caller must handle the returned result. <br /><pre class="prettyprint"><br />>>> result = api.search({'tags':'python', 'per_page':'3'})<br />>>> result['photos']['photo'][0]['id']<br />'3911751961'<br /></pre><br /><br />Flickr photo url construction is described <a href="http://www.flickr.com/services/api/misc.urls.html">here</a> in details. You can easily get the url of a returned photo search result by using <i>build_photo_url</i>. Default image size is 'm' which means 'normal'<br /><pre class="prettyprint"><br />>>> api.build_photo_url(result['photos']['photo'][0])<br />'http://farm4.static.flickr.com/3462/3911751961_43d409cf7c_m.jpg'<br />>>> api.build_photo_url(result['photos']['photo'][1], size='s')<br />'http://farm3.static.flickr.com/2613/3911666353_ac0cc98871_s.jpg'<br /></pre><br /><br />Lets search for pictures tagged 'fun' around point <a href="http://maps.google.com/?ie=UTF8&ll=41.034046,28.980217&spn=0.187757,0.465889&z=12"><i>(lat=41.070293, lon=28.24894)</i></a><br /><pre class="prettyprint"><br />>>> pictures = api.search({'lat':'41.034046', 'lon':'28.980217', 'radius':'10', 'radius_units':'km','tags':'fun'})<br />>>> api.build_photo_url(fun_pictures['photos']['photo'][20])<br />'http://farm1.static.flickr.com/116/293251976_ce5337908d_m.jpg'<br /></pre><br /><br /><br />The next post of "Python API for Flickr Services" will show how you can call methods that require authentication. For the curious readers the api is ready <a href="http://code.google.com/p/ilkinulassandbox/source/browse/#svn/trunk/python/flickr">http://code.google.com/p/ilkinulassandbox/</a>. But it lacks documentation :(<br /><br /><br />NOTE : I use this python API in my facebook application "<a href="http://apps.facebook.com/turkiye_flickr">Türkiye'yi ne kadar iyi tanıyorsun?</a>". Application is a simple guessing game. You see a geo tagged picture from flickr and you answer which city this picture belongs.<br /><br />UPDATE : This library returns native Python datatypes rather than XML trees or unparsed JSON, which the other Flickr APIs have a tendency to do. (Thanks <a href="http://news.ycombinator.com/user?id=martian">martian</a>)İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com5tag:blogger.com,1999:blog-2296791868291929959.post-15846465677787636662009-08-03T12:49:00.009+03:002009-08-03T18:23:20.748+03:00Div Roller : jQuery plugin for rotating html div elementsIn this post I want to introduce a jQuery plugin that i have written for one of my projects.<br /><i>jquery.divroller</i> plugin is written to rotate messages displayed in the home page of <a href="http://www.bahele.com/">www.bahele.com</a>. <b>bahele</b> is a <a href="http://developers.facebook.com/connect.php">facebook connect</a> site where users can login with their facebook accounts and write messages about what they like or dislike. (<b>Bahele</b> is only available in Turkish for now.)<br /><br />For the ones who have not heard of this library here's the motto from <a href="http://www.jquery.com">jquery.com</a><br /><pre><br />"jQuery is a fast and concise JavaScript Library that simplifies HTML document <br />traversing, event handling, animating, and Ajax interactions for rapid web <br />development. jQuery is designed to change the way that you write JavaScript."<br /></pre><br /><a href="http://www.google.com/search?q=jquery">jQuery</a> is a widely used javascript library. There are tons of javascript libraries in the wild, each has its own clever implementations. jQuery differs from other frameworks by its chaining property. Most of the methods in the library returns a jQuery object. You can call a jQuery function on a return value of another jQuery function. Here is what i mean:<br /><pre class="prettyprint"><br /> $("a[href$='.pdf']")<br /> .addClass("external_link")<br /> .append("<img src="http://www.blogger.com/images/pdf.png" />")<br /> .click(pdfLinkClicked);<br /></pre><br />One line of javascript is splitted into four lines for better readability.<br /><ol><br /><li>The first line selects all the links in the page whose <i>'href'</i> attribute ends with <i>'.pdf'</i><br /></li><li>The second line adds <i>'external_link'</i> css class to selected link elements.<br /></li><li>The third line places an image after the link element in order to specify that is a link to download a pdf file.<br /></li><li>The last line binds <i>'pdfLinkClicked'</i> function to the click event of link element.<br /></li></ol><br />Enough for a short introduction, now lets look how we can take advantage of <b>jquery.divroller</b>. Below is a simple usage scenario. Plugin is applied to the html div element whose id attrubute is equal to "divroller_container". There are two configuration parameters:<br /><ul><br /> <li><b>pause</b> : Sleep duration between two rotations. This parameter determines the speed of the rolling divs.<br /> </li><li><b>visible</b> : Number of visible html elements inside the container. Plugin shows only "visible" number of elements, the others are hidden.<br /></li></ul><br /><pre class="prettyprint"><br /><div id="divroller_container"><br /><div class="box_dark box_size" id="item1"><br /><a href="http://ilkinbalkanay.blogspot.com/2007/11/my-favorite-shell-commands.html"><br />My favorite shell commands</a><br /></div><br /><div class="box_light box_size" id="item2"><br /><a href="http://ilkinbalkanay.blogspot.com/2007/10/volatile-variables-in-java.html"><br />Volatile Variables In JAVA</a><br /></div><br /><div class="box_dark box_size" id="item3"><br /><a href="http://ilkinbalkanay.blogspot.com/2007/09/power-off-shell.html"><br />The power off shell</a><br /></div><br /><div class="box_light box_size" id="item4"><br /><a href="http://ilkinbalkanay.blogspot.com/2007/09/seach-java-class-files-in-jars.html"><br /> Search java class files in jars. </a><br /></div><br /><div class="box_dark box_size" id="item5"><br /><a href="http://ilkinbalkanay.blogspot.com/2008/01/readwritelock-example-in-java.html"><br />ReadWriteLock example in Java</a><br /></div><br /><div class="box_light box_size" id="item6"><br /><a href="http://ilkinbalkanay.blogspot.com/2008/01/how-to-change-gnome-desktop-wallpaper.html"><br />How to change GNOME desktop wallpaper programmatically</a><br /></div><br /></div><br /><br /><script type="text/javascript"><br />$("#divroller_container").divroller({pause:2000, visible:3});<br /></script><br /></pre><br /><br />You can see the plugin in action : <a href="http://ilkinulas.googlepages.com/demo.html">Live demonstration</a><br />You can also <a href="http://ilkinulassandbox.googlecode.com/files/jquery.divroller.js">download</a> the javascript source.<br /><br /><i>Note : There are countless jQuery plugins available on the internet. Before writing your own plugin you should check <a href="http://plugins.jquery.com/"> http://plugins.jquery.com/</a>, you might be reinventing the wheel.</i>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com8tag:blogger.com,1999:blog-2296791868291929959.post-52644857483489865862009-07-28T23:42:00.008+03:002009-08-02T21:05:40.773+03:00Oracle'ın Linux stratejisi Ubuntu mu olmalı?<a href="http://news.cnet.com/8301-13505_3-10272966-16.html">Bu adresteki</a> haberin Türkçe çevirisini paylaşmak istiyorum. Elimden geldiğince cevirmeye çalıştım. Keyifli okumalar:<br /><br /><hr><br />Oracle geçtiğimiz yıllarda yaptığı satın almalarla, pazarda önde gelen teknolojileri portföyünde topladı. Fakat tüm bu satın almalara rağmen, hala eksik kalan bir şey var: işletim sistemi. Her ne kadar, yıllardır Red Hat'ı satın alınacaklar listesinde tutsa da, işletim sistemi olarak Ubuntu'yu seçmek Oracle için daha iyi olabilir.<br /><br />Evet, Oracle Sun'u satın alarak Solaris işletim sistemini de elde etmiş oldu, fakat <a href="http://news.cnet.com/8301-13505_3-10272310-16.html">Red Hat yönetim kurulu başkanı Jim Whitehurst'un Çarşamba günü, finansal raporları açıklarken belirttiği gibi</a>, Solaris'ten Linux'e olan kullanıcı göçü hızla devam ediyor ve Sun'ın Linux'a olan eğilime karşı geliştirdiği OpenSolaris bu göçü durdurmak için etkisiz kaldı.<br /><br />Red Hat'ın en büyük 25 anlaşmasını, <a href="http://news.cnet.com/8301-13505_3-10108675-16.html">Oracle'a kaptırmadan yenilemesi ile birlikte</a>, bir Red Hat Enterprice (Kurumsal) Linux (RHEL) klonu olan Oracle Enterprise Linux (OEL), Red Hat'ın egemenliğine son vermek yolunda büyük darbe aldı. RHEL'nin piyasadaki egemenliği Oracle'ın herşeyi içinde olan bir kurumsal yazılım paketine sahip olma hedefinin önünde büyük bir engel olarak durmakta. Red Hat'in elinde böyle bir kurumsal yazılım paketinin olması Oracle için gerçek bir tehdit olarak görülüyor.<br /><br />Oracle satış ekiplerinin Oracle uygulamalarını ve veritabanlarını RHEL platformu üzerinde OEL'e göre daha kolay satması, OEL'in zamanla yok olacağına bir işaret gibi gözüküyor.<br /><br /><a href="http://www.theregister.co.uk/2009/06/25/redhat_fq12010_numbers/">The Register'in da belirttiği gibi</a> Oracle, Red Hat'i alabilir fakat sabit ve yüksek gelirleriyle Red Hat, Oracle için pahalı bir satın alma hedefi olarak görülüyor. Bununla birlikte, Red Hat, Redwood Shores'daki (California'da Oracle'in merkezinin bulunduğu yer) ortağı ve rakibi olan Oracle'ın kollarına atlamak için can atmıyor.<br /><br />Tüm bu bilgiler ışığında, Red Hat ile devam etmek yerine Canonical, ticari Ubuntu sponsoru, ile güçlü bir ortaklık Oracle için doğru bir Linux stratejisi olacaktır.<br /><br />Açık şekilde görülüyor ki, Masaüstünde egemenliği elinde tutan ve ticari sunucularda da güçlü bir yeri olduğunu iddia eden Ubuntu, <a href="http://www.starryhope.com/linux/ubuntu/2007/ubuntu-just-how-popular-is-it/">Linux dağıtımları içinde en çok tercih edilen dağıtım.</a> OEL, Oracle satış ekibi için pazarlaması zor olan bir ürün olduğu için Ubuntu'yu Oracle teknolojilerini tamamlayan bir ürün olarak pazarlamak daha kolay olacaktır.<br /><br />OEL'i satmak için istek var fakat derman yok.<br /><br />Sahibi olduğum, açık kaynak kodlu içerik yönetimi uygulamarı satan şirketin, Alfresco, verilerine bakılacak olursa Ubuntu Kurumsal ürünlerdeki yüzde 37'lik payıyla, yüzde 28 pay alan RHEL ve Fedorayı geride bırakmış durumda.<br /><br />Bir yıl önce <a href="http://news.cnet.com/8301-13505_3-9868873-16.html">Ubuntu ciddi bir ilerleme içindeydi</a>, bugün ise gerçek kurumsal kurulumlarda tercih edilen dağıtım Ubuntu olmuş gözüküyor.<br /><br />Özetle, Ubuntu arkasına camianın desteğini almış durumda. Tek eksiğinin bir yazılım devinin desteği olduğunu düşünüyorum. Hala aklına gelmemesine rağmen, Oracle, Ubuntu'yu kurumsal bir marka yapabilecek güçte.<br /><br />Oracle'ın yıllar önce Red Hat'a elini uzatması tesadüfi değildi. Oracle'ın Red Hat Kurumsal Linux dağıtımına (RHEL) verdiği destek olmasaydı, bugün RHEL'in olduğu yerde Novell'in SUSE'sini ya da diğer Linux dağıtımlarını görebilirdik.<br /><br />Oracle'ın elinde Ubuntu'yu başlıca tercih edilen kurumsal sunucu yapma gücü var. Fakat akıllardaki soru, Oracle bunu istiyor mu?<br /><br />"The 451 Group" ile çalışan analist Matt Aslett'in bana dediği gibi, "Oracle'ın Linux stratejisi mevcut müşterilerine hizmet vermek." Ve Oracle RHEL kullanan Oracle müşterileri Ubuntu kullanan müşterilerden fazla. Sean Michael Kerner'in belittiği gibi Oracle ürünlerini Ubuntu üzerinde çalıştırmadan önce hepsinin Ubuntu üzerinde problemsiz çalıştığını belgelendirmek zorunda. Bu yüzden RHEL (ve onun klonu OEL) Oracle için daha güvenli bir seçim gibi gözüküyor.<br /><br />Pazar RHEL (parasını veren kurumsal müşteriler) ve Ubuntu'dan (para ödemeyen Linux camiası) yanayken, Oracle'ın OEL için neden bir sürü kaynak ayırdığını anlamak zor. Ya git OEL yerine RHEL üzerine yoğunlaş ya da Ubuntu'ya bir fırsat ver.<br /><br />Oracle Ubuntu'yu seçerek hem bir işletim sistemi sahibine sahip olur hem de Ubuntu'nun populerliğini kazanç kapısına çevirebilir.<br /><br />Siz ne düşünüyorsunuz? Ubuntu, Oracle için iyi bir hamle olabilir mi? Yoksa Oracle'ın sonradan aklına gelen Linux pazarında, RedHat ile devam etmek Oracle için daha mı iyi olur?<br /><hr>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com4tag:blogger.com,1999:blog-2296791868291929959.post-25646430009685378972009-07-27T20:54:00.005+03:002009-08-02T21:04:51.757+03:00Java LineNumberReaderBu yazıyı ingilizce yazarım diye düşünüyordum fakat klavyenin başına geçince iş değişti. Bu sefer de işin kolayına kaçıyorum. Bu günlüğe ilk başladığım zamanlarda yazılarım ingilizceydi. Bakınız : <a href="http://ilkinbalkanay.blogspot.com/2007/10/volatile-variables-in-java.html">Volatile Variables In JAVA</a>. İngilizce yazmanın şöyle bir avantajı oluyor, yazınızı <a href="http://www.dzone.com">dzone</a>, <a href="http://www.digg.com">digg</a> gibi sosyal link paylaşım sitelerine gönderdiğiniz anda tahmin edemeyeceğiniz kadar çok ziyaretçi geliyor sitenize. dzone, reddit, digg benzeri türkçe link paylaşım sitelerini pek bilmiyorum ama araştırıp yazıları oraya eklesem iyi olacak galiba ;) Sonuçta bu yazıları benim gibi yazılım meraklıları okusun diye yazıyorum. Fikirlerimi ve yazılarımı ne kadar çok kişi okursa o kadar çok geribesleme alabilirim diye düşünüyorum. Google'ın satın aldığı <a href="http://www.feedburner.com">feedburner</a> servisinin söylediğine göre ben dahil bu günlüğü takip eden 16 kişi var :D<br /><br />İstanbul'da 3 büyük GSM operatöründen birisinde yazılım geliştirme departmanında çalışıyorum. (Hangi operatorde çalıştığımı merak edenler için ipucu: "Fark var!!!"). İçinde milyonlarca satır olan bir text dosyasını işleyecek bir java uygulaması yazmam gerekti. Uygulamanın yapacağı iş çok basit, satır satır tüm dosyayı okuyup her satır için belirli işleri çalıştıracak. <br /><br />İşlenecek dosya içinde çok fazla satır olduğu için uygulamanın çalışma süresi de yarım saatten fazla oluyor. Uygulamayı başlattıktan sonra işin yüzde kaçının tamamlandığını ekrana yazdırmak için başlangıçta dosya içinde kaç satır olduğunu bilmek yeterli. Bunun için iki yöntem var. <br /><ul><br /> <li>Birinci yöntem dosyayı açıp satır satır taramak ve her satırda satır sayısı sayacını bir artırmak.<br /> <li>İkinci yöntem <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/io/LineNumberReader.html">java.util.LineNumberReader</a> sınıfını kullanmak.<br /></ul><br />Aşağıdaki kod parçası iki yöntemin çalışma sürelerini karşılaştırmak için yazıldı. 10 milyon satırlı bir deneme dosyası ile 100 iterasyonun ortalamasını alarak elde ettiğim sonuç:<br /><pre><br />LineNumberReader average : 388 miliseconds.<br />FileScanner average : 839 miliseconds.<br /></pre><br />Birinci yöntem ile 10 milyon satırlı bir dosyanın satır sayısını bulmak 839 milisaniye sürerken ikinci yöntem ile 388 milisaniye sürmüş.<br /><br /><pre class="prettyprint"><br />package util;<br /><br />import java.io.BufferedReader;<br />import java.io.File;<br />import java.io.FileReader;<br />import java.io.IOException;<br />import java.io.LineNumberReader;<br /><br /><br />public class LineNumberReaderTest {<br /><br /> public static void main(String[] args) throws IOException {<br /> LineNumberReaderTest test = new LineNumberReaderTest();<br /> String filePath = args[0]; <br /> File textFile = new File(filePath);<br /> int numberOfIterations = 100;<br /> int result_1 = test.testByLineNumberReader(numberOfIterations, textFile);<br /> int result_2 = test.testByFileScan(numberOfIterations, textFile);<br /> assert result_1 == result_2;<br /> }<br /> <br /> <br /> private int testByLineNumberReader(int numberOfIterations, File textFile) throws IOException {<br /> int numberOfLines = 0;<br /> long start = System.currentTimeMillis();<br /> for (int i = 0; i < numberOfIterations; i++) {<br /> numberOfLines = this.numberOfLinesByLineNumberReader(textFile);<br /> }<br /> long diff = System.currentTimeMillis() - start; <br /> System.out.println("LineNumberReader average : " + diff/numberOfIterations + " miliseconds.");<br /> return numberOfLines;<br /> }<br /><br /><br /> public int testByFileScan(int numberOfIterations, File textFile) throws IOException {<br /> int numberOfLines = 0;<br /> long start = System.currentTimeMillis();<br /> for (int i = 0; i < numberOfIterations; i++) {<br /> numberOfLines = this.numberOfLinesByScanningFile(textFile);<br /> }<br /> long diff = System.currentTimeMillis() - start; <br /> System.out.println("FileScanner average : " + diff/numberOfIterations + " miliseconds.");<br /> return numberOfLines;<br /> }<br /><br /> /**<br /> * Dosyayı satir satir gezerek satir sayisini bulmaya yarar<br /> * @param textFile<br /> * @return dosyadaki satir sayisi<br /> * @throws IOException<br /> */<br /> public int numberOfLinesByScanningFile(File textFile) throws IOException {<br /> BufferedReader bufferedReader = new BufferedReader(new FileReader(textFile));<br /> int numberOfLines = 0;<br /> while(bufferedReader.readLine() != null) {<br /> numberOfLines++;<br /> }<br /> return numberOfLines;<br /> }<br /> <br /> /**<br /> * LineNumberReader sinifini kullanarak satir sayisini verir.<br /> * @param textFile<br /> * @return dosyadaki satir sayisi<br /> * @throws IOException<br /> */<br /> public int numberOfLinesByLineNumberReader(File textFile) throws IOException {<br /> LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(textFile));<br /> lineNumberReader.skip(textFile.length());<br /> return lineNumberReader.getLineNumber();<br /> }<br />}<br /></pre><br /><br />Merak ettiğim bir konu var. Ben bu LineNumberReader sınıfına ilk defa iki gün önce rastladım. Siz böyle bir sınıfın varlığını biliyor muydunuz?<br /><br />Son olarak aklımdayken söyleyeyim. 10 milyon satırlık test dosyasını aşağıdaki komut ile oluşturdum:<br /><pre><br />ilkinulas@tututil:/tmp$ seq 10000000 > deneme.txt<br />ilkinulas@tututil:/tmp$ wc -l deneme.txt <br />10000000 deneme.txt<br /></pre>İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com2tag:blogger.com,1999:blog-2296791868291929959.post-89394692039689976642009-07-26T19:55:00.001+03:002009-08-02T21:04:51.757+03:00Bahele. Artık mesajlara yorum yazabilirsinVakit buldukça <a href="http://www.bahele.com">Bahele.com</a>'a yeni özellikler eklemeyi sürdürüyorum. Site çok fazla kullanılmasa da motivasyonum yüksek. Önceleri yabancı olduğum web teknolojilerini deneyebilmem için iyi fırsat oldu. Ve işte Bahele'deki son değişiklikler:<br /><ol><br /><li>Mesajlara yorum yazılabiliyor. Yazılan bu yorumlar yorumu yapanın facebook feed'leri arasına gönderiliyor.</li><br /><li>Yeni facebook feed şablonları ekledim. Facebook'ta ana sayfayada gözüken feed'ler arasına birşeyler göndermek isterseniz facebook feed şablonlarını kullanmanız gerekiyor. Şablonları biraz daha göze batacak hale getirdim.</li><br /></ol><br /><br />İnternette dolanırken <a href="http://www.programmableweb.com/">programmableweb</a> diye bir siteye rastladım. Aklınıza gelebilecek her türlü <a href="http://en.wikipedia.org/wiki/Mashup_%28web_application_hybrid%29">mashup</a> ile ilgili bilgi bulabileceğiniz bir site. Bu aralar flickr, google, yahoo, twitter ve facebook api'lerini inceliyorum. Bu devlerin servislerini kullanarak geliştirilebilecek yeni uygulamalar, servisler üzerine kafa yormaya başladım. <br /><br />Hemen bir örnek site tanıtayım: <a href="http://nearbytweets.com/">nearbytweets.com</a>. Google Maps ve Twitter API'lerini kullanarak geliştirilmiş bu site sizin yerinizi buluyor (google sağolsun) sonra da twitter API'si ile arama yaparak yakınlarınızdan yazılan twitter mesajlarını listeliyor. Bence çok başarılı bir mashup örneği.<br /><br />Nereden nereye geldik. Bahele ile başladık mashup ile bitiriyoruz. Haydi görüşmek üzere...İlkin Ulaş BALKANAYhttp://www.blogger.com/profile/01068439091401215925noreply@blogger.com0