<?xml version="1.0" encoding="utf-8"?><!-- generator="b2evolution/4.1.4" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>yazılım geyiklemeleri</title>
		<link>http://ertan.rdgnetwork.org/</link>
		<atom:link rel="self" type="application/rss+xml" href="http://ertan.rdgnetwork.org/?tempskin=_rss2" />
		<description></description>
		<language>utf-8</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=4.1.4"/>
		<ttl>60</ttl>
				<item>
			<title>Invariant Case Türkçe İ ve I karakterleri</title>
			<link>http://ertan.rdgnetwork.org/invariant-case-turkce-i-karakteri</link>
			<pubDate>Thu, 12 Jan 2012 22:19:00 +0000</pubDate>			<dc:creator>ertan</dc:creator>
			<category domain="main">Algoritma Soruları</category>			<guid isPermaLink="false">376@http://blog.rdgnetwork.org/</guid>
						<description>&lt;p&gt;Çok eski bir konu ama halen bu konuda hatalı kodlarla karşılaştığım için anlatayım. .Net Framework 2.0 versiyonu ile string karşılaştırmalarda yeni bir özellik geldi.&lt;/p&gt;

&lt;h2&gt;Back To Basics&lt;/h2&gt;

&lt;p&gt;Geçmiş ile işim olmaz diyenler bu bölümü atlayabilir, meraklılar için önce biraz zamanda geri saralım. &lt;/p&gt;

&lt;p&gt;Bundan 15 yıl öncesinde DOS tipi işletim sistemleri kullanılırken dillerdeki farklı karakterleri göstermek için ISO 8859 adında bir standart kullanılmaya başlandı. O tarihlerde bilgisayarlar daktilo niyetine kullanıldığı için temel olarak ingilizce&#039;yi alan bu standart farklı diller içinde 255 karakter içerisinden sık kullanılmayan karakterlerin şekilleri ve karakterlerin sıralaması değiştirilerek çözüldü. &lt;/p&gt;

&lt;p&gt;Örneğin; Türkçe için Ş,İ,Ö,Ç gibi karakterlere değiştirerek Latin-5 (Tam ismiyle ISO-8859-9) isimli ISO standardı uyduruldu. &lt;/p&gt;

&lt;p&gt;Eğer farklı bir dil setini kullanıyorsanız &quot;I&quot; harfi ile &quot;ı&quot; (yada ekranda göreceğiniz şekliyle &quot;Y&quot; benzeri bir şey) aynı anlamda değildi.&lt;/p&gt;

&lt;p&gt;O zamanları hatırlayınca Türkçe karakter problemleri şimdi yaşananlar bunca karmaşaya rağmen çok hafif kalır aslında ama neyse.&lt;/p&gt;

&lt;p&gt;1990&#039;ların sonuna doğru tüm bu sorunları ortadan kaldırmak için Unicode adı verilen yeni bir standart yayılmaya başladı ama ancak şimdilerde yaygın olarak kullanılmaya başladı. .Net&#039;in ilk yayınladığı 1.0 versiyonunda da varsayılan olarak Unicode kullanılması belki de tüm bunlara bir katkısı olmuştur.&lt;/p&gt;

&lt;h2&gt;Problem nerde ?&lt;/h2&gt;

&lt;p&gt;Framework 1.0&#039;daki tüm string işlemlerinin kullanılan dilin özelliklerine göre çalışması bir sürü karakter sorunlarını çözdü ama bu sefer farklı bir problem yarattı. &lt;/p&gt;

&lt;p&gt;Örneğin; Diskinizdeki C:\Inceden.txt isimli bir dosyayı açmak niyetiyle aşağıdaki gibi bir iş yaparsanız&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;string dosya = &quot;C:\Inceden.txt&quot;;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;File.Open( dosya.ToLower() );&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dosyanın adı &quot;c:\ınceden.txt&quot; gibi bir şeye dönüşüyor, normal olarakta dosyayı bulamıyordunuz.&lt;/p&gt;

&lt;p&gt;Aslında bu normal çünkü Türkçe size &quot;I&quot; harfinin küçülmüş halinin &quot;ı&quot; olduğunu söyler.&lt;/p&gt;

&lt;p&gt;Bu sefer karşılaştırma işlemlerinde üzerinde işlem yapmak istediğiniz şeyin ne olduğu bu sefer değişmeye başladı. Bu bir kişinin adı mı ?, yoksa dosya adı mı ? gibi.&lt;/p&gt;

&lt;p&gt;1.1 versiyonuna kadar devam eden problem &lt;a href=&quot;https://connect.microsoft.com/VisualStudio/feedback/details/119401/when-referenced-assembly-name-contains-i-character-in-turkish-region-settings-gives-designer-error&quot;&gt;benimde katkımla&lt;/a&gt; yoğun şikayetler yüzünden framework&#039;deki string işlemlerine Invariant ve Ordinal isimli yeni karşılaştırma tipleri eklenerek çözüldü. Bu konuyla ile ilgili &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms973919.aspx&quot;&gt;daha fazla detayı&lt;/a&gt; buradan öğrenebilirsiniz.&lt;/p&gt;

&lt;h2&gt;Nasıl ?&lt;/h2&gt;

&lt;p&gt;Eğer kullanılan dilden bağımsız hareket etmek istiyorsanız &lt;b&gt;Invariant&lt;/b&gt;, dil ile ilgisiz tam eşleşme istiyorsanız &lt;b&gt;Ordinal&lt;/b&gt; kullanılması gibi bir çözüm çıktı.&lt;/p&gt;

&lt;p&gt;Örnekle gidelim;&lt;/p&gt;

&lt;p&gt;Biraz önceki dosya adını invariant kullanarak küçük harflere çevirirsek;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;? &quot;Inceden.TXT&quot;.ToLowerInvariant() &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&quot;inceden.txt&quot;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Örneğin Invariant karşılaştırırsak;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;? string.Equals(&quot;i&quot;,&quot;I&quot;, StringComparison.InvariantCultureIgnoreCase)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;? string.Equals(&quot;ş&quot;,&quot;S&quot;, StringComparison.InvariantCultureIgnoreCase)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;false&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;? string.Equals(&quot;ş&quot;,&quot;Ş&quot;, StringComparison.InvariantCultureIgnoreCase)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;benzeri ordinal karşılaştırma yaparsak;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;? string.Equals(&quot;i&quot;,&quot;İ&quot;, StringComparison.OrdinalIgnoreCase)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;false&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;? string.Equals(&quot;I&quot;,&quot;İ&quot;, StringComparison.OrdinalIgnoreCase)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;false&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;? string.Equals(&quot;i&quot;,&quot;I&quot;, StringComparison.OrdinalIgnoreCase)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ordinalin farklı davrandığı bir örnek olarak&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;? string.Equals(&quot;a&quot;,&quot;A&quot;, StringComparison.OrdinalIgnoreCase)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;İşin özeti&lt;/h2&gt;

&lt;p&gt;Herhangi bir string karşılaştırma yapacaksanız, string içindeki değerin ne olduğunu bilerek davranmanız ilerde daha az ağrısız bir ortam yaratır size. &lt;/p&gt;

&lt;p&gt;Size tavsiyem hiç bu özellikleri kullanmadan asla ama asla &lt;b&gt;myString1 == myString2&lt;/b&gt; şeklinde bir karşılaştırma yapmayın. Bu tür karşılaştırmalar işletim sisteminin seçtiği dilin özelliklerine göre çalışır, eğer yazdığınız uygulama birden fazla dil desteği sağlıyorsa uzak durun derim.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://ertan.rdgnetwork.org/invariant-case-turkce-i-karakteri&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Çok eski bir konu ama halen bu konuda hatalı kodlarla karşılaştığım için anlatayım. .Net Framework 2.0 versiyonu ile string karşılaştırmalarda yeni bir özellik geldi.</p>

<h2>Back To Basics</h2>

<p>Geçmiş ile işim olmaz diyenler bu bölümü atlayabilir, meraklılar için önce biraz zamanda geri saralım. </p>

<p>Bundan 15 yıl öncesinde DOS tipi işletim sistemleri kullanılırken dillerdeki farklı karakterleri göstermek için ISO 8859 adında bir standart kullanılmaya başlandı. O tarihlerde bilgisayarlar daktilo niyetine kullanıldığı için temel olarak ingilizce'yi alan bu standart farklı diller içinde 255 karakter içerisinden sık kullanılmayan karakterlerin şekilleri ve karakterlerin sıralaması değiştirilerek çözüldü. </p>

<p>Örneğin; Türkçe için Ş,İ,Ö,Ç gibi karakterlere değiştirerek Latin-5 (Tam ismiyle ISO-8859-9) isimli ISO standardı uyduruldu. </p>

<p>Eğer farklı bir dil setini kullanıyorsanız "I" harfi ile "ı" (yada ekranda göreceğiniz şekliyle "Y" benzeri bir şey) aynı anlamda değildi.</p>

<p>O zamanları hatırlayınca Türkçe karakter problemleri şimdi yaşananlar bunca karmaşaya rağmen çok hafif kalır aslında ama neyse.</p>

<p>1990'ların sonuna doğru tüm bu sorunları ortadan kaldırmak için Unicode adı verilen yeni bir standart yayılmaya başladı ama ancak şimdilerde yaygın olarak kullanılmaya başladı. .Net'in ilk yayınladığı 1.0 versiyonunda da varsayılan olarak Unicode kullanılması belki de tüm bunlara bir katkısı olmuştur.</p>

<h2>Problem nerde ?</h2>

<p>Framework 1.0'daki tüm string işlemlerinin kullanılan dilin özelliklerine göre çalışması bir sürü karakter sorunlarını çözdü ama bu sefer farklı bir problem yarattı. </p>

<p>Örneğin; Diskinizdeki C:\Inceden.txt isimli bir dosyayı açmak niyetiyle aşağıdaki gibi bir iş yaparsanız</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">string dosya = "C:\Inceden.txt";</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">File.Open( dosya.ToLower() );</span></code></td></tr>
</table></div>

<p>Dosyanın adı "c:\ınceden.txt" gibi bir şeye dönüşüyor, normal olarakta dosyayı bulamıyordunuz.</p>

<p>Aslında bu normal çünkü Türkçe size "I" harfinin küçülmüş halinin "ı" olduğunu söyler.</p>

<p>Bu sefer karşılaştırma işlemlerinde üzerinde işlem yapmak istediğiniz şeyin ne olduğu bu sefer değişmeye başladı. Bu bir kişinin adı mı ?, yoksa dosya adı mı ? gibi.</p>

<p>1.1 versiyonuna kadar devam eden problem <a href="https://connect.microsoft.com/VisualStudio/feedback/details/119401/when-referenced-assembly-name-contains-i-character-in-turkish-region-settings-gives-designer-error">benimde katkımla</a> yoğun şikayetler yüzünden framework'deki string işlemlerine Invariant ve Ordinal isimli yeni karşılaştırma tipleri eklenerek çözüldü. Bu konuyla ile ilgili <a href="http://msdn.microsoft.com/en-us/library/ms973919.aspx">daha fazla detayı</a> buradan öğrenebilirsiniz.</p>

<h2>Nasıl ?</h2>

<p>Eğer kullanılan dilden bağımsız hareket etmek istiyorsanız <b>Invariant</b>, dil ile ilgisiz tam eşleşme istiyorsanız <b>Ordinal</b> kullanılması gibi bir çözüm çıktı.</p>

<p>Örnekle gidelim;</p>

<p>Biraz önceki dosya adını invariant kullanarak küçük harflere çevirirsek;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">? "Inceden.TXT".ToLowerInvariant() </span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">"inceden.txt"</span></code></td></tr>
</table></div>

<p>Örneğin Invariant karşılaştırırsak;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">? string.Equals("i","I", StringComparison.InvariantCultureIgnoreCase)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">true</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">? string.Equals("ş","S", StringComparison.InvariantCultureIgnoreCase)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">false</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">? string.Equals("ş","Ş", StringComparison.InvariantCultureIgnoreCase)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">true</span></code></td></tr>
</table></div>

<p>benzeri ordinal karşılaştırma yaparsak;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">? string.Equals("i","İ", StringComparison.OrdinalIgnoreCase)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">false</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">? string.Equals("I","İ", StringComparison.OrdinalIgnoreCase)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">false</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">? string.Equals("i","I", StringComparison.OrdinalIgnoreCase)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">true</span></code></td></tr>
</table></div>

<p>ordinalin farklı davrandığı bir örnek olarak</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">? string.Equals("a","A", StringComparison.OrdinalIgnoreCase)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">true</span></code></td></tr>
</table></div>

<h2>İşin özeti</h2>

<p>Herhangi bir string karşılaştırma yapacaksanız, string içindeki değerin ne olduğunu bilerek davranmanız ilerde daha az ağrısız bir ortam yaratır size. </p>

