<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Observed by Burcu Dogan &#187; Regular</title>
	<atom:link href="http://blog.burcudogan.com/category/regular/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.burcudogan.com</link>
	<description>burcu dogan&#039;s monthly routine. caution: risk of overdose.</description>
	<lastBuildDate>Fri, 23 Jul 2010 12:09:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>LG Optimus GT540&#8242;ı kullanabildim mi?</title>
		<link>http://blog.burcudogan.com/602/</link>
		<comments>http://blog.burcudogan.com/602/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 10:45:09 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[devices]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=602</guid>
		<description><![CDATA[Türkiye pazarında Android telefon popülasyonu biraz düşük seyretmekte. Biz bundan yakınırken, LG bize yeni bir telefon getirdi. 599 TLden satacağı bu telefonun adı LG Optimus GT540. Yaklaşık 15 gündür test için bana ödünç verilen bu telefonla ilgili görüşlerimi yazacağım. İzlenimlerim, bu telefonu tasarım ve kullanılabilirlik anlamında diğer Android telefonlardan ayıran özellikler üzerine. Fiziksel: Cihazın dış [...]]]></description>
			<content:encoded><![CDATA[<p>Türkiye pazarında Android telefon popülasyonu biraz düşük seyretmekte. Biz bundan yakınırken, LG bize yeni bir telefon getirdi. 599 TLden satacağı bu telefonun adı <a href="http://www.amazon.co.uk/LG-GT540-sim-free-unbranded-contract/dp/B003L0OX9U">LG Optimus GT540</a>. Yaklaşık 15 gündür test için bana ödünç verilen bu telefonla ilgili görüşlerimi yazacağım. İzlenimlerim, bu telefonu tasarım ve kullanılabilirlik anlamında diğer Android telefonlardan ayıran özellikler üzerine.</p>
<h3>Fiziksel: Cihazın dış ögeleri</h3>
<p>Bir cihazın dış güzelliği içi kadar, hatta içinden daha önemli olabilir. Cihazlarla fiziksel temasa girdiğimiz nokta, o cihazın başarılı olup olmayacağı konusunda büyük bir kriterdir.</p>
<h4>Dış yüzey tuşları</h4>
<p><img class="alignleft size-full wp-image-685" title="Alt tuslar" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/alttuslar3.png" alt="" width="190" height="150" />Telefonu elinize aldığınızda ilginizi çeken ilk şey Android telefonlarda gelen tuşların (ana ekran, geri, menü tuşlarının) bir kısmının <em>soft</em>, diğer bir kısmının ise <em>hard</em> tuşlardan oluşuyor olması. Zira tuşlar iki sıra halinde yerleştirilmiş. İlk sırada dokunmatik (<em>soft</em>) olan menü ve geri tuşları var. Alt sırada ise arama kabul etme, ana ekran ve arama sonlandırma tuşları sıralandırılmış. Android bir telefonda en çok etkileşime geçtiğiniz tuşların geri ve menü tuşları olduğunu söyleyecek olursam bu yerleştirim başarılı sayılabilinir. Fakat dokunmatik olan geri ve menü tuşları ekranın <strong>kendisi kadar hassas değil</strong>. Bu durum, yanlışlıkla basmaları engellemek için alınmış bir tasarım kararı olarak görünse de doğru bir karar olduğunu düşünmüyorum. Çünkü cihazı test ederken geri tuşu yerinde bir çok kez ekranın sağ alt köşesine, menü tuşuna basacağım diye de birçok kez ekranın sol alt köşesindeki tuşlara dokundum. Telefonun en çok kullanılan iki tuşuna bu kadar sert davranmak zorunda kalmanız parmaklarınız açısından acı verici.</p>
<p><img class="alignright size-full wp-image-654" title="Geri tuşu avucun içerisinde kalıyor" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/backtus.png" alt="" width="225" height="300" />Geri tuşunun ergonomisi hakkında yapılabilinecek bir yorum daha var. Bunlardan en önemlisi bu tuşun yerleşimi. Telefon benim kişisel görüşüme göre <strong>solaklar için tasarlanmış</strong>. Sağ elinizle kullandığınızda geri tuşu avucunuzun tam içinde kalıyor. Baş parmağınızla ona dokunmanız gerçekten büyük bir uğraş. Ayrıca bu iki soft tuş yüzünden ekranın alt kısmında olan biteni görmek gerçekten imkansız. <em>Soft </em>tuşlar, fiziksel tuşların altında olsaydı belki daha kullanılabilir olurlardı. Özelleştirilmiş ekranlarda ana fonksiyon tuşlarının en alta yerleştirilmesi uygun olmamış, bu ögeler parmaklarınız yüzünden <em>tamamen görünmez kalıyor </em>&#8211; Özelleştirme ile ilgili yorumların devamını yazının alt kısmında bulabilirsiniz.</p>
<p>Arama için ayrılmış Android tuşunun ön yüzeyde değil de sağ yan duvara konumlandırılmış olması ise iyi düşünülmüş. Keza, ara sıra yanlışlıkla arama tuşuna basıp arama uygulamasının çalıştırmasının önüne geçilebiliyor.</p>
<h4>Ekran özellikleri</h4>
<p>320&#215;480 çözünürlüğünde 160dpi&#8217;lık resistif bir ekran var önümüzde. Resistif bir ekran kullandıysanız bu ekranların çalışma prensibini biliyor olabilirsiniz. Resistif ekranlar iki katman arasında yer alan hava boşluğunun daralıp genişlemesi sayesinde sizin dokunuşunuzu fark eden ekranlardır. Bu nedenle iPhone veya Nexus One&#8217;daki kapasitif ekranlarla karşılaştırıldığında dokunmaya değil basınca duyarlı ekranlar oldukları söylenebilir. Resistif ekranlar bu nedenle kullanırken daha fazla azim gerektiren yüzeylerdir. Özellikle sanal klavyede hassasiyetle ilgili sorunları olan bir ekran oldukça problem yaratabilir. Optimus&#8217;un resistif ekranının belirgin en büyük özelliği de bu. Varsayılan olarak numkey ile gelmesi QWERTY klavyesinin yeterince kullanabilir olmadığını kanıtlar gibi. Yatay pozisyonda ise çok daha rahat bir kullanım sağlıyor QWERTY. Açıkcası klavyeyi sürekli olarak yatay pozisyonda kullandım ve herhangi bir kullanılabilirlik sorunu yaşamadım. Göreceli olarak minik sayılabilecek parmaklarım dikey konumadaki klavye ile fazla barışık değildi.</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/verticalqwerty.png"><img class="alignnone size-full wp-image-630" title="verticalqwerty_thumb" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/verticalqwerty_thumb.png" alt="" width="133" height="200" /></a> <a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/horizontalqwerty.png"><img class="alignnone size-full wp-image-631" title="horizontalqwerty_thumb" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/horizontalqwerty_thumb.png" alt="" width="269" height="200" /></a> <a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/numpad.png"><img class="alignnone size-full wp-image-632" title="numpad_thumb" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/numpad_thumb.png" alt="" width="133" height="200" /></a></p>
<p>Genel klasmanda en sorunsuz klavye telefon tuş takımı dizilimine sahip olan klavye (son resimdeki). QWERTY&#8217;den daha hızlı yazabiliyorsunuz, üstelik strese girmeden.<span id="more-602"></span></p>
<p>QWERTY klavye ile olan deneyimi size daha net bir şekilde anlatabilmek için küçük bir deney yaptım. 200 kelimelik bir cümlede yanlış olarak bastığım karakter, noktalama işaretleri vb. ögeleri saydım. Sonuçlar yatay pozisyonun 3.5 kat daha doğru yazıma olanak verdiğini ortaya çıkardı.</p>
<p>Yatay durumda 200 kelimede yapılan hata sayısı: 12<br />
Dikey konumda 200 kelimede yapılan hata sayısı: 43</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/fingersens.png"><img class="size-full wp-image-648 alignright" title="Finger printing" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/fingersens.png" alt="" width="205" height="307" /></a>Resistif ekranların basınca duyarlı olmasına bir süre sonra alışabiliyorsunuz fakat multitouch desteği olmayan bir telefonda özellikle tarayıcı ve haritalar üzerindeki kabiliyetleriniz sınırlanıyor. Zoom tuşlarını kullanarak scroll etmek zaman kaybına yol açıyor çünkü multitouch destekli bir ekranla bunların ikisini aynı anda yapabiliyorsunuz. Sayfada kalma ve sayfayı inceleme sürelerinizin saniyelerle ölçüldüğü bir dünyada elbette ki saniyeler çok önemli. Fakat bu klasmandaki telefonların birçoğunun resistif ekranlara sahip olduğunu belirtmeden geçemeyeceğim. Benzer sınıfta olan Huawei&#8217;in başka bir Android&#8217;iyle deneyim karşılaştırması yaptığımda LG Optimus GT540, dokunuşlarıma çok daha net ve hızlı karşılık veriyordu.</p>
<p>Her telefona uygulamaktan zevk aldığım bir teste geldi sıra. Hemen hemen her telefonun ekranının orta bölgesi dokunmaya yeterli bir seviyede cevap verebilirken, aynı durum ekranın kenarları için geçerli değil. Bu da kenarlara yerleştirilen her türlü elementin kullanımını zorlaştırıyor. GT540&#8242;in ekranla ilgili büyük sorunu<em> kenarlardaki kötü hassasiyetinden </em>kaynaklanıyor. Köşegenlere paralel olarak gizmeye çalıştığım çizgilerin kenarlarda nasıl deforme olduğunu ve son 10-15 pikselde neredeyse yok olduğunu görebilirsiniz. Benzeri bir testi Nexus One&#8217;da yaptım ve en ufak bir deformasyon yaşamadım. Klavye ile ilgili problemlerimin de nedeni ortaya çıkmış oldu böylece.</p>
<p>Ekran plastik, zaten resistif bir ekran olduğundan dolayı elastik bir maddeden yapılmamış olma ihtimali bulunmamakta. Ekranın parlaklığı ve çözünürlüğü dış kaplaması nedeniyle sınırlı kalmakta. Sentetik maddelerin ışığın kırmasıyla ilgili problemi olan benim gibi kullanıcılar netlik ile ilgili problem yaşayabilirler. Plastik ekran, malzemesi nedeniyle eldeki yağı daha fazla kendine bulaştırıyor. Fakat ekranın temizlenmesi oldukça kolay. Telefonu küçük bir bez parçası ya da kendi giysilerinizle birkaç saniye içerisinde temizlemeniz mümkün.</p>
<h3>Yazılım: Özelleştirilmiş Android</h3>
<p>Neredeyse tüm üreticiler Android&#8217;i ürünlerinin hedef kitlesine göre özelleştiriyor. LG Optimus GT540 da bu ürünlerden biri. Telefonu elinize ilk aldığınızda özelleştirilmiş ana tema, sosyal ağ entegrasyonu, temel fonksiyonların ekranlara yerleştirilmiş olması ve kendi marketi olan SlideME göze çarpıyor. Telefon Android&#8217;in 1.6 sürümüyle geliyor. Üretici ileri tarihte 2.1 veya üstü bir sürümle çıkmayı planladığını açıkladı fakat elinizdeki 1.6 telefonların güncellemesiyle ilgili net bir bilgi yok. Uygulama geliştiriciler genellikle 2.1 ve üstü sürümleri destekleyen uygulamalar çıkardıklarından dolayı, 1.6 sizi eski uygulamalarla dolu bir köşeye sıkıştırabilir.</p>
<h4>Sosyal Ağ Hizmetleri</h4>
<p>LG Optimus GT540 ürün olarak gençlerin hedef alındığı ve telefon özelliklerinin sosyal ağlarla donatıldığı bir telefon olarak tasarlanmış. Telefonu açtığınızda ilk olarak gözünüze çarpan, sosyal ağ hesaplarınızı telefona bağlamıza yarayan uyguluma. Bu uygulamadan Facebook, Twitter ve Bebo hesaplarınızı telefonla eşleştirebiliyorsunuz ve adres defterinizi sosyal ağlarla entegre çalışacak hale getirebiliyorsunuz. Bebo&#8217;yu neredeyse kullanmayan bir ülke olan Türkiye&#8217;de telefonun pazara bu sosyal ağı içererek girmesi yanlış olmuş. Onun yerine FriendFeed ya da LinkedIn gibi daha aktif kullanılan bir ağa öncelik verilebilir ve bu ağ için geliştirme yapılabilinirdi.</p>
<h4>Temel Fonksiyon Tuşları</h4>
<p>Android&#8217;in birçok kör noktası olduğu konusundaki tartışmalarda ön saflarda yer alan kişilerden biriyim. Bu kör noktaların biri de menü tuşuyla ulaşılan ana fonksiyon tuşları. İlk kez Android kullanmaya başlamış kişilerin bu navigasyonu keşfetmesi zaman alabiliyor. Menüyü keşfedinceye kadar da uygulamaların işlevsizliğinden yakınabiliyorlar. LG, bu telefonda ana fonksiyon tuşunu ekranın üzerine konumlandırmayı uygun görmüş. Bu sayede en çok kullanılan fonksiyona tek bir tuşla erişmek mümkün olurken, ilk kullanıcılar için de bir ipucu sunulmuş olmuş.</p>
<p>Fakat, öte yandan bu tuşlar kullanıcının araştırma dürtüsünü azalttığından dolayı menü navigasyonunu keşfetmesini zorlaştırabilir.</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/snmanager_thumb.png"><img class="alignnone size-full wp-image-641" title="snmanager_thumb" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/snmanager_thumb.png" alt="" width="133" height="200" /></a> <a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/contactlist_thumn.png"><img class="alignnone size-full wp-image-642" title="contactlist_thumn" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/contactlist_thumn.png" alt="" width="133" height="200" /></a> <a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/blockingt.png"><img class="alignnone size-full wp-image-643" title="blockingt" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/blockingt.png" alt="" width="330" height="200" /></a></p>
<p>Standart Android ekranlarında farklı olarak menü tuşuyla gelen özelliklerinden en temellerinin alta tuş olarak yerleştirilmiş olması. Bu sayede menüde zaman kaybetmeden işleri halletmek mümkün. Fakat küçük parmağım alt tabakaya yerleştirilmiş bu tuşlardan memnun değil. Hemen altındaki menü ve geri dönme tuşlarına basma ihtimalim var çünkü.</p>
<h4>Android Market&#8217;in Yokluğu</h4>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/downloaded.png"><img class="alignright size-thumbnail wp-image-660" title="Sizin indirdiğiniz uygulamaların ayrı bir segment içinde belirtilmesi" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/downloaded-150x150.png" alt="" width="150" height="150" /></a>Google&#8217;ın market uygulaması bu telefonla da gelmiyor. Market konusunda problem yaşayan bir dolu operatör ve cihaz üreticisi varken bu bir sürpriz değil. Android market yerine SlideMe denilen farklı bir market bulunmakta. İçerik, Google&#8217;ınki kadar geniş değil ve market uygulamasının kullanılabilirliği beni tatmin etmedi. Ayrıca upgrade etmeye çalıştığımda bir türlü güncellenemediğinden motivasyonumu kaybetmeme neden oldu. Google marketli bir ROM bulup, telefona Google marketini ilave etme konusunda fazla kararlı değildim. Bunun en önemli nedeni bu telefon için hazırlanmış bir ROM bulamamamdı. Fazla riske girmek istemediğimden telefonu olduğu gibi kabullendim. Daha önceden kullandığım uygulamaların APK dosyalarını bularak kendim yükledim birçoğunu. Market&#8217;in rahatlığını yakalayamadım ama neredeyse aradığım tüm uygulamaları buldum.</p>
<p>Uygulamaların listelendiği ekranda, kullanıcının yüklediği uygulamalarla ilgili kullanışlı bir organizasyon yaratılmış. Sonradan yüklenen uygulamalar ayrı bir segmentte sunularak kullanıcının kendi yüklediklerini kolayca ayırt edebilmesi sağlanmış. Özellikle yeni bir uygulama yüklediğinizde bulmanız çok daha kolay oluyor.</p>
<h4>Tarayıcı Konforu</h4>
<p>Tarayıcı performans açısından yeterli düzeyde, en azından sayfaların render edilmesi ile ilgili bir performans problemi bulunmamakta. Oldukça ağır JavaScript içeren sayfalarda tamamen tıkanabiliyor fakat bu tür sayfalara telefondan erişmek isteyen kullanıcı sayısının azlığı düşünülecek olursa tamamen es geçilebilinir. Tarayıcının üzerinde varsayılan Android tarayıcısından farklı olarak kısayollar paneli gelmekte. Bu panel sayfanın üzerine overlay olarak yerleştirildiğinden bazen bazı elementlerle etkileşime geçmenize engel oluyor. Örneğin, Google&#8217;da arama yaparken arama button&#8217;unun tam üzerinde durduğundan kullanıcı olarak kendinizi rahatsız hissediyorsunuz.</p>
<h4>Varsayılan Uygulamalar</h4>
<p>Telefon ile birlikte gelen uygulamalar tatmin edici bir seviyede. Birkaç uygulama, telefonu ilk elime aldığımda ilgimi çekti. Bunlar:</p>
<ol>
<li>Video düzenleyici: Video çekip daha sonra bu videoları düzenlenize yardımcı olan mini bir uygulama var. Özellikle video çekimini aktif olarak kullanan ve çektiklerini çabucacık paylaşmak isteyenler için ideal.</li>
<li>FM Radyo: Hala radyo kullanıcıları var mıdır bilinmez ama bu telefon FM radyo desteğiyle birlikte geliyor. Yayını duraklatma gibi artık temel sayılabilinecek özellikler ise es geçilmiş.</li>
<li>IO File Manager: Dosya sisteminize tamamen erişebilmeniz için tasarlanmış bir uygulama. Bu uygulama ile işletim sistemine ait dosyaları görmek de mümkün.</li>
</ol>
<h3>Performans ve Batarya Tüketimi</h3>
<p>Telefonun teknik ayrıntılarına ulaşmakta büyük bir zorluk çektiğimi belirtmem lazım. Çeşitli performans araçları ile elde ettiğim verilerde 256 MB RAM ve 600 MHz bir işlemciyle karşılaştım. Telefonun tepki verme hızı uygulamalar arasında geçişler yaparken bariz olarak etkileniyor. Animasyonlar ve diğer arayüz ile ilgili olan geçişler yeterince performanslı değil. Performans konusunda iyi bir kriter olabileceğine inandığım tarayıcı deneyimi ise kesinlikle ortalamanın altında. En azından Sun Spider testi bitmek bilmiyor ki, size gerçekçi bir metrik verebileyim.</p>
<p>Batarya tüketimi konusunda şampiyon olarak nitelendirebileceğim bir telefon. İçerisindeki 1500lük batarya ile aktif kullanımda bile 1.5 günü aşan bir kullanım olanağı sağlıyor. Tamamen yeniden sarj olması 1.2 saat sürdüğünden dolayı sürekli olarak sahada gezenlere uygun bir telefon.</p>
<h3>GSM, Ağ Baglantıları ve GPS</h3>
<p>Telefonla ilgili en önemli kriterlerden biri de veri bağlarıyla arasındaki köprünün ne kadar başarılı olup olmadığı. Telefonun GSM ağı ile etkileşiminin oldukça problemsiz olduğunu belirtmem lazım. Ayrıca 3G bağlantı sağlamakta zorluk çektiğim çoğu noktada LG Optimus GT540 ile bağlantı hızım ortalamanın üzerindeydi.</p>
<p>Kablosuz ağları yakalama potansiyeli, kullandığım diğer tüm Android telefonlardan çok daha başarılıydı. Fakat GPS alıcısından çok da memnun kaldığımı söylemem. Araç içerisindeyken tatminkar bir servis sağlıyor ve navigasyon araçlarını kullanmanıza problemsiz olanak veriyor. Ama, dış alanda sabit dururken veya pencere kenarında konumunuza göre diğer telefonlara göre daha kötü. Navigasyon için kullanacaksanız sadece Google Maps uygulaması ile bile oldukça mutlu olabilirsiniz.</p>
<h3>Kamera</h3>
<p>Telefon satın alırken en üzerinde durulan kriterlerden biri kamera. Özellikle sosyal ağlarla entegre olma konseptiyle çıkmış bir telefondan sürekli paylaşım halindeki kullanıcısını mutlu etmesi bekleniyor. GT540&#8242;ın kamerası ışığı oldukça yayıyor, bu nedenle ışığın fazla olduğu ortamlarda ve gün ışında fotoğraflar yeterince net değil. Öte yandan, karanlıkta çektiğim fotoğraflardan daha çok verim aldığımı söyleyebilirim. 3.0 mega piksel bir kamera taşıdığı için beklentiniz çok yüksek olmuyor. İncelemeniz için birkaç örnek fotoğraf ekliyorum:</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/IMG20100723_003.jpg"><img class="alignnone size-thumbnail wp-image-667" title="IMG20100723_003" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/IMG20100723_003-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/IMG20100723_004.jpg"><img class="alignnone size-thumbnail wp-image-668" title="IMG20100723_004" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/IMG20100723_004-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/IMG20100708_001.jpg"><img class="alignnone size-thumbnail wp-image-669" title="IMG20100708_001" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/IMG20100708_001-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/IMG20100723_011.jpg"><img class="alignnone size-thumbnail wp-image-671" title="IMG20100723_011" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/IMG20100723_011-150x150.jpg" alt="" width="150" height="150" /></a></p>
<h2>Sonuç</h2>
<p>Çok düşük bütçelilere hitap eden bu telefon, sıradan özelliklere sahip bir cihaz almaktansa Android&#8217;le tanışmak ve ucuz telefonlardakinden çok daha iyi bir tarayıcı deneyimi yaşamak isteyen insanlar için ideal. Açıkca belirtmek gerekirse cihaz bir multimedya aracı değil ve resistif ekranı yüzünden klavyesi çok başarısız. Email trafiği arasında kaybolanlara ve Internet bağımlılarına kesinlikle hitap etmiyor. &#8220;Sadece temel telefon özellikleri (telefon/mesaj/kamera) bana yeterli, geri kalan tüm diğer özellikler benim için artı bir puan.&#8221; diyorsanız almayı ciddi olarak düşünebilirsiniz. Telefonunuzu yenilemeyi düşünüyorsanız ve Android&#8217;e ilgi duyuyorsun mutlaka göz atın.</p>
<p>Öte yandan, benim kalibremde konfor arayan bir telefon kullanıcısı iseniz, bu cihaz kesinlikle size göre değil.</p>
<h3>EK &#8211; Sürücü Problemleri</h3>
<p>Telefon benim elime ilk geçtiğinde hemen <em>USB debugging</em> modunu açarak kendi yazdığım uygulamalardan birkaçını test etmek istedim. Mac OS X, telefonu tanımadı. Telefon için uzun uğraşlar gerektiren bir sürücü avına başladım. Öncelikle telefonla bize verilen CD&#8217;nin içerisine baktım. Sürücülerin burada olacağını umuyodum. Fakat CDnin içerisinden sadece basın bildirisi ve fotoğraflar çıkınca biraz üzüldüm.</p>
<p>Hiç Windows makinem olmadığından dolayı şirketten makinelerden birine göz koydum önce. LG&#8217;nin mobil telefonlarla ilgili güncellemelerini dağıttığı bir uygulama indirmek zorunda kaldım. Bu program, lgmobile.com&#8217;dan indirilmesi gerekirken, bağlantı bana 404 verdiğinden dolayı tamamen farklı bir yerden güvenilir olmayan bir kopyasını buldum. Programı çalıştırıp sürücümü alabileceğimi düşünürken, her şey yeniden tepetaklak oldu. Uygulama benden, elimdeki telefonu IMEI numarasınıyla veya model ile seri nosuyle tanıtmamı bekliyordu. Hepsini denedim, hiçbiri işe yaramadı. Yaklaşık 2 saat uğraştıktan sonra pes ettim. Ertesi gün Windows XP kurulu bir makineye USB üzerinden bağlanmaya çalıştığımda biraz daha moralim yerine geldi. Makinem cihazın takılı olduğunu algılayabiliyordu en azından. Uzun süren bir sürücü arayışından sonra umutlarım yeniden yerle bir oldu.</p>
<p>GT540, geliştiricileri hedefleyen bir makine olmadığından arayışlarımı sonlandırma kararı aldım. Çünkü telefonu kullanacak son kullanıcının (örneğin annemin) benim yaptıklarımdan daha ötesiyle uğraşmak istediğini sanmıyorum. Sonra tesadüfen LGMobile güncelleme uygulamasını yanlış çalıştırdığımı farkettim. Yaklaşık 30dklık bir kurulum merasiminin ardından telefonu DDMS&#8217;te görebiliyordum. O kadar çok kurulum yaptı ki, bu sürecin gerçek olmadığına inanmaya başlamıştım. Şu an GT540&#8242;a erişebiliyorum, fakat Android SDK ile gelen sürücü güncellemelerim bozuldu ve kendi telefonlarım bana cevap vermiyor.</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2010/07/drivers.png"><img class="alignnone size-full wp-image-657" title="Kurulanlar" src="http://blog.burcudogan.com/wp-content/uploads/2010/07/drivers1.png" alt="" width="351" height="170" /></a></p>
<p>Yukarıdaki liste kurulan komponentleri gösteriyor. Kuruluma başladıysanız bir şeylerin ters gittiğini düşünüp sakın iptal etme yoluna girmeyin. Yani kısacası, Windows kullanmıyorsanız  telefon sizi sinirlendirecektir <img src='http://blog.burcudogan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Başka bir Android telefonunuz varsa çıldırabilirsiniz.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/602/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why didn&#8217;t you understand inheritance in JavaScript?</title>
		<link>http://blog.burcudogan.com/564/</link>
		<comments>http://blog.burcudogan.com/564/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 19:45:04 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=564</guid>
		<description><![CDATA[Coming from a regular background, you&#8217;re probably introduced into inheritance in a classical way with C++ or Java. JavaScript does not have any native mechanism to provide inheritance in the terms of what you&#8217;ve known already. JavaScript is a prototype based language. Behaviors of classes can be ported to other classes in a prototype based methodology. In [...]]]></description>
			<content:encoded><![CDATA[<p>Coming from a regular background, you&#8217;re probably introduced into inheritance in a classical way with C++ or Java. JavaScript does not have any native mechanism to provide inheritance in the terms of what you&#8217;ve known already. JavaScript is a prototype based language. Behaviors of classes can be ported to other classes in a prototype based methodology. In this article, I&#8217;ll underline this concept and will illustrate you how it works.</p>
<h3>So, what is Object.prototype?</h3>
<p>You should be familiar with Object.prototype at least you have a little dirty object oriented JS experience. If you dont, let me explain you in a few words. In order to bind methods to a type, you extend your type&#8217;s prototype. For instance, let us assume we need a Student type, who can enroll to and withdraw classes.<br />
<code><br />
var Student = function(){};<br />
Student.prototype.enroll = function(classes){<br />
&nbsp;&nbsp;&nbsp;&nbsp; // code here<br />
}<br />
Student.prototype.withdraw = function(classes){<br />
&nbsp;&nbsp;&nbsp;&nbsp; // code here<br />
}<br />
</code></p>
<p>So, Student&#8217;s prototype is referencing to an object which has two functions, enroll and withdraw. Similarly you could have written the same as:<br />
<code><br />
var Student = function(){};<br />
var methods = {<br />
&nbsp;&nbsp;&nbsp;&nbsp; enroll: function(classes){  /* code here */  },<br />
&nbsp;&nbsp;&nbsp;&nbsp; withdraw: function(classes){  /* code here */ }<br />
}<br />
Student.prototype = methods;</code></p>
<p>Great, now it&#8217;s time to explain you what prototype object is doing. Whenever you are constructing an instance of Student type, it appends enroll and withdraw functions to the created object. In short,<br />
<code>var student = new Student();<br />
</code>student object can call student.enroll([4, 5]); and student.withdraw([5]); in order to enroll to classes which are identified with 4 and 5. And withdraw the class identified with 5. Student class will be extended before Student.constructor is called so, you can use enroll and withdraw right inside of the constructor if needed. Visually the memory looks like:</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2010/06/prototype1.gif"><img class="alignnone size-full wp-image-576" title="How prototype works?" src="http://blog.burcudogan.com/wp-content/uploads/2010/06/prototype1.gif" alt="" width="457" height="83" /></a></p>
<p>So if you make a change to Student.prototype after student is created, changes will affect the student instance.</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2010/06/prototype2.gif"><img class="alignnone size-full wp-image-573" title=" " src="http://blog.burcudogan.com/wp-content/uploads/2010/06/prototype2.gif" alt="" width="458" height="168" /></a></p>
<p>You started to be fascinated, arent you? But we&#8217;re just beginning. We&#8217;ll take a look how we&#8217;re using prototypes to share common behavior among classes. Assume we need another class called PartTimeStudent that inherits Student. To transfer all of the capabilities of the Student, we can set PartTimeStudent&#8217;s prototype to a Student object.<br />
<code>var PartTimeStudent = function(){}<br />
PartTimeStudent.prototype = new Student();<br />
PartTimeStudent.prototype.constructor = PartTimeStudent;</code><br />
By setting the prototype to a Student object that&#8217;s being initialized by new Student() line, you also transferred the PartTimeStudent&#8217;s constructor to the Student&#8217;s. Last line resets the constructor to the right one.</p>
<p>And finally you can continue to extend PartTimeStudent by adding more methods to its prototype.<br />
<code>PartTimeStudent.prototype.other = function(){/* code here */}</code></p>
<p>Anytime you ask for enroll() from a PartTimeStudent, firstly PartTimeStudent will be searched if it has its own property called as enroll. After no result is found, object&#8217;s prototype is being searched. This chain goes until a match is found. If there are no matches, there will be an error to output. Prototype chaining is usually a very costly operation and as you change the deeper definitions such as Object.prototype, it&#8217;s becoming a performance bottleneck. That&#8217;s the main reason behind the common advices that tell you not to extend Object.prototype directly. And as far as I can understand, if you don&#8217;t extend Object.prototype (or any of the existing classes), JS engine uses the natively implemented Object internally which is expected to run . If you make changes, standard implementation cannot be used and extra memory will be consumed to keep the definitions.</p>
<p>This was a quick intro for prototype based inheritance. Part II will cover more existing issues.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/564/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twifighting: Compare tweets per hour</title>
		<link>http://blog.burcudogan.com/554/</link>
		<comments>http://blog.burcudogan.com/554/#comments</comments>
		<pubDate>Sun, 16 May 2010 08:48:03 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=554</guid>
		<description><![CDATA[Yesterday, I put some code and graphics together and launched Twifighting: a simple tool which compares how trendy your phrases are in Twitter&#8217;s ecosystem. It&#8217;s an easy tool I always needed, to make some market research, to gather the latest interest metrics and etc. I simply thought that I&#8217;m not the only one on the [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, I put some code and graphics together and launched <a href="http://twifighting.com">Twifighting</a>: a simple tool which compares how trendy your phrases are in Twitter&#8217;s ecosystem. It&#8217;s an easy tool I always needed, to make some market research, to gather the latest interest metrics and etc.</p>
<p><a href="http://twifighting.com"><img class="aligncenter size-full wp-image-555" title="twifighting" src="http://blog.burcudogan.com/wp-content/uploads/2010/05/twifighting1.png" alt="" width="500" height="318" /></a></p>
<p>I simply thought that I&#8217;m not the only one on the comparison need side, that&#8217;s how I decided to launch it. It&#8217;s funny to watch the metrics from <a href="http://twifighting.com/#Gordon%20Brown|David%20Cameron">Gordon Brown vs David Cameron</a>, <a href="http://twifighting.com/#Obama|BP">Obama vs BP</a> and etc. <img src='http://blog.burcudogan.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  I became a huge addict! I&#8217;m planning a minor update with some useful features and fix some of the usability problems. If you have any feedback, please drop it here.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/554/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Setting bounds of a map to cover collection of POIs on Android</title>
		<link>http://blog.burcudogan.com/521/</link>
		<comments>http://blog.burcudogan.com/521/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 10:51:14 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=521</guid>
		<description><![CDATA[Lately, as I browse web for maps related questions on Android, what&#8217;s frequently requested is an example of setting bounds of a map (zooming to a proper level and panning) to be able show all of the pins given on the screen. Most of the maps APIs provide this functionality such as Google Maps API, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.burcudogan.com/wp-content/uploads/2010/04/maps1.png"><img class="alignright size-full wp-image-550" title="maps" src="http://blog.burcudogan.com/wp-content/uploads/2010/04/maps1.png" alt="" width="167" height="250" /></a>Lately, as I browse web for maps related questions on Android, what&#8217;s frequently requested is an example of setting bounds of a map (zooming to a proper level and panning) to be able show all of the pins given on the screen.</p>
<p>Most of the maps APIs provide this functionality such as Google Maps API, so developers seem to have problems with implementing theirs. Google Maps API for Android does not provide functionality for setting bounds to a box. Instead, what&#8217;s provided is to zoom to a span.</p>
<p><code>com.google.android.maps.MapController.<strong>zoomToSpan</strong>(int latSpanE6, int lonSpanE6)</code></p>
<p>latSpanE6 is the difference in latitudes * 10^6 and similarly lonSpanE6 is the difference longitude * 10^6. You may question how map controllers know where to zoom in just by the differences. For examples, kms between longitudes differ from equator to poles. Fortunately, Google maps projection has them in the same length. This may remind you the infamous <a href="http://answers.yahoo.com/question/index?qid=20090824125304AAiAM3j">South America versus Greenland syndrome</a>. Although Greenland is much much smaller than South America, it doesnt look so with this map projection.</p>
<p>On the below, I implemented a boundary arranger method for MapView. Method takes three arguments: items, hpadding and vpadding. items as you may guess is a list of POIs. Other arguments are a little bit more interesting. hpadding and vpadding is the percentage of padding you would like to leave horizontally and vertically so that pins don&#8217;t appear just on the corners. For instance, if you assign 0.1 for hpadding, 10% padding will be given from top and bottom.</p>
<p>BTW, You&#8217;ll have to extend the existing MapView and add this method to your own MapView to use this method properly.</p>
<pre class="java">public void <strong>setMapBoundsToPois</strong>(List&lt;GeoPoint&gt; items, double hpadding, double vpadding) {

    MapController mapController = this.getController();</pre>
<pre class="java">    // If there is only on one result
    // directly animate to that location

    if (items.size() == 1) { // animate to the location
        mapController.animateTo(items.get(0));
    } else {</pre>
<pre class="java">        // find the lat, lon span
        int minLatitude = Integer.MAX_VALUE;
        int maxLatitude = Integer.MIN_VALUE;
        int minLongitude = Integer.MAX_VALUE;
        int maxLongitude = Integer.MIN_VALUE;

        // Find the boundaries of the item set
        for (GeoPoint item : items) {
            int lat = item.getLatitudeE6(); int lon = item.getLongitudeE6();

            maxLatitude = Math.max(lat, maxLatitude);
            minLatitude = Math.min(lat, minLatitude);
            maxLongitude = Math.max(lon, maxLongitude);
            minLongitude = Math.min(lon, minLongitude);
        }

        // leave some padding from corners
        // such as 0.1 for hpadding and 0.2 for vpadding
        maxLatitude = maxLatitude + (int)((maxLatitude-minLatitude)*hpadding);
        minLatitude = minLatitude - (int)((maxLatitude-minLatitude)*hpadding);

        maxLongitude = maxLongitude + (int)((maxLongitude-minLongitude)*vpadding);
        minLongitude = minLongitude - (int)((maxLongitude-minLongitude)*vpadding);

        // Calculate the lat, lon spans from the given pois and zoom</pre>
<pre class="java">        mapController.zoomToSpan(Math.abs(maxLatitude - minLatitude), Math
.abs(maxLongitude - minLongitude));

        // Animate to the center of the cluster of points
        mapController.animateTo(new GeoPoint(
              (maxLatitude + minLatitude) / 2, (maxLongitude + minLongitude) / 2));
    }</pre>
<pre class="java">} // end of the method</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/521/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>W3C Widgets: The good, the bad and the ugly</title>
		<link>http://blog.burcudogan.com/468/</link>
		<comments>http://blog.burcudogan.com/468/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 20:24:46 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[w3c widgets]]></category>
		<category><![CDATA[web standards]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=468</guid>
		<description><![CDATA[It hasn&#8217;t been a while since ppk wrote about totally a new W3C movement called &#8220;Widgets&#8220;. A Widget is a downloadable archive of HTML, JavaScript, CSS and a configuration file. It&#8217;s a downloadable web front-end. Basically it&#8217;s designed to build mobile apps to avoid extra network usage consumed to download heavy weight pages, CSS and [...]]]></description>
			<content:encoded><![CDATA[<p>It hasn&#8217;t been a while since <a href="http://www.quirksmode.org/blog/archives/2009/04/introduction_to.html">ppk</a> wrote about totally a new W3C movement called &#8220;<a href="http://www.w3.org/TR/widgets/">Widgets</a>&#8220;. A Widget is a downloadable archive of HTML, JavaScript, CSS and a configuration file. It&#8217;s a downloadable web front-end. Basically it&#8217;s <em>designed to build mobile apps</em> to avoid extra network usage consumed to download heavy weight pages, CSS and JS. With Widgets, you only consume network traffic for data transmission. Before getting into details I have to share a fact that according to my knowledge, <a href="http://www.opera.com/">Opera Mobile</a> is the only browser around with Widgets support.</p>
<p>You can <a href="http://widget.developer.vodafone.com/en/howtobuildawidget">read  Vodafone&#8217;s tutorial to make a Widget first</a> to have an initial look.</p>
<h2>The Good</h2>
<p>For many years, I&#8217;ve been in a huge debate with people who uses work  force inefficiently by their 35k different platforms and SDKs. Half of  the developer have written HTML once in their life and JavaScript has a  very large developers base. Every new mobile platform is usually  re-inventing the wheel once again and this default action is usually driven by business fears.</p>
<p>Widgets make software accessible anywhere you can run a browser. It&#8217;s definitely &#8220;Write once, run everywhere&#8221;. And the complaints about slow page transmission is being fixed by running them from local resources.</p>
<p>Widgets will push mobile web browsers to act more similarly as applications base grow. Many of the extensions such as geo-location APIs dont really fit each other and some mobile browsers provide totally non-standard features. If web applications dominates the mobile, community will push browsers to act better.</p>
<p>It&#8217;s easy to get in. You dont have to download SDKs, learn another language and read documentation/tutorials to learn something new.</p>
<h2>The Bad</h2>
<p>Performance. Native apps run fast. Even Dalvik empowered Android is horrible and not really responsive compared to other platforms&#8217; applications because of Java. Heavy JS on web browsers are not scalable and just like most of the other browsers, Safari on iPhone has rendering issues even on local websites.</p>
<p>Forget the advantages of Web when it comes to releasing software. No on the fly updates at all. Software should be downloaded again and again as new versions release.  Accessibility to internal platform is questionable. Open platforms like Android provide access to internals such as contact lists, file system and invoking other applications. If mobile  operating system manufacturers cant meet at providing the similar APIs, this wont work.</p>
<h2>The Ugly</h2>
<p>I find the old-generation of mobile development community is very ill-minded. They use the know-how to make money and this community is interested in their complex and closed environments.</p>
<p>On the other hand, the only contributor is Opera for now. I&#8217;m not really sure if they go for larger market share or not. If an open standard acts like a diverse platform for Opera browser phones, it&#8217;s the same story.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/468/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Probably I&#8217;m a &#8220;products person&#8221;</title>
		<link>http://blog.burcudogan.com/444/</link>
		<comments>http://blog.burcudogan.com/444/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 21:47:19 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[personal development]]></category>
		<category><![CDATA[products]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=444</guid>
		<description><![CDATA[It all started when I was younger, almost 15 years ago. As a rebellious child, I decided to publish my own newspaper to share my opinions about products I use daily. I wrote critics, future notes and reviews almost about everything &#8212; from plugs to kitchen tools. Reviewing was boring, but manufacturing was very costly, [...]]]></description>
			<content:encoded><![CDATA[<p>It all started when I was younger, almost 15 years ago. As a rebellious child, I decided to publish my own newspaper to share my opinions about products I use daily. I wrote <em>critics, future notes and reviews almost about everything</em> &#8212; from plugs to kitchen tools. Reviewing was boring, but manufacturing was very costly, and my cheap implementations would be looking very ugly. So, I gave up fast.</p>
<p>I was introduced to programming and computing technology very long time ago. I was pushed to it and fascinated by the flow of bits and bytes. But everything was embodied in 1996, the day I met the Web. Finally there was an easy and cheap way to distribute products. And to be able to ship products, I had to learn programming. This is how I started.</p>
<p>Now as a professional, I still couldn&#8217;t understand why I&#8217;m not also responsible for budget, strategy, concept, ux  et al as a developer. I&#8217;m a products person, I want to code for beautiful products to change mindsets and push the limits for more market visibility. I&#8217;m driven by breakthrough concepts, user interaction improvement, performance, cognition and reasoning. If you cant convince me, I perform bad. To be honest, I&#8217;m not sure this is how a developer should act but this is my formula. My time is valuable and if you want me to invest it in your project, you have to convince me. I never remember myself applying for a company to work on a product I dont believe that I can dedicate myself to.</p>
<p>Most probably this makes me an inefficient developer. I get angry when we don&#8217;t make enough revenue and we ship features that turns into invisible toys that 80% doesnt even use. I find myself crazily analysing the logs where available and trying to understand how users think.</p>
<p>Now ask me how many companies I started. Actual the number is &#8220;one&#8221; &#8212; the sector was totally out of technology business. We had great recognition from major industry players in the USA and our main service was quite profitable for college students. I made some huge mistakes in the past two years with losing the entrepreneurship I have inside. Now I decided to be a half entrepreneur and half time&amp;energy investor.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/444/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Custom Scroll Distance for UIScrollView</title>
		<link>http://blog.burcudogan.com/413/</link>
		<comments>http://blog.burcudogan.com/413/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 23:01:27 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=413</guid>
		<description><![CDATA[Most recently, I was trying to create a slider for users to navigate between different items. A scroll view was working fine since it implements most of the scrolling behavior I needed in my application natively. But the content I want to scroll was smaller in width and UIScrollView is designed to scroll multiples of [...]]]></description>
			<content:encoded><![CDATA[<p>Most recently, I was trying to create a slider for users to navigate between different items. A scroll view was working fine since it implements most of the scrolling behavior I needed in my application natively. But the content I want to scroll was smaller in width and <strong>UIScrollView </strong>is designed to scroll multiples of its width. This was truly a problem. It was possible to scroll 2-3 items once a time and there were no focus, although I was looking for a one-to-one transition between different items.</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2009/12/scroll11.png"><img class="left alignnone size-medium wp-image-424" title="Slider" src="http://blog.burcudogan.com/wp-content/uploads/2009/12/scroll11-293x300.png" alt="Slider" width="293" height="300" /></a> There were possibilities to listen touches and calculate the positioning of the next item and scroll to it. But to be honest, I had no time to try out fancy and not-stable solutions. Instead of losing myself in the rules of UIScrollView, I wanted UIScrollView to get lost in me. Remind the rule: &#8220;Only scroll multiples of its width horizontally&#8221;. Great, so why not modifying scroll view&#8217;s size? Well, just because I want other items to be visible and lined together to give user a feeling that it is a slider.</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2009/12/scroll2.png"><img class="right alignnone size-medium wp-image-434" src="http://blog.burcudogan.com/wp-content/uploads/2009/12/scroll2-250x300.png" alt="" width="250" height="300" /></a></p>
<p>Normally, that is where you stop, but there appeared a trick to make it work my way. I decided not to clip the subviews of scroll view and TA-DA! Images were lined up together and were visible even though they were not in the bounds of my scroll view. Very simple and clean solution. Inline note please: Before moving to the &#8220;how&#8221;, I want to point out <strong>there is a problem with this trick</strong>. You cannot interact with items out of the scroll view boundaries. If your items are tiny, this is a huge problem because scrolling will only be active for 50-60 pixels. Consequently, use this trick if items are at least %50-%60 of the whole screen.</p>
<p>Start a new window-based Xcode project. Create a view controller with a xib file. Open xib file and add a UIScrollView to the main view. Return back to the controller you created and add a property to connect UIScrollView. Return back to Interface Builder. Modify the width, height and positioning of the view. Connect controller&#8217;s scroll view to UIScrollView we created.<strong> Enable paging and uncheck &#8220;Clip Subviews&#8221;</strong>. Our scroll view is ready to be filled. On the viewDidLoad method, I&#8217;m going to add several images.</p>
<pre>// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {

    [super viewDidLoad];

	int i = 0, cx = 0;

	for(;;i++){

		UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"image%d.png", i + 1]];

		if(image == nil)
			break;

		UIImageView *view = [[UIImageView alloc] initWithImage:image];
		view.frame = CGRectMake(cx,0, scrollView.frame.size.width, scrollView.frame.size.height);
		[scrollView addSubview:view];

		[view release];

		cx += scrollView.frame.size.width;
	}

	scrollView.contentSize = CGSizeMake(cx, scrollView.frame.size.height);

}</pre>
<p>And finally build and run. It is going to work.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/413/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Why should developers blog?</title>
		<link>http://blog.burcudogan.com/376/</link>
		<comments>http://blog.burcudogan.com/376/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 08:57:17 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[personal development]]></category>
		<category><![CDATA[social media]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=376</guid>
		<description><![CDATA[If I make an statistical study out of my friends and colleges who are developers, I can barely can say 10% of them are blogging. Is blogging a nightmare, a time waster, a cheap-seat show where bloggers act like significant people for them? I don&#8217;t know. I have one prediction: They don&#8217;t like writing. These [...]]]></description>
			<content:encoded><![CDATA[<p>If I make an statistical study out of my friends and colleges who are developers, I can barely can <strong>say 10% of them are blogging</strong>. Is blogging a nightmare, a time waster, a cheap-seat show where bloggers act like significant people for them? I don&#8217;t know. I have one prediction: They don&#8217;t like writing. These people are tech savvy, they are not like my mother who doesn&#8217;t know how to publish on Web. They have sufficient writing capabilities their readers won’t complain about. They have weekends off and most of them are single.<br />
<img class="right size-full wp-image-398" title="Blogging Culture" src="http://blog.burcudogan.com/wp-content/uploads/2009/11/blogging1.gif" alt="Blogging Culture" width="300" height="199" /><br />
I started my Internet fanaticism with writing in 1996-97. But releasing my first personal took another 10 years to happen, just a few years ago in 2006. Since I started to blog technically in a more personal area, my life changed fast. I have met dozens of people regardless of geological distances, interchanged great amount of knowledge, made friends, found people who can challenge me and found jobs. Besides these benefits, I have other reasons to blog technically:</p>
<h2>1. It&#8217;s natural: You have passion for technology</h2>
<p>You don&#8217;t have to have a reason. This should be very natural. If you are passionate about technology, you are also passionate about the trends in tech. Blogging is the top of the game since 2002-2003. Regretting the fashions won’t make you a cooler person. Early adoption gives a better impression. Running a blog and not making money out of it gives me one obvious signal: <em>I&#8217;m passionate about what I&#8217;m doing, this is not just a job to earn my life.</em></p>
<h2>2. Self promotion</h2>
<p>Isn&#8217;t it obvious? Nowadays if you are not on the Web, you are nowhere. You will at least have a personal space to introduce yourself to the world of networks. It&#8217;s good because you can find others who are interested in similar technologies and are passionate for similar concepts.</p>
<h2>3. Self improvement</h2>
<p>How could writing improve my own abilities? It&#8217;s usually being asked. Being socially active is the best thing to find more people who can challenge your existing capabilities. I understand you were the smartest of your family, you had great marks at high school, was a top student at college and now a superstar employee. But due to the existence of your blog, everyday you have replies back to you from smarter people around to remind you are still a beginner. This is a great opportunity to see there are no limits and you are never done.</p>
<p>On the other hand, your blog serves as a timeline which captures your interests, technical knowledge and other capabilities. You can easily review yourself by taking a look at your older posts.</p>
<h2>4. Sharing Knowledge</h2>
<p>And obviously, sharing knowledge has its factor. It’s common for others to struggle where you went down. You may like to share an exceptional bug, a trick to make things work, a newly released product, methodologies, stories, experiences and reviews.</p>
<p>Blogging makes you a better developer. More people you meet, the better person you will be. Physically there are many constraints but an online representation of yours will fasten things. And as a blogger, I want to get that as an RSS feed! <strong>Now there is one thing I&#8217;m curious about. Do you blog or not? Why or why not?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/376/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Maps Development on Android: Registering a Maps API key</title>
		<link>http://blog.burcudogan.com/307/</link>
		<comments>http://blog.burcudogan.com/307/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 12:29:57 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=307</guid>
		<description><![CDATA[Location based applications are  musts on mobile platforms. Android does not have maps natively but Google Maps team is providing an add-on that comes with Android SDK (at least 1.5). In this post, I&#8217;m not going to show you how to pop out maps on your little mobile screen, but underline the application signature details [...]]]></description>
			<content:encoded><![CDATA[<p>Location based applications are  musts on mobile platforms. Android does not have maps <em>natively</em> but Google Maps team is providing an add-on that comes with Android SDK (at least 1.5). In this post, I&#8217;m not going to show you how to pop out maps on your little mobile screen, but underline the application signature details related with Maps API.</p>
<p>First of all in our to show map tiles properly, we need an API key. This is all because you are requesting from Google Data API and have to agree with the terms of service. I&#8217;m also sure that quote rules also apply.</p>
<p>Every Android application is signed with a signature of the publisher. While obtaining a key, you must provide the MD5 summary of your signature to Google, and Google activates possible transactions between Maps API and the application your signature signs. In order to complete these actions, you have to</p>
<ol>
<li>Obtain the MD5 summary of your signature. If you do not have a signature, you can use the default one.</li>
<li><a href="http://code.google.com/android/maps-api-signup.html">Sign up for an API key</a> directly from Google by providing the hash of your signature.</li>
<li>Use API key with map elements and generate a sample map view.</li>
</ol>
<h2>Obtaining an API key</h2>
<p>You will have to use the keytool to obtain information about signatures. If you haven&#8217;t created one, Android SDK puts a default one in your <code>~/.android</code> directory. In this tutorial, I&#8217;m going to show you how to register with this default signature. Open a terminal prompt and enter</p>
<pre>$ keytool -list -keystore <strong>~/.android/debug.keystore</strong></pre>
<p>It&#8217;s going to ask you the password of the keystore (debug.keystore). Default is &#8220;android&#8221;. If you receive a MalformedKeyringException, you are giving the wrong password. If everything works great, it will output a few lines of information including the hash. Please read the summary line and copy the hash.</p>
<pre>Certificate fingerprint (MD5): <strong>E8:F4:F2:BF:03:F3:3A:3D:F3:52:19:9B:58:20:87:68</strong></pre>
<p>After obtaining the summary key, you can jump to the next level &#8212; <a href="http://code.google.com/android/maps-api-signup.html">signing up for an API key</a>. Give the hash as input and register. Please note the API key Google has given to you.</p>
<h2>Generating Maps on Android</h2>
<p><img class="alignright size-medium wp-image-369 right" title="Maps" src="http://blog.burcudogan.com/wp-content/uploads/2009/11/maps-223x300.png" alt="Maps" width="223" height="300" />Android SDK comes with two archives. First one is the <code>android.jar</code> which contains the standard platform libraries. And <code>maps.jar</code> which is a library dedicated to generation of maps. In the maps API, you will notice <a href="http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html">MapView</a>. You can extend MapView to customize and add new features to show a custom map view. Or <a href="http://developer.android.com/guide/tutorials/views/hello-mapview.html">invoke the existing methods</a> to perform simple operations like panning, zooming and adding overlays to show information on the default map. There are great tutorials about Android&#8217;s map view and controller on web, I simply didn&#8217;t want to copy-cat the existing. Google&#8217;s <a href="http://developer.android.com/guide/tutorials/views/hello-mapview.html">Hello, MapView</a> is a place to start.</p>
<h2>Multiple-Developer Cases</h2>
<p>A signature can only be associated with a single API-key. What you are going to do if development is made across a team? You <strong>dont need to </strong>create different signatures for each developer and register them to use Data API one by one. Register a single signature and obtain a key. Then, <em>distibute the signature among the developers</em> &#8211; better add it to your version controlling system.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/307/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Redis: New Persistent Key-Value Store</title>
		<link>http://blog.burcudogan.com/324/</link>
		<comments>http://blog.burcudogan.com/324/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 21:16:23 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[redis]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=324</guid>
		<description><![CDATA[Most recently, I&#8217;m working on Redis which is a key-value datastore with interesting characteristics. It&#8217;s ultra fast and has built in atomic operations to handle concurrent usage. Although everything lives in-memory, Redis syncs with hard disk time to time to serve as permanent storage. Most impressively, downloading Redis and making a working build doesn&#8217;t take [...]]]></description>
			<content:encoded><![CDATA[<p>Most recently, I&#8217;m working on <a href="http://code.google.com/p/redis/">Redis</a> which is a key-value datastore with interesting characteristics. It&#8217;s ultra fast and has built in atomic operations to handle concurrent usage. Although everything lives in-memory, Redis syncs with hard disk time to time to serve as permanent storage. Most impressively, downloading Redis and making a working build doesn&#8217;t take more than a few minutes.</p>
<p>Redis explains itself as a non-volatile memcached with various in-built data structures. Instead of only key and string value pairs, you can have lists and sets as values. There are atomic pop/push operations to work on these structures and increment/decrement functionality to work on numeric values.</p>
<p>Several client libraries are available including Perl, Python, Erlang, C++, Ruby, Scala and PHP. To write a more meaningful post, I&#8217;d like to add lines from a simple Python script.</p>
<pre>
import redis

storage = redis.Redis()
storage.keys("a*")  # returns keys starting with a

storage.get("key1") # returns the value of "key1"
storage.set("key1", "hello world") # setting the value of "key1"
storage.delete("key1") # deletes the pair with key1.

# working on lists
storage.push('key2', 'This is the first value', tail=True)
storage.push('key2', 'This is the second value', tail=True)
print storage.pop('key2')
</pre>
<p>Most of <a href="http://code.google.com/p/redis/wiki/CommandReference">these methods</a> are ported to client libraries and are available in downloadable Redis archive.</p>
<p>Although Redis can not be distributed, it&#8217;s easy to set up a slave node to replicate the master. Since it syncs with hard-disk in certain intervals, there might be data-loss in possible system crashes. So, setting up a slave may decrease the risks. It&#8217;s also advised to use Redis on a central server and manage sharding in the application level.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/324/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why do Code Reviews Matter?</title>
		<link>http://blog.burcudogan.com/292/</link>
		<comments>http://blog.burcudogan.com/292/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 10:28:46 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=292</guid>
		<description><![CDATA[We build software together. Team sizes vary a lot but it&#8217;s usually not 2 or 3. Team members leave, new members join and in the end of the day codebases are shared among large numbers of  different and diverse people from development, testing and deployment. Code reviewing process is what you take into action every [...]]]></description>
			<content:encoded><![CDATA[<p>We build software together. Team sizes vary a lot but it&#8217;s usually not 2 or 3. Team members leave, new members join and in the end of the day codebases are shared among large numbers of  different and diverse people from development, testing and deployment.<br />
Code reviewing process is what you take into action every time you make modifications to the code&#8217;s itself. Even though you change a single line, before committing the code to repository, a peer reviews it and confirms it can be submitted. Reviews can help to decrease the number of bugs, vulnerable code pieces, misuses of coding standards and etc. In an environment with no reviewing practices, actual code <strong>wont be directly visible to developers</strong> before an other member opens file(s) for editing. <em>Without reviews, even though build passes QA tests,</em></p>
<ol>
<li>Readability of the code,</li>
<li>Compatibility with coding standards,</li>
<li>Organization of the codebase,</li>
<li>Documentation inside the code <code>/* comments */</code>,</li>
</ol>
<p>will stay as<strong> surprises</strong>. These may lead to a dirty and badly organized base after a few years of continuous development. Asking a peer before you integrate new code into your product is a better approach since you may most probably have more time to fix, reshape and enhance your code if you take the action earlier. Usually only one other team will have time to review your code. But reviewing should be done with two people. First one should be a master, the one that knows the existing system well and can see the big picture. He can guess the impacts of your certain changes among the codebase. Other peer should be ideally someone who is not very familiar with the code, so you can test how easy to get into your code if you have to assign a bug to a new member, how well it suits with patterns in software development, how simple and obvious your solution is.</p>
<p>Consequently, whatever you are working on is shared among people. Asking for a review is always better than not asking and keep your actual contribution as a secret until it needs to be changed.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/292/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Let&#8217;s modify our representation of addresses in adr microformat</title>
		<link>http://blog.burcudogan.com/258/</link>
		<comments>http://blog.burcudogan.com/258/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 21:25:37 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[microformats]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=258</guid>
		<description><![CDATA[Microformats define a representation spec for addresses, called adr. This year, I made two distinct proposal to modify the current draft, but turned down each time I tried. In this post, I&#8217;m going to address the current problems and how tiny enhancements can bring new horizons in the retrieval of location based information. The problem [...]]]></description>
			<content:encoded><![CDATA[<p>Microformats define a representation spec for addresses, called <a href="http://microformats.org/wiki/adr">adr</a>. This year, I made two distinct proposal to modify the current draft, but turned down each time I tried. In this post, I&#8217;m going to address the current problems and how tiny enhancements can bring new horizons in the retrieval of location based information.</p>
<h3>The problem</h3>
<p><a href="http://microformats.org/wiki/adr#Format">Current spec</a> does not serve as a latitude, longitude carrier. Current properties only include <em>post-office-box, extended-address, street-address, locality, region, postal-code and country-name</em> which are text fields to form an address. This schema is defined in vCard and migrated to hCard microformat in 2004. Then, the need of address-based extraction led them to copycat this format and call it <em>adr</em>. <strong>vCard&#8217;s final design spec was way before we had online maps. </strong>Nowadays, we have addresses all over the Web. Automatically directing these text addresses to locations on maps or providing a preview on hovers would be the first basic attempts to improve our data representations. But unfortunately, maps are talking more in mathematics than text addresses. In practise, there is a process that takes addresses and transforms them into a latitude, longitude couple and pans map to that location. This process is called <a href="http://en.wikipedia.org/wiki/Geocoding">geocoding</a>, and it is far away from perfection in today&#8217;s scale. Instead of depending on a geocoder to transform addresses into mathematical locations, I suggest microformats to enable built-in (lat, long) arrays in adr.</p>
<h3>Extending adr with a set of latitudes and longitudes</h3>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2009/08/poly.jpg"><img class="right" title="British Museum" src="http://blog.burcudogan.com/wp-content/uploads/2009/08/t_poly.jpg" alt="" width="320" height="200" /></a>What I&#8217;m going for is to extend adr with an optional list of (lat, long) values. So, in cases where coordinates are given, instead of asking a geocoder to land us on a location we can directly move. But why to use a list of coordinates and not a single point? Because, in spatial domain different geometric structures are being represented as different shapes. Examples are below.</p>
<ol>
<li> If you are talking about a city centre, it&#8217;s most likely to be a <strong>Point</strong>.</li>
<li>Mississippi river is a long long <strong>Line</strong>.</li>
<li>And a university campus is obviously a <strong>Polygon</strong>.</li>
</ol>
<p>In the image above, British Museum is represented by 12 latitudes and longitudes as the inner area which these points compose. On the other hand another representation may be made with the centre point of the museum with (51.529038,-0.128403). Formally speaking, the museum is located on &#8220;<em>British Museum, Great Russell Street, London, WC1B 3DG, UK</em>&#8220;. And this translates to the coordinate I gave. What about using them together to form:</p>
<pre>
&lt;div class="adr"&gt;

&lt;div class="street-address"&gt;Great Russell Street&lt;/div&gt;
&lt;span class="locality"&gt;London&lt;/span&gt;,
&lt;span class="postal-code"&gt;WC1B 3DG&lt;/span&gt;,
&lt;div class="country-name"&gt;UK&lt;/div&gt;

&lt;div class="geo"&gt; &lt;!-- optional coordinates attribute from geo --&gt;
&lt;span class="latitude"&gt;51.529038&lt;/span&gt;,
&lt;span class="longitude"&gt;-0.128403&lt;/span&gt;
&lt;/div&gt;

&lt;/div&gt;
</pre>
<p>In the example above, I&#8217;ve used <a href="http://microformats.org/wiki/geo">geo</a> to include the single point &lt;lat, long&gt; optionally to map the address to a physical location. More useful structures can be defined within standards to enable multiple point entries to provide polygons such as 12-point representation of British Museum in the image above. Or basically, multiple geo entries inside an adr may work.</p>
<p><strong>TODO:</strong> Write about the impact this usage can bring.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/258/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing for Accuracy and Precision</title>
		<link>http://blog.burcudogan.com/243/</link>
		<comments>http://blog.burcudogan.com/243/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 08:34:22 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=243</guid>
		<description><![CDATA[Software testing has no boundaries at all. This discipline is so unique that it’s not very common to see systematic approaches due to the variety of material and the changing tradeoffs. A few weeks ago, I came across to a decent software testing article from a Microsoft engineer which was published on Live Spaces. Unfortunately, [...]]]></description>
			<content:encoded><![CDATA[<p>Software testing has no boundaries at all. This discipline is so unique that it’s not very common to see systematic approaches due to the variety of material and the changing tradeoffs. A few weeks ago, I came across to a decent software testing article from a Microsoft engineer which was published on Live Spaces. Unfortunately, it was followed by<em> 2 spam comments</em> &#8212; was very ironic to see such an <strong>assertive article</strong> was ruined by two regular Russian spammers.</p>
<p>I love machine learning and classification. My whole life is being spent between two parameters: accuracy and precision. These are the common statistical values to determine how successful your system is. If you have a search engine, accuracy may tell you what percentage of retrieved documents are really relevant. And percentage is a value to determine how likely your results cover all the relevant documents available.</p>
<p>Surprisingly a few days ago, I was asked to break a machine learning system during a job interview. I was asked to come up with some possible cases. According to my own philosophy, accuracy and precision are parts of the system requirements. They are related with the <strong>quality of the overall product</strong>. But how are you going to collect information to come up with these numbers? Imagine you are working on a searching engine. Is it manageable to find n people and ask them manually if they like the results or not? Will your sample (<em>n people</em>) reflect your user base? How costly it will be and how objective? Is it really scalable? Is it possible to for a human to read all of the documents on the Web and decide which are really related to his search phrase? These are a few introductory level problems with analysis of accuracy and precision.</p>
<h3>Post-Processing and the Importance of Feedback</h3>
<p>It may not be critical for you to release a product with a target accuracy and precision. Mostly, consumer market suits this model the best. But this alone should not be translated into the “inessentiality of the quality tracking”. I am just advising you to track the quality after the release <em>(similar to ship-then-test method).</em> Detect which results are exit-links, provide instant feedback tools for users to relocate their results and etc. Use acquired feedback to improve the existing system. Testing may not be done with the release, you may need to discuss and analyze if your product is performing well and report to your development team and influence them with scalable user-oriented improvements.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/243/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Addresses Not Found in High Traffic</title>
		<link>http://blog.burcudogan.com/238/</link>
		<comments>http://blog.burcudogan.com/238/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 13:19:36 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[dns]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/238/</guid>
		<description><![CDATA[My sister found herself a new downloading hobby and I was not planning to be the hobby killer until everything became inaccessible for both of us. She’s heavily downloading recently, I’m not sure about the material but it’s  high load. Pages were coming slower on my side as it was expected and I’m not saying [...]]]></description>
			<content:encoded><![CDATA[<p>My sister found herself a new downloading hobby and I was not planning to be the hobby killer until everything became inaccessible for both of us. She’s <em>heavily downloading</em> recently, I’m not sure about the material but it’s  <strong>high load</strong>. Pages were coming slower on my side as it was expected and I’m not saying I have a wide bandwidth but overall bottleneck was not just the slower uploads or downloads.</p>
<h3>UDP 53, what’s wrong there?</h3>
<p>I started to recognize a pattern. My downloads were even more slower because resolving was failing miserably every time I try. I was not even able to resolve domain names to IP addresses. Had to check myself what might cause this problem. As a quick note, if your local DNS cache (managed by operating systems) doesn&#8217;t have a record of the domain name you’re trying to visit, you make a request to one of the nearby DNS servers to return the associated IP. If your nearby server doesn&#8217;t have that record, it asks to root servers etc. Most of my reader audience knows the story well. This communication is made on UDP port 53. UDP is a <strong>connectionless</strong> way to transmit data. Unlike TCP, you don&#8217;t have to spend time on three-way-handshakes to make a proper connection that both of the sides are aware of. But if your packets get lost, nobody is responsible. It’s like playing a game, many tradeoffs similar to every engineering issue.</p>
<p>I gently asked my sister to stop a while, and started receive not timed-out UDP answers back. Resolving problem was fixed. But I had to be convinced that UDP is the best ever been chosen from. I understood the fact the essential parameter was latency. We have to be fast, faster and fastest as possible. Wanted to take time back to understand why it is designed this way and my problem appeared with a solution in milliseconds.</p>
<h3>Why DNS is using UDP?</h3>
<p>Reliability versus fastness. Remind the rule. If you don’t have the address, ask a <strong>nearby name server</strong>. Is it implicitly saying “<em>Don’t go too far</em>.”? Probably it is. You’re not on a very reliable connection and if your traffic load is very high, there will be many conjunctions, long delays and large jitters. My dns requests most probably couldn&#8217;t even making it to the name server. And since my ISP’s name servers are not reliable, I was using <a href="http://www.opendns.com/">OpenDNS</a>. Translation: <em>I was far far far away from the source</em>.</p>
<p>I fixed the issue. Even crazy downloading is again on, my domains are resolving rapidly at the moment. I’m extremely happy. If you’re using OpenDNS at office or LANs which have more than 20+ clients, make yourself a favor and set up a local name server today.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/238/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Data Manipulation on Client Machines</title>
		<link>http://blog.burcudogan.com/227/</link>
		<comments>http://blog.burcudogan.com/227/#comments</comments>
		<pubDate>Fri, 22 May 2009 11:47:42 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[clientside]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[realtime web]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=227</guid>
		<description><![CDATA[It&#8217;s my third week and I&#8217;m discussing the scalability of the real-time web. We&#8217;re only talking about text input, realtime search, trend extractions and etc. I had a love growing inside for this instant replier, it makes me feel I&#8217;m more connected to real people (sort of egoism). It&#8217;s good because we have text, none [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s my third week and I&#8217;m <a href="http://friendfeed.com/search?q=realtime&amp;comment=thejbf">discussing</a> the scalability of the real-time web. We&#8217;re only talking about text input, realtime search, trend extractions and etc. I had a love growing inside for this instant replier, it makes me feel I&#8217;m more connected to real people (<em>sort of egoism</em>). It&#8217;s good because we have text, none of the realtime providers are working on more than indexing the &#8220;text&#8221; for searching, as it revealed. Text is medium of communication and there are a lot more: images, audio, videos etc. You are not really interested in multimedia as I guess because, <em>text is cool</em>. You can skim it, you can select it, easily process it. But the world is not man-made and I cant even imagine a moment where maps are served as text, for example. Typing is human&#8217;s built-in analog to digital converter. Love it or not, but we are forced ungracefully by this nature to talk in multimedia when text alone is not efficient enough.</p>
<h3>Realtime Data Processing</h3>
<p>Realtime environment have to play with data to make connections, be able to provide smart searching that does not only depend on full-text comparison. Imagine that they have to tokenize text input to post-process what&#8217;s going on with the message. Almost requires O(n) on CPU. Twitter has about 1 million users, let&#8217;s assume averagely every user enters a new twit once in 3 days and average entry is 100 characters long (doesn&#8217;t sound realistic, but let&#8217;s be optimistic). It converges to 350k posts a day. 350k times tokenizing the 100 character-long input = <strong>35 million characters</strong> are processed during a day.  I tried to tokenize a 100 char string 350k times and it took only 41 seconds since I was using the same string over and over again. With helps of caching, CPU minimizes the memory I/O and it made a huge difference, so my 41 seconds were far from being accurate. But besides tokenizing, there are other operations you have to run. And once you fetch it from memory, you&#8217;re done. Therefore, I believe it&#8217;s not really an extra load to tokenize the input on the server-side.</p>
<p>But, what would you do if you have to post-process terabytes of imagery? I&#8217;m not sure if you are aware of Microsoft&#8217;s Virtual Earth 3D but, it is more like<strong> Google Earth running on your browser</strong>.</p>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/RealtimeWebandDataManipulationofClientMa_A8D3/Untitled2_3.jpg"><img class="inline" style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" title="Virtual Earth 3D" src="http://blog.burcudogan.com/wp-content/uploads/RealtimeWebandDataManipulationofClientMa_A8D3/Untitled2_thumb_3.jpg" border="0" alt="Virtual Earth 3D" width="648" height="288" /></a></p>
<p>A very long time ago, I was making a demo to my friends and showing the Mt. Rainer in WA distinct in 3D mode. Virtual Earth 3D fetches higher quality imagery for forefront. Since there is no colour balance adjustments at VE imagery, many people thought  the level differences on the scene is sort of a corruption and not good looking. I decided to talk to engineers that we can solve this problem with <em>relative histogram equalization</em> (fancy name but easy method). I didn&#8217;t sound perfectly realistic, cause our imagery were tens of terabytes and it was very risky to process them all for such a tiny improvement.<span id="more-227"></span></p>
<p>Luckily, I recognize client power for the first time and the power it brings out. I was going to add a improvement step to equalize imagery once it is loaded as &#8220;it is&#8221; to user machine. User&#8217;s itself was about to play a role to balance images on the front-end.</p>
<h3>Future of the Web: More Realtime Data Needs More Client Power</h3>
<p>Twitter example is quite lightweight, 35 million characters/day is not huge as you may guess. As millions started to use realtime equipment passionately and generate a hundred thousands times more content than this, we may have to take advantage of our user&#8217;s machines mostly for pre and post processing of data. All of the new client technologies are about the provide a rich environment and framework to let the users contribute to the overall system with scalability. Future is going to be all about <strong>making a distribution decision between clients and servers</strong>. If you are a server guy who has no idea on the user machines, study your lesson before this balance dominates the world.</p>
<p><strong>Edit: </strong>Sorry for quoting VE&#8217;s 3D mode with Silverlight, thanks for Jon O&#8217;Brein (a Microsoft MVP) for fixing my deadly fault. I was high or something.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/227/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why Do I See Software Development Job Titles as Nothing but Virtual Positions?</title>
		<link>http://blog.burcudogan.com/222/</link>
		<comments>http://blog.burcudogan.com/222/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 21:58:34 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=222</guid>
		<description><![CDATA[There are so various areas and people involved with software that &#8220;software development&#8221; phrase alone doesn&#8217;t give you enough perception about what the real job is. I proclaim that there are stereotypes in this field: code monkeys, every job developers, developers specialized in an area, revolutionary brains, problem solvers etc. They all share some characteristics, [...]]]></description>
			<content:encoded><![CDATA[<p>There are so various areas and people involved with software that &#8220;software development&#8221; phrase alone doesn&#8217;t give you enough <em>perception</em> about what the real job is. I proclaim that there are stereotypes in this field: code monkeys, every job developers, developers specialized in an area, revolutionary brains, problem solvers etc. <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="ISoftwareDeveloper" src="http://blog.burcudogan.com/wp-content/uploads/HowWouldYoustartProgrammingIfyouwereaChi_1EF2/image.png" border="0" alt="ISoftwareDeveloper" width="285" height="122" align="right" /> They all share some characteristics, some behaviours, some little common knowledge. The mutual attribute is only the names. We all know that they can code. But they implement coding behaviour entirely in different ways.</p>
<p>I started to code with a fundamental function to find roots of a 2nd order equation and easily understood how programming can reduce the amount of time I&#8217;m spending on <em>trivial calculations</em>. The Internet was becoming widely available (at least in the community I was living). There was a technology boom, the access rate to the &#8220;<em>new</em>&#8221; were increasing wildly. I decided to learn as far as I can and in the end I became a giant language and framework addict, although I had <strong>no deep knowledge in anything</strong>. But it was driving me because, the particular technology I was interested in was helping me to turn my fancy ideas into concrete products. So, not for doing all for learning the technology&#8217;s itself doesn&#8217;t make me a software developer now? How dramatic.</p>
<h2>Being a software developer with no purpose</h2>
<p>It&#8217;d really taken me far too long to get aware of the ecosystem of a software-dominated system without formal education. However, before  I had reasons to learn, <strong>I had never dreamt of being a professional software developer</strong> – cause all alone <em>it was meaningless, </em>especially in a situation when software you&#8217;re bringing out doesn&#8217;t have any purpose <em>other than making profit</em>. Nobody does have dreams like being the greatest developer in this or that field. People like me usually tend to be remembered with</p>
<ol>
<li>a groundbreaking product, a method changes the concepts, a more efficient way of doing things.</li>
<li>being a leader in a specific area to influence other people.</li>
</ol>
<p>They put meaning into every single duty they are working. I personally don&#8217;t look programming jobs as jobs. It&#8217;s a great opportunity to access a company&#8217;s tools and existing audience to make differences quicker than forming a new start-up, gain respect and deal with financial stuff. But again with purpose, you always have the &#8220;<em>If you&#8217;re not hiring me,</em> <em>I&#8217;ll be doing the same on my own</em>&#8221; advantage under the belt obviously. <span id="more-222"></span></p>
<p>Software is just a tool, not the ultimate reason. Many people in industry don&#8217;t seem to understand it. Of course, the better and deeper you know about the technology, the impact you can make will be larger. Development alone is a very wide and challenging issue, that&#8217;s why it is titled as a separate profession nowadays. But instead of thinking totally machine oriented, you have to have a main goal and use tech to fasten it.</p>
<p>I&#8217;d love to see specialized development titles instead of everyday titles we face today like: software engineer, software developer, software development engineer and etc. <strong>Biotech/Bioinformatics</strong> is a great example alone for separating itself from the<em> mainstream tech community</em>. Take  a look at the following job posting:</p>
<blockquote><p>X is searching for an experienced Software Developer to support the Production Genomics Facility in Y. The mission of the X is applying genomic science to the critical fields of bioenergy, bioremediation and carbon cycle management. The X applies both the latest high-volume sequencing technology and classic Sanger processes to sequence and analyze thousands of large and small genomes&#8230;</p>
<p><strong>Skills Required<br />
</strong>- Create, manage, and query MySQL databases.<br />
- Develop and utilize Perl classes, modules, and scripts for managing data and performing analyses; and Perl/CGI web pages for providing user access.</p></blockquote>
<p>Why don&#8217;t we see similar ads from most of the software/hardware companies today? Give me a reason to get excited of what you are doing now, so that I can check the if I meet with your qualifications.</p>
<p>Consequently, software development title is artificial, it is not concrete. You basically don&#8217;t have a clue about what you&#8217;re going to do <em>inside</em> while you are applying. I wish companies were a little bit specific on titles and descriptions. Yes, I am agree with you that this basically applies to many industries. But, software is a supporting tool in many industries alone. So, it is a special case, it&#8217;s far more problematic.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/222/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Using Paper and Pencil Before Coding</title>
		<link>http://blog.burcudogan.com/210/</link>
		<comments>http://blog.burcudogan.com/210/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 18:02:40 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[deep thinking]]></category>
		<category><![CDATA[software design]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=210</guid>
		<description><![CDATA[I don&#8217;t remind myself starting to code, even a single tiny function, without illustrating it on paper. Do I write code on paper? Yes, I also do that. I adore coding on whiteboards where many people can come together on a coffee break and discuss. Most of the young developers ignore that single rule in [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t remind myself starting to code, even a single tiny function, without illustrating it on paper. <em>Do I write code on paper?</em> Yes, I also do that. I adore coding on whiteboards where many people can come together on a coffee break and discuss. Most of the young developers ignore that single rule in software development. To write decent code, you have to spend <strong>more time on thinking, criticising, brainstorming</strong> – determining what the problem is before getting into the solution. Defining the constraints, getting aware of the exceptions, and so on.</p>
<h2>Early Starting or Deep Thinking?</h2>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/IAlwaysUsePaperandPencil_F241/nbody.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="nbody" src="http://blog.burcudogan.com/wp-content/uploads/IAlwaysUsePaperandPencil_F241/nbody_thumb.jpg" border="0" alt="nbody" width="121" height="119" align="left" /></a>I wish the first idea comes to mind was the perfect one. But usually, it is not even close enough to be a good solution – it is often greedy and very straight-forward. The more you learn about the problem and its characteristics, the better and more efficient solution will pop up. If you start coding in the first hour, you will probably never ever finish the task. I&#8217;d like to share a case study from Jon Bentley&#8217;s amazing book, <a href="http://www.amazon.com/Programming-Pearls-2nd-ACM-Press/dp/0201657880">Programming Pearls</a>.</p>
<p>The story is about Andrew Appel and his experience on reducing the run time of a system from <strong>one year to one day</strong>. They had to simulate the motions of <em>N objects</em> in 3D space, given their masses and initial positions and velocities. They basically were interested to predict the positions of planets, stars, galaxies 10 years, 100 years, 1000 years later. In a 2D space the input may look like the image on the left: a large set of vectors.</p>
<p>The regular simulation programs divide time into small steps and computes the progress of each object at each step. Due to the existing of gravitational field and mass attractions, the computational cost were proportional to N<sup>2</sup>. Appel estimated that 1000 time steps of such a system with <em>N=10000</em> objects would require more than one year on a VAX-11/780 or a day on a <a href="http://en.wikipedia.org/wiki/Cray-1">Cray-1</a>. Andrew had to develop a system far more efficient than a one-year-running turtle. After several speedup improvements, he reduced the runtime to less than a day on VAX-11/780 &#8212; almost 400 times faster than the initial setup.<span id="more-210"></span></p>
<p>He managed to change the concept on many levels to make such a huge difference.</p>
<ol>
<li><strong>Data Structures:</strong> Foremost, O(<em>N<sup>2</sup></em>) had to go. He decided to represent objects as leaves on a binary tree; higher nodes were representing the cluster of objects. The force operating on a particular object can be approximated  by the force exerted by the large clusters. This alone reduced complexity to O(<em>N logN</em>) by a factor of <em>12</em>.</li>
<li><strong>Algorithm Tuning:</strong> Initial algorithm has to use tiny time steps to handle the rare case that two particles come closer to one another. Usages of tree-based structure enabled investigation of such rare cases possible<em> independently from time steps</em>. As a result, Andrew doubled the time step size and <em>halved</em> the run time.</li>
<li><strong>Data Structure Reorganization:</strong> The tree that was representing the initial objects was quite bad in representing the later sets. Reconfiguring the tree at every new step was a bit costly but reduced the number of local calculations and <em>halved</em> the total runtime.</li>
<li><strong>Code Tuning:</strong> Due to additional numerical accuracy provided by the tree, 64-bit floating point number could be replaced by 32 bit single-precision, <em>halved</em> the runtime. Additionally, profiling the application showed that 98% percent of runtime was being spend in one procedure. Rewriting that procedure in assembly  increased the speed by a factor of <em>2,5</em>.</li>
<li><strong>Hardware Extensions:</strong> Moving the program to a similar machine with a floating point accelerator <em>halved</em> the total runtime.</li>
</ol>
<p>Finally new system was requiring only one day to simulate 10k objects. Most of the work done by Andrew Appel were visible without writing a single line of code. If your inventions don&#8217;t rely on the statistical results to be proved, you should be able to make all decisions without writing a single line of code. Being able to predict the system&#8217;s response on paper can make you the the one makes the differences.</p>
<p>Even in professional environments, people tend to start coding as soon as possible. Initial design doesn&#8217;t only lead you functional mistakes and a program with tones of bugs, but may blind you to see the problem from different aspects and representing data in a different ways to fasten the system. Only good estimators can code good software. Therefore, I&#8217;m not interested in which <strong>new fancy technologies you know</strong>, far more interested if you have <em>a wide range from top to hardware</em>, able to see the bottlenecks and improve them on paper. Then, any developer can write the code.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/210/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JPEG to Compress Vector Graphics?</title>
		<link>http://blog.burcudogan.com/201/</link>
		<comments>http://blog.burcudogan.com/201/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 22:26:39 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[image compression]]></category>
		<category><![CDATA[jpeg]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[png]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/201/</guid>
		<description><![CDATA[Compressing, entropy and information theory have things in common with economics. Nobody&#8217;s going to turn his head unless you stop talking maths. I truly understand they are a bit boring and complex for your grandmother, but surprisingly most of the technical people doesn&#8217;t bother to understand the underlying concept either. In this post, I&#8217;m going [...]]]></description>
			<content:encoded><![CDATA[<p>Compressing, entropy and information theory have things in common with economics. Nobody&#8217;s going to turn his head unless <em>you stop talking maths</em>. I truly understand they are a bit boring and complex for your grandmother, but surprisingly most of the technical people doesn&#8217;t bother to understand the underlying concept either. In this post, I&#8217;m going to pass over the following topics in a daily tongue to illustrate the overall scheme on your mind:</p>
<ol>
<li>What is image compression and why do we use it? </li>
<li>A short brief of JPEG compression. </li>
<li>A review of <a href="http://maps.google.com/">Google Maps</a> and <a href="http://maps.live.com">Live Search Maps</a> for serving images as the primary content. </li>
</ol>
<h2>Introduction to Image Compression</h2>
<p>If you understand the term <em>&quot;compression</em>&quot;, it doesn&#8217;t mean we are over with the definition. Hold on. </p>
<blockquote><p>Image compression, the art and science of reducing the amount of data required to represent an image, is one of the most useful and commercially successful technologies in the field of digital image processing. (<em>Digital Image Processing 3rd Ed., Gonzalez &amp; Woods, page 525</em>)</p>
</blockquote>
<p>Let&#8217;s first try to understand how compression became one of the most commercially successful field in image processing? With the irrepressible popularity of television and Internet (after mid-90s), images and videos become significant elements to represent information. With no compression;&#160; a coloured <a href="http://en.wikipedia.org/wiki/Standard-definition_television">standard TV</a> broadcast, 640&#215;480 wide with refresh rate of 30 frames per seconds, requires 27,648,000 bytes to be transmitted per second. Even in tomorrow&#8217;s technology, supplying a connection of almost 30Mbytes/second just for a TV cast doesn&#8217;t seem to be possible with no doubt. It&#8217;s no surprise to hear many failed quotes back from early 1900s that television will never be able to find opportunity to be on the market.</p>
<h3>Data versus Information</h3>
<p>When the issue is compression, it refers to the compression of data. Data is being transferred to carry information. Therefore, we might be able to reduce the amount of data to represent a given quantity of information. A parrot in a very populated barber shop in downtown loves to say &quot;Hello&quot; to every new customer that comes in. How would you transmit the words it spells in text most efficiently?</p>
<p><img class="inline" title="Data vs. Information" border="0" alt="image" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image.png" /> </p>
<p>Statistically hello is the most common word. Representing it in a bit is highly acceptable, instead of transferring 5 characters (5*8 = 40 bits). In the example above, it&#8217;s very clear that statistics say &quot;stranger&quot; is the second word we most likely to hear from parrot and so on. Converting (mapping) the string array into a bit stream saves 94% of bandwidth in this case. <a href="http://en.wikipedia.org/wiki/Huffman_coding">Huffman coding</a>, which is going to remind you the method above, guarantees you to use minimum possible number of bits if you have statistical information of data.</p>
<h3>Image Compression Techniques</h3>
<p>Generally, image compression techniques are separated into two columns:&#160; lossy and lossless compression. Lossy methods takes the advantage of capabilities of <strong>human vision range</strong>, eliminates details and loose information to reduce amount of data. Lossy methods are mostly used for natural images. In lossless compression, encoding process finds a smart way to represent same amount of information in lesser amount of data, just like in the example above with Mr. Parrot. And some may use hybrid models to mix advantages of both sides.<span id="more-201"></span> </p>
<h2>JPEG Compression</h2>
<p><a href="http://blog.burcudogan.com/wp-content/uploads/2009/04/image2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image-thumb.png" width="300" height="67" /></a>JPEG is a hybrid compression method, optionally can perform as totally lossless. It mainly depends on the fact that correlation between close pixels doesn&#8217;t change much in natural photos. So, we are able to guess closer pixels around if we know the one in the middle. JPEG&#8217;s encoding algorithm is separated into four steps:</p>
<ol>
<li>Blocking the image into little pieces, usually 8&#215;8 pixel blocks – some use 16&#215;16 blocks. Separating images into little pieces will help us the guess the nearby pixels. </li>
<li><strong>Discrete Cosine Transform (DCT):</strong> In &quot;<em>simple</em>&quot; terms, this process generates a bit stream for each block which starts with the average value of the block continuing the details of how pixels change horizontally and vertically. So, as an addition to the guess, we have extra information to fix it. Therefore, DCT is totally lossless. It only represents the same information in other words. Outputs a stream of 64 numerical elements like: 125 34 –32 43 2 21 –43 1 –3 4&#8230; (Smart way to represent information) </li>
<li><strong>Quantization:</strong> Adjusts precision.&#160; This is where we loose information. Output stream may turn into: 125 35 –30 45 0 20 –45 –5 5&#8230; (Human vision range is not that sensitive) </li>
<li><strong>Entropy encoding:</strong> You may encode the stream coming from quantization with Huffman coding to save bandwidth – just like how we did in the parrot example. (Smart way to represent information) </li>
</ol>
<h2>Maps and Compression</h2>
<p>Maps serve images as their <em>primary content.</em> Most of the providers have road, aerial, labelled road, labelled aerial, terrain (<a href="http://maps.google.com/?ie=UTF8&amp;ll=51.727028,5.844727&amp;spn=13.051211,39.550781&amp;t=p&amp;z=5">Google does</a>), bird&#8217;s eye (<a href="http://maps.live.com/default.aspx?v=2&amp;FORM=LMLTCP&amp;cp=skj331gzpckc&amp;style=b&amp;lvl=1&amp;tilt=-90&amp;dir=0&amp;alt=-1000&amp;scene=16378878&amp;phx=0&amp;phy=0&amp;phscl=1&amp;encType=1">Live Search Maps does</a>) and etc. In this section, I&#8217;m going to discuss mostly the <em>aerial imagery</em> and how many bytes they are spreading to share the same amount of information. Both of the providers have road, aerial and aerial (with labels) image sources.</p>
<h3>Google Maps (maps.google.com)</h3>
<p>Google Maps choose to separate vector and natural images. Encode vectors as transparent PNGs and aerial images as JPEGs. And adds vector information as an overlay if user prefer to view the area with labels.</p>
<p><img class="inline" title="Aerial" border="0" alt="Aerial" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image3.png" width="150" height="150" /> <img class="inline" title="Labels" border="0" alt="Labels" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image4.png" width="150" height="150" /> <img class="inline" title="Aerial with Labels" border="0" alt="Aerial with Labels" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image5.png" width="150" height="150" />&#160;<a href="http://blog.burcudogan.com/wp-content/uploads/2009/04/image6.png"><img class="inline" alt="Road Map" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image-thumb1.png" width="150" height="150" /></a> </p>
<p>Image sizes in the corresponding order are: 27.6KB (JPEG), 13.7KB (PNG), 0KB (overlaid versions of 1st and 2nd image), 25.6KB (PNG). In this case, let&#8217;s count the bytes Google consumes on the following actions:</p>
<ol>
<li>Road imagery views: 25.6KB </li>
<li>A switch to labelled aerial: 27.6KB + 13.7KB = 41.3KB </li>
<li>A switch to aerial without labels: cost free </li>
<li><strong>Total cost</strong> = 25.6KB +&#160; 41.3KB = 66.9KB </li>
</ol>
<p>Google only seems to make an encoding decision depending on the image&#8217;s characteristics, JPEG for aerial, PNG for rest. But unfortunately, this leads to the transmission of repeated information of roads on an aerial switch. Take a look at image 2 and 4 above. </p>
<p>I&#8217;m guessing <strong>most people don&#8217;t tend to switch to aerial soon</strong> until they zoom in to <em>street level</em>. So, instead of pushing them to download two separate images for on road mode, Google Maps may choose this method. HTTP requests are costly. And a dozen of them are more costly than costly. A map control usually has to download 8-12 tiles depending on your screen resolution. Just think of the overhead that those 12 tiles are generating.</p>
<h3>Live Search Maps (maps.live.com)</h3>
<p>We are on the same area, somewhere in the downtown London again with Live Search Maps.</p>
<p><img class="inline" alt="Aerial" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image7.png" width="150" height="150" /> <a href="http://blog.burcudogan.com/wp-content/uploads/2009/04/image8.png"><img class="inline" alt="Hybrid" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image-thumb2.png" width="150" height="150" /></a> <img class="inline" title="Road Map" border="0" alt="image" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image9.png" width="150" height="150" /></p>
<p>Image sizes in the corresponding order are: 28.52KB (JPEG), 29.82KB (JPEG), 25.6KB (PNG). Repeating the same user actions above for a tile:</p>
<ol>
<li>Road imagery views: 25.6KB </li>
<li>A switch to labelled aerial: 29.82KB </li>
<li>A switch to aerial without labels: 28.52KB </li>
<li><strong>Total cost</strong> = 25.6KB + 29.82KB + 28.52KB = 83.94KB </li>
</ol>
<p>If every user were switching between these map modes back and forth on every zoom level, Google Maps would beat LSM with little difference*. Labels on aerial images don&#8217;t looks as sharp as Google&#8217;s, but keeps size in an appropriate level although it is encoded to be a JPEG. If users switches to non-labelled aerial very rarely, for example after pointing an area they are searching, this method might be practical and more efficient than Google&#8217;s overlaying concept. </p>
<p><img class="inline" title="LSM vs. Google Maps" border="0" alt="image" src="http://blog.burcudogan.com/wp-content/uploads/2009/04/image10.png" width="608" height="282" /> </p>
<p>Above, there are 200% zoomed versions of labelled aerial tiles from San Francisco. The left image comes from <a href="http://microsoft.com/virtualearth">Virtual Earth</a> and the other is Google&#8217;s. In my own personal opinion I find Google&#8217;s labels more readable than Virtual Earth&#8217;s, despite being 22-years-old and topping the heap when it comes to sensitivity in vision. </p>
<p>(*) Note: I repeated the process for 100+ random tiles. Ratios don&#8217;t seem to change much.</p>
<h5>Custom tiles?</h5>
<p>What about custom tile integration with Virtual Earth and Google Maps API? Google&#8217;s method allows you to overlay roads on your custom maps (didn&#8217;t check it, but it&#8217;s not a big deal &#8212; they already have isolated labels). </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/201/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Would you Like to Throw Exceptions from a Constructor?</title>
		<link>http://blog.burcudogan.com/144/</link>
		<comments>http://blog.burcudogan.com/144/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 00:40:33 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[constructors]]></category>
		<category><![CDATA[exceptions]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=144</guid>
		<description><![CDATA[Throwing an exception from a constructor has always been an arguable issue between my friends after a few beers of joy. It firstly came to me on an exam where question was asking me to design a class which lets not more than n number of instances to be constructed. Not using the most straight-forward [...]]]></description>
			<content:encoded><![CDATA[<p>Throwing an exception from a constructor has always been an arguable issue between my friends after a few beers of joy. It firstly came to me on an exam where question was asking me to design a class which lets <em>not more than n number of instances to be constructed.</em></p>
<p>Not using the most straight-forward trick to have a private constructor, I decided to invoke an exception from constructor if there exists more than n instances of that particular class. Luckily, I was coding in Java and had the comfort of a managed environment under the belt. My answer wasn’t graded thankfully but this case became a major concern and I decided to make several experiments back in the old days.</p>
<p>According to what I have seen while debugging, Java simply assigns a number of nulls or zeros to all of the fields of the class unless constructor is successfully executed. Additionally, right after an exception is thrown from a constructor, a null reference is returned and the newly created invalid instance starts to wait for the <strong>garbage collector</strong> to pick it up and remove the useless object from memory permanently. In short terms, a new instance is created although platform tends to murder it quickly in silent.</p>
<h2>What about Unmanaged Platforms?</h2>
<p>It was nice to see somebody was taking care of such exceptional situations but what would you do if you were alone? Fault tolerance isn’t just catching all exceptions: (from slides of <a href="http://www.research.att.com/~bs">Bjarne Stroustrup</a>)</p>
<ol>
<li>The program must be <strong>in a valid state</strong> after an exception is caught</li>
<li><em>Resource leaks must be avoided</em></li>
</ol>
<p>This will become a problem where memory management is all up to you. You will have to remove and cleanup resources after an exception has been thrown, otherwise it will cause a leakage in memory and you will have created a zombie object hanging around memory &#8212; attached to the mother thread.</p>
<h2>Cleaning Up the Mess of C++</h2>
<p>An object is not even an object once its constructor finished successfully. So, better try to release resources inside the constructor before you throw an exception. In this case, I&#8217;m always using a <strong>double-exception throwing pattern</strong> that I made up and passionately using it in similar situations I face.</p>
<p>Let&#8217;s ask the complier! Two lines of code is always more representative than 10 lines of words. Here below, I&#8217;ve written a class called &#8220;Foo&#8221;, not functional but dangerous and an exception &#8220;StreamInitException&#8221; was decided to be thrown if there happens a problem while longStreamChar is being initialized. Right after we allocate 10k bytes for longStreamChar, <strong>BOOM</strong>! Someone pushed the wrong button, somebody shut down the database or trouble makers&#8217; spirits are near. Don&#8217;t try to catch it inside the constructor and see what happens. Many orphan kids, once we named them as longStreamChar, are all around and we can&#8217;t even access them.</p>
<pre>#include &lt;iostream&gt;

struct StreamInitException {
    StreamInitException(char * m){ message = m; }
    char * message;
};

class Foo {
    public:
        Foo(){
            try {
                this-&gt;initCharStream();
            } catch(StreamInitException * ex) {
                this-&gt;~Foo(); //release resources
                throw ex; // exception originally thrown by initCharStream
            }
        }

        ~Foo(){
            if(this-&gt;longCharStream)
            delete this-&gt;longCharStream;
        }

        void initCharStream(){
            //create a long char array of 10k
            this-&gt;longCharStream = (char*)malloc(10000);
            throw new StreamInitException("Error occurred during init.");
        }
    private:
        char * longCharStream;
    };

int main(){

    Foo * foo = NULL;

    try{
        foo = new Foo;
    } catch(StreamInitException * ex){
        std::cout &lt;&lt; ex-&gt;message &lt;&lt; std::endl;
    }

    return 0;

}</pre>
<p>Therefore, I&#8217;m handling init related bad moments of the object inside the constructor, deallocate memory etc. and re-throw the same exception finally after I get the hold of the control. Seems acceptable!</p>
<p class="warning">Consequently, <strong>I have a final question</strong>: do you prefer to throw an exception from constructors or search for other workarounds such as assigning the workload to a separate method called Init()?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/144/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Domain Name Server Fight is Back!</title>
		<link>http://blog.burcudogan.com/128/</link>
		<comments>http://blog.burcudogan.com/128/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 16:21:00 +0000</pubDate>
		<dc:creator>Burcu Dogan</dc:creator>
				<category><![CDATA[Regular]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[master table]]></category>
		<category><![CDATA[resource records]]></category>

		<guid isPermaLink="false">http://blog.burcudogan.com/?p=128</guid>
		<description><![CDATA[This is the second time I’m facing a horrible situation in 12 years of my active Internet adventure. One or a few DNSes ignore my change requests and keep pointing to the old IP although two weeks has passed after my edits. Those rebel servers cause the half of the routers to use the old [...]]]></description>
			<content:encoded><![CDATA[<p>This is the second time I’m facing a horrible situation in 12 years of my active Internet adventure. One or a few DNSes ignore my change requests and keep pointing to the old IP although two weeks has passed after my edits. Those rebel servers cause the half of the routers to use the old IP address and keep my old end-point&#160; alive recursively. I’m not sure if it’s a <strong>TTL issue</strong> with an <em>A RECORD</em> or an hacking attempt via <strong>DNS injection</strong>. Don’t know the answer yet, because I’m not able to access every name server (naturally) although I can traverse my path and know the evil ones.</p>
<p>Does anybody have a clue what is happening behind? Because straight forward actions like switching to my own name servers may not help me with the issue at this moment. The new changes might come to a&#160; deadlock on same cycle. Is there anybody out there who knows what’s happening?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.burcudogan.com/128/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
