<?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>Huysuz Adam &#187; Genel</title>
	<atom:link href="http://www.huysuzadam.com/kategori/genel/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.huysuzadam.com</link>
	<description>Web teknolojileri ile ilgili teknik bir blog...</description>
	<lastBuildDate>Mon, 18 Jul 2011 11:02:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>X-Requested-With ile AJAX&#8217;ı anlamak</title>
		<link>http://www.huysuzadam.com/2011/07/18/x-requested-with-ile-ajaxi-anlamak/</link>
		<comments>http://www.huysuzadam.com/2011/07/18/x-requested-with-ile-ajaxi-anlamak/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 11:02:00 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=584</guid>
		<description><![CDATA[Ufak bir ipucu paylaşayım istedim. Eğer DRY prensibini benimsediyseniz mutlaka karşınıza gelmiştir: aynı sayfayı Ajax&#8217;la ve Ajax&#8217;sız çağırma ihtiyacı&#8230; Bu durumda genelde senaryo şudur, AJAX&#8217;la çağırdığınızda sayfanın başında sonunda yer alan &#8220;header&#8221; ve &#8220;footer&#8221; kısmını göstermek istemezsiniz. Ya da bir POST işlemi yapıyorsanız (insert / update / delete işlemleri) AJAX&#8217;la geldiğinde bir mesajı yazdırmak yeterli [...]]]></description>
			<content:encoded><![CDATA[<p>Ufak bir ipucu paylaşayım istedim.</p>
<p>Eğer <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY</a> prensibini benimsediyseniz mutlaka karşınıza gelmiştir: aynı sayfayı Ajax&#8217;la ve Ajax&#8217;sız çağırma ihtiyacı&#8230;</p>
<p>Bu durumda genelde senaryo şudur, AJAX&#8217;la çağırdığınızda sayfanın başında sonunda yer alan &#8220;header&#8221; ve &#8220;footer&#8221; kısmını göstermek istemezsiniz.</p>
<p>Ya da bir POST işlemi yapıyorsanız (insert / update / delete işlemleri) AJAX&#8217;la geldiğinde bir mesajı yazdırmak yeterli olurken AJAX&#8217;la gelinmediğinde işlem sonucunun gösterildiği bir sayfaya yönlendirmek gerekir. Krolar aynı sayfaya post edebilir ama ona değinmiyorum bile&#8230;</p>
<p>Daha advanced programcılar çıktı formatını değiştirebilir, örneğin AJAX&#8217;la gelindiğinde JSON, gelinmediğinde string gönderebilir mesela.</p>
<p>Bu durumla baş etmek için bir GET parametresi göndermek en klasik çözüm. Ancak her AJAX ihtiyacında tekrar bu GET parametresini göndermek hem angarya hem de boşu boşuna URL&#8217;yi uzatıyor.</p>
<h1>Çözüm</h1>
<p>Eğer javascript framework&#8217;ü kullanıyorsanız popüler framework&#8217;lerin hemen hepsi Ajax&#8217;la data gönderirken <strong>X-Requested-With</strong> diye bir header da gönderiyor. Bu header&#8217;ı kontrol ederek işlerinizi kolaylaştırabilir, kendi framework&#8217;ünüz varsa standardize edebilirsiniz.</p>
<blockquote><p><strong>Not:</strong> Javascript framework&#8217;ü kullanmıyorsanız da kullanmaya başlayın bi zahmet! Yok illa kullanmam diyosanız da XMLHttpRequest objesinin setRequestHeader diye bir metodu var, onu kullanarak javascript kütüphanenize ekleyebilirsiniz.</p></blockquote>
<p>PHP&#8217;den kontrol etmek için <strong>$_SERVER['HTTP_X_REQUESTED_WITH']</strong> değişkeni <strong>XMLHttpRequest </strong>değerine eşit mi diye bakmak gerekiyor.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2011/07/18/x-requested-with-ile-ajaxi-anlamak/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A&#8217;dan Z&#8217;ye Bir Web Projesi Nasıl Yapılır</title>
		<link>http://www.huysuzadam.com/2011/02/16/adan-zye-bir-web-projesi-nasil-yapilir/</link>
		<comments>http://www.huysuzadam.com/2011/02/16/adan-zye-bir-web-projesi-nasil-yapilir/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 14:15:43 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=445</guid>
		<description><![CDATA[Vakt-i zamanında yazdığım gibi, web sitesi yapmak aslında çok zor bir iş değil. biraz eyçtimiyel (HTML) biraz fotoşot, biraz PHP üstüne biraz da siyo (SEO) koduk muydu kralını yaparız projenin&#8230; Öyle değil mi? Değil kardeşim! Milyonlarca web projesi var ve her gün binlercesi bu listeye ekleniyor. Dolayısıyla aklınıza gelen proje emin olun kesinlikle başkasının da aklına [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>Vakt-i zamanında <a href="http://www.huysuzadam.com/2007/02/11/bizim-yigen-de-yapiyor-web-sitesi/">yazdığım gibi</a>, web sitesi yapmak aslında çok zor bir iş değil. biraz eyçtimiyel (HTML) biraz fotoşot, biraz PHP üstüne biraz da siyo (SEO) koduk muydu kralını yaparız projenin&#8230;</p>
<p>Öyle değil mi? Değil kardeşim!</p>
<p>Milyonlarca web projesi var ve her gün binlercesi bu listeye ekleniyor. Dolayısıyla aklınıza gelen proje emin olun kesinlikle başkasının da aklına gelmiştir. Ancak her fikir kaliteli bir ürüne dönüşecek diye bir kural yok&#8230;</p>
<blockquote><p>Facebook&#8217;un ilk çıktığı zamanları hatırlıyorum da, o zamanlar interneti henüz ele geçirmemişlerdi&#8230; &#8220;Bu ne len&#8221; demiştim üniversite öğrencileri girecekmiş etcekmiş. Üstelik daha etkileyici rakipleri de vardı adı neydi hatırlayamasam da, ama facebook diğerlerini solladı gitti&#8230;</p></blockquote>
<p>Üzerinde çalıştığım, ekibinde yer aldığım onlarca projeyi düşündüğümde şöyle bir yol haritası çıkardım. Eksiği olabilir, eğer eklemek istediğiniz birşey varsa lütfen iletin, eklerim&#8230;<span id="more-445"></span></p>
<h2>1. Fikrin Analizi</h2>
<blockquote><p>Muhteşem bir fikir geldi aklıma. Bir yaparsak var yaa, hiçbişey yapmamıza gerek yok para akacak böyle akacak&#8230;</p></blockquote>
<p>Şu cümleyi hiç duymadıysam en yaz 20 farklı kişiden duymuşumdur. Yani evet fikirlerin birçoğu farklı ve hayal kurduğunuzda harika olacak projeler ama hayal üzerine iş kuramazsınız değil mi?</p>
<p>Bakalım fikrinizin potansiyeli neymiş:</p>
<h3>1.1 Rakip Analizi</h3>
<p>Rakiplerinizin durumuna göre bir sektöre girerken iki seçeneğiniz var:</p>
<ol>
<li>&#8220;İlk giren&#8221; olacaksınız: Daha önce bu konuda ciddiye alınacak bir girişim yoktur.</li>
<li>&#8220;Fark yaratan&#8221; olacaksınız: Bu konuda çalışan proje(ler) var, ancak fikrinizin ayırt edici bir özelliği var.</li>
</ol>
<p>Peki hangisi daha iyi?  <span style="color: #993300;">&#8220;İlk gireen&#8221;</span> diye bağırdığınızı duyar gibiyim. Özellikle Türkiye&#8217;de var olan sektörlere girmeyle ilgili bir kompleksimiz var. Orjinal olmayan fikirlere hemen burun kıvırıyoruz.</p>
<p>Ama aslında ikisinin de kendine göre avantajları ve dezavantajları var:</p>
<p><strong>İlk giren bir projede</strong>, eğer güçlü ve analitik bir pazar araştırması imkanınız yoksa işiniz biraz şansa kalmış demektir:</p>
<p>Örneğin fotokritik.com&#8217;un tutacağı ile ilgili elimizde analitik hiçbir veri yoktu. Dürüst olmak gerekirse pazar araştırması olarak yaptığımız tek şey</p>
<blockquote><p>Çok Türk kullanıcı var abi photosig.com&#8217;da, fena fotoğraf da çekmiyolar ha</p></blockquote>
<p>şeklinde içki masası muhabbetinden öte birşey değildi :)</p>
<p>Ama inanılmaz bir kitle topladı, sanki insanlar onu bekliyormuş yıllarca. Türkiye&#8217;de bu kadar kaliteli ve fazla fotoğrafçı olduğununun kimse farkında değildi.</p>
<p><strong>Fark yaratan bir projede ise,</strong> zaten var olan ürünlerin ne kadar karlı olduğunu öngörmek daha kolay. Dolayısıyla sektörün potansiyeli daha kolay tahmin edilebilir.Bu durumda yapmanız gereken rakiplerin zayıflıklarını ya da eksiklerini bulup oraya yönelmektir.</p>
<p>Buna örnek olarak sinemalar.com verilebilir. Sinema.com ve beyazperde.com gibi iki çok kuvvetli rakip olmasına rağmen eksikler tespit edildi ve  sinemalar.com &#8211; yanılmıyorsam - sektöründe lider bir konuma yerleşti.</p>
<h3>1.2 Gelir Modeli</h3>
<p>İkinci önemli konu projenin nasıl para kazanacağı. Genelde bana bir projeden bahsedildiğinde &#8220;reklam&#8221; harici bir gelir modeli soruyorum.</p>
<p>Çünkü çakallık yapmayacaksanız reklamdan para kazanmak gerçekten çok zor Türkiye&#8217;de. Google reklamlarının tıklama başına ödedikleri rakamlar birçok gelişmiş ülkeye kıyasla çok düşük.</p>
<p>Reklam ajansları ile çalışacaksanız da paranın çok çok büyük bir kısmını ajansa bırakmayı göze almak gerekiyor.</p>
<p>Ama bu demek değil ki reklam kötü bir gelir modeli. Eğer reklam gelir modeli söz konusuysa, girdiğiniz iş aynı bir televizyon, radyo ya da gazete gibi medya sektörü. Zaten o yüzden sosya medya diyoruz ya&#8230;</p>
<p>Benim demek istediğim, proje tutsun da, nasıl olsa reklamdan meklamdan para kazanırız dememek gerek&#8230;</p>
<h3>1.3 Pazar Analizi ve Hedef Kitle</h3>
<p>Fotokritik.com sadece amatör ve profesyonel olarak fotoğrafçılıkla ilgilenen kişileri hedefler. Yüksek maliyetlerle kıyaslandığında hedef kitlenin büyüklüğü para kazanmanız için gerekli alt limitin biraz üzerindeyken flickr.com&#8217;a baktığınızda, global olmasının dışında, fotoğraf makinesi olan herkesi hedefleyerek çok daha geniş bir kitleye hitap ettiğini görebilirsiniz.</p>
<p>Hedef kitlenizin özellikleri de önemli. Örneğin e-bebek.com&#8217;un hikayesine okuduğumda sahibi şöyle birşeyden bahsetmişti (hatırladığım kadarıyla aktarıyorum):</p>
<blockquote><p>Malum şu aralar daha sakin dursa de Türkiye&#8217;de ekonomi fazla dalgalıydı ve her ekonomik krizde de insanlar refleks olarak giderlerini kısarlar. Ancak kısmayacakları birşey varsa o da bebekleridir.</p></blockquote>
<p>Bebek ürünleri sektörü yazı kışı olmayan, özellikle doğum oranının yüksek olduğu ülkemizde yüksek hedef kitlesiyle önemli bir pazar. Peki ya sizin kitleniz kim ve ne kadar güçlü?</p>
<p><strong>1.4 Pazarlama Stratejisi ve Ziyaretçi İlişkileri (!)</strong></p>
<blockquote><p>&#8220;User generated content&#8221;i koydum muydu kullanıcılar doldurur siteyi, bi sürü içerik olunca google da indeksler sayfayı, arama motoru optimizasyonu da yaptık mıydı bu iş tamamdır</p></blockquote>
<p>Oooldu canım ne kolay değil mi? İnsanların genelde yaptığı en yaygın hata siteyi yapınca insanların sitelerine akın edeceği düşüncesi.</p>
<p>Evet fotokritik.com ya da uzmansorusu.com gibi gelir modelinden önce ihtiyaca yönelik bir projeniz varsa ağızdan ağıza projeniz yayılıyor. Ancak diğer senaryolarda pazarlama ve ziyaretçi memnuniyetini daha en baştan kurgulamanız gerek.</p>
<p>İki hedefiniz var:</p>
<ol>
<li>Projenizi daha çok kişiye ulaştırmak</li>
<li>Gelen ziyaretçinin sitenize daha sonra tekrar girmesini sağlamak</li>
</ol>
<p><strong>Proje ilk açıldığında</strong> ikinci madde unutulur ve <strong>birinci maddeye odaklanılır</strong>.</p>
<p><strong>Proje hit almaya başlayınca</strong> da sanki herkes siteyi tamamen tanıyor biliyor zannedilir ve &#8220;bu site ne işe yarar&#8221; gibi bilgiler tasarımdan kaldırılır ya da köşe bucağa saklanır, <strong>ikinci maddeye odaklanılır</strong>.</p>
<p>Her zaman için bu iki kesimi de göz önünde tutarak bir pazarlama ve müşteri ilişkileri stratejisi oluşturmak gerekli.</p>
<ul>
<li>Pazarlama araçları neler olacak</li>
<li>Viral marketing, e-mail marketing, reklam, PR, WOM gibi neleri kullanabiliyorsunuz,</li>
<li>İlerleyen aşamalarda neleri hangi durumlarda (ne zaman) kullanacaksınız.</li>
<li>Maliyetleri nedir ve avantajları / dezavantajları ne olacak.</li>
</ul>
<p>Yani özetle projenizi insanlara nasıl  duyuracaksınız. Bunu planlamadan projenizin planlaması hazır gibi düşünmeyin&#8230;<br />
Ziyaretçi ilişkileri derken &#8220;Müşteri İlişkileri Yönetimi&#8221;ne dokundurmak istedim işi. Fiziksel bir ürün yok diye CRM kullanmayacaksınız diye bir şart yok. Burada CRM derken CRM yazılımından bahsetmiyorum.</p>
<p>En basitinden &#8220;sizi özledik neredesiniz&#8221; başlıklı bir &#8220;aylık newsletter&#8221;, önemli günlerinde müşterilere erişmek, &#8220;satış sonrası hizmetler&#8221; gibi üyelik sonrası hizmetler türü birçok şekilde müşterilerinizi projenize tekrar çekmek için neler yapacaksınız?</p>
<h2>2. İşin Tanımlanması</h2>
<p>Yapılacak iş nedir, hedef nedir, gelir modeli nedir, maliyetler nelerdir, projede kimler hangi görevlerde yer alır (nelerden sorumludur), teknik gereksinimler nedir vb. bilgilerin düzgün ve anlaşılır bir şekilde dokümante edilmesi gerekir.</p>
<p>Bu aşama yukarıdaki fikir analizinin sentezlenerek somut olarak plana dökülmesidir diyebilirim.</p>
<p>Genelde fikir sahibi kişinin kafasında olur tüm bunlar, asla kağıda dökülmez, ya da karman çorman notlar halinde tutulur.</p>
<p>Teknik anlamda bir yol haritası mutlaka yapılır ama bu tarz &#8220;genel&#8221; bir yol haritası ıskalanır. Böyle bir planınızın olması hem bazı şeyleri atlamanıza engel olur, hem de bir sonraki adımınızı aklınızda tutmanıza gerek kalmaz&#8230;</p>
<h2>3. Teknik Analiz</h2>
<p>Yapılacak işin detaylandırılması: projedeki fonksiyonların listesi ( site haritası ), mockup / wireframe halinde projenin kaba şekli ne olacak belirlenmesi. Bu aşamaya genelde bir sonraki adımdan, <strong>tasarım </strong>aşamasından sonra geçmek gibi bir alışkanlık var.</p>
<p>Sitede şunlar bunlar olacak, o zaman veritabanı şöyle olsun diye teknik elemanlar veritabanını tasarlamaya başlarlar. Evet verinin tasarımı mutlaka çok önemli ama elinde bir mockup olmadan aslında veri yeteri kadar tanımlı değil.</p>
<p>O yüzden her tür tasarımdan önce (grafik ya da teknik) öncelikle projede neler olacak, ve daha önemlisi neler olmayacak, belirlendikten sonra ister bir mockup / wireframe, ister tasarımın kabası yapılarak projenin ne olacağı netleştirilmeli.</p>
<h2>4. Tasarım</h2>
<p>Grafik tasarımı, yazılım mimarisinin tasarımı, sunucu altyapısının tasarımı, veritabanı tasarımı. Bir sürü tasarım var elimizde.</p>
<p>Bu tasarımlar yapılmadan büyük boyutlu bir projeye başlamak hüsranla sonuçlanabilir. Burada dikkat edilmesi gereken nokta, özellikle ışık hızıyla gelişen web teknolojileri söz konusu olduğunda tasarımı daha esnek bir şekilde kabadan inceye doğru gelişecek şekilde tasarlamak.</p>
<p>Yapılan tasarımların, projenin herhangi bir noktasında, büyük ya da küçük ölçülerde değişebileceği baştan göz önünde bulundurulmalı, kabaca tasarımlar yapıldıktan sonra geliştirme işine geçilmeli ve gerekiyorsa geliştirme sırasında tasarım da güncellenebilmeli.</p>
<p>Bu dediğim yazılım mimarisini ve sunucu altyapısının tasarımını tam kapsamıyor olabilir ama özellikle grafik tasarım ve veritabanı tasarımında kesinlikle çok önemli, çünkü bu iki konsept proje ilerledikçe değişikliklere çok daha fazla açık&#8230;</p>
<p>Ben bu işi bir heykel yontmaya benziyorum:</p>
<ol>
<li>Küp şeklinde bir ahşap blok ile başlıyoruz</li>
<li>Önce yuvarlak bir kafa şekli veriyorsunuz.</li>
<li>Sonra boyun girintisini, göz çukurunu, burnu ve kulakların olduğu yerleri ortaya çıkartıyoruz</li>
<li>Tek tek detayları çözüyoruz</li>
<li>En son kaşların, saçların çizgileri, alındaki kırışıklıklara kadar ince detaylara giriyoruz.</li>
</ol>
<h2>5. Geliştirme</h2>
<p>Front-end ve back-end geliştirmelerin yapılması, sunucuların kurulması, konfigürasyonu vs.</p>
<p>Burası en standart kısım. Teknik elemanların en iyi bildiği kısım. Burada tek önerebileceğim şey özellikle takım çalışmasına adaptasyon ve örneğin pair programming gibi modern teknikleri en azından bir denemek. (Ben yapamadım içimde kaldı bari siz deneyin :) )</p>
<h2>6. Kalite Kontrol</h2>
<p>İşte Türkiye&#8217;de asla yapılmayan bir işlem.</p>
<p>Yazılan kodun kaliteli olması için bir kalite kontrol mekanizmasının işlemesi gerekli. İşe başlamadan önce bazı standartların belirlenmesiyle kalite kontrol başlar, daha kaliteli kod yazmak için yapılanlarla (örneğin pair programming ve unit testing) ilerler ve başka bir gözün kontrol etmesiyle başa döner.</p>
<p>Başka bir gözün kontrol etmesi ile ilgili olarak Türkiye&#8217;de pek alışkın olmadığımız bir durum var. Bu başkası illa bizden daha kıdemli birisi olmak zorunda değil. Ama tabii belli bir kabiliyette olması şart. Farklı bir göz sizin gözden kaçırdığınız birşeyleri yakalayabilir.</p>
<p>Kalite kontrol ile ilgili olarak, unit testing maliyeti inanılmaz arttırıyor.</p>
<p>Ancak SVN kullanılması, hataların bugzilla, mantis, trac gibi merkezi bir <em>&#8220;böcek avcısında&#8221;</em> takip edilmesi, standart bir yazılım mimarisi kullanılması ve yazılan kodların ikinci bir göz tarafından kabaca bir gözden geçirilmesi bile ilk aşamada yeterli olacaktır.</p>
<p><strong><br />
</strong></p>
<h2>7. Bakım ve İşletme</h2>
<p>Bu konuya da bir makine mühendisi gözüyle bakıyorum. Büyük bir fabrikanın bakım &#8211; işletmesi ile bir web projesinin bakım &#8211; işletmesi aynı temel prensiplere dayanıyor.</p>
<p>Hata olacak noktaları proaktif olarak (hata oluşmadan önce) bularak gerekli önlemleri almak, sistem çalışırken hakkında gerekli datayı toplamak ve bu datayı sürekli gözlemleyerek bir arıza durumunda anında müdahale ederek sorunu çözmek.</p>
<p>Allahtan günümüzde bakım / işletme  (ve scaling) kolaylıkla outsource edilebiliyor. Örneğin amazon servisleri ya da diğer &#8220;cloud computing&#8221; hizmeti veren şirketler bu sistemleri size paket olarak sunuyor.</p>
<p>Scaling gerekliyse scale ediyor, donanım arızalarıyla ilgili zaten siz uğraşmıyorsunuz. Ama eğer bu servisleri kullanmıyorsanız sunucularınızı monitör eden programlar kullanmalısınız. Sunuculardaki yükler neler, sunucular hata vermiş mi vs.</p>
<blockquote><p>Birçok firma / kişi yazılımda oluşan hataları ya loglamıyor ya da bu loglara hiç bakmıyor. Hayırsever bir ziyaretçi e-posta atana kadar haberleri bile olmuyor. Düşününce ne kadar saçma değil mi?</p></blockquote>
<p>Ayrıca donanım ya da yazılım arızalarına karşı mutlaka yedekli bir yapınız olmalı. Çift power supply, çift ethernet, çifter çifter diskler hatta çift sunucular vs. Bu kısmı maliyetli olduğu için doğru optimizasyon için inisiyatif kullanmanız gerekecek&#8230;</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2011/02/16/adan-zye-bir-web-projesi-nasil-yapilir/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>SQL Injection nedir, nasıl önlenir?</title>
		<link>http://www.huysuzadam.com/2011/02/13/sql-injection-nedir-nasil-onlenir/</link>
		<comments>http://www.huysuzadam.com/2011/02/13/sql-injection-nedir-nasil-onlenir/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 09:09:04 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[Güvenlik]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=508</guid>
		<description><![CDATA[PHP&#8217;yi ya da web tabanlı herhangi bir yazılımı öğreniyorsanız güvenlikle ilgili ilk öğrenmeniz gerekenlerden biri SQL injection. Hala uzmansorusu.com&#8216;da sorulan soruların ciddiye alınacak bir kısmında, üniversiteye gelen stajerlerde, hatta çalışma fırsatım olan arkadaşlarda bu konuda bir bilgisizlik var&#8230; Aslında bu blog&#8217;a başlarken ileri düzey konulara, framework&#8217;lere falan değineyim istemiştim ama pes ediyorum artık. Şuraya yazayım [...]]]></description>
			<content:encoded><![CDATA[<p>PHP&#8217;yi ya da web tabanlı herhangi bir yazılımı öğreniyorsanız güvenlikle ilgili ilk öğrenmeniz gerekenlerden biri SQL injection.</p>
<p>Hala <a href="http://www.uzmansorusu.com">uzmansorusu.com</a>&#8216;da sorulan soruların ciddiye alınacak bir kısmında, üniversiteye gelen stajerlerde, hatta çalışma fırsatım olan arkadaşlarda bu konuda bir bilgisizlik var&#8230;</p>
<p>Aslında bu blog&#8217;a başlarken ileri düzey konulara, framework&#8217;lere falan değineyim istemiştim ama pes ediyorum artık. Şuraya yazayım da en azından lazım olduğunda al oku işte diye adresini veririm :)</p>
<p><span id="more-508"></span></p>
<h2>SQL Injection Nedir?</h2>
<p>Türkçeye çevirirsek <strong>SQL&#8217;in içine zehir enjekte edilmesidir</strong> diyebiliriz. Örnek vermek gerekirse elimizde bir kullanici_detay.php dosyası olsun:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where id=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>satırını ele aldığımızda, $_GET['id']&#8216;nin bir sayı olduğunu farz ederiz ve kod düzgün çalışır. Bu sayfanın adresi de şöyle birşeydir</p>
<pre>http://www.huysuzadam.com/kullanici_detay.php?id=5</pre>
<p>Peki ben uyanıklık yapıp adres satırını şöyle değiştirirsem:</p>
<pre>http://www.huysuzadam.com/kullanici_detay.php?id=1 or 1=1</pre>
<p>Bu durumda sql cümlesi şöyle birşeye dönüşmüş olur:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span></pre></div></div>

<p>1=1 önergesi her zaman doğru döndüreceği için tüm kullanıcıları listeletebilirim bu durumda&#8230;</p>
<h2>Ne Zararı Olur?</h2>
<p>Tüm kullanıcıları görse nee, görmese ne diyebilirsiniz. Peki bu güvenlik açığı ile neler yapılabilir?</p>
<p>Az önceki örneği değiştiriyorum, bu sefer biraz daha karışık işlere girelim:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$username</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$passwd</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwd'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where username='<span style="color: #006699; font-weight: bold;">$username</span>' and passwd='<span style="color: #006699; font-weight: bold;">$passwd</span>' &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Bu sefer bir hacker olarak $_POST['username'] değişkenini yine uyanıklık yaparak aynen şöyle gönderiyorum:</p>
<pre>a' or 1=1 or 'b</pre>
<p>yerine koyduğumuzda sql&#8217;imiz şu hale gelmiş oluyor:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> username<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'a'</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #ff0000;">'b'</span> <span style="color: #993333; font-weight: bold;">AND</span> passwd<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'asdf'</span></pre></div></div>

<p>Gördüğünüz gibi OR&#8217;lar sayesinden herhangi bir kullanıcı olarak girebiliriz. SQL&#8217;in son hali kolay okunsun diye ben böyle girdim ama biraz yaratıcılık kullanılarak daha kısa ya da daha farklı yaramazlıklar yapılabilir.</p>
<h2>Nasıl Önlememelisiniz : magic_quotes_gpc</h2>
<p>PHP&#8217;nin eski versiyonlarında magic quotes gibi bir ayarla SQL injection&#8217;a çözüm ürettiğini zannetti Zend firması. Aslında bu daha sonra çok baş ağrısı yaratacak bir karardı ve o yüzden de PHP6&#8242;da yanılmıyorsam tamamen kaldırılacak bu özellik.</p>
<h3>Magic Quotes şu şekilde çalışır:</h3>
<p>php.ini&#8217;den magic_quotes_gpc aktif edilirse PHP otomatik olarak tüm $_GET, $_POST ve $_COOKIE değişkenlerinin içindeki tırnak işaretlerini \&#8217; ve \&#8221; ile değiştirir. Bu durumda ikinci örneği ele alırsak sql şu hale gelmiş olur:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> username<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'a<span style="color: #000099; font-weight: bold;">\'</span> or 1=1 or <span style="color: #000099; font-weight: bold;">\'</span>b'</span> <span style="color: #993333; font-weight: bold;">AND</span> passwd<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'asdf'</span></pre></div></div>

<p>Bu durumda \ işareti yanındaki karakteri &#8220;escape&#8221; eder, yani tek tırnak işaretinin tırnağı kapama görevine son verir. Böylece veritabanı hakkaten de adı <strong>a\&#8217; or 1=1 or \&#8217;b</strong> olan bir marslıyı (!) bulmaya çalışır.</p>
<p>Kırma girişimi başarısızlıkla sonuçlanır, dünya kurtulur.</p>
<p>Burada dikkat edilmesi gereken tek nokta, yazının başında verdiğimiz örnekteki gibi sayıları kontrol ederken de tırnak işareti kullanmamız gerekir.</p>
<p>Yani;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where id=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>yerine</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where id='&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>yazmamız gerekir.</p>
<p><span style="color: #ff0000; font-size: 14px;">Ancak sakın magic_quotes_gpc yönetimini kullanmayın!</span></p>
<p>Çünkü bu konuda iki büyük sorun var: Birincisi psikolojik olarak buna o kadar alışıyorsunuz ki sanki bu magic_quotes_gpc açıksa bir daha asla SQL injection yemezmişsiniz gibi geliyor. Sonra da biri gelip bu sefer de /* */ kullanarak SQL injection yapıyor. Ya da görünmez ASCII karakterleri ya da diğer muhtelif yöntemler.</p>
<p>(Not: Bu muhtelif yöntemleri burada tek tek yazmayacağım ki bu doküman bir &#8220;hacker&#8217;ın el kitabı&#8221;na dönüşmesin ;) )</p>
<p>İkinci büyük sorun da, hiç başınıza gelmeyecek zannetseniz de hosting değiştirme problemi. magic_quotes_gpc&#8217;ye güvenirken, bir anda bu ayarın kapalı duruma geldiğini düşünebiliyor musunuz? Kolay gerçekleşecek bir senaryo değil gibi gözükse de gayet olasıdır, tecrübeyle de sabittir!</p>
<p>3. daha önemsiz sorun ise, &#8220;Ozan&#8217;ın kalemi&#8221; gibi bir cümledeki tırnak işaretini de escape etmesi. Bu durumda veritabanına yazmadığınız durumlarda &#8220;strip_slashes&#8221; gibi bir işlem yapmanız gerekiyor ki bu da bazen inanılmaz can sıkıcı olabiliyor.</p>
<h2>SQL Injection Nasıl Önlenir?</h2>
<p>Gelelim sadede. Bunu yapmanın birkaç yöntemi var. Bana en makul gelenleri:</p>
<h3>mysql_real_escape_string</h3>
<p>Bu fonksiyon, değişkenlerin içindeki tüm zararlı karakterleri &#8220;escape&#8221; eder, yani güvenli hale getirir.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwd'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'passwd'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>şeklinde kullanılır.</p>
<p><strong>Avantajları:</strong></p>
<ol>
<li>Ekstra bir kütüphaneye falan gerek yok, doğrudan kullanılabilir.</li>
</ol>
<p><strong>Dezavantajları:</strong></p>
<ol>
<li> Yazması çok sıkıcı</li>
<li> MySQL&#8217;den başka veritabanı kullanırsanız ne olacak?</li>
</ol>
<h3>Bind etme yöntemi</h3>
<p>Aslında bunu mysql konutları ile yapmak da mümkün, ama zahmetli olduğu için bir database wrapper kullanarak yapılışını anlatacağım.</p>
<p>Bir database wrapper ya da PDO kullanılır. Örneğin Zend_Db kullanalım:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'/var/lib/ZendFramework/Zend/Db.php'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> Zend_Db<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Mysqli'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'username'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'myuser'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'mypass'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'dbname'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'mydbname'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'driver_options'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>MYSQLI_INIT_COMMAND <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'SET NAMES UTF8;'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetchRow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;select * from users where id=?&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Avantajları:</strong></p>
<ol>
<li>Soru işaretinin yerine değişkenimiz güvenli bir şekilde yerleştirildi.</li>
<li>&#8220;fetchRow&#8221; metodu sayesinde sadece 1 satır çekilip $user&#8217;a eşitlendi. Dolayısıyla mysql_fetch_row vs. yazmanıza da gerek kalmadı.</li>
<li>MySQL sorguyu cache&#8217;leyebildi. Direkt değişkeni yazdığınızda veritabanı onu cache&#8217;leyemez.</li>
</ol>
<p><strong>Dezavantajı:</strong></p>
<ol>
<li>Yeni birşey öğrenmek ve uygulamak gerekiyor. Bu da aslında dezavantaj değil avantaj aslında ama anlayana ;)</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2011/02/13/sql-injection-nedir-nasil-onlenir/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Programlamada Üretim Hızını Arttırmak&#8230;</title>
		<link>http://www.huysuzadam.com/2011/02/12/programlamada-uretim-hizini-arttirmak/</link>
		<comments>http://www.huysuzadam.com/2011/02/12/programlamada-uretim-hizini-arttirmak/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 13:57:27 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[ide'ler]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Web Teknolojileri]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=493</guid>
		<description><![CDATA[Bir ürün ortaya koyarken, aynı diğer sektörlerde olduğu gibi yazılım sektöründe de maliyet çok önemli elbette. Yazılım ve donanım masraflarını çıkardığımız zaman geriye kalan maliyet yazılımcıların çalışma süresi, bu yüzden de projenin ne kadar hızlı geliştirilirse maliyeti o kadar düşük olur diyebiliriz. İster kendi projenizi geliştiren bir yazılımcı olun, ister bir şirket, bu gerçek değişmiyor. [...]]]></description>
			<content:encoded><![CDATA[<p>Bir ürün ortaya koyarken, aynı diğer sektörlerde olduğu gibi yazılım sektöründe de maliyet çok önemli elbette.</p>
<p>Yazılım ve donanım masraflarını çıkardığımız zaman geriye kalan maliyet yazılımcıların çalışma süresi, bu yüzden de projenin ne kadar hızlı geliştirilirse maliyeti o kadar düşük olur diyebiliriz. İster kendi projenizi geliştiren bir yazılımcı olun, ister bir şirket, bu gerçek değişmiyor.</p>
<p>Tabii üretim hızını arttırırken, bunun tam karşısında dikilen çok önemli bir parametre var, o da <strong>KALİTE</strong> ! Hızlı yazmak uğruna kaliteden ödün vermemeliyiz&#8230; Türkiye&#8217;deki berbat yazılım kalitesinin bence en büyük nedeni bu.</p>
<p><span id="more-493"></span></p>
<h2>Sorun?</h2>
<p>Makine mühendliği eğitimi sırasında üretim planlama ile ilgili derslerimiz vardı. Bunlardan biri de seri üretimde maliyetin düşürülmesi için yapılabilecekler. Mesela bir otomobil üretim bandını düşünün.</p>
<p>Her ne kadar yazılım sektörü ile kıyasladığınızda maliyeti etkileyen çok fazla parametre olsa da, aynen yazılımdaki gibi üretim hızını ne kadar arttırırsanız birim otomobil başına maliyetiniz de o kadar düşer.</p>
<p>Burada hızı optimize ederken en önemli bir prensip vardır:</p>
<blockquote><p>Üretim işleminin hızını arttırmaya zorlarsanız kaliteden kaybedersiniz. Ancak asıl optimize edebileceğiniz nokta, üretim işlemleri arasında ara maddelerin bir yerden bir yere transferi, makineye bağlanması, makineden sökülmesi gibi ara işlemlerdir.</p></blockquote>
<p>Örneğin bir torna işlemini olması gerekenden daha hızlı yaparsanız torna bıçağının ısınması vb. nedenlerden ürettiğiniz malzemenin yüzey KALİTESİ düşer, pürüzsüz bir yüzey yerine tırtıklı bir yüzey elde edersiniz.</p>
<p>Çok benzer bir şekilde kod yazma süreniz 3 aşağı  5 yukarı bellidir. Eğer çok hızlı yazmaya çalışırsanız mutlaka bazı noktaları gözden kaçırmaya başlarsınız. Bunun da acısı birkaç ay sonra çıkar: &#8220;Ben mi yazmışım lan bunu?!?!&#8221;</p>
<h2>Nasıl?</h2>
<p>Peki bu konuda ne yapılabilir? Programcı özelinde baktığımızda bence önemli unsurlardan birisi, aynı seri üretim yapan bir fabrikada olduğu gibi, ara işlemleri optimize etmek. Yani program yazarken rutin olarak yaptığımız ara işlemleri hızlandırmak.</p>
<p>İşte benim optimize ettiğim bazı şeyler. Eğer bu listeye eklemek istediğiniz bir şey varsa lütfen yorum olarak yazın, buraya eklerim&#8230;</p>
<h3>1. Çift Monitör Kullanmak</h3>
<p>Bilkent&#8217;teki işimde monitörümün yanına ikinci bir monitör koyduğum zaman çalışma arkadaşlarımın ilk tepkileri daha çok &#8220;wow ne havalı&#8221; gibi hafif dalga geçen bir yaklaşımdı. Şu an, departman müdürümüz de dahil çoğu kişi çift monitör kullanıyor&#8230;</p>
<p>Nedeni kesinlikle hava atma merakımdan değil. Basit bir rutini devreden çıkartmak: (Alt + TAB) kombinasyonu. Bir proje yazıp test ederken saatte kaç keç alt+tab kombinasyonunu kullandığınızı saydınız mı? Ben de saymadım aslında ama: <strong>ÇOK</strong> :)</p>
<p>Bir monitöre favori browser&#8217;ınızı koyuyorsunuz, diğerine editörü. Editörde yazdığınızın sonucunu browser&#8217;dan karşılaştırıyorsunuz. Ya da CSS ile uğraşıyorsunuz atıyorum. CSS&#8217;i Firebug ile modifiye ederek istediğiniz sonucu elde ediyorsunuz. Sonra yandaki monitörden son halini CSS&#8217;e yazıyorsunuz.</p>
<p>Hatta itiraf ediyorum atuyorum 5 dakika süren bir işlemi yaparken ikinci monitörde minesweeper oynadığım da çoktur :) Çünkü o sırada başka bir işe girerek ilkine olan konsantrasyonumu kaybetmek istemem&#8230;</p>
<h3>2. 10 Parmak Yazabilmek</h3>
<p>Dalga geçmiyorum, hala 2-3 parmakla kod yazmaya çalışan insanlar var yahu!</p>
<h3>3. Shortcut Kullanmak</h3>
<p>Belki abarttığımı düşüneceksiniz ama, hiç klavyeden elinizi kaldırıp mouse&#8217;a götürmenin size vakit kaybettirdiği dikkatinizi çekmiş miydi? Bu hareket belki 0,3 saniye alıyor ama günde belki 10.000 kere yapıyoruz.  Hemen hemen her işlemin bir shortcut&#8217;ı var: Commit et, kaydet, yükle (upload), dosya aç, dosya bul vs.vs. Bazı işlemlerin çok abuk shortcut&#8217;ları olabiliyor, tek elle yapamadığınız. Onları da üşenmeden değiştirin derim&#8230;</p>
<p>Aslında shortcut değil ama, yeni IDE&#8217;lerde code templates diye bir olgu var. Örneğin netbeans&#8217;de &#8220;assign&#8221; yazıp TAB&#8217;a bastığımda $this-&gt;assign(&#8216;parameter&#8217;, $parameter); gibi bir kodu otomatik üretiyor ve cursor &#8216;parameter&#8217; üzerinde oluyor. Onu örneğin &#8216;users&#8217; olarak değiştirdiğimde otomatik olarak $parameter da $users oluyor&#8230;</p>
<p>Kullandığım başka bir trick de Textmate&#8217;ten: Shift + Ctrl Enter yaptığımda bulunduğum satırın sonuna bir noktalı virgül koyup sonraki satıra geçiyor. Bunu netbeans&#8217;de yapmak için basit bir makro kaydetmem gerekti. Bir satırın ortasındayken sona git, noktalı virgül koy, sonra enter&#8217;a bas yerine epey hızlandırıyor beni&#8230;</p>
<p>Siz de kendi hızınızı arttıracak shortcut&#8217;lar üretebilirsiniz.</p>
<h3>4. Programlara Kolay Erişim</h3>
<p>Favori programlarınızı başlat menüsü altından tüm programlara, oradan program dizinine, oradan programa gidip mi çalıştırıyorsunuz?</p>
<p>Her gün kullandığınız programları mac kullanıyorsanız dock&#8217;a ekleyebilir, windows 7 kullanıyorsanız &#8220;pin&#8221; ile taskbar&#8217;a sabitleyebilirsiniz. (Daha eski bir windows kullanıyorsanız önce onu çöpe atmakla işe başlayabilirsiniz!) Günlük kullanmadıklarınızı ise buraya koymayın ki bu sefer de yüzlerce program arasından günlük programınızı aramayın&#8230;</p>
<p>Diğer programlara erişmek için Mac&#8217;te Cmd+Space ile spotlight&#8217;ı açıp programın adını yazabilirsiniz. Aynısını windowsda yapmak için klavyenizdeki windows tuşuna basıp programın adını yazmaya başlayın, başlat menüsü açılıp program listede çıkar, oradan yine klavyeyle seçip açabilirsiniz.</p>
<h3>5. Yıldırım gibi Çalışan Bir Bilgisayar</h3>
<p>Birçok yerde işin bu erbapları der ki:</p>
<blockquote><p>&#8220;Paranızın alabileceği en iyi bilgisayarı alın&#8221;</p></blockquote>
<p>Sonuçta işinize yatırımdır bu. Bir yandan donanım problemleriyle ya da kanıran bir bilgisayarla uğraşırken nasıl konsantre olabilirsiniz ki işinize?</p>
<p>Kullandığınız donanımın birbirine uyumlu olması çok önemli o yüzden marka bilgisayarları tercih etmekte yarar var. Para ayırabiliyorsanız Mac&#8217;i sırf bu yüzden tavsiye ederim. Windows 7 bana göre gerek stabilite, gerek performans, gerekse fonksiyonalite açısından Snow Leopard&#8217;ı solladı ancak donanım olarak Mac kadar düzgün çalışan PC her zaman toplanmıyor. Sessizliği de cabası&#8230;</p>
<p>En son yakın bir arkadaşım bilgisayarının sesinden bıkıp kasayı yan odaya koymaktan bahsediyordu&#8230; Duvarı delip kabloları oradan geçirecekmiş ;)</p>
<p>Windows 7 kullanıyorsanız hızlı bir USB belleği windows 7&#8242;yi hızlandırmak için kulanabilirsiniz. USB&#8217;yi takın ve ekrana çıkan yönlendirmeleri takip edin. Bilgisayarınızın daha hızlı tepki verdiğini görebilirsiniz.</p>
<p>Linux&#8217;a gelince&#8230; Desktop olarak <strong>Kullanmayın!</strong> Bu kadar basit :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2011/02/12/programlamada-uretim-hizini-arttirmak/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Bunları yapmayana programcı demem&#8230;</title>
		<link>http://www.huysuzadam.com/2011/01/31/bunlari-yapmayana-programci-demem/</link>
		<comments>http://www.huysuzadam.com/2011/01/31/bunlari-yapmayana-programci-demem/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 14:02:26 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=465</guid>
		<description><![CDATA[Özellikle uzmansorusu.com&#8216;daki soruları ve hatta bazı yabancı kaynakları incelediğimde bu devirde bile insanların hala çok kritik ve genel uygulamalardan bihaber olduklarına şaşkınlıkla şahit oluyorum&#8230; Sene olmuş 2011, hala şu aşağıdakileri yapmıyorsanız (en azından) ne kadar iyi programcı olduğunuzu tekrar değerlendirmenizin zamanı gelmiş demektir&#8230; (Web tabanlı yazılım ve PHP ele alınmıştır) Database Wrapper Kullanmak Veritabanına doğrudan [...]]]></description>
			<content:encoded><![CDATA[<p>Özellikle <a href="http://www.uzmansorusu.com" target="_blank">uzmansorusu.com</a>&#8216;daki soruları ve hatta bazı yabancı kaynakları incelediğimde bu devirde bile insanların hala çok kritik ve genel uygulamalardan bihaber olduklarına şaşkınlıkla şahit oluyorum&#8230;</p>
<p>Sene olmuş 2011, hala şu aşağıdakileri yapmıyorsanız (en azından) ne kadar iyi programcı olduğunuzu tekrar değerlendirmenizin zamanı gelmiş demektir&#8230;</p>
<p><span style="color: #808080;">(Web tabanlı yazılım ve PHP ele alınmıştır)</span></p>
<p><span style="color: #808080;"><span id="more-465"></span></span></p>
<h2>Database Wrapper Kullanmak</h2>
<p>Veritabanına doğrudan php fonksiyonları ile değil bir class aracılığı ile ya da <a href="http://www.php.net/pdo" target="_blank" rel="nofollow">PDO</a> ile ulaşmak olarak özetleyebilirim.</p>
<p>En büyük avantajlarından biri sql&#8217;lerdeki parametreleri bind ederek SQL injection sorununa pratik bir çözüm üretmek. Bind ederek sql&#8217;lerin veritabanı tarafından cache&#8217;lenebilmesini de sağlamış olursunuz.</p>
<p>Bunların yanında veritabanı değiştirmek istediğinizde işinizi kolaylaştırır, bazı pratik komutlarla yazma hızınızı arttırır, hata yönetimini kolaylaştırır.</p>
<p><strong>Tavsiyem:</strong> Sunucuda <a href="http://framework.zend.com" target="_blank" rel="nofollow">Zend Framework</a> kuruluysa Zend_Db, ama projenizle dağıtacaksanız, özellikle de FTP ile dağıtmanız gerkiyorsa asla! Zend Framework çok büyük boyutta ve binlerce dosyada oluşuyor. Sunucuya yüklemek saatlerinizi alabilir.</p>
<h2>Template Sistemi Kullanmak</h2>
<p>Aslında ideali MVC gibi bir yaklaşımla tüm kodları düzgün bir şekilde organize etmek ama bu olmasa bile en azından bir template sistemi ile basitçe HTML&#8217;leri PHP&#8217;lerden ayırmak gerek&#8230;</p>
<p>HTML&#8217;lerin içerisinde sadece if/else yargıları ile döngüler ve helper fonksiyonlarına izin verilir. Geri kalan tüm php kodları ayrı çalışmalı ve sadece HTML&#8217;de kullanılacak data template sistemine aktarılmalı&#8230;</p>
<p><strong>Tavsiyem:</strong> Zend_View ya da <a href="http://www.smarty.net" rel="nofollow">smarty</a>.</p>
<p><strong>Bonus:</strong> HTML, CSS ve Javascript de birbirinden ayrılırsa dadından yinmez.<strong><br />
</strong></p>
<h2>SVN, Git ya da Benzeri Bir Versiyonlama Sistemi Kullanmak</h2>
<p>Versiyonlama sistemleri başlarda angarya olarak gözükse de alışınca vazgeçemeyeceğiniz bir araç. Windows kullanıcıları için özellikle <a href="http://subversion.tigris.org/" target="_blank" rel="nofollow">SVN</a> tavsiye edilir, çünkü TortoiseSVN adında süper pratik ve becerikli bir program mevcut. SVN sunucunuz yoksa ve tek çalışıyorsanız <a href="http://tortoisesvn.tigris.org/" target="_blank" rel="nofollow">TortoiseSVN</a> ile bir dizine sağ tıklayıp o dizini repository yapabilirsiniz.</p>
<p>SVN ile, geçmişte nereleri değiştirdiğinizin tam bir kaydını tutabilir ve bir sorun olması durumunda istediğiniz zamana geri dönebilirsiniz.</p>
<p><strong>Bonus:</strong> Branch kullanarak stabil versiyon ile yeni özellik eklenen versiyonları birbirinden ayırmak. Böylece projenize yeni ve uzun süren bir özellik eklemek için çalışmaya devam ederken, çalışan sitede acil bir değişiklik gerektiğinde çalışan siteyi bozmadan değişikliği yapabilirsiniz.</p>
<h2>IDE Kullanmak</h2>
<p>Hala ben Notepad++ kullanıyorum yetiyor, Notepad2 ya da Ultraedit kullanıyorum diyenlerle hayretler içerisinde karşılaşıyorum.</p>
<p>Gerçi aynı düşünceyi ben de paylaşmıştım bir süre ama sanırım 1998 &#8211; 1999 gibi vazgeçtim bu fikrimden. Hala notepad türevlerini kullanmakta inat ediyorsanız, üzgünüm benden 12 yıl geridesiniz :) (vi kullananları tenzih ederim, bilenin elinde IDE gibidir kendisi).</p>
<p>Evet notepad ile de düzgün kod yazılabilir elbet ama benden söylemesi, mehteran gibi  2 adım ileri 1 adım geri gitmek gibi birşey.</p>
<p>Tavsiyem <a href="http://www.netbeans.org" target="_blank" rel="nofollow">Netbeans</a>: ücretsiz, java olmasına rağmen epey hızlı, sürekli geliştiriliyor ve tonla özelliğe sahip.</p>
<h2>Firebug ve Eklentilerini Kullanmak (Frontend Mühendisleri için)</h2>
<p><a href="http://www.getfirebug.com" rel="nofollow">Firebug</a> Firefox için yazılmış bir eklenti. Javascript ve HTML (DOM) ile ilgili birçok sorunuza cevap verebileceği gibi muhtelif başka amaçlarla da kullanılabiliyor: AJAX çağrılarını izlemek, sayfa yüklenme hızı ile ilgili sorunları tespit etmek, hatta PHP ile ilgili uyarı mesajlarını firebug&#8217;a gönderenler bile var.</p>
<p>Geçen yabancı bir şirketin iş başvurusunda, firebug konsolunuzda çıkan adrese CV&#8217;nizi gönderin yazıyordu :) Siz düşünün artık firebug&#8217;ın önemini&#8230;</p>
<p><strong>Bonus:</strong> Firebug&#8217;a eklenen eklentiler de var. SEO, sayfanın yükleme hızını ölçmek, cookie&#8217;leri takip etmek gibi diğer amaçlarınız için</p>
<h2>jQuery Bilmek (Frontend Mühendisleri için)</h2>
<p>Neden <a href="http://jquery.com" target="_blank" rel="nofollow">jQuery</a> dedim de <a href="http://mootools.net/" target="_blank" rel="nofollow">mootools</a>, <a href="http://prototypejs.com" target="_blank" rel="nofollow">prototype</a> / <a href="http://script.aculo.us" rel="nofollow">script.aculo.us</a>, <a href="http://developer.yahoo.com/yui/" rel="nofollow">YUI</a> ya da <a href="http://www.sencha.com/" rel="nofollow">ExtJS</a> demedim? Çünkü jQuery inanılmaz büyük bir kitleyi arkasına almış ve çok kullanışlı bir javascript. Diğerlerinin de elbetteki kendine göre avantajları var ama jQuery&#8217;siz olmayacağını düşünüyorum.</p>
<p>Kullanımı ilk başta biraz garip geliyor ancak alıştıktan sonra ne kadar hızla kod üretebildiğinizi görünce diğer javascript framework&#8217;lerine gerek olmadığını görebiliyorsunuz. Aslında bunlar beraber de kullanılabiliyor ama zorda kalmadıkça tek framework tercih etmekte yarar var. jQuery&#8217;nin plugin&#8217;leri sayesinde başka hiçbir framework&#8217;e ihtiyacınız kalmıyor.</p>
<p><strong>Bonus:</strong> jQuery plugin&#8217;lerinden standart bir set oluşturarak web tabanlı projelerinizde hız kazanabilirsiniz. Önerilerim: <a href="http://jqueryui.com" target="_blank" rel="nofollow">jQueryUI</a>, autocomplete, beauty tooltips, cookie, validate&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2011/01/31/bunlari-yapmayana-programci-demem/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Uzmansorusu.com Yayında</title>
		<link>http://www.huysuzadam.com/2010/08/18/uzmansorusu-com-yayinda/</link>
		<comments>http://www.huysuzadam.com/2010/08/18/uzmansorusu-com-yayinda/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 07:39:50 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=428</guid>
		<description><![CDATA[Bir süredir üzerinde çalıştığım uzmansorusu.com yayında. İş arkadaşım Batur&#8217;un yardımlarıyla hazırladığımız bu projede Türkiye&#8217;ye özgü &#8220;stackoverflow&#8221; ya da &#8220;experts-exchange&#8221; tadında bir bilgi paylaşım platformu oluşturmayı amaçladık. Her ne kadar IT uzmanları için bir numaralı bilgi edinme aracı Google olsa da aynı sektördeki teknik kişilerin bir araya gelebileceği bir ortam olur diye ümit ediyorum. Umarım insanların [...]]]></description>
			<content:encoded><![CDATA[<p>Bir süredir üzerinde çalıştığım uzmansorusu.com yayında. İş arkadaşım Batur&#8217;un yardımlarıyla hazırladığımız bu projede Türkiye&#8217;ye özgü &#8220;stackoverflow&#8221; ya da &#8220;experts-exchange&#8221; tadında bir bilgi paylaşım platformu oluşturmayı amaçladık.</p>
<p>Her ne kadar IT uzmanları için bir numaralı bilgi edinme aracı Google olsa da aynı sektördeki teknik kişilerin bir araya gelebileceği bir ortam olur diye ümit ediyorum.</p>
<p>Umarım insanların işine yarar&#8230;</p>
<p style="text-align: center;"><img class="aligncenter size-medium wp-image-430" title="Uzman Sorusu" src="http://www.huysuzadam.com/wp-content/uploads/2010/08/Untitled-1-300x201.jpg" alt="Uzman Sorusu" width="300" height="201" /></p>
<p style="text-align: center;"><a href="http://www.uzmansorusu.com">http:www.uzmansorusu.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2010/08/18/uzmansorusu-com-yayinda/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jetanket.com yayında&#8230;</title>
		<link>http://www.huysuzadam.com/2009/12/09/jetanket-com-yayinda/</link>
		<comments>http://www.huysuzadam.com/2009/12/09/jetanket-com-yayinda/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 09:04:31 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=342</guid>
		<description><![CDATA[Bloguma yazmayalı 3-4 ay olmuş... Evet yazmadım ama bi sor niye? Çok ciks bir ürün çıkardık son üç ayda: <a href="http://www.jetanket.com">http://www.jetanket.com</a>

<div style="text-align:center;">
<a href="http://www.huysuzadam.com/wp-content/uploads/2009/12/jetanket_anasayfa.png"><img src="http://www.huysuzadam.com/wp-content/uploads/2009/12/jetanket_anasayfa-300x199.png" alt="Jet Anket" title="Jet Anket Anasayfası" width="300" height="199" class="size-medium wp-image-352"  style="border:1px solid #ccc; padding:2px; background-color:#eee;"/></a>
</div>]]></description>
			<content:encoded><![CDATA[<p>Bloguma yazmayalı 3-4 ay olmuş&#8230; Evet yazmadım ama bi sor niye? Çok ciks bir ürün çıkardık son üç ayda: <a href="http://www.jetanket.com">http://www.jetanket.com</a></p>
<div style="text-align:center;"><a href="http://www.huysuzadam.com/wp-content/uploads/2009/12/jetanket_anasayfa.png"><img class="size-medium wp-image-352" style="border:1px solid #ccc; padding:2px; background-color:#eee;" title="Jet Anket Anasayfası" src="http://www.huysuzadam.com/wp-content/uploads/2009/12/jetanket_anasayfa-300x199.png" alt="Jet Anket" width="300" height="199" /></a></div>
<p><span id="more-342"></span></p>
<p>Firmaların anketlerini hazırlayıp sitelerine entegre edebilecekleri bir servis jetanket. <a href="http://www.baturorkun.com/">Batur Orkun</a>&#8216;la beraber boş vakitlerimizde uğraştık ve 3 ayda ortaya çıktı.<br />
Fena bir süre değil o yüzden mutluyuz.</p>
<h2>Hipersonik Teknolojik Anket Editörü</h2>
<p>Özellikle anket editörü çok fantastik oldu, sürükle &#8211; bırak falan, teknolojinin dibine vurduk diyebilirim&#8230; Ek olarak oylama imkanı da var, oylamada geyik potansiyeli oldukça yüksek olmakla beraber yine profesyonel anlamda kullanılabilir.</p>
<p>Batur javascript konusundaki tekniğini konuşturdu. Eh, o kadar olacak adam <a href="http://kitap.antoloji.com/web-tasarimcilari-icin-javascript-dhtml-ve-css-kitabi/">kitabını yazmış</a> bu işin.</p>
<div style="text-align:center;"><a href="http://www.huysuzadam.com/wp-content/uploads/2009/12/2.png"><img class="aligncenter size-medium wp-image-362" style="border:1px solid #ccc; padding:2px; background-color:#eee;" title="Anket editörü" src="http://www.huysuzadam.com/wp-content/uploads/2009/12/2-300x191.png" alt="Anket editörü" width="300" height="191" /></a></div>
<h2>Anket ve Oylama Dağıtımı</h2>
<p>Üyelere oylama ve anketlerini hiper-süper teknolojik arabirimimizle yarattırmakla kalmıyoruz, hedef kitleye (arkadaşlar, müşteriler ya da firma çalışanları mesela) ulaştırma imkanı da sağlıyoruz.</p>
<p>Şu an sadece toplu e-posta göndertiyoruz ama yakında bir facebook application&#8217;ı ile milyonlara virüs gibi salma, hastalık yaratma gibi niyetlerimiz güçlü. Viral marketing&#8217;den bahsediyorum evet&#8230;.</p>
<p>Gönderilecek e-posta adreslerinin yönetimini kolaylaştırmak için GMail, Hotmail ve hatta MyNet de dahil birçok servisten irtibatların otomatik aktarımını da dahil ettik.</p>
<div style="text-align:center;"><a href="http://www.huysuzadam.com/wp-content/uploads/2009/12/6.png"><img class="aligncenter size-medium wp-image-367" title="Sosyal ağlar" src="http://www.huysuzadam.com/wp-content/uploads/2009/12/6-300x228.png" alt="Sosyal ağlar" width="300" height="228" /></a></div>
<h2>Raporlama</h2>
<p>Bir güzellik de raporlar&#8230; Anket ve oylamalarla ilgili çok ciks, grafikli raporlar sunuyoruz. Üyeler bu raporları yazdırabilir ya da daha detaylı istatistik bilgileri gerekiyorsa Excel&#8217;e çıktı alıp istediği istatistikleri hesaplayabilir. Şu an çok genel raporlar veriyoruz ama medyan, standart sapma gibi profesyonel kullanıma cevap verecek ek raporlar da planlarımız arasında yer alıyor.</p>
<div style="text-align:center;"><a href="http://www.huysuzadam.com/wp-content/uploads/2009/12/4.png"><img class="aligncenter size-medium wp-image-368" title="Anket raporları" src="http://www.huysuzadam.com/wp-content/uploads/2009/12/4-300x218.png" alt="Anket raporları" width="300" height="218" /></a></div>
<h2>Facebook Connect</h2>
<p>Facebook connect&#8217;i ilk kez uyguladığım proje JetAnket oldu. Burası aynı zamanda rahatlama alanım olduğu için yazmadan edemeyeceğim:</p>
<p>&#8220;Facebook API&#8217;larının dokümanlarını yazanı allah bildiği gibi yapsın!&#8221; (oh be)</p>
<p>Epey bir karın ağrısından sonra facebook connect&#8217;i uyguladık. Siteyi yavaşlatmayacak ve düzgün çalışacak bir connect uygulaması için dokümanların arasında dolanırken kafayı yemek işten değil&#8230;</p>
<p>OpenId entegrasyonu da yine planlar arasında ama tabii önce servis ne kadar ilgi görecek onu görmek lazım&#8230;</p>
<h2>Kullandığımız Teknolojiler</h2>
<p>Sunucu tarafında Zend Framework kullandık. ZF&#8217;nin kendi altyapısı yerine özellikle <a href="http://www.netbeans.org">Netbeans</a> ve muadili bir IDE ile çok hızlı bir şekilde çalışabileceğimiz bir altyapı kurdum. Yine de çalışma mantığı aynı; MVC type2, front controller, bootstrap dosyası, router vs. ama ZF&#8217;nin cinslikleri yok&#8230;</p>
<p>Aynı altyapıyı önümüzdeki yıl içerisinde çıkacağını planladığımız Bilkent Üniversitesi&#8217;nin kütüphane yazılımı için de kullanıyoruz&#8230;</p>
<p>İstemci tarafında <a href="http://jquery.com">jquery</a> ve plug-in&#8217;lerinden oldukça yararlandık. Bunlar dışında birçok açık kaynak kodlu yazılım kullandık, open flash charts, jpgraph, open inviter gibi&#8230;</p>
<h2>İş Modeli</h2>
<p>Jet Anket&#8217;in iş modeli yurtdışında pek yaygın olan ama bizde pek görülmeyen &#8220;Freemium&#8221;. Yani belirli limitlere kadar yazılımı ücretsiz kullanabilirsiniz, eğer limitler yetersizse makul bir ücret karşılığı limitlerinizi arttırabiliyorsunuz.</p>
<p>Uzun süredir denemek istediğim bir model bu:</p>
<p>Uzakta barındırılan web tabanlı yazılım + freemium&#8230;</p>
<p>Klasik yazılımların aksine uzakta barındırılan (remote-hosted) yazılımlarda tüm işlemler tek merkezden yapıldığı için bakım ve kurulum masrafları yok. Usability üzerine yoğunlaşılarak eğitim masraflarını da yok ediyoruz. Tabii komplike yazılımların esnekliğine ve işlevselliğine erişmek imkansız ama çoğunluğun (örneğin KOBİ&#8217;ler) ihtiyacı olan aslında basit fonksiyonlarla hızla ihtiyacına çözüm bulmak.</p>
<p><a href="http://37signals.com">37signals</a>&#8216;in yıllar önce başarıyla uyguladığı bu model daha sonra birçok servise ilham kaynağı oldu. Bakalım Türkiye&#8217;de de tutacak mı?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2009/12/09/jetanket-com-yayinda/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Yaratıcı FotoKritik Kullanıcısı (Nostalji)</title>
		<link>http://www.huysuzadam.com/2009/07/15/yaratici-fotokritik-kullanicisi-nostalji/</link>
		<comments>http://www.huysuzadam.com/2009/07/15/yaratici-fotokritik-kullanicisi-nostalji/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 14:01:56 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[FotoKritik]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=305</guid>
		<description><![CDATA[Artık FotoKritik ile bağlantım kalmadığına göre bazı mizahi öğelerden bahsedebilirim. FotoKritik&#8217;te bizi en çok uğraştıran konu yüksek eğitim seviyesine sahip kullanıcıların hakaret ederken bile çok kibar cümleler kullanmasıydı&#8230; Aşağıdaki durum artık bunun son noktalarından&#8230; Hakarete uğrayan kullanıcıya hak vermek ve gerekli reaksiyonu göstermekle beraber gülmekten kendimizi alamamıştık :) Eski maillere bakarken karşılaştım, paylaşayım dedim&#8230; Olay [...]]]></description>
			<content:encoded><![CDATA[<p>Artık FotoKritik ile bağlantım kalmadığına göre bazı mizahi öğelerden bahsedebilirim.</p>
<p>FotoKritik&#8217;te bizi en çok uğraştıran konu yüksek eğitim seviyesine sahip kullanıcıların hakaret ederken bile çok kibar cümleler kullanmasıydı&#8230;</p>
<p>Aşağıdaki durum artık bunun son noktalarından&#8230;</p>
<p><span id="more-305"></span></p>
<p>Hakarete uğrayan kullanıcıya hak vermek ve gerekli reaksiyonu göstermekle beraber gülmekten kendimizi alamamıştık :) Eski maillere bakarken karşılaştım, paylaşayım dedim&#8230;</p>
<p>Olay şu şekilde gelişiyor. İki üye fotoğrafla ilgili yorumlarda bir konuda tartışıyorlar. Tartışmanın bir noktasında üyelerden biri diğerine bir özür e-postası gönderiyor, içeriği şu şekilde:</p>
<blockquote style="padding:10px"><p>
Merhaba xxx Bey,</p>
<p>Foto kritikteki yorumlarınız inanın ki hiç önemli değil sizi gayet iyi anlıyorum kendinizce haklı ve geçerli sebepleriniz olabilir. Hiç önemli değil :) Ben sizi kırdıysam özür dilerim şahsınızdan ve aramızda ki bu münakaşaya istinaden bir jest olarak size değerli bir portrem olan ve içerdiği metaforik anlam, renk tonlamaları ve fotoğrafçılıkta en zor kategorilerden biri olan portre özellikle oto portre çekimine dair gayet başarılı bulunmuş ve galerilerde çokça ilgi görmüş &#8220;Hareket&#8221; isimli otoportremi hediye etmek isterim, üstelikte şahsım tarafından imzalı bir kopyası. Yorumlarınız ve gosterdiğiniz ilgiden dolayı teşekkür ederim.</p>
<p>Saygılar
</p></blockquote>
<div style="margin-top:30px;">
Bu e-postanın ekinde ise şu &#8220;sanatsal&#8221; fotoğraf yer alıyor:
</div>
<p>.<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.<br />
.</p>
<p><a href="http://www.huysuzadam.com/wp-content/uploads/2009/07/nah.jpg"><img src="http://www.huysuzadam.com/wp-content/uploads/2009/07/nah-300x225.jpg" alt="Özür" title="Özür" width="300" height="225" class="size-medium wp-image-307" /></a></p>
<p>Ne diyeyim, yaratıcılık fotoğraf sanatının doğasında var&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2009/07/15/yaratici-fotokritik-kullanicisi-nostalji/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Zend Framework 1.8 Kurulumu</title>
		<link>http://www.huysuzadam.com/2009/07/14/zend-framework-1-8-kurulumu/</link>
		<comments>http://www.huysuzadam.com/2009/07/14/zend-framework-1-8-kurulumu/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 15:26:05 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[ZF Örnek]]></category>
		<category><![CDATA[ZF Kurulum]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=287</guid>
		<description><![CDATA[Daha önce ZF 1.5.2 için bir örnek oluşturmuştum. Ancak 1.8 versiyonundan itibaren işler biraz değişti. Aslında proje yaratmak oldukça kolaylaştı ama ilk kurulum biraz uğraştırabilir. ZF 1.8&#8242;den itibaren, ilk kez 1.7 versiyonunda gelen Zend_Tool epey önplana çıktı. Artık &#8220;zf create project&#8221; gibi bir komutla çalışır bir proje elde etmek mümkün. Tabii gerekli ayarları yaptıktan sonra&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>Daha önce <a href="http://www.huysuzadam.com/2008/06/11/zend-frameworke-giris-ve-ornek-proje/">ZF 1.5.2 için bir örnek</a> oluşturmuştum. Ancak 1.8 versiyonundan itibaren işler biraz değişti. Aslında proje yaratmak oldukça kolaylaştı ama ilk kurulum biraz uğraştırabilir.</p>
<p>ZF 1.8&#8242;den itibaren, ilk kez 1.7 versiyonunda gelen Zend_Tool epey önplana çıktı. Artık &#8220;zf create project&#8221; gibi bir komutla çalışır bir proje elde etmek mümkün. Tabii gerekli ayarları yaptıktan sonra&#8230;</p>
<p><span id="more-287"></span></p>
<h2>Zend Framework Kurulumu</h2>
<p>Bu örnek windows için oluşturulmuştur ama linux ve mac için de mantık benzerdir.</p>
<p>Düzgün ve çalışan bir Apache &#8211; PHP &#8211; MySQL kurulumu olduğu varsayılmıştır.</p>
<p>PHP&#8217;nin &#8220;C:\php&#8221; altında olduğu varsayılmıştır.</p>
<p>Zend Framework 1.8.4 ile test edilmiştir, eski versiyonlarda çalışmayacağı garanti olup ileriki versiyonlar için söz veremem zira Zend zırt pırt değiştiriyor yapıyı&#8230;</p>
<h3>Yapılacaklar</h3>
<ul>
<li>Her projede ayrı ayrı kopyalar oluşturmamak için ZF&#8217;ü genel bir dizine koyup php&#8217;nin include_path&#8217;ine ekleyeceğiz.</li>
<li>Projeleri otomatik yaratan zf.bat betiğine erişebilmek için zf.bat  ve php.exe dosyalarının sistem PATH&#8217;ine ekleyeceğiz.</li>
<li>Projeyi web sunucusunun kök dizini <strong>dışındaki</strong> bir &#8220;Projeler&#8221; dizininde oluşturacağız. (Güvenlik nedeniyle asla webroot&#8217;ta oluşturmayın!)</li>
<li>Kök dizini dışında olduğumuz için bir virtual host tanımlayacağız. Böylece şık adreslerimiz de düzgün çalışacak.</li>
<li>Projemizi test edip ilk kez çalıştığını göreceğiz.</li>
</ul>
<p><strong>Projenin Geliştirilmesi</strong> (Sonraki Yazı)</p>
<ul>
<li> Proje dizin yapısına bir göz atacağız.</li>
<li>Proje ile ilgili ilk ayarları yapacağız (application.ini)</li>
<li>Veritabanıyla ilgili işlemler için bir model yaratacağız.</li>
<li>Birkaç action oluşturacağız ama silemeyeceğiz !?!? (Açıklaması var)</li>
<li>Bir layout oluşturup view&#8217;lerimizi bu layout ile ilişkilendireceğiz.</li>
<li>Basit bir helper oluşturacağız.</li>
</ul>
<h2>Kurulum</h2>
<p>Öncelikle <a href="http://framework.zend.com/download/latest">son versiyonu</a> indirmekle başlayalım. Full versiyona şimdilik gerek yok o yüzden minimal olan versiyonu indirebilirsiniz.</p>
<p>İndirdiğiniz arşivi açtığınızda bin ve library olmak üzere iki dizin göreceksiniz. Bu dizinlerden bin içerisinde zf.bat, zf.php ve zf.sh dosyaları bulunur. Bu dosyalarla ilgili tanımları yaptıktan sonra projeyi otomatik olarak oluşturacak betikler bunlardır. Diğer dizin olan library altında ise Zend Framework bulunuyor.</p>
<h3>ZF&#8217;ün PHP include_path&#8217;ine Eklenmesi</h3>
<p>PHP kurulumunuzun &#8220;C:\php&#8221; altında olduğunu farz ederek, &#8220;C:\php\ZF&#8221; diye bir dizin oluşturun.</p>
<p>PEAR kütüphanesinin de &#8220;C:\php&#8221; içerisinde olduğunu düşünerek en uygun yerin burası olduğuna karar verdim ama başka yerlere kurmak da mümkün aslında.</p>
<p>Kütüphaneye erişebilmek için php.ini dosyasını açıp <strong>include_path</strong> tanımlamasına &#8220;C:\php\ZF\library&#8221; dizinini ekleyin.</p>
<div style="border-top: 1px solid #cccc99; border-bottom: 1px solid #cccc99; padding: 8px; background-color: #ffffcc;"><strong>Notlar</strong></p>
<ul>
<li>Doğru php.ini&#8217;yi güncellediğinizden emin olun. Bunun için bir php dosyasına &#8220;phpinfo();&#8221; yazıp çalıştırdıktan sonra &#8220;Loaded Configuration File&#8221; kısmına bakın.</li>
<li>PEAR kurduysanız php.ini dosyasının en sonunda bir include_path tanımı daha olabilir.</li>
<li>Birden fazla dizin tanımlanacaksa windows için noktalı virgül, linux ve mac için iki nokta ile ayırılması gerekir. Benim windows bilgisayarımdaki include_path&#8217;in son hali: include_path=&#8221;.;C:\php\pear;C:\php\ZF\library&#8221;</li>
</ul>
</div>
<p>Apache&#8217;yi yeniden başlattığınızda include_path tanımı sayesinde artık hangi dizinde olursa olsun php içerisinden require(&#8220;Zend/&#8230;.&#8221;); şeklinde dosya çağırabilir hale geldiniz. Ama çağırmanıza gerek olmayacak o ayrı.</p>
<h3>ZF Betiğinin Çalıştırılabilir Dizinlere (Path) Eklenmesi</h3>
<p>Bunun için Control Panel → System → Advanced System Settings penceresine gidin (Türkçe windows kullanıcıları başının çaresine baksın).</p>
<p>Environment Varibles&#8217;a tıklayınca açılan penceredeki System Variables altından PATH değişkeninin sonuna &#8220;C:\php\ZF\bin&#8221; ve &#8220;C:\php&#8221; dizinlerini ekleyin. (Noktalı virgülle ayırarak)</p>
<p>Bu aşamadan sonra bilgisayarınız baştan başlatmanız gerekecek maalesef. (Logout &#8211; Login kurtarmaz).</p>
<p>Buraya kadar eğer doğru bir şekilde yaptıysanız &#8220;Command Prompt&#8221; açıp &#8220;zf show version&#8221; yazdığınız zaman şöyle bir şey görmeniz lazım:</p>
<pre>Zend Framework Version: 1.8.4</pre>
<h3>İlk Projemizin Oluşturulması</h3>
<ul>
<li>Eğer yoksa, projeler ile ilgili web sunucunun <strong>kök dizininden farklı bir yere</strong> bir dizin oluşturun. Mesela benimkisi &#8220;D:\Projeler&#8221;.</li>
<li>Bir &#8220;Command Prompt&#8221; açın ve o dizine cd ile gidin. Projeniz için dizin yaratmayın! zf.bat sizin için otomatik olarak halledecek bunu.</li>
<li> Şu komutu verin:
<pre>zf create project zf_deneme</pre>
</li>
</ul>
<p>ZF betiği projeler dizini altında <strong>zf_deneme</strong> diye bir dizin oluşturacak ve başlangıç için önerilen dizin yapısını oluşturacaktır:</p>
<p><img class="size-full wp-image-292" src="http://www.huysuzadam.com/wp-content/uploads/2009/07/zf_directory_structure.gif" alt="Zend Framework Directory Structure" width="185" height="433" /></p>
<h3>Virtual Host Tanımlaması</h3>
<p>Aslında virtual host olayına girmeden de çalışır hale getirmek mümkün. Bir &#8220;<strong>Alias</strong>&#8221; oluşturulabilir (Bkz. <a href="http://www.huysuzadam.com/2008/06/11/zend-frameworke-giris-ve-ornek-proje/">önceki yazım</a>), ya da güvenliği boşverip doğrudan kök dizinine yerleştirilebilir ki kesinlikle tavsiye etmiyorum, alışmayın&#8230; Ancak her halükarda public dizini için &#8220;<strong>AllowOverride All</strong>&#8221; tanımını yapmalısınız.</p>
<p>Windows&#8217;da virtual host tanımlamak için önce httpd.conf dosyasını bulun. Bu dosyada:</p>
<pre>NameVirtualHost *:80</pre>
<p>satırının comment&#8217;li olmadığından emin olun. Eğer rewrite modülü yüklü değilse</p>
<pre>LoadModule   rewrite_module   modules/mod_rewrite.so</pre>
<p>satırını ekleyin ya da başındaki commenti kaldırın.</p>
<p>Virtual host ile ilgili diğer tanımların bulunduğu yere aşağıdakileri tanımlayın (Bu arada virtual host tanımlamaları ayrı bir dosyada tutuluyor da olabilir, apache&#8217;nin conf dizinine bir bakın) :</p>
<pre>&lt;VirtualHost *:80&gt;
  ServerName localhost
&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
  ServerName zf_deneme.localhost
  DocumentRoot D:\Projects\zf_deneme\public
  &lt;Directory "D:\Projects\zf_deneme\public"&gt;
    AllowOverride All
  &lt;/Directory&gt;
&lt;/VirtualHost&gt;
</pre>
<p>Yaptığınız değişikliklerin geçerli olması için apache&#8217;yi restart etmeniz gereklidir.</p>
<p>Son olarak <strong>C:\Windows\System32\drivers\etc</strong> dizinindeki <strong>hosts</strong> dosyasını notepad ile açın ve içerisine</p>
<pre>127.0.0.1       zf_deneme.localhost</pre>
<p>satırını ekleyin. Windows&#8217;u restart etmenize gerek yok&#8230;</p>
<p>Artık <strong>http://zf_deneme.localhost/</strong> adresine bağlandığınızda projenize erişebiliyor olmanız lazım:</p>
<p><img class="aligncenter size-full wp-image-295" style="border: 3px solid #ccc;" title="zf_gettingstarted_screenshot" src="http://www.huysuzadam.com/wp-content/uploads/2009/07/zf_gettingstarted_screenshot.jpg" alt="Zend Framework Kurulumu" width="480" height="427" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2009/07/14/zend-framework-1-8-kurulumu/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>MySQL türkçe desteği: Collation ve character set nedir?</title>
		<link>http://www.huysuzadam.com/2009/05/23/mysql-turkce-destegi-collation-ve-character-set-nedir/</link>
		<comments>http://www.huysuzadam.com/2009/05/23/mysql-turkce-destegi-collation-ve-character-set-nedir/#comments</comments>
		<pubDate>Sat, 23 May 2009 10:52:33 +0000</pubDate>
		<dc:creator>M.Ozan Hazer</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web Teknolojileri]]></category>

		<guid isPermaLink="false">http://www.huysuzadam.com/?p=252</guid>
		<description><![CDATA[MySQL 4.1&#8242;den itibaren türkçe karakter işi karıştı. &#8220;SET NAMES latin5&#8243; ile çözdük bu problemi gerçi ama yine de sistemin nasıl çalıştığını bilmezseniz sorun yaşayabilirsiniz. O yüzden MySQL&#8217;in karakter seti ve collation hakkında birşeyler yazayım istedim. Tanımlar Konuyu kavramak için önce tanımları ele alalım. Bilmemiz gereken iki tanım var: &#8220;Character Set&#8221; ve &#8220;Collation&#8221; Character Set (Karakter [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL 4.1&#8242;den itibaren türkçe karakter işi karıştı. &#8220;SET NAMES latin5&#8243; ile çözdük bu problemi gerçi ama yine de sistemin nasıl çalıştığını bilmezseniz sorun yaşayabilirsiniz. O yüzden MySQL&#8217;in karakter seti ve collation hakkında birşeyler yazayım istedim.</p>
<h2>Tanımlar</h2>
<p>Konuyu kavramak için önce tanımları ele alalım. Bilmemiz gereken iki tanım var: &#8220;Character Set&#8221; ve &#8220;Collation&#8221; </p>
<p><strong>Character Set (Karakter Seti)</strong><br />
Adından anlayabileceğiniz gibi desteklenen karakterleri kast ediyoruz. Örneğin latin5 karakter setindeki &#8220;ı&#8221; harfinin ASCII kodu latin1 karakter setindeki &yacute; harfi ile aynıdır. Dolayısıyla türkçe bir dokümanı latin1 olarak gösterirseniz tüm &#8216;ı&#8217; harfleri &#8216;&yacute;&#8217; olarak gösterilecektir.</p>
<p>Farklı diller aynı karakter setlerine sahip olabilir, örneğin latin1 seti almanca, ispanyolca, ingilizce, isveçce gibi dilleri kapsar.</p>
<p><span id="more-252"></span></p>
<p>Notlar:<br />
- Character set, charset, code page gibi isimleri de vardır.<br />
- latin1: ISO-8859-1 ve windows-1252 ile aynıdır.<br />
- latin5: ISO-8859-9 ve windows-1254 ile aynıdır.  </p>
<p><strong>Collation (koleyşın)</strong><br />
İki karakterin karşılaştırılmasında kullanılır. Pratikte bu tablo alanlarını sorgularken ve sıralamalarda işe yarar:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SET</span> names latin5;
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> deneme <span style="color: #993333; font-weight: bold;">WHERE</span> isim <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Çağrı'</span>;
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> deneme <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> isim;</pre></div></div>

<p>Yukarıdaki sorguların sonucu <code>isim</code> alanının collation&#8217;ına bağlıdır.</p>
<p>Örnekle açıklamak istersek, almancada da &#8220;ü&#8221; harfi var türkçede de, isveçcede de&#8230; Ama bu harflerin alfabedeki yeri dile göre değişiyor yani collation&#8217;ı latin1_swedish_ci seçip sıralama yaparsanız ü başka yerde, latin1_german1_ci seçerseniz başka yerde yer alır. Ya da latin1_german1_ci seçerseniz aramalarda &#8216;ä&#8217; ile &#8216;a&#8217; aynı kabul edilirken latin1_german2_ci seçerseniz farklı kabul edilir.</p>
<p>Collation altçizgiyle ( _ işareti) parçalara ayırırsak ilk kısım karakterin ait olduğu dil ailesini, ikinci kısım dili, üçüncü kısım ise karşılaştırma şeklini ifade eder. </p>
<p>Örneğin <code>latin1_swedish_ci</code> dediğimiz zaman &#8220;latin1&#8243; ailesinden &#8220;isveçce&#8221; dilini büyük-küçük harf ayrımı olmadan sırala demek istiyoruz. </p>
<p>ci: Case-Insensitive (Büyük &#8211; küçük harfe duyarsız)<br />
cs: Case-Sensitive (Büyük &#8211; küçük harfe duyarlı. Sadece bazı diller için geçerli, türkçede kullanılmaz)<br />
bin: Binary (Karakteri tanımlayan byte değerine göre karşılaştır demek. Pratikte büyük &#8211; küçük harfe duyarlılık istendiğinde kullanılır.</p>
<h2>MySQL Dil Ayarı Nasıl Yapılır?</h2>
<p>MySQL&#8217;le biraz uğraşırsanız dilin ayarlanabileceği tonla yer görürsünüz. Büyükten küçüğe doğru gidersek: </p>
<ol>
<li>Sunucu ayarı</li>
<li>Veritabanı ayarı</li>
<li>Tablo ayarı</li>
<li>Tablodaki alanın ayarı</li>
</ol>
<p>Not 1: Bu ayarlardan pratikte sizi tek ilgilendiren: tablodaki alanın karakter seti.<br />
Not 2: Buradaki ayarlar ne olursa olsun son sözü yine bağlantıyı kurduktan sonra verdiğiniz &#8220;SET NAMES utf8&#8243; komutu söyler. </p>
<h3>1. MySQL Sunucusu</h3>
<p>MySQL derlenirken tanımlanabilir:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">shell<span style="color: #000000; font-weight: bold;">&gt;</span> .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--with-charset</span>=utf8 <span style="color: #660033;">--with-collation</span>=utf8_general_ci</pre></div></div>

<p>Ya da my.cnf / my.ini&#8217;de tanımlanabilir:</p>
<p><!--more--></p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>mysqld<span style="">&#93;</span></span>
<span style="color: #000099;">character-set-server</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">utf8</span>
<span style="color: #000099;">collation-server</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">utf8_general_ci</span></pre></div></div>

<p>Bu tanımlar sadece yeni yaratılacak veritabanları ve tabloların varsayılan karakter setinin utf8, collation&#8217;ının ise utf8_general_ci olmasını sağlar. Yani bu tanımları yapsanız bile yine de &#8220;SET NAMES utf8&#8243; demeniz gerekecektir.</p>
<h3>2. Veritabanı</h3>
<p>Veritabanı yaratılırken tanımlanır. Eğer tanımlanmazsa MySQL sunucusundaki tanım neyse o kullanılır.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> mydb
  <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8
  <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;</pre></div></div>

<p>Bu yapılan tanım da sadece bu veritabanında oluşturulan tabloların varsayılan karakter seti ve collation&#8217;ının ne olacağını belirler.</p>
<h3>3. Tablo</h3>
<p>Tablo yaratılırken tanımlanır. Eğer tanımlanmazsa veritabanındaki tanım kullanılır:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"> <span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> deneme <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`x`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> latin5 <span style="color: #993333; font-weight: bold;">COLLATE</span> latin5_turkish_ci</pre></div></div>

<p>Bu durumda tabloya eklenen satırların collation&#8217;ı verilmezse latin5_turkish_ci olur.</p>
<h3>4. Tablo Alanı</h3>
<p>Üstteki tabloya ispanyolca bir alan eklemek istediğimizi düşünelim:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> deneme <span style="color: #993333; font-weight: bold;">ADD</span> <span style="color: #ff0000;">`y`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> latin1 <span style="color: #993333; font-weight: bold;">COLLATE</span> latin1_spanish_ci;</pre></div></div>

<p>Tablonun collation&#8217;ı türkçe olmasına rağmen alan ispanyolca oldu. Bu alana türkçe giriş yaparsanız ı,ş, ğ gibi karakterleri hatalı görürsünüz.</p>
<h2>Çalışma Şekli</h2>
<p>Bu kısımda SET NAMES &#8216;latin5&#8242; ne demek onu detaylandıracağım&#8230;</p>
<p>Veritabanının çalışma şeklini düşünürsek, biz sunucuya bir sorgu gönderiyoruz, sunucu da bu sorguyu okuyup bize bir cevap gönderiyor.</p>
<ol>
<li>Gönderdiğimiz sorgu hangi karakter setinde? Biz örneğin ascii mi gönderiyoruz yoksa utf8 mi?<br />
Bunun için sunucu <code>character_set_client</code> parametresine bakar.</li>
<li>Gönderilen sorguyu sunucu hangi karakter setine çevirmeli? Bunun için de <code>character_set_connection</code> ve <code>collation_connection</code> parametrelerine bakar. Yani sunucu gönderilen sorguyu <code>character_set_client</code> karakter setinden <code>character_set_connection</code> karakter setine çevirir.<br />
<code>collation_connection</code> parametresi sadece iki string birbiriyle kıyaslanacaksa kullanılır. Eğer bir tablo alanını bir string ile karşılaştırıyorsanız kullanılmaz çünkü bu durumda o tablo alanının collation&#8217;ı kullanılır.
</li>
<li>
Sunucu sorguyu işleyip veritabanından sonucu çektikten sonra bize gönderir demiştik, bize göndermeden önce sonucun karakter setini değiştirebilir. Bunun için <code>character_set_results</code> parametresini kullanır.
</li>
</ol>
<p>Bütün bu ayarları sunucunun konfigürasyon dosyasından yapabileceğiniz gibi (my.cnf ya da my.ini) doğrudan bir sql cümlesi ile de yapabilirsiniz. Yani php için:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;set character_set_client='latin5'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>diyebilirsiniz örneğin. </p>
<p>Sadece türkçe kullanacaksanız eğer şu komuyu verebilirsiniz:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SET character_set_client='latin5'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SET character_set_results='latin5'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SET character_set_connection='latin5'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Her seferinde bu satırları aklımızda tutmamıza gerek olmasın diye MySQL bir kısa yol koymuş, o da:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SET NAMES latin5&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>SET NAMES satırından nasıl kurtulurum?</h2>
<p>Programcıların SET NAMES satırını unutmaları ihtimaline karşı <code>init_connect</code> parametresini kullanmak pratik olabilir:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>mysqld<span style="">&#93;</span></span>
<span style="color: #000099;">init_connect</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">'SET NAMES latin5'</span></pre></div></div>

<p>Tabii veritabanını başlatırken parametre olarak da verilebilir bu.</p>
<p>Performansı arttırmak için veritabanı ayarlarına <code>skip-character-set-client-handshake</code> parametresini ekleyebilirsiniz. Bu durumda tablo alanının collation&#8217;ı kullanılacaktır ancak SET NAMES ile dili değiştirmek bu durumda mümkün olmayacaktır. Bir de, bu parametre &#8220;super user&#8221; ile bağlandığınızda geçersizdir.</p>
<h2>Türkçe Dil Desteği ile İlgili Diğer Etkenler</h2>
<p>Farklı dillerin doğru desteklenmesi için sadece MySQL&#8217;in doğru ayarlanması tabii ki yeterli değil. Dinamik web sitelerini örnek aldığımızda, Apache &#8211; PHP &#8211; MySQL platformunu düşünürsek:</p>
<ol>
<li>
<strong>Apache&#8217;nin dil ayarı</strong><br />
Header göndererek apache&#8217;de dil tanımlanabilir:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">AddDefaultCharset</span> utf-<span style="color: #ff0000;">8</span></pre></div></div>

<p>Bu tanımlanan dil hatalıysa PHP, HTML ve veritabanındaki ayarlarınız ne olursa olsun sorun yaşarsınız.
</li>
<li>
<strong>PHP</strong><br />
PHP&#8217;den de aynı apache&#8217;deki gibi header gönderilebilir:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-type: text/html; charset=utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Bu gönderilen header, apache tarafından gönderilenlerin sonuna eklendiği için apache&#8217;nin ayarlarını değiştiremez ancak burada dil ile ilgili header yanlış gönderilirse HTML ve veritabanındaki ayarlarınız ne olursa olsun sorun yaşarsınız.
</li>
<li>
<strong>HTML</strong><br />
HTML meta komutu ile header bilgisi simüle edilebilir.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">HTTP-EQUIV</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-type&quot;</span> <span style="color: #000066;">VALUE</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>Eğer PHP ya da apache&#8217;den header gönderildiyse bu değer işe yaramaz. Eğer buradaki bilgi hatalı olursa veritabanından doğru dilde çekseniz bile sorun yaşayabilirsiniz.
</li>
</ol>
<h3>UTF-8 ile ilgili not</h3>
<p>UTF8 sonradan çıkan bir tanım. İçerisinde hemen hemen tüm dilleri barındırdığı için aslında büyük kolaylık. Ancak ilk geliştirilen ASCII formatından farklı bir altyapısı var. Dolayısıyla eğer utf8 kullanmayı seçtiyseniz yukarıdakilere ek olarak bir de dosya formatı sorunu karşınıza çıkıyor. </p>
<p>Eğer PHP ya da HTML sayfalarınızı açtığınız editör UTF8 destekli değilse ya da yeni dosya yarattığınızda dosyayı utf8 olarak kaydetmediyseniz yine sorun yaşayabilirsiniz.</p>
<p>UTF8 başlı başına bir muamma olduğu için çok detaya girmeyeceğim&#8230;</p>
<h3>Karakter sorunu çözmede izleyebileceğiniz yol</h3>
<p>Eğer karakter sorunu yaşıyorsanız aşama aşama şunu yapabilirsiniz:</p>
<p>1. Öncelikle sayfada gösterilen karakterler bozuk mu yoksa yanlış karakter setinde göstermeye çalıştığı için mi öyle gözüküyor onu tespit edin. Bunun için firefox&#8217;ta View / Character Encoding kısmından encoding doğru mu gözüküyor bakın. Eğer doğruysa ve problem utf8&#8242;leyse hata ya ilgili dosyanın utf8 olmamasıdır ya da veritabanından hatalı geliyordur. </p>
<p>2. Eğer encoding hatalıysa header&#8217;larda sorun var mı ona bakın. Header&#8217;ları görmek için firefox&#8217;un firebug extension&#8217;ından ya da ie8&#8242;in developer tools&#8217;undan vs. yararlanabilirsiniz. Eğer header farklı ise header&#8217;ın nereden geldiğini bulun: Ya apache&#8217;den ya da PHP&#8217;den gelir.</p>
<p>3. Header doğruysa &#8220;View source&#8221; diyip meta elemanına bakın. Buna &#8220;view source&#8221; ile bakın zira özellikle dinamik sitelerde kazara birden fazla meta komutunun geldiğine çok şahit oldum.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huysuzadam.com/2009/05/23/mysql-turkce-destegi-collation-ve-character-set-nedir/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
	</channel>
</rss>