<p>Size tavsiyem hiç bu özellikleri kullanmadan asla ama asla <b>myString1 == myString2</b> şeklinde bir karşılaştırma yapmayın. Bu tür karşılaştırmalar işletim sisteminin seçtiği dilin özelliklerine göre çalışır, eğer yazdığınız uygulama birden fazla dil desteği sağlıyorsa uzak durun derim.</p><div class="item_footer"><p><small><a href="http://ertan.rdgnetwork.org/invariant-case-turkce-i-karakteri">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://ertan.rdgnetwork.org/invariant-case-turkce-i-karakteri#comments</comments>
			<wfw:commentRss>http://ertan.rdgnetwork.org/?tempskin=_rss2&#38;disp=comments&#38;p=376</wfw:commentRss>
		</item>
				<item>
			<title>beklenen linq tepkisi</title>
			<link>http://ertan.rdgnetwork.org/beklenen-linq-tepkisi</link>
			<pubDate>Tue, 27 Dec 2011 20:28:00 +0000</pubDate>			<dc:creator>ertan</dc:creator>
			<category domain="main">Algoritma Soruları</category>			<guid isPermaLink="false">375@http://blog.rdgnetwork.org/</guid>
						<description>&lt;p&gt;beklenen linq tepkisi&lt;/p&gt;

&lt;p&gt;İlk çıktığı zamandan beri mümkün olduğu kadar uzak durduğum linq ile ilgili beklentim boşa çıkmadı. &lt;a href=&quot;http://www.infoq.com/news/2008/11/DLINQ-Future&quot;&gt;Linq to sql&#039;in geliştirilmesine son verildi.&lt;/a&gt; Okuduğum yorumlardan çoğu kişi bu konuya baya bir sinirlenmiş ve şaşırmış. Hatta open source yapın biz bakarız diyenleri bile var.&lt;/p&gt;

&lt;p&gt;İşin aslı ben o kadar fazla şaşırdım diyemem, sebebi ise şimdiye kadar uzak durmam ile aynı sebep.&lt;/p&gt;

&lt;p&gt;Henüz gün ışığı almamış yazılımcılarımız için biraz geçmişten bahsedeyim. Aşağıda Microsoft&#039;un her biri için zamanında &quot;bakın süper oldu! hadi kullanın&quot; dediği data access teknolojilerinin listesi var.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine&quot;&gt;Microsoft Jet Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Data_Access_Objects&quot;&gt;Data Access Objects (DAO)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/ActiveX_Data_Objects&quot;&gt;ActiveX Data Objects (ADO)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Remote_Data_Objects&quot;&gt;Remote Data Objects (RDO)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Remote_Data_Services&quot;&gt;Remote Data Services (RDS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Open_Database_Connectivity&quot;&gt;Open Database Connectivity (ODBC)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/OLE_DB&quot;&gt;OLE DB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/ADO.NET&quot;&gt;ADO.NET&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu listenin içinde şimdi kullanayım dediğinizde şu anda sadece ADO.NET kullanılabilir durumda, bunun dışında yeni gelmiş Linq2SQL ve Entity Framework var. Üzerinde geliştirme yapılabilen diğer platformlar (Java gibi) ile karşılaştırdığınızda Microsoft&#039;un bu Data Access konusunda bir türlü karar veremediğini görürsünüz. &lt;/p&gt;

&lt;p&gt;Şimdi bu yazıyı okuyupda beni Microsoft düşmanı filan sanmayın, Microsoft sayesinde para kazanan biriyim, hatta mecbur kalmadığım sürece Java yada benzeri bir şey ile ilgim olmaz. &lt;/p&gt;

&lt;p&gt;Geçen o kadar yıldan sonra emin olduğum tek şey var. &lt;u&gt;Data Access konusunda Microsoft&#039;a güvenme.&lt;/u&gt;&lt;/p&gt;

&lt;h2&gt;Neden ?&lt;/h2&gt;

&lt;p&gt;Microsoft eşlenik olduğu rakipleri içerisinde geliştiricilere en çok önemi veren şirket, ürettiği herşeyde &lt;a href=&quot;http://ertan.rdgnetwork.org/product-vs-platform-sirketleri&quot;&gt;&quot;platform&quot;&lt;/a&gt; tadı vardır ama belli konularda her zaman &quot;kaygı ayrılığı&quot; durumu yaşanır. MS&#039;inde güçlü ve zayıf olduğu yerler var, örneğin yaptığınız projenin Oracle veritabanı ile çalışıyor olmasını (gayet doğal olarak) tercih etmez. &lt;/p&gt;

&lt;p&gt;Eğer tek atımlık bir projeden bahsediyorsak bu veritabanı taşınabilirliği o kadar önemli olmayabilir ama eğer mermi adedi belirsiz bir üründen bahsediyorsanız ortaya çıkacak ürünün tüm sinir, sindirim ve dolaşım sisteminde Sql Server, Active Directory gibi MS ürünlerinin bulunmasını ister.&lt;/p&gt;

&lt;p&gt;Bu yüzden MS belli konularda (data access gibi, IIS gibi) geliştiriciler ile bağlılık arasında kendi kendine sürekli bir savaş yaşar. Eğer mobility&#039;ye çok açık bir durum var ise bir süre sonra Entity Framework benzeri yeni bir versiyon çıkar ortaya. Yukarda listesini gördüğünüz data access componentlerinin sayısının çok olmasının nedeni budur.&lt;/p&gt;

&lt;h2&gt;Linq ile derdim&lt;/h2&gt;

&lt;p&gt;Bilmeyenler için önce ufak detay vereyim. Linq, IQueryable ve Expression denilen bir yapı üzerine kurulu ve siz bu IQueryable ve Expression&#039;lar ile bir sorgu hazırlayarak, herhangi bir sisteme execute edilmesi için gönderiyorsunuz. Bu sistem bir c# array&#039;i olur veya db olur çok fark etmiyor, hatta birden fazla sistemi birbirine join bile edebilirsiniz.&lt;/p&gt;

&lt;p&gt;Linq2SQL ise database&#039;de duran tablolara göre üretilmiş/generate edilmiş classlar&#039;a göre bu Expression&#039;ları SQL komutlarına çevirerek çalışan bir mantıkta zaten.&lt;/p&gt;

&lt;p&gt;Öncelikle lambda konusu benim gözümde anonymous delegate&#039;lerin biraz daha şekillisi, kolay kullanılanı. Eğer dümdüz, 1 kez yazdığınız zaman işiniz bitecek ise kullanmamak için hiç problem görmüyorum. &lt;/p&gt;

&lt;p&gt;Eğer reuse ihtimali olacak bir kod yazıyorsanız, sorunlar o zaman başlıyor.&lt;/p&gt;

&lt;h3&gt;Serialization&lt;/h3&gt;

&lt;p&gt;Linq&#039;in açılımı &quot;Language Integrated Query&quot; demek. Eğer bir query dilinden bahsediyorsak benim ilk baktığım, sorgunun nasıl serialize edildiğidir. Eğer serialize edemiyorsam disk&#039;e kaydedemem, networkden geçiremem, viewstate&#039;e yazamam. &lt;/p&gt;

&lt;p&gt;Örneğin serialization var ise örneğin müşterileri listeyecek bir servis yapıyorsam;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Customers[] GetCustomers( Expression query );&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;gibi bir metodla dışardan gelcek sorguyu dinamik olarak çalıştırabilirim. Eğer yapamıyorsam aşağıdaki gibi her case için ayrı düşünmem gerekli.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Customers[] GetCustomers( int? id, string name, ... );&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Linq için baktığımız zaman, Expression class&#039;ı &quot;by design&quot; olarak query&#039;ler serialize edilemiyor. Bu konuda WCF içerisinde geçen &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ee622463.aspx&quot;&gt;buradaki&lt;/a&gt; bilgi var. Okuduğum kadarıyla pek tatmin edici değil, ciddi işler için kullanılabilecek bir boyutta değil.&lt;/p&gt;

&lt;h3&gt;Type-Safety&lt;/h3&gt;

&lt;p&gt;Sorgu dili direk c# içerisine gömüldüğü için hazırlanan sorgu ilgili Type&#039;a göre değişiyor. Yani genel bir sorgu yazayım istediğim yere göndereyim gibi bir mantık olamıyor, mutlaka bir class tanımı istiyor.&lt;/p&gt;

&lt;p&gt;Örneğin bir Xml dosyasındaki entity tanımlarına göre çalıştıramıyorsunuz. Bu yüzden dinamik bir yapı kurmanız çok zor. ( Eğer arka tarafda xml&#039;e bakarak otomatik class generate edecek bir yapınız yok ise, bu da yapanı var gördüm.)&lt;/p&gt;

&lt;p&gt;Bazıları ne yaptın, o kadarda değil diyebilir, en fazla ne yapabileceğinize örnek vereyim.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;var xml = XElement.Load(&quot;nurettin.xml&quot;);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;string t = &quot;Belluci&quot;;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;var v = from page in xml.Elements(&quot;SitePage&quot;)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;where t == page.Element(&quot;Title&quot;).Value&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;select page;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bu xml içerisinden linq ile sorgulamanın bir örneği. Aynı şeyi birde xpath (evet w3c standardı) ile deneyelim.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;var xml = new XmlDocument().LoadXml(&quot;nurettin.xml&quot;);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;var page = xml.SelectNodes(&quot;//SitePage[Title =&#039;Belluci&#039;]&quot;);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hmm..&lt;/p&gt;

&lt;h3&gt;Yazım şekli (syntax)&lt;/h3&gt;

&lt;p&gt;Kolay anlaşılması için standart c# ile yazılmış bir kod parçası üzerinden gidelim. Aşağıda 2 array içinde eşleşen kayıtları bulan bir kod parçası var.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;foreach (string g1 in sourceGroups)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;{&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160; foreach (string g2 in targetGroups)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (g1 == g2)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; matches.Add(g1);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160; }&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc0&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aynı kodun birde linq ile yazalım;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;maches.AddRange(&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;from g1 in sourceGroups&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;from g2 in targetGroups&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;where g1 == g2&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;select g1);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bunlardan hangisine baktığınızda 5sn içerisinde ne olduğunu anlıyorsunuz ? Anlaşılır, temiz syntax&#039;ın cevabı ile aynıdır bu. Sizi bilmem sql-vari dil bana pek anlaşılır gelmiyor.&lt;/p&gt;

&lt;h3&gt;Özet&lt;/h3&gt;

&lt;p&gt;Eğer tek atımlık bir iş yapıyorsanız, yazdığınız koda geri dönüşünüz az olacak ise Linq gayet kullanılabilir, c# içerisindeki Query sorunlarını halledebilecek bir yapı. Buna uzun süredir de ihtiyaç vardı.&lt;/p&gt;

&lt;p&gt;Eğer API gibi, extend-reusability falan istiyorsanız c# sınırları dışına çıkmayan bir API içerisinde yine kullanılabilir ama dış dünyaya açtığınız kapılardan Linq geçirmemeniz sizin için faydalı olacaktır.&lt;/p&gt;

&lt;p&gt;Linq2SQL&#039;in ise geleceğine zaten Microsoft karar vermiş gözüküyor.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://ertan.rdgnetwork.org/beklenen-linq-tepkisi&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>beklenen linq tepkisi</p>

<p>İlk çıktığı zamandan beri mümkün olduğu kadar uzak durduğum linq ile ilgili beklentim boşa çıkmadı. <a href="http://www.infoq.com/news/2008/11/DLINQ-Future">Linq to sql'in geliştirilmesine son verildi.</a> Okuduğum yorumlardan çoğu kişi bu konuya baya bir sinirlenmiş ve şaşırmış. Hatta open source yapın biz bakarız diyenleri bile var.</p>

<p>İşin aslı ben o kadar fazla şaşırdım diyemem, sebebi ise şimdiye kadar uzak durmam ile aynı sebep.</p>

<p>Henüz gün ışığı almamış yazılımcılarımız için biraz geçmişten bahsedeyim. Aşağıda Microsoft'un her biri için zamanında "bakın süper oldu! hadi kullanın" dediği data access teknolojilerinin listesi var.</p>

<ul>
<li><a href="http://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine">Microsoft Jet Engine</a></li>
<li><a href="http://en.wikipedia.org/wiki/Data_Access_Objects">Data Access Objects (DAO)</a></li>
<li><a href="http://en.wikipedia.org/wiki/ActiveX_Data_Objects">ActiveX Data Objects (ADO)</a></li>
<li><a href="http://en.wikipedia.org/wiki/Remote_Data_Objects">Remote Data Objects (RDO)</a></li>
<li><a href="http://en.wikipedia.org/wiki/Remote_Data_Services">Remote Data Services (RDS)</a></li>
<li><a href="http://en.wikipedia.org/wiki/Open_Database_Connectivity">Open Database Connectivity (ODBC)</a></li>
<li><a href="http://en.wikipedia.org/wiki/OLE_DB">OLE DB</a></li>
<li><a href="http://en.wikipedia.org/wiki/ADO.NET">ADO.NET</a></li>
</ul>

<p>Bu listenin içinde şimdi kullanayım dediğinizde şu anda sadece ADO.NET kullanılabilir durumda, bunun dışında yeni gelmiş Linq2SQL ve Entity Framework var. Üzerinde geliştirme yapılabilen diğer platformlar (Java gibi) ile karşılaştırdığınızda Microsoft'un bu Data Access konusunda bir türlü karar veremediğini görürsünüz. </p>

<p>Şimdi bu yazıyı okuyupda beni Microsoft düşmanı filan sanmayın, Microsoft sayesinde para kazanan biriyim, hatta mecbur kalmadığım sürece Java yada benzeri bir şey ile ilgim olmaz. </p>

<p>Geçen o kadar yıldan sonra emin olduğum tek şey var. <u>Data Access konusunda Microsoft'a güvenme.</u></p>

<h2>Neden ?</h2>

<p>Microsoft eşlenik olduğu rakipleri içerisinde geliştiricilere en çok önemi veren şirket, ürettiği herşeyde <a href="http://ertan.rdgnetwork.org/product-vs-platform-sirketleri">"platform"</a> tadı vardır ama belli konularda her zaman "kaygı ayrılığı" durumu yaşanır. MS'inde güçlü ve zayıf olduğu yerler var, örneğin yaptığınız projenin Oracle veritabanı ile çalışıyor olmasını (gayet doğal olarak) tercih etmez. </p>

<p>Eğer tek atımlık bir projeden bahsediyorsak bu veritabanı taşınabilirliği o kadar önemli olmayabilir ama eğer mermi adedi belirsiz bir üründen bahsediyorsanız ortaya çıkacak ürünün tüm sinir, sindirim ve dolaşım sisteminde Sql Server, Active Directory gibi MS ürünlerinin bulunmasını ister.</p>

<p>Bu yüzden MS belli konularda (data access gibi, IIS gibi) geliştiriciler ile bağlılık arasında kendi kendine sürekli bir savaş yaşar. Eğer mobility'ye çok açık bir durum var ise bir süre sonra Entity Framework benzeri yeni bir versiyon çıkar ortaya. Yukarda listesini gördüğünüz data access componentlerinin sayısının çok olmasının nedeni budur.</p>

<h2>Linq ile derdim</h2>

<p>Bilmeyenler için önce ufak detay vereyim. Linq, IQueryable ve Expression denilen bir yapı üzerine kurulu ve siz bu IQueryable ve Expression'lar ile bir sorgu hazırlayarak, herhangi bir sisteme execute edilmesi için gönderiyorsunuz. Bu sistem bir c# array'i olur veya db olur çok fark etmiyor, hatta birden fazla sistemi birbirine join bile edebilirsiniz.</p>

<p>Linq2SQL ise database'de duran tablolara göre üretilmiş/generate edilmiş classlar'a göre bu Expression'ları SQL komutlarına çevirerek çalışan bir mantıkta zaten.</p>

<p>Öncelikle lambda konusu benim gözümde anonymous delegate'lerin biraz daha şekillisi, kolay kullanılanı. Eğer dümdüz, 1 kez yazdığınız zaman işiniz bitecek ise kullanmamak için hiç problem görmüyorum. </p>

<p>Eğer reuse ihtimali olacak bir kod yazıyorsanız, sorunlar o zaman başlıyor.</p>

<h3>Serialization</h3>

<p>Linq'in açılımı "Language Integrated Query" demek. Eğer bir query dilinden bahsediyorsak benim ilk baktığım, sorgunun nasıl serialize edildiğidir. Eğer serialize edemiyorsam disk'e kaydedemem, networkden geçiremem, viewstate'e yazamam. </p>

<p>Örneğin serialization var ise örneğin müşterileri listeyecek bir servis yapıyorsam;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">Customers[] GetCustomers( Expression query );</span></code></td></tr>
</table></div>

<p>gibi bir metodla dışardan gelcek sorguyu dinamik olarak çalıştırabilirim. Eğer yapamıyorsam aşağıdaki gibi her case için ayrı düşünmem gerekli.</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">Customers[] GetCustomers( int? id, string name, ... );</span></code></td></tr>
</table></div>

<p>Linq için baktığımız zaman, Expression class'ı "by design" olarak query'ler serialize edilemiyor. Bu konuda WCF içerisinde geçen <a href="http://msdn.microsoft.com/en-us/library/ee622463.aspx">buradaki</a> bilgi var. Okuduğum kadarıyla pek tatmin edici değil, ciddi işler için kullanılabilecek bir boyutta değil.</p>

<h3>Type-Safety</h3>

<p>Sorgu dili direk c# içerisine gömüldüğü için hazırlanan sorgu ilgili Type'a göre değişiyor. Yani genel bir sorgu yazayım istediğim yere göndereyim gibi bir mantık olamıyor, mutlaka bir class tanımı istiyor.</p>

<p>Örneğin bir Xml dosyasındaki entity tanımlarına göre çalıştıramıyorsunuz. Bu yüzden dinamik bir yapı kurmanız çok zor. ( Eğer arka tarafda xml'e bakarak otomatik class generate edecek bir yapınız yok ise, bu da yapanı var gördüm.)</p>

<p>Bazıları ne yaptın, o kadarda değil diyebilir, en fazla ne yapabileceğinize örnek vereyim.</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">var xml = XElement.Load("nurettin.xml");</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160;string t = "Belluci";</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;var v = from page in xml.Elements("SitePage")</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;where t == page.Element("Title").Value</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;select page;</span></code></td></tr>
</table></div>

<p>Bu xml içerisinden linq ile sorgulamanın bir örneği. Aynı şeyi birde xpath (evet w3c standardı) ile deneyelim.</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">var xml = new XmlDocument().LoadXml("nurettin.xml");</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&#160;&#160;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160;var page = xml.SelectNodes("//SitePage[Title ='Belluci']");</span></code></td></tr>
</table></div>

<p>Hmm..</p>

<h3>Yazım şekli (syntax)</h3>

<p>Kolay anlaşılması için standart c# ile yazılmış bir kod parçası üzerinden gidelim. Aşağıda 2 array içinde eşleşen kayıtları bulan bir kod parçası var.</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">foreach (string g1 in sourceGroups)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">{</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160; foreach (string g2 in targetGroups)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160; {</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160; if (g1 == g2)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160; {</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; matches.Add(g1);</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160; }</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"></div></td><td><code><span class="amc_default">&#160;&#160; }</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc0"><div class="amc1"></div></div></td><td><code><span class="amc_default">}</span></code></td></tr>
</table></div>

<p>Aynı kodun birde linq ile yazalım;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">maches.AddRange(</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&#160;&#160;from g1 in sourceGroups</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;from g2 in targetGroups</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160;where g1 == g2</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;select g1);</span></code></td></tr>
</table></div>

<p>Bunlardan hangisine baktığınızda 5sn içerisinde ne olduğunu anlıyorsunuz ? Anlaşılır, temiz syntax'ın cevabı ile aynıdır bu. Sizi bilmem sql-vari dil bana pek anlaşılır gelmiyor.</p>

<h3>Özet</h3>

<p>Eğer tek atımlık bir iş yapıyorsanız, yazdığınız koda geri dönüşünüz az olacak ise Linq gayet kullanılabilir, c# içerisindeki Query sorunlarını halledebilecek bir yapı. Buna uzun süredir de ihtiyaç vardı.</p>

<p>Eğer API gibi, extend-reusability falan istiyorsanız c# sınırları dışına çıkmayan bir API içerisinde yine kullanılabilir ama dış dünyaya açtığınız kapılardan Linq geçirmemeniz sizin için faydalı olacaktır.</p>

<p>Linq2SQL'in ise geleceğine zaten Microsoft karar vermiş gözüküyor.</p><div class="item_footer"><p><small><a href="http://ertan.rdgnetwork.org/beklenen-linq-tepkisi">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://ertan.rdgnetwork.org/beklenen-linq-tepkisi#comments</comments>
			<wfw:commentRss>http://ertan.rdgnetwork.org/?tempskin=_rss2&#38;disp=comments&#38;p=375</wfw:commentRss>
		</item>
				<item>
			<title>Product vs Platform şirketleri</title>
			<link>http://ertan.rdgnetwork.org/product-vs-platform-sirketleri</link>
			<pubDate>Tue, 15 Nov 2011 00:31:00 +0000</pubDate>			<dc:creator>ertan</dc:creator>
			<category domain="main">Coding</category>
<category domain="alt">Yazılım</category>			<guid isPermaLink="false">363@http://blog.rdgnetwork.org/</guid>
						<description>&lt;p&gt;Bundan bir süre önce Google+’ın başındaki kişi Steve Yegge aslında Google çalışanlarına gönderdiği bir makaleyi kazara public olarak yayınladı, biraz uzun olsa da herkese bu yazının içeriğini okumasını tavsiye ederim.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/112678702228711889851/posts/eVeouesvaVX&quot;&gt;https://plus.google.com/112678702228711889851/posts/eVeouesvaVX&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Henüz ülkemiz için erken olsa da (bu iyi bir şey), bu yazıdan öğrenilecek çok şey var. Bu yazıda beni en çok şaşırtan bir kamyon danışmanı olan bir şirket bunun nasıl farkına varmazdı ama neyse. Ben bizim şartlarımıza uyan başka bir konudan gitmek istiyorum.&lt;/p&gt;
&lt;p&gt;Bizde de Google’ın yaptığına benzer gayet başarılı olmuş gayet çeşitli (bunun içerisine e-ticaret, ilan sitelerini, teknoloji şirketlerini de dahil ediyorum) ürünler var. Ancak bu şirketlerin başına Jeff Bezos gibi bir patron henüz gelmedi. Görünüşe göre de en az 1 jenerasyon boyunca da gelmeyecek.&lt;/p&gt;
&lt;p&gt;Tüm bu bizim ürettiğimiz ürünlerin temel problemi bu Steve amcanın yazdıkları galiba. Başarılı bir ürün yarattıktan sonra onunla ne yapacağımızı bilmiyoruz.&lt;/p&gt;
&lt;p&gt;Örnek isterseniz tüm başarılı olmuş, e-ticaret ya da ilan sitelerine bakın 1 tanesi bile elle tutulur bir API sağlamaz. Bu sitelerin patronları için bir kategorideki ürün listesi kaynak kodlar kadar değerli. Hatta web sitelerinden bu verileri almaya çalışırsanız size dava açarlar.&lt;/p&gt;
&lt;p&gt;Bana göre asıl kaçırdıkları bu API’leri sağlayarak etraflarında yaratacakları ekosistem. Bir ürünü ayakta tutan aslında bu ekosistemdir. Microsoft bu ekosistemi daha ilk zamanlarından beri kullandı, bununla tüm karşısına dikilenleri yola getirdi. Facebook’da aynı yoldan geldi, şu anda canı sıkılan insanları eğlendirmesi için içinde yüzlerce uygulaması var.&lt;/p&gt;
&lt;p&gt;Tersi örnek Google Maps. Eğer bu ekosistemi yaratacak API’leri sağlayamazsanız bir gün o ürünü sizden daha iyi yapan (misal Yandex Maps) gibi birileri mutlaka çıkar ve o gün aldatılırsınız. Başka bir örnek; sahibi bir kamu kuruluşu olmasına rağmen IBB Trafik sitesidir.&lt;/p&gt;
&lt;p&gt;Halen ikna olmadıysanız; limitsiz kaynağınız olsa bile bu ekosistem’in yaratacağı inovasyon’a hiçbir zaman erişemezsiniz. Inovasyon olmadan sürekliliği sağlamanız imkansızdır.&lt;/p&gt;
&lt;p&gt;Bu ekosistemi yaratmak için düşünülenin aksine ağır bir yükü omuzlamak gerekmiyor. Bezos’un kurallarını takip edin yeterli, eğer okumaya üşendiniz ya da anlamadıysanız ben özetleyeyim.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tüm takımlar (Bezos tam tarif edememiş, modül diyeyim) verilerini servisler ile yayınlayacak.&lt;/li&gt;
&lt;li&gt;Tüm takımlar arasındaki iletişim sadece bu servisler aracılığıyla olacak. &lt;/li&gt;
&lt;li&gt;Başka bir iletişim yöntemi geçerli değildir. Direk linkler, direk veri tabanı bağlantıları, arka kapılar yada benzeri hiçbir yöntem. Tüm iletişim bu servisler ile network üzerinden yapılacak.&lt;/li&gt;
&lt;li&gt;Ne tür bir teknoloji (HTTP, Corba, custom... ) kullandığınızın önemi yok. &lt;/li&gt;
&lt;li&gt;Tüm servisler dışarıya açılabilir olacak. Tüm bu servisler dış dünyadan geliştiricilere açılacak şekilde planlanıp, tasarlanacak.&lt;/li&gt;
&lt;li&gt;Bunları yapmayan kişi işten atılacak.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bu maddeleri ben yazsaydım bu kadar güzel özetleyemezdim heralde &lt;img src=&quot;http://blog.rdgnetwork.org/rsc/smilies/icon_smile.gif&quot; title=&quot;&amp;amp;amp;#58;&amp;amp;amp;#41;&quot; alt=&quot;&amp;amp;amp;#58;&amp;amp;amp;#41;&quot; class=&quot;middle&quot; width=&quot;15&quot; height=&quot;15&quot; /&gt; Tüm tasarımınızı bu maddelere uyarak yaptığınızda gerisi kendiliğinden gelecektir.&lt;/p&gt;
&lt;p&gt;Bunları yazmamın sebebi;&lt;/p&gt;
&lt;p&gt;Eğer girişimciyseniz mevcut sitelere alternatif bir şeyler yapmak isteyip de mevcut olanlar yüzünden cesaret edemiyorsanız, bu konuda denemeye değer.&lt;/p&gt;
&lt;p&gt;Eğer patronsanız bir an önce Bezos’un gönderdiği bir mail’in benzerini sizde gönderin çok geç kalmadan.&lt;/p&gt;
&lt;p&gt;Eğer geliştiriciyseniz bir an önce proje, ürün, platform arasında ne fark vardır onu öğrenin.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://ertan.rdgnetwork.org/product-vs-platform-sirketleri&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Bundan bir süre önce Google+’ın başındaki kişi Steve Yegge aslında Google çalışanlarına gönderdiği bir makaleyi kazara public olarak yayınladı, biraz uzun olsa da herkese bu yazının içeriğini okumasını tavsiye ederim.</p>
<p><a href="https://plus.google.com/112678702228711889851/posts/eVeouesvaVX">https://plus.google.com/112678702228711889851/posts/eVeouesvaVX</a></p>
<p>Henüz ülkemiz için erken olsa da (bu iyi bir şey), bu yazıdan öğrenilecek çok şey var. Bu yazıda beni en çok şaşırtan bir kamyon danışmanı olan bir şirket bunun nasıl farkına varmazdı ama neyse. Ben bizim şartlarımıza uyan başka bir konudan gitmek istiyorum.</p>
<p>Bizde de Google’ın yaptığına benzer gayet başarılı olmuş gayet çeşitli (bunun içerisine e-ticaret, ilan sitelerini, teknoloji şirketlerini de dahil ediyorum) ürünler var. Ancak bu şirketlerin başına Jeff Bezos gibi bir patron henüz gelmedi. Görünüşe göre de en az 1 jenerasyon boyunca da gelmeyecek.</p>
<p>Tüm bu bizim ürettiğimiz ürünlerin temel problemi bu Steve amcanın yazdıkları galiba. Başarılı bir ürün yarattıktan sonra onunla ne yapacağımızı bilmiyoruz.</p>
<p>Örnek isterseniz tüm başarılı olmuş, e-ticaret ya da ilan sitelerine bakın 1 tanesi bile elle tutulur bir API sağlamaz. Bu sitelerin patronları için bir kategorideki ürün listesi kaynak kodlar kadar değerli. Hatta web sitelerinden bu verileri almaya çalışırsanız size dava açarlar.</p>
<p>Bana göre asıl kaçırdıkları bu API’leri sağlayarak etraflarında yaratacakları ekosistem. Bir ürünü ayakta tutan aslında bu ekosistemdir. Microsoft bu ekosistemi daha ilk zamanlarından beri kullandı, bununla tüm karşısına dikilenleri yola getirdi. Facebook’da aynı yoldan geldi, şu anda canı sıkılan insanları eğlendirmesi için içinde yüzlerce uygulaması var.</p>
<p>Tersi örnek Google Maps. Eğer bu ekosistemi yaratacak API’leri sağlayamazsanız bir gün o ürünü sizden daha iyi yapan (misal Yandex Maps) gibi birileri mutlaka çıkar ve o gün aldatılırsınız. Başka bir örnek; sahibi bir kamu kuruluşu olmasına rağmen IBB Trafik sitesidir.</p>
<p>Halen ikna olmadıysanız; limitsiz kaynağınız olsa bile bu ekosistem’in yaratacağı inovasyon’a hiçbir zaman erişemezsiniz. Inovasyon olmadan sürekliliği sağlamanız imkansızdır.</p>
<p>Bu ekosistemi yaratmak için düşünülenin aksine ağır bir yükü omuzlamak gerekmiyor. Bezos’un kurallarını takip edin yeterli, eğer okumaya üşendiniz ya da anlamadıysanız ben özetleyeyim.</p>
<ol>
<li>Tüm takımlar (Bezos tam tarif edememiş, modül diyeyim) verilerini servisler ile yayınlayacak.</li>
<li>Tüm takımlar arasındaki iletişim sadece bu servisler aracılığıyla olacak. </li>
<li>Başka bir iletişim yöntemi geçerli değildir. Direk linkler, direk veri tabanı bağlantıları, arka kapılar yada benzeri hiçbir yöntem. Tüm iletişim bu servisler ile network üzerinden yapılacak.</li>
<li>Ne tür bir teknoloji (HTTP, Corba, custom... ) kullandığınızın önemi yok. </li>
<li>Tüm servisler dışarıya açılabilir olacak. Tüm bu servisler dış dünyadan geliştiricilere açılacak şekilde planlanıp, tasarlanacak.</li>
<li>Bunları yapmayan kişi işten atılacak.</li>
</ol>
<p>Bu maddeleri ben yazsaydım bu kadar güzel özetleyemezdim heralde <img src="http://blog.rdgnetwork.org/rsc/smilies/icon_smile.gif" title="&amp;amp;#58;&amp;amp;#41;" alt="&amp;amp;#58;&amp;amp;#41;" class="middle" width="15" height="15" /> Tüm tasarımınızı bu maddelere uyarak yaptığınızda gerisi kendiliğinden gelecektir.</p>
<p>Bunları yazmamın sebebi;</p>
<p>Eğer girişimciyseniz mevcut sitelere alternatif bir şeyler yapmak isteyip de mevcut olanlar yüzünden cesaret edemiyorsanız, bu konuda denemeye değer.</p>
<p>Eğer patronsanız bir an önce Bezos’un gönderdiği bir mail’in benzerini sizde gönderin çok geç kalmadan.</p>
<p>Eğer geliştiriciyseniz bir an önce proje, ürün, platform arasında ne fark vardır onu öğrenin.</p><div class="item_footer"><p><small><a href="http://ertan.rdgnetwork.org/product-vs-platform-sirketleri">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://ertan.rdgnetwork.org/product-vs-platform-sirketleri#comments</comments>
			<wfw:commentRss>http://ertan.rdgnetwork.org/?tempskin=_rss2&#38;disp=comments&#38;p=363</wfw:commentRss>
		</item>
				<item>
			<title>Parallel kütüphanesi</title>
			<link>http://ertan.rdgnetwork.org/parallel-kutuphanesi-asparallel</link>
			<pubDate>Sun, 22 May 2011 20:16:17 +0000</pubDate>			<dc:creator>ertan</dc:creator>
			<category domain="main">Yazılım</category>
<category domain="alt">Algoritma Soruları</category>			<guid isPermaLink="false">358@http://blog.rdgnetwork.org/</guid>
						<description>&lt;p&gt;Uzun bir aradan sonra sonunda hakkında yazabileceğim bir şey yeni aklıma geldi. Eğer yamulmuyorsam Parallel kütüphanesi Framework 4.0 ile beraber geldi, daha öncesinde MS Research&#039;in geliştirdiği bir extension olarak gizli bir köşede saklanıyordu.&lt;/p&gt;

&lt;h2&gt;Parallel kütüphanesi ( yada AsParallel() ) Nedir ?&lt;/h2&gt;

&lt;p&gt;Parallel kütüphanesi son 2-3 yılda yeni çıkan birden fazla işlemcilerin avantajını kullanmak için işleri kolaylaştırmak amacıyla geliştirilmiş bir kütüphane. &lt;/p&gt;

&lt;p&gt;Temel olarak yaptığı sıralı olarak yapılacak işleri birden fazla CPU&#039;ya dağıtarak aynı anda birden fazla iş yapmaya, dolayısıyla da verilen işi daha hızlı yapar.&lt;/p&gt;

&lt;h2&gt;Neden ihtiyacım olur&lt;/h2&gt;

&lt;p&gt;Bundan yıllar öncesinde C yada ASM&#039;de yazdığım zamanlarla karşılaştırınca, bisikletle bir ferrari&#039;yi karşılaştırmaya benziyor. İronik olan kısım ise yazdığımız programlar halen o zamanki programlar kadar yavaş. &lt;/p&gt;

&lt;p&gt;Önce herhangi bir programı yavaşlatan nedir diye düşünelim;&lt;/p&gt;

&lt;p&gt;* Donanım&lt;br /&gt;
* Network&lt;br /&gt;
* For, Foreach, While gibi döngüler.&lt;/p&gt;

&lt;p&gt;Bunların dışında bir programın yavaş çalışmasına neden olacak bir etken yok. Donanım ve Network kısmı için zaten sürekli olarak bir şeyler yapılıyor zaten konumuzun dışında.&lt;/p&gt;

&lt;p&gt;Eğer yazdığımız kodun hızlı çalışmasını istiyorsak yapacağımız tek şey bu döngü&#039;lere dikkat etmek, ne kadar az döngü varsa kod o kadar hızlı çalışacaktır. Bu optimizasyonu tabiki belli dereceye kadar yapabiliriz ve nihayetinde bazı kısımlar kalacak. &lt;/p&gt;

&lt;p&gt;Standart kodlama yaparken (eğer thread filan yaratmıyorsanız) yazdığımız kod her zaman ve her zaman tek CPU üzerinde çalışacaktır. Bazen CPU bir şeylerle uğraşırken Task Manager&#039;i açtığınızda tüm CPU&#039;ların bir şey yaptığını görüyor olursunuz ancak burası biraz yanıltıcıdır.&lt;/p&gt;

&lt;p&gt;Çok merak ediyorsanız basit bir loop yaratarak CPU&#039;yu sürekli meşgul tutan bir kod çalıştırın ve Task Manager&#039;da olanları izleyin, eğer 2 CPU&#039;lu bir makinanız varsa test yaptığınız exe asla %50 (4 CPU&#039;nuz varsa %25) cpu kullanımının üzerine çıkmayacaktır. Task Manager&#039;ın grafik kısmına baktığınız zaman tüm CPU&#039;larda aktivite gözükür ancak bu işletim sisteminin yapılan işleri farklı CPU&#039;lara dağıtması yüzünden kaynaklanır. Yani kodunuz kısa bir süre 1. CPU daha sonra 2. CPU&#039;da çalışmaya devam eder. Ancak yaptığınız iş tek CPU sınırını aşmadığı için asıl rakamlara baktığınız zaman bu söylediğim görünmez bariyer&#039;de takılırsınız.&lt;/p&gt;

&lt;p&gt;Yazdığınız kodu hızlandırmak için birden fazla CPU kullanmayı istiyorsanız kodunuz içinde ekstra olacak bir şeyler daha ekleyerek, niyetinizi belli etmeniz gerekir.&lt;/p&gt;

&lt;h2&gt;Nasıl ?&lt;/h2&gt;

&lt;p&gt;Anlaşılır olması için örnekli gidiyorum; basit bir örnek olsun diye elimizde bir int array&#039;i olsun ve biz array üstündeki elemanı string halline dönüştürmek isteyelim. (Pratikde string&#039;e dönüştürmekten başka bir şeyler olacaktır)&lt;/p&gt;

&lt;p&gt;Önce array&#039;i tanımlayıp içini çöp&#039;le dolduralım.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;List&amp;lt;int&amp;gt; arr = new List&amp;lt;int&amp;gt;();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160; for (int i = 1; i &amp;lt; 9999999; i++)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;arr.Add(i);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Standart olarak yazacağımız kod aşağıdaki gibi;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;a.ForEach(delegate(int i)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;{&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return i.ToString();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;});&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Şimdi bu kodu benim 8 CPU&#039;lu canavar bilgisayarımda çalıştırdığımda süre olarak 01.520 saniyede tamamlanıyor.&lt;/p&gt;

&lt;p&gt;Aynı kod üzerinde biraz değişiklik yaparak paralel kütüphanesinin kullanılmasını istersem;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;arr.AsParallel().ForAll(delegate(int i)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;{&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;string c = i.ToString();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;});&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Araya eklediğim bu AsParallel ile çalışma süresi 0.619 saniyeye düştü. &lt;/p&gt;

&lt;p&gt;Karşılaştırma yapınca arada devasa bir fark var. Geriye tek sorun kalıyor;&lt;/p&gt;

&lt;p&gt;Paralel çalışacak kod parçası üzerinde sıralı işlemler yapmamanız gerekli, örneğin toplama gibi sıralı olması gerekmeyen bir kod yazabilirsiniz ancak bir önceki değere ihtiyacınız olduğu durumlarda işler biraz zorlaşabilir.&lt;/p&gt;

&lt;p&gt;Böyle durumlar biraz daha karmaşık, bunun detaylarını daha sonra yazarım ancak sadece bu yöntemle kodunuz içindeki döngüler&#039;in büyük bir çoğunluğunda bu parallel kütüphanesini halen kullanabilirsiniz.&lt;/p&gt;

&lt;p&gt;Umarım işinize yaramıştır. Unutmadan denemek isteyenler için tüm test kodu aşağıda;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_long&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;List&amp;lt;int&amp;gt; arr = new List&amp;lt;int&amp;gt;();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;for (int i = 1; i &amp;lt; 9999999; i++)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;arr.Add(i);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;s.Start();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc0&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;arr.ForEach(delegate(int i)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;{&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;string c = i.ToString();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;s.Stop();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Console.WriteLine(&quot; Sure : &quot; + s.Elapsed);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;s.Reset();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc0&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;s.Start();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;arr.AsParallel().ForAll(delegate(int i)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;{&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;string c = i.ToString();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;});&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;s.Stop();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Console.WriteLine(&quot; Sure : &quot; + s.Elapsed);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://ertan.rdgnetwork.org/parallel-kutuphanesi-asparallel&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Uzun bir aradan sonra sonunda hakkında yazabileceğim bir şey yeni aklıma geldi. Eğer yamulmuyorsam Parallel kütüphanesi Framework 4.0 ile beraber geldi, daha öncesinde MS Research'in geliştirdiği bir extension olarak gizli bir köşede saklanıyordu.</p>

<h2>Parallel kütüphanesi ( yada AsParallel() ) Nedir ?</h2>

<p>Parallel kütüphanesi son 2-3 yılda yeni çıkan birden fazla işlemcilerin avantajını kullanmak için işleri kolaylaştırmak amacıyla geliştirilmiş bir kütüphane. </p>

<p>Temel olarak yaptığı sıralı olarak yapılacak işleri birden fazla CPU'ya dağıtarak aynı anda birden fazla iş yapmaya, dolayısıyla da verilen işi daha hızlı yapar.</p>

<h2>Neden ihtiyacım olur</h2>

<p>Bundan yıllar öncesinde C yada ASM'de yazdığım zamanlarla karşılaştırınca, bisikletle bir ferrari'yi karşılaştırmaya benziyor. İronik olan kısım ise yazdığımız programlar halen o zamanki programlar kadar yavaş. </p>

<p>Önce herhangi bir programı yavaşlatan nedir diye düşünelim;</p>

<p>* Donanım<br />
* Network<br />
* For, Foreach, While gibi döngüler.</p>

<p>Bunların dışında bir programın yavaş çalışmasına neden olacak bir etken yok. Donanım ve Network kısmı için zaten sürekli olarak bir şeyler yapılıyor zaten konumuzun dışında.</p>

<p>Eğer yazdığımız kodun hızlı çalışmasını istiyorsak yapacağımız tek şey bu döngü'lere dikkat etmek, ne kadar az döngü varsa kod o kadar hızlı çalışacaktır. Bu optimizasyonu tabiki belli dereceye kadar yapabiliriz ve nihayetinde bazı kısımlar kalacak. </p>

<p>Standart kodlama yaparken (eğer thread filan yaratmıyorsanız) yazdığımız kod her zaman ve her zaman tek CPU üzerinde çalışacaktır. Bazen CPU bir şeylerle uğraşırken Task Manager'i açtığınızda tüm CPU'ların bir şey yaptığını görüyor olursunuz ancak burası biraz yanıltıcıdır.</p>

<p>Çok merak ediyorsanız basit bir loop yaratarak CPU'yu sürekli meşgul tutan bir kod çalıştırın ve Task Manager'da olanları izleyin, eğer 2 CPU'lu bir makinanız varsa test yaptığınız exe asla %50 (4 CPU'nuz varsa %25) cpu kullanımının üzerine çıkmayacaktır. Task Manager'ın grafik kısmına baktığınız zaman tüm CPU'larda aktivite gözükür ancak bu işletim sisteminin yapılan işleri farklı CPU'lara dağıtması yüzünden kaynaklanır. Yani kodunuz kısa bir süre 1. CPU daha sonra 2. CPU'da çalışmaya devam eder. Ancak yaptığınız iş tek CPU sınırını aşmadığı için asıl rakamlara baktığınız zaman bu söylediğim görünmez bariyer'de takılırsınız.</p>

<p>Yazdığınız kodu hızlandırmak için birden fazla CPU kullanmayı istiyorsanız kodunuz içinde ekstra olacak bir şeyler daha ekleyerek, niyetinizi belli etmeniz gerekir.</p>

<h2>Nasıl ?</h2>

<p>Anlaşılır olması için örnekli gidiyorum; basit bir örnek olsun diye elimizde bir int array'i olsun ve biz array üstündeki elemanı string halline dönüştürmek isteyelim. (Pratikde string'e dönüştürmekten başka bir şeyler olacaktır)</p>

<p>Önce array'i tanımlayıp içini çöp'le dolduralım.</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">List&lt;int&gt; arr = new List&lt;int&gt;();</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160; for (int i = 1; i &lt; 9999999; i++)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160;arr.Add(i);</span></code></td></tr>
</table></div>

<p>Standart olarak yazacağımız kod aşağıdaki gibi;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">a.ForEach(delegate(int i)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&#160;&#160;{</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160;return i.ToString();</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;});</span></code></td></tr>
</table></div>

<p>Şimdi bu kodu benim 8 CPU'lu canavar bilgisayarımda çalıştırdığımda süre olarak 01.520 saniyede tamamlanıyor.</p>

<p>Aynı kod üzerinde biraz değişiklik yaparak paralel kütüphanesinin kullanılmasını istersem;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">arr.AsParallel().ForAll(delegate(int i)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&#160;&#160;{</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160;string c = i.ToString();</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;});</span></code></td></tr>
</table></div>

<p>Araya eklediğim bu AsParallel ile çalışma süresi 0.619 saniyeye düştü. </p>

<p>Karşılaştırma yapınca arada devasa bir fark var. Geriye tek sorun kalıyor;</p>

<p>Paralel çalışacak kod parçası üzerinde sıralı işlemler yapmamanız gerekli, örneğin toplama gibi sıralı olması gerekmeyen bir kod yazabilirsiniz ancak bir önceki değere ihtiyacınız olduğu durumlarda işler biraz zorlaşabilir.</p>

<p>Böyle durumlar biraz daha karmaşık, bunun detaylarını daha sonra yazarım ancak sadece bu yöntemle kodunuz içindeki döngüler'in büyük bir çoğunluğunda bu parallel kütüphanesini halen kullanabilirsiniz.</p>

<p>Umarım işinize yaramıştır. Unutmadan denemek isteyenler için tüm test kodu aşağıda;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_long"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">List&lt;int&gt; arr = new List&lt;int&gt;();</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">for (int i = 1; i &lt; 9999999; i++)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;arr.Add(i);</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"></div></td><td><code><span class="amc_default">s.Start();</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc0"><div class="amc1"></div></div></td><td><code><span class="amc_default">arr.ForEach(delegate(int i)</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc1"><div class="amc1"></div></div></td><td><code><span class="amc_default">{</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"><div class="amc1"></div></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;string c = i.ToString();</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"><div class="amc1"></div></div></td><td><code><span class="amc_default">});</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"><div class="amc1"></div></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"><div class="amc1"></div></div></td><td><code><span class="amc_default">s.Stop();</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"><div class="amc1"></div></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"><div class="amc1"></div></div></td><td><code><span class="amc_default">Console.WriteLine(" Sure : " + s.Elapsed);</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"><div class="amc1"></div></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"><div class="amc1"></div></div></td><td><code><span class="amc_default">s.Reset();</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc0"><div class="amc2"></div></div></td><td><code><span class="amc_default">s.Start();</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc1"><div class="amc2"></div></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"><div class="amc2"></div></div></td><td><code><span class="amc_default">arr.AsParallel().ForAll(delegate(int i)</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"><div class="amc2"></div></div></td><td><code><span class="amc_default">{</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"><div class="amc2"></div></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;string c = i.ToString();</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"><div class="amc2"></div></div></td><td><code><span class="amc_default">});</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"><div class="amc2"></div></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"><div class="amc2"></div></div></td><td><code><span class="amc_default">s.Stop();</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"><div class="amc2"></div></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"><div class="amc2"></div></div></td><td><code><span class="amc_default">Console.WriteLine(" Sure : " + s.Elapsed);</span></code></td></tr>
</table></div><div class="item_footer"><p><small><a href="http://ertan.rdgnetwork.org/parallel-kutuphanesi-asparallel">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://ertan.rdgnetwork.org/parallel-kutuphanesi-asparallel#comments</comments>
			<wfw:commentRss>http://ertan.rdgnetwork.org/?tempskin=_rss2&#38;disp=comments&#38;p=358</wfw:commentRss>
		</item>
				<item>
			<title>turnaround time</title>
			<link>http://ertan.rdgnetwork.org/turnaround-time</link>
			<pubDate>Fri, 29 Oct 2010 08:44:04 +0000</pubDate>			<dc:creator>ertan</dc:creator>
			<category domain="main">Yazılım</category>			<guid isPermaLink="false">327@http://blog.rdgnetwork.org/</guid>
						<description>&lt;p&gt;&lt;i&gt;Klavyem sanırım aşırı kullanım yüzünden o (noktalı olanı) harfini yazmamakta inat ediyor. çok uğraşamadım idare ediniz.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;img src=&quot;http://www.getmoreyoutubeviews.com/wp-content/uploads/2009/02/repeat-business.jpg&quot; /&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;wikipedia&#039;ya gore &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;br /&gt;
Turnaround, in computing scheduling, the total time between submission of a process and its completion&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;anlamına gelen bu kelime biz farkında olmadan yazılım geliştirme için harcadığımız zamanın büyük bir bolumunu alır.&lt;/p&gt;

&lt;p&gt;Diyelim ki ofisinizde sakin bir şekilde çalışırken, yazdığınız uygulamada ufak bir hata buldunuz. Basit anlamda bu süre IDE açıkken uygulamayı derleyip, hatayı deneyip, tekrar IDE&#039;ye dondugunuze kadar geçen süredir aslında. &lt;/p&gt;

&lt;p&gt;Çoğu developer bu süreyi etkileyecek sorunları çozmek yerine gozardı edip bir an once hatayı test etmeye odaklanır. Tanıdığım bir developer&#039;ın yaptıklarını ornek vererek gideyim &lt;img src=&quot;http://blog.rdgnetwork.org/rsc/smilies/icon_smile.gif&quot; title=&quot;&amp;amp;amp;#58;&amp;amp;amp;#41;&quot; alt=&quot;&amp;amp;amp;#58;&amp;amp;amp;#41;&quot; class=&quot;middle&quot; width=&quot;15&quot; height=&quot;15&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;img src=&quot;http://static.frysforum.com/mi/57dff9078be2281da821a9fa2a981bff-0-compiling.png&quot; /&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;1. Derle 45sn (7sn) Normalde çok kısa süren bu iş, diskinde yer olmadığı için kodları USB diskten kullanıyor bu yüzden çok yavaş.&lt;/p&gt;

&lt;p&gt;2. Kopyala 90sn. (0sn) Normalde build script&#039;i ile kopyalanan dll dosyası, build script&#039;ini güncellemediği için elle kopyalamak zorunda. Derlenen dosyayı programı çalıştırdığı dizine kopyalıyor ama uygulamayı açık unuttuğu için dosyaları kopyalayamadı. programı kapatıp kopyalamayı tekrar başlatıyor.&lt;/p&gt;

&lt;p&gt;3. Çalıştırma 35sn. (4sn) Her ne amaçla kullanıldığını anlamadığım bir cehennemden gelmiş bir antitrojan uyarı mesajı çıkarıyor. Mesaj kapatılıyor.&lt;/p&gt;

&lt;p&gt;4. Deneme 70sn. (2sn) Denemek için uygulamadaki ekrana gidip parametreleri giriyor, ama hatayı oluşmadı. Biraz düşündükten sonra hatalı parametre girdiğini farkedip düzeltip tekrar deniyor. Hata düzelmemiş. tekrar baştan başla.&lt;/p&gt;

&lt;p&gt;Bu saydıklarımın aslında daha fazlası var ama sıkıcı olmaması için daha detaylandırmadım. Şimdi normalde 13sn süren &quot;turnaround&quot; zamanı bu developer için 240 saniye yani 4dk.&lt;/p&gt;

&lt;p&gt;Gün içinde bunu yüzlerce kez tekrar ettiğimiz için işimizi yaparken harcadığımız zamanın çok çok büyük bir bölümünü anlamsız, kimseye faydası olmayan, can sıkıcı işlerle geçiririz.&lt;/p&gt;

&lt;p&gt;Verdiğim örnekler için bir build script&#039;i ve &lt;a href=&quot;http://ertan.rdgnetwork.org/2007/02/22/unit_test&quot;&gt;unit test&lt;/a&gt; yapmanız yeterlidir ama yaptığınız işin detaylarını sizden başka kimse bilmez. &lt;/p&gt;

&lt;p&gt;Bu konuda size sadece bazı genel olabilecek önerilerim olacak;&lt;/p&gt;

&lt;p&gt;* Kod yazarken dikkatinizi dağıtacak, antivirüs, outlook gibi zıpır zıpır popup mesaj çıkaran şeyleri kapatın.&lt;/p&gt;

&lt;p&gt;* Age of Empires eski makinalarda da çalışıyor olsa bile ofisdeki en hızlı makinayı kullanın, bunun için gerekirse patronunuza yalvarın. Şirketin bik bik standartları var bu yüzden veremeyiz denirse gidip kendinize hızlı bir makina alın, bu kendinize yaptığınız bir yatırımdır.&lt;/p&gt;

&lt;p&gt;* Sürekli tekrar ettiğiniz şeyleri daha kısa sürede yapmanın bir yolunu bulun, gerekirse telefonda ağlayan kullanıcıyı beklemeye alıp browser&#039;ın address barına günde 150 kere yanlış yazdığınız programın adresini bookmark&#039;lara ekleyin.&lt;/p&gt;

&lt;p&gt;* Yazdığınız uygulamayı arayüzler içinden test etmekten vazgeçin, felsefik saçmalıklardan olacak ama unit test için ilk adımı atmak uzun bir yolun ilk adımıdır.&lt;/p&gt;

&lt;p&gt;* Geliştirdiğiniz uygulamayı güncellemek için tek tek dosya kopyalamaktan vazgeçin, hayır daha hızlı değil. Tüm değişmiş dosyaları güncelleyecek bir script dosyası yazın. &lt;/p&gt;

&lt;p&gt;* Bunların içerisindeki en önemlisi &quot;hurafe&quot;lere inanmayın. 10dk önce çalışan bir şey mars&#039;dan gelmiş kırmızı etekli uzaylılar tarafından bozulmuş olamaz.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://ertan.rdgnetwork.org/turnaround-time&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><i>Klavyem sanırım aşırı kullanım yüzünden o (noktalı olanı) harfini yazmamakta inat ediyor. çok uğraşamadım idare ediniz.</i></p>

<p><center><img src="http://www.getmoreyoutubeviews.com/wp-content/uploads/2009/02/repeat-business.jpg" /></center></p>

<p>wikipedia'ya gore </p>

<p><em><br />
Turnaround, in computing scheduling, the total time between submission of a process and its completion<br />
</em></p>

<p>anlamına gelen bu kelime biz farkında olmadan yazılım geliştirme için harcadığımız zamanın büyük bir bolumunu alır.</p>

<p>Diyelim ki ofisinizde sakin bir şekilde çalışırken, yazdığınız uygulamada ufak bir hata buldunuz. Basit anlamda bu süre IDE açıkken uygulamayı derleyip, hatayı deneyip, tekrar IDE'ye dondugunuze kadar geçen süredir aslında. </p>

<p>Çoğu developer bu süreyi etkileyecek sorunları çozmek yerine gozardı edip bir an once hatayı test etmeye odaklanır. Tanıdığım bir developer'ın yaptıklarını ornek vererek gideyim <img src="http://blog.rdgnetwork.org/rsc/smilies/icon_smile.gif" title="&amp;amp;#58;&amp;amp;#41;" alt="&amp;amp;#58;&amp;amp;#41;" class="middle" width="15" height="15" /></p>

<p><center><img src="http://static.frysforum.com/mi/57dff9078be2281da821a9fa2a981bff-0-compiling.png" /></center></p>

<p>1. Derle 45sn (7sn) Normalde çok kısa süren bu iş, diskinde yer olmadığı için kodları USB diskten kullanıyor bu yüzden çok yavaş.</p>

<p>2. Kopyala 90sn. (0sn) Normalde build script'i ile kopyalanan dll dosyası, build script'ini güncellemediği için elle kopyalamak zorunda. Derlenen dosyayı programı çalıştırdığı dizine kopyalıyor ama uygulamayı açık unuttuğu için dosyaları kopyalayamadı. programı kapatıp kopyalamayı tekrar başlatıyor.</p>

<p>3. Çalıştırma 35sn. (4sn) Her ne amaçla kullanıldığını anlamadığım bir cehennemden gelmiş bir antitrojan uyarı mesajı çıkarıyor. Mesaj kapatılıyor.</p>

<p>4. Deneme 70sn. (2sn) Denemek için uygulamadaki ekrana gidip parametreleri giriyor, ama hatayı oluşmadı. Biraz düşündükten sonra hatalı parametre girdiğini farkedip düzeltip tekrar deniyor. Hata düzelmemiş. tekrar baştan başla.</p>

<p>Bu saydıklarımın aslında daha fazlası var ama sıkıcı olmaması için daha detaylandırmadım. Şimdi normalde 13sn süren "turnaround" zamanı bu developer için 240 saniye yani 4dk.</p>

<p>Gün içinde bunu yüzlerce kez tekrar ettiğimiz için işimizi yaparken harcadığımız zamanın çok çok büyük bir bölümünü anlamsız, kimseye faydası olmayan, can sıkıcı işlerle geçiririz.</p>

<p>Verdiğim örnekler için bir build script'i ve <a href="http://ertan.rdgnetwork.org/2007/02/22/unit_test">unit test</a> yapmanız yeterlidir ama yaptığınız işin detaylarını sizden başka kimse bilmez. </p>

<p>Bu konuda size sadece bazı genel olabilecek önerilerim olacak;</p>

<p>* Kod yazarken dikkatinizi dağıtacak, antivirüs, outlook gibi zıpır zıpır popup mesaj çıkaran şeyleri kapatın.</p>

<p>* Age of Empires eski makinalarda da çalışıyor olsa bile ofisdeki en hızlı makinayı kullanın, bunun için gerekirse patronunuza yalvarın. Şirketin bik bik standartları var bu yüzden veremeyiz denirse gidip kendinize hızlı bir makina alın, bu kendinize yaptığınız bir yatırımdır.</p>

<p>* Sürekli tekrar ettiğiniz şeyleri daha kısa sürede yapmanın bir yolunu bulun, gerekirse telefonda ağlayan kullanıcıyı beklemeye alıp browser'ın address barına günde 150 kere yanlış yazdığınız programın adresini bookmark'lara ekleyin.</p>

<p>* Yazdığınız uygulamayı arayüzler içinden test etmekten vazgeçin, felsefik saçmalıklardan olacak ama unit test için ilk adımı atmak uzun bir yolun ilk adımıdır.</p>

<p>* Geliştirdiğiniz uygulamayı güncellemek için tek tek dosya kopyalamaktan vazgeçin, hayır daha hızlı değil. Tüm değişmiş dosyaları güncelleyecek bir script dosyası yazın. </p>

<p>* Bunların içerisindeki en önemlisi "hurafe"lere inanmayın. 10dk önce çalışan bir şey mars'dan gelmiş kırmızı etekli uzaylılar tarafından bozulmuş olamaz.</p><div class="item_footer"><p><small><a href="http://ertan.rdgnetwork.org/turnaround-time">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://ertan.rdgnetwork.org/turnaround-time#comments</comments>
			<wfw:commentRss>http://ertan.rdgnetwork.org/?tempskin=_rss2&#38;disp=comments&#38;p=327</wfw:commentRss>
		</item>
				<item>
			<title>asp.net ve web platformu ile ilgili tavsiyeler.</title>
			<link>http://ertan.rdgnetwork.org/asp-net-ve-web-platformu-ile-ilgili-tavsiyeler</link>
			<pubDate>Wed, 20 Oct 2010 19:27:15 +0000</pubDate>			<dc:creator>ertan</dc:creator>
			<category domain="main">Yazılım</category>			<guid isPermaLink="false">325@http://blog.rdgnetwork.org/</guid>
						<description>&lt;p&gt;Bu aralar bende yeni bir projeye başladığım için geçmiş tecrübeleri bir köşeye yazmanın zamanı geldi diye düşünüyorum. Umarım bir gün faydasını görürsünüz.&lt;/p&gt;

&lt;p&gt;Henüz hiç kod yazmadıysanız öncelikle geliştirdiğiniz uygulamayı kimlerin kullanacağı konusunda biraz düşünmeniz gerekiyor. Intranet (ofisiniz diyelim) içinde çalışacak bir uygulama ile internet üzerinden kullanılacak uygulama arasındaki uçurumların daha sonra farkına varabilirsiniz.&lt;/p&gt;

&lt;h4&gt;Bant Genişliği&lt;/h4&gt;

&lt;p&gt;Eğer intranet içerisinde ve sınırları aşmayacak kullanıcı adedinde olacak ise biraz daha rahat davranabilir bant genişliğini düşünmeden hızlı kod geliştirmeye odaklanabilirsiniz. Bu durumda ASP.NET kontrolleri yada MVC ile yol almakta fayda var. Bunlarla çok basit uygulamaları neredeyse hiç kod yazmadan arayüzlerle geliştirmeniz bile olası.&lt;/p&gt;

&lt;h4&gt;View State&lt;/h4&gt;

&lt;p&gt;Yeterli bant genişliği olsa bile IDE&#039;den New Project dediğiniz anda web.config&#039;den viewstate&#039;i çok mecbur kalmadığınız sürece bir daha açmamak üzere kapatmanız iyi olacaktır. &lt;/p&gt;

&lt;p&gt;Eğer kendiniz web controlleri geliştirecekseniz mecbur kaldığınızda &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/1whwt1k7.aspx&quot;&gt;control state&lt;/a&gt;&#039;i kullanmaya çalışın. Yeniden hesaplayabildiğiniz şeyleri (DropDrown&#039;ın listesi gibi) viewstate yerine veritabanı gibi ortamlardan oluşturun. Ancak hesaplayamadığınız (DropDown&#039;ın seçili item&#039;ı gibi) değerleri sadece control state&#039;e yazın. Bu tercih ilerde sizi 60kb&#039;lik html sayfasına karşılık 700kb&#039;lik viewstate&#039;den kurtaracak, hem network hemde cpu anlamında rahat etmenizi sağlar.&lt;/p&gt;

&lt;h4&gt;Login&lt;/h4&gt;

&lt;p&gt;Daha sonra uygulamanın kullanıcılarının sisteme nasıl giriş (login) yapacakları konusunda düşünmeniz gerekiyor. &lt;/p&gt;

&lt;p&gt;Eğer tüm kullanıcıların AD (Active Directory) içerisinde hesabı var ise sizden şifre girilmeyen bir uygulama isteyeceklerdir. Bu yüzden Windows Authentication kullanmalısınız. Bu arada windows authentication sadece Internet Explorer ile çalışır, Firefox veya Chrome kullanmakta ısrar eden patronlarınız var ise şifre girmek zorunda kalacakları konusunda uyarmanız uyarmanız yerindedir. &lt;/p&gt;

&lt;p&gt;Etrafta yeterince bilgi olduğu için Forms Authentication&#039;ın detaylarına girmiyorum.&lt;/p&gt;

&lt;p&gt;Uygulamanın giriş yapılmadan kullanılacak bölümleri (örneğin ana sayfa gibi) olacak ise giriş yapılacak bölümün dosyalarını ayrı bir dizin içerisinde tutun ve bu dizinde aşağıdaki gibi bir web.config dosyası tanımlayın. Böylece henüz login olmamış kullanıcılar bu dizin içerisindeki bir sayfaya erişmek istediğinde login sayfasına yönlendirilecektir.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;XML:&lt;/p&gt;&lt;div class=&quot;codeblock amc_xml amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&lt;span class=&quot;amc_default&quot;&gt;&lt;span class=&quot;amc_keyword&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&lt;span class=&quot;amc_keyword&quot;&gt;&amp;lt;system.web&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span class=&quot;amc_keyword&quot;&gt;&amp;lt;authorization&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span class=&quot;amc_keyword&quot;&gt;&amp;lt;deny&lt;/span&gt;&lt;span class=&quot;amc_default&quot;&gt; &lt;span class=&quot;amc_attribute&quot;&gt;users&lt;/span&gt;=&lt;span class=&quot;amc_string&quot;&gt;&quot;?&quot;&lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span class=&quot;amc_keyword&quot;&gt;&amp;lt;/authorization&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&lt;span class=&quot;amc_keyword&quot;&gt;&amp;lt;/system.web&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&lt;span class=&quot;amc_default&quot;&gt;&lt;span class=&quot;amc_keyword&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
 
&lt;h4&gt;Dil problemleri&lt;/h4&gt;
&lt;p&gt; &lt;br /&gt;
Türkçe ve diğer tüm dil problemlerinden kurtulmak için web.config aşağıdaki şekilde olmalı;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;globalization requestEncoding=&quot;utf-8&quot; responseEncoding=&quot;utf-8&quot; fileEncoding=&quot;utf-8&quot; enableClientBasedCulture=&quot;true&quot; culture=&quot;auto&quot; uiCulture=&quot;auto&quot; /&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Şu anda hiç planınızda olmasa bile lokalizasyon için kullanılan &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/c6zyy3s9.aspx&quot;&gt;resource dosyalarının kullanımını&lt;/a&gt; öğrenin. &lt;br /&gt;
 &lt;/p&gt;
&lt;h4&gt;Session&lt;/h4&gt;

&lt;p&gt;Eğer session içerisinde bir şey tutmamayı planlıyorsanız (-ki bu doğru yoldasınız demek) sessionState&#039;i kapatarak biraz daha performans kazanabilirsiniz. Eğer aynı anda 100+ kullanıcıyı geçecek bir sistem geliştiriyorsanız, session kullanmanızı kesinlikle tavsiye etmem.&lt;br /&gt;
 &lt;br /&gt;
Hazır session hakkında konu açılmışken, eğer uygulamanız birden fazla sunucuda paralel olarak çalışacak (Load balanced yada Cluster diye geçer) ise mümkün olduğu kadar session kullanmaktan kaçının. Mecbur kalmanız durumunda session içerisine koyduğunuz nesnelerin serialize edilebilir olmasına dikkat edin.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Load balancing&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Normalde session bilgileri web sunucusunun hafızasında saklanır. Yani siz sunucuyu kapattığınızda bu bilgiler kaybolur. Özel durumlar haricinde yük paylaşımı yapılan sunucularda session bilgileri sunucunun hafızası yerine serialize edilerek veritabanı üzerinde saklanır. Böylece 1. tıklamada A sunucusuna giden istek, 2. tıklamada B sunucusuna gittiğinde uygulama kaldığı yerden devam edebilir. Eğer bu konu size çok problem yaratıyor ise network sorumlunuz ile konuşarak bağlantı açan istemcinin hep aynı sunucu üzerinde kalmasını sağlayabilirsiniz. (Umarım karmaşık olmadı)&lt;br /&gt;
 &lt;/p&gt;
&lt;h3&gt;HTML&lt;/h3&gt;

&lt;h4&gt;Boşluk karakterleri&lt;/h4&gt;

&lt;p&gt;HTML ile ilgili yapacağınız en iyi ve kısa optimizasyon ne kadar cici ve anlaşılabilir gelirse gelsin Visual Studio&#039;nun aspx dosyaları üzerindeki salak indent&#039;lerini kaldırmak olacaktır. &lt;/p&gt;

&lt;p&gt;Nedeni ise çok fazla detay ve ascx tipi kontroller içeren sayfalar verilen indentler nedeniyle sunucunuzdan çıkacak olan &quot; &quot; (boşluk) karakterleri normal html boyutunu geçebilir.&lt;/p&gt;

&lt;p&gt;Özellikle bu konuya liste tipi ekranlarda dikkat etmeniz gerekli. Örneğin listenin her satırında aşağıdaki gibi bir kodun tekrar ettiğini varsayalım.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;asp:Panel runat=&quot;server&quot;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;asp:Button runat=&quot;server&quot; Text=&quot;tıkla&quot;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;asp:Button runat=&quot;server&quot; Text=&quot;hey&quot;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;/asp:Panel&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bu durumda browser&#039;a 20 adet boşluk ve 4 tane yeni satır karakteri göndermiş oluyorsunuz. Toplamda bu 28 byte civarı bir şey yapar. Eğer listede 1000 adet kayıt listelenirse hiç kimsenin işine yaramayan 28kb&#039;lik boş veri gönderiyor olursunuz. (Html boyutu dışında bunun sunucunuzda farklı etkileride var ama detayı sonra anlatırım)&lt;/p&gt;

&lt;h4&gt;Hyperlinkler&lt;/h4&gt;

&lt;p&gt;Bu bölüm çok önemli değil ama benim gibi titiz karakterli olanlar sevebilir. &lt;/p&gt;

&lt;p&gt;Sayfalar içerisinde verdiğiniz linklerin anlaşılabilir olmasına aslında gerek yok. Örnekle gideyim; &lt;/p&gt;

&lt;p&gt;bir arama kutunuz var diyelim;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;form action=&quot;executesearch.aspx&quot;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;lt;input type=&quot;textbox&quot; name=&quot;aranacakkelime&quot;/&amp;gt;&amp;lt;input type=&quot;button&quot; name=&quot;b&quot;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; &amp;lt;/form&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bu şekilde bir html yerine aşağıdaki gibi daha kısa kelimeleri seçebilirsiniz.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;form action=&quot;es.aspx&quot;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;lt;input type=&quot;textbox&quot; name=&quot;k&quot;/&amp;gt;&amp;lt;input type=&quot;button&quot; name=&quot;b&quot;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; &amp;lt;/form&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Böylece sunucu ve browser arasında gidip gelen veri miktarını azaltabilirsiniz. Bu mantık arama kutusu için ben anlamlı gelmeyebilir ama örneğin arama sonuçları sayfasında verdiğiniz linklerde&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;a href=&quot;details.aspx?sayfano=5&quot;&amp;gt;Detay&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;yerine; &lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;a href=&quot;d.aspx?i=5&quot;&amp;gt;Detay&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;hatta biraz biliyorsanız rewrite rule&#039;lar ile;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;a href=&quot;d/5&quot;&amp;gt;Detay&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;verdiğinizde her satır için ilk örnekte 10, ikincide 19 byte kazanırsınız. Bu fazla gözükmeyebilir ama 1000 satır kayıt listelediğinizde 19kb kazanıyorsunuz demektir.&lt;/p&gt;

&lt;h4&gt;Resim linkleri&lt;/h4&gt;

&lt;p&gt;Bunu çok fazla kişi bilmez ancak neredeyse tüm browserlar gezinti yaparken sayfanın içeriğini sunucudan indirmek için site başına 2 ağ bağlantısı kullanır. Bu kullanıcı bir link&#039;e tıkladığı zaman 1. kanaldan html içeriği indirilirken 2. kanaldan css,javascript,resim gibi diğer bilgiler indirilir. Örneğin 5 tane css dosyası kullanıyorsanız bu durumda neredeyse hepsi sıralı olarak sunucudan indirilir.&lt;/p&gt;

&lt;p&gt;Bu tür bir problemi gidermek için farklı içerikleri aslında aynı siteyi gösteren ancak farklı isimlerle göstererek browser&#039;ı kandırabilirsiniz. Yani css ve js dosyaları için farklı bir adres, resimler için farklı bir adres verebilirsiniz. Örneğin;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;lt;link href=&quot;http://res.benimguzelsitem.com/css/elma.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;lt;link href=&quot;http://res.benimguzelsitem.com/css/armut.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;lt;img src=&quot;http://img.benimguzelsitem.com/img/jennajameson.jpg&quot;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;lt;img src=&quot;http://img.benimguzelsitem.com/img/emilyscott.jpg&quot;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;/bod&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc0&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Şimdi bu yapıya göre &quot;res.benimguzelsitem.com&quot; ve &quot;img.benimguzelsitem.com&quot; web siteleri aslında &quot;www.benimguzelsitem.com&quot; ile aynı IP adresini kullanmakta (DNS tanımları üzerinden bunu yapabilirsiniz) ve hatta IIS üzerinde aynı dizini göstermekte.&lt;/p&gt;

&lt;p&gt;Böylece browser&#039;ı kandırarak normalde 2 yerine 6 kanaldan sayfa içeriğini indirmenizi sağlar, buda hızlı açılan sayfalar demek.&lt;/p&gt;

&lt;p&gt;Şimdilik bu kadar.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://ertan.rdgnetwork.org/asp-net-ve-web-platformu-ile-ilgili-tavsiyeler&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Bu aralar bende yeni bir projeye başladığım için geçmiş tecrübeleri bir köşeye yazmanın zamanı geldi diye düşünüyorum. Umarım bir gün faydasını görürsünüz.</p>

<p>Henüz hiç kod yazmadıysanız öncelikle geliştirdiğiniz uygulamayı kimlerin kullanacağı konusunda biraz düşünmeniz gerekiyor. Intranet (ofisiniz diyelim) içinde çalışacak bir uygulama ile internet üzerinden kullanılacak uygulama arasındaki uçurumların daha sonra farkına varabilirsiniz.</p>

<h4>Bant Genişliği</h4>

<p>Eğer intranet içerisinde ve sınırları aşmayacak kullanıcı adedinde olacak ise biraz daha rahat davranabilir bant genişliğini düşünmeden hızlı kod geliştirmeye odaklanabilirsiniz. Bu durumda ASP.NET kontrolleri yada MVC ile yol almakta fayda var. Bunlarla çok basit uygulamaları neredeyse hiç kod yazmadan arayüzlerle geliştirmeniz bile olası.</p>

<h4>View State</h4>

<p>Yeterli bant genişliği olsa bile IDE'den New Project dediğiniz anda web.config'den viewstate'i çok mecbur kalmadığınız sürece bir daha açmamak üzere kapatmanız iyi olacaktır. </p>

<p>Eğer kendiniz web controlleri geliştirecekseniz mecbur kaldığınızda <a href="http://msdn.microsoft.com/en-us/library/1whwt1k7.aspx">control state</a>'i kullanmaya çalışın. Yeniden hesaplayabildiğiniz şeyleri (DropDrown'ın listesi gibi) viewstate yerine veritabanı gibi ortamlardan oluşturun. Ancak hesaplayamadığınız (DropDown'ın seçili item'ı gibi) değerleri sadece control state'e yazın. Bu tercih ilerde sizi 60kb'lik html sayfasına karşılık 700kb'lik viewstate'den kurtaracak, hem network hemde cpu anlamında rahat etmenizi sağlar.</p>

<h4>Login</h4>

<p>Daha sonra uygulamanın kullanıcılarının sisteme nasıl giriş (login) yapacakları konusunda düşünmeniz gerekiyor. </p>

<p>Eğer tüm kullanıcıların AD (Active Directory) içerisinde hesabı var ise sizden şifre girilmeyen bir uygulama isteyeceklerdir. Bu yüzden Windows Authentication kullanmalısınız. Bu arada windows authentication sadece Internet Explorer ile çalışır, Firefox veya Chrome kullanmakta ısrar eden patronlarınız var ise şifre girmek zorunda kalacakları konusunda uyarmanız uyarmanız yerindedir. </p>

<p>Etrafta yeterince bilgi olduğu için Forms Authentication'ın detaylarına girmiyorum.</p>

<p>Uygulamanın giriş yapılmadan kullanılacak bölümleri (örneğin ana sayfa gibi) olacak ise giriş yapılacak bölümün dosyalarını ayrı bir dizin içerisinde tutun ve bu dizinde aşağıdaki gibi bir web.config dosyası tanımlayın. Böylece henüz login olmamış kullanıcılar bu dizin içerisindeki bir sayfaya erişmek istediğinde login sayfasına yönlendirilecektir.</p>

<p class="amcode">XML:</p><div class="codeblock amc_xml amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default"><span class="amc_default"><span class="amc_keyword">&lt;configuration&gt;</span></span></span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default"><span class="amc_default">&#160;&#160;<span class="amc_keyword">&lt;system.web&gt;</span></span></span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default"><span class="amc_default">&#160;&#160;&#160;&#160;<span class="amc_keyword">&lt;authorization&gt;</span></span></span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default"><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160;<span class="amc_keyword">&lt;deny</span><span class="amc_default"> <span class="amc_attribute">users</span>=<span class="amc_string">"?"</span>/&gt;</span></span></span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default"><span class="amc_default">&#160;&#160;&#160;&#160;<span class="amc_keyword">&lt;/authorization&gt;</span></span></span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default"><span class="amc_default">&#160;&#160;<span class="amc_keyword">&lt;/system.web&gt;</span></span></span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default"><span class="amc_default"><span class="amc_keyword">&lt;/configuration&gt;</span></span></span></code></td></tr>
</table></div>
 
<h4>Dil problemleri</h4>
<p> <br />
Türkçe ve diğer tüm dil problemlerinden kurtulmak için web.config aşağıdaki şekilde olmalı;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">&lt;globalization requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="utf-8" enableClientBasedCulture="true" culture="auto" uiCulture="auto" /&gt;</span></code></td></tr>
</table></div>

<p>Şu anda hiç planınızda olmasa bile lokalizasyon için kullanılan <a href="http://msdn.microsoft.com/en-us/library/c6zyy3s9.aspx">resource dosyalarının kullanımını</a> öğrenin. <br />
 </p>
<h4>Session</h4>

<p>Eğer session içerisinde bir şey tutmamayı planlıyorsanız (-ki bu doğru yoldasınız demek) sessionState'i kapatarak biraz daha performans kazanabilirsiniz. Eğer aynı anda 100+ kullanıcıyı geçecek bir sistem geliştiriyorsanız, session kullanmanızı kesinlikle tavsiye etmem.<br />
 <br />
Hazır session hakkında konu açılmışken, eğer uygulamanız birden fazla sunucuda paralel olarak çalışacak (Load balanced yada Cluster diye geçer) ise mümkün olduğu kadar session kullanmaktan kaçının. Mecbur kalmanız durumunda session içerisine koyduğunuz nesnelerin serialize edilebilir olmasına dikkat edin.</p>

<p><b>Load balancing</b></p>

<p>Normalde session bilgileri web sunucusunun hafızasında saklanır. Yani siz sunucuyu kapattığınızda bu bilgiler kaybolur. Özel durumlar haricinde yük paylaşımı yapılan sunucularda session bilgileri sunucunun hafızası yerine serialize edilerek veritabanı üzerinde saklanır. Böylece 1. tıklamada A sunucusuna giden istek, 2. tıklamada B sunucusuna gittiğinde uygulama kaldığı yerden devam edebilir. Eğer bu konu size çok problem yaratıyor ise network sorumlunuz ile konuşarak bağlantı açan istemcinin hep aynı sunucu üzerinde kalmasını sağlayabilirsiniz. (Umarım karmaşık olmadı)<br />
 </p>
<h3>HTML</h3>

<h4>Boşluk karakterleri</h4>

<p>HTML ile ilgili yapacağınız en iyi ve kısa optimizasyon ne kadar cici ve anlaşılabilir gelirse gelsin Visual Studio'nun aspx dosyaları üzerindeki salak indent'lerini kaldırmak olacaktır. </p>

<p>Nedeni ise çok fazla detay ve ascx tipi kontroller içeren sayfalar verilen indentler nedeniyle sunucunuzdan çıkacak olan " " (boşluk) karakterleri normal html boyutunu geçebilir.</p>

<p>Özellikle bu konuya liste tipi ekranlarda dikkat etmeniz gerekli. Örneğin listenin her satırında aşağıdaki gibi bir kodun tekrar ettiğini varsayalım.</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">&lt;asp:Panel runat="server"&gt;</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160;&lt;asp:Button runat="server" Text="tıkla"/&gt;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&#160;&#160;&lt;asp:Button runat="server" Text="hey"/&gt;</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;&lt;/asp:Panel&gt;</span></code></td></tr>
</table></div>

<p>Bu durumda browser'a 20 adet boşluk ve 4 tane yeni satır karakteri göndermiş oluyorsunuz. Toplamda bu 28 byte civarı bir şey yapar. Eğer listede 1000 adet kayıt listelenirse hiç kimsenin işine yaramayan 28kb'lik boş veri gönderiyor olursunuz. (Html boyutu dışında bunun sunucunuzda farklı etkileride var ama detayı sonra anlatırım)</p>

<h4>Hyperlinkler</h4>

<p>Bu bölüm çok önemli değil ama benim gibi titiz karakterli olanlar sevebilir. </p>

<p>Sayfalar içerisinde verdiğiniz linklerin anlaşılabilir olmasına aslında gerek yok. Örnekle gideyim; </p>

<p>bir arama kutunuz var diyelim;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">&lt;form action="executesearch.aspx"&gt;</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&#160;&#160;&lt;input type="textbox" name="aranacakkelime"/&gt;&lt;input type="button" name="b"/&gt;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default"> &lt;/form&gt;</span></code></td></tr>
</table></div>

<p>Bu şekilde bir html yerine aşağıdaki gibi daha kısa kelimeleri seçebilirsiniz.</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">&lt;form action="es.aspx"&gt;</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&#160;&#160;&lt;input type="textbox" name="k"/&gt;&lt;input type="button" name="b"/&gt;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default"> &lt;/form&gt;</span></code></td></tr>
</table></div>

<p>Böylece sunucu ve browser arasında gidip gelen veri miktarını azaltabilirsiniz. Bu mantık arama kutusu için ben anlamlı gelmeyebilir ama örneğin arama sonuçları sayfasında verdiğiniz linklerde</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">&lt;a href="details.aspx?sayfano=5"&gt;Detay&lt;/a&gt;</span></code></td></tr>
</table></div>

<p>yerine; </p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">&lt;a href="d.aspx?i=5"&gt;Detay&lt;/a&gt;</span></code></td></tr>
</table></div>

<p>hatta biraz biliyorsanız rewrite rule'lar ile;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">&lt;a href="d/5"&gt;Detay&lt;/a&gt;</span></code></td></tr>
</table></div>

<p>verdiğinizde her satır için ilk örnekte 10, ikincide 19 byte kazanırsınız. Bu fazla gözükmeyebilir ama 1000 satır kayıt listelediğinizde 19kb kazanıyorsunuz demektir.</p>

<h4>Resim linkleri</h4>

<p>Bunu çok fazla kişi bilmez ancak neredeyse tüm browserlar gezinti yaparken sayfanın içeriğini sunucudan indirmek için site başına 2 ağ bağlantısı kullanır. Bu kullanıcı bir link'e tıkladığı zaman 1. kanaldan html içeriği indirilirken 2. kanaldan css,javascript,resim gibi diğer bilgiler indirilir. Örneğin 5 tane css dosyası kullanıyorsanız bu durumda neredeyse hepsi sıralı olarak sunucudan indirilir.</p>

<p>Bu tür bir problemi gidermek için farklı içerikleri aslında aynı siteyi gösteren ancak farklı isimlerle göstererek browser'ı kandırabilirsiniz. Yani css ve js dosyaları için farklı bir adres, resimler için farklı bir adres verebilirsiniz. Örneğin;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">&lt;html&gt;</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&lt;head&gt;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160;&lt;link href="http://res.benimguzelsitem.com/css/elma.css" rel="stylesheet" type="text/css" /&gt;</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;&lt;link href="http://res.benimguzelsitem.com/css/armut.css" rel="stylesheet" type="text/css" /&gt;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">&lt;/head&gt;</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">&lt;body&gt;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default">&#160;&#160;&lt;img src="http://img.benimguzelsitem.com/img/jennajameson.jpg"/&gt;</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"></div></td><td><code><span class="amc_default">&#160;&#160;&lt;img src="http://img.benimguzelsitem.com/img/emilyscott.jpg"/&gt;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"></div></td><td><code><span class="amc_default">&lt;/bod&gt;</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc0"><div class="amc1"></div></div></td><td><code><span class="amc_default">&lt;/html&gt;</span></code></td></tr>
</table></div>

<p>Şimdi bu yapıya göre "res.benimguzelsitem.com" ve "img.benimguzelsitem.com" web siteleri aslında "www.benimguzelsitem.com" ile aynı IP adresini kullanmakta (DNS tanımları üzerinden bunu yapabilirsiniz) ve hatta IIS üzerinde aynı dizini göstermekte.</p>

<p>Böylece browser'ı kandırarak normalde 2 yerine 6 kanaldan sayfa içeriğini indirmenizi sağlar, buda hızlı açılan sayfalar demek.</p>

<p>Şimdilik bu kadar.</p><div class="item_footer"><p><small><a href="http://ertan.rdgnetwork.org/asp-net-ve-web-platformu-ile-ilgili-tavsiyeler">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://ertan.rdgnetwork.org/asp-net-ve-web-platformu-ile-ilgili-tavsiyeler#comments</comments>
			<wfw:commentRss>http://ertan.rdgnetwork.org/?tempskin=_rss2&#38;disp=comments&#38;p=325</wfw:commentRss>
		</item>
				<item>
			<title>Office 2010 elektronik imza yeniliği</title>
			<link>http://ertan.rdgnetwork.org/office-2010-elektronik-imza-yenili-i</link>
			<pubDate>Mon, 04 Oct 2010 07:17:32 +0000</pubDate>			<dc:creator>ertan</dc:creator>
			<category domain="main">Yazılım</category>			<guid isPermaLink="false">324@http://blog.rdgnetwork.org/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://ertan.rdgnetwork.org/2009/11/29/elektronik_imza_uzerine&quot;&gt;Daha önce&lt;/a&gt; yazdığım gibi bir çok uygulama elektronik imza için basit olduğundan BES tipi imzaları atmayı yeterli görüyordu ama Office 2010 için (biraz şaşırsamda) bu konuda bir güzel değişiklik yapılmış.&lt;/p&gt;

&lt;p&gt;Docx, xlsx gibi sonu x ile biten uzantılar ile dosya formatlarını daha önceden xml haline dönüştürmüşlerdi, (bilmeyenler için; docx uzantısını sadece zip şekline çevirin açılacaktır) şimdi de dokümanlara elektronik imza atılırken XaDES formatında atılmaya başlamış. Belki elektronik imza düşündüğünüz bazı projelerinizde işinize yarayabilir.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://ertan.rdgnetwork.org/office-2010-elektronik-imza-yenili-i&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://ertan.rdgnetwork.org/2009/11/29/elektronik_imza_uzerine">Daha önce</a> yazdığım gibi bir çok uygulama elektronik imza için basit olduğundan BES tipi imzaları atmayı yeterli görüyordu ama Office 2010 için (biraz şaşırsamda) bu konuda bir güzel değişiklik yapılmış.</p>

<p>Docx, xlsx gibi sonu x ile biten uzantılar ile dosya formatlarını daha önceden xml haline dönüştürmüşlerdi, (bilmeyenler için; docx uzantısını sadece zip şekline çevirin açılacaktır) şimdi de dokümanlara elektronik imza atılırken XaDES formatında atılmaya başlamış. Belki elektronik imza düşündüğünüz bazı projelerinizde işinize yarayabilir.</p><div class="item_footer"><p><small><a href="http://ertan.rdgnetwork.org/office-2010-elektronik-imza-yenili-i">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://ertan.rdgnetwork.org/office-2010-elektronik-imza-yenili-i#comments</comments>
			<wfw:commentRss>http://ertan.rdgnetwork.org/?tempskin=_rss2&#38;disp=comments&#38;p=324</wfw:commentRss>
		</item>
				<item>
			<title>Webmaster'lar için Google bloklarına çözüm</title>
			<link>http://ertan.rdgnetwork.org/webmasterlar-icin-google-bloklarina-cozum</link>
			<pubDate>Mon, 20 Sep 2010 20:01:51 +0000</pubDate>			<dc:creator>ertan</dc:creator>
			<category domain="main">Algoritma Soruları</category>			<guid isPermaLink="false">323@http://blog.rdgnetwork.org/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://sozluk.rdgnetwork.org&quot;&gt;Sözlük&lt;/a&gt; sayfasını yaparken en hassas olduğum konu hızlı çalışmasıydı ama bugün açmaya çalışırken sayfanın bir türlü yüklenemediğini farkettim. Sayfa yüklenmesi tamamlanmadığı için javascript&#039;lerinde çalışmadığını farkettim. Biraz kurcalayınca sorunun saygıdeğer memleket yöneticilerimizin google ip&#039;lerine koyduğu bloklama yüzünden sayfanın google analytics kodunu çalıştırmaya uğraştığını farkettim.&lt;/p&gt;

&lt;p&gt;Klavye kullanmayayı bilen bazı internet kullanıcıları bu sorunu &lt;a href=&quot;http://www.kabiliyet.org/2010/06/youtubea-girememe-ve-internet-yavaslg.html&quot;&gt;buradaki&lt;/a&gt; gibi çözümlerle halletmeye çalışıyorlar. Okumaya üşenenler için basitçe &lt;b&gt;hosts&lt;/b&gt; dosyasına google&#039;ın bloklanmamış ip numaralarının girilmesi anlatılıyor.&lt;/p&gt;

&lt;p&gt;Bunu herkesin yapması elbetteki mümkün değil, bu yüzden site web masterları için google analytics kodu üzerinde yapacağınız ufak bir düzenleme ziyaretçilerinizin yavaşlık şikayetlerini ortadan kaldıracaktır. Yapacağınız şey üretilen kodu basitçe bir fonksiyonun içerisine alın ve setTimeout ile çağırın. &lt;/p&gt;

&lt;p&gt;Örneğin size aşağıdaki gibi bir kod verilecek;&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;var gaJsHost = ((&quot;https:&quot; == document.location.protocol) ? &quot;https://ssl.&quot; : &quot;http://www.&quot;);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;document.write(unescape(&quot;%3Cscript src=&#039;&quot; + gaJsHost + &quot;google-analytics.com/ga.js&#039; type=&#039;text/javascript&#039;%3E%3C/script%3E&quot;));&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;var pageTracker = _gat._getTracker(&quot;UA-XXXXXX-X&quot;);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;pageTracker._initData();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;pageTracker._trackPageview();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;bu kodu aşağıdaki şekildeki gibi en başına bir fonksiyon tanımı ve en sonunada fonksiyonu kapattıktan sonra setTimeout çağrısını koymanız yeterli.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;function googleKayit() {&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;var gaJsHost = ((&quot;https:&quot; == document.location.protocol) ? &quot;https://ssl.&quot; : &quot;http://www.&quot;);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;document.write(unescape(&quot;%3Cscript src=&#039;&quot; + gaJsHost + &quot;google-analytics.com/ga.js&#039; type=&#039;text/javascript&#039;%3E%3C/script%3E&quot;));&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;var pageTracker = _gat._getTracker(&quot;UA-XXXXXX-X&quot;);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;pageTracker._initData();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;pageTracker._trackPageview();&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;window.setTimeout(googleKayit, 100);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;böylece google bloklu olsa bile sayfanızdaki diğer javascript çağrıları çalışacaktır. site ziyaretçilerininde saç baş yolmasını biraz olsun engellemiş olursunuz.&lt;/p&gt;

&lt;p&gt;komik olan şey ise sözlük için yapmış olsam da kullandığım blog engine yüzünden bu blog&#039;da aynı şeyi yapamıyor olmam.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://ertan.rdgnetwork.org/webmasterlar-icin-google-bloklarina-cozum&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://sozluk.rdgnetwork.org">Sözlük</a> sayfasını yaparken en hassas olduğum konu hızlı çalışmasıydı ama bugün açmaya çalışırken sayfanın bir türlü yüklenemediğini farkettim. Sayfa yüklenmesi tamamlanmadığı için javascript'lerinde çalışmadığını farkettim. Biraz kurcalayınca sorunun saygıdeğer memleket yöneticilerimizin google ip'lerine koyduğu bloklama yüzünden sayfanın google analytics kodunu çalıştırmaya uğraştığını farkettim.</p>

<p>Klavye kullanmayayı bilen bazı internet kullanıcıları bu sorunu <a href="http://www.kabiliyet.org/2010/06/youtubea-girememe-ve-internet-yavaslg.html">buradaki</a> gibi çözümlerle halletmeye çalışıyorlar. Okumaya üşenenler için basitçe <b>hosts</b> dosyasına google'ın bloklanmamış ip numaralarının girilmesi anlatılıyor.</p>

<p>Bunu herkesin yapması elbetteki mümkün değil, bu yüzden site web masterları için google analytics kodu üzerinde yapacağınız ufak bir düzenleme ziyaretçilerinizin yavaşlık şikayetlerini ortadan kaldıracaktır. Yapacağınız şey üretilen kodu basitçe bir fonksiyonun içerisine alın ve setTimeout ile çağırın. </p>

<p>Örneğin size aşağıdaki gibi bir kod verilecek;</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&#160;&#160;document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160;var pageTracker = _gat._getTracker("UA-XXXXXX-X");</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;pageTracker._initData();</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">&#160;&#160;pageTracker._trackPageview();</span></code></td></tr>
</table></div>

<p>bu kodu aşağıdaki şekildeki gibi en başına bir fonksiyon tanımı ve en sonunada fonksiyonu kapattıktan sonra setTimeout çağrısını koymanız yeterli.</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">function googleKayit() {</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">&#160;&#160;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">&#160;&#160;document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;var pageTracker = _gat._getTracker("UA-XXXXXX-X");</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">&#160;&#160;pageTracker._initData();</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">&#160;&#160;pageTracker._trackPageview();</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default">}</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"></div></td><td><code><span class="amc_default">window.setTimeout(googleKayit, 100);</span></code></td></tr>
</table></div>

<p>böylece google bloklu olsa bile sayfanızdaki diğer javascript çağrıları çalışacaktır. site ziyaretçilerininde saç baş yolmasını biraz olsun engellemiş olursunuz.</p>

<p>komik olan şey ise sözlük için yapmış olsam da kullandığım blog engine yüzünden bu blog'da aynı şeyi yapamıyor olmam.</p><div class="item_footer"><p><small><a href="http://ertan.rdgnetwork.org/webmasterlar-icin-google-bloklarina-cozum">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://ertan.rdgnetwork.org/webmasterlar-icin-google-bloklarina-cozum#comments</comments>
			<wfw:commentRss>http://ertan.rdgnetwork.org/?tempskin=_rss2&#38;disp=comments&#38;p=323</wfw:commentRss>
		</item>
			</channel>
</rss>

