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

<channel>
	<title>karalamalar &#187; Programlama</title>
	<atom:link href="http://www.karalamalar.net/kategori/programlama/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.karalamalar.net</link>
	<description>ortaya kişisel bir şeyler...</description>
	<lastBuildDate>Fri, 13 Jan 2012 18:02:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PHP söz dizimi kontrolü</title>
		<link>http://www.karalamalar.net/php-soz-dizimi-kontrolu/</link>
		<comments>http://www.karalamalar.net/php-soz-dizimi-kontrolu/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 07:22:50 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[sentaks kontrolü]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=256</guid>
		<description><![CDATA[Dün yayında olan bir PHP projesinde çeşitli değişiklikler yapmak durumunda kaldım. Test etme şansım olmadığından dosyanın bir kopyasını sunucuya atarak sunucu üzerinde test etmeye çalıştım. Gönderdiğim dosyayı çalıştırmayı denediğimde bomboş bir ekranla karşılaştım. Güvenlik nedeniyle sunucu, hata mesajlarını ekrana basmayacak şekilde ayarlanmıştı. Hata kayıtları da benim yetkim olmayan bir yerde duruyordu. Bir şekilde hatanın nerede [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Dün yayında olan bir <a href="http://www.karalamalar.net/etiket/php">PHP</a> projesinde çeşitli değişiklikler yapmak durumunda kaldım. Test etme şansım olmadığından dosyanın bir kopyasını sunucuya atarak sunucu üzerinde test etmeye çalıştım. Gönderdiğim dosyayı çalıştırmayı denediğimde bomboş bir ekranla karşılaştım. Güvenlik nedeniyle sunucu, hata mesajlarını ekrana basmayacak şekilde ayarlanmıştı. Hata kayıtları da benim yetkim olmayan bir yerde duruyordu. Bir şekilde hatanın nerede olduğunu bulmam gerekiyordu. Çok fazla değişiklik yaptığım için eski dosya ve yeni dosya arasında bir karşılaştırma yapmak uzun sürecekti. Bir kaç kontrol yapmaya karar verdim.</p>
<p>İlk olarak söz dizimi kontrolü yaparak dosyanın PHP tarafından işlenebildiğinden emin olmak istedim. Bunun için PHP&#8217;yi komut satırından &#8220;-l&#8221; parametresi ile çalıştırıp ikinci parametre olarak dosyanın ismini verebilirsiniz. Eğer PHP klasörünüz PATH değişkeninde tanımlandıysa dosyanızın olduğu klasörde komut satırı açarak <code>php -l dosyaismi.php</code> şeklinde söz dizimi kontrolü gerçekleştirebilirsiniz. PATH değişkeninde tanımlı değilse php.exe&#8217;nin tam yolunu girmeniz gerekebilir (Örneğin: <code>c:\php\php.exe -l dosyaismi.php</code>)</p>
<p>Bu komut PHP dosyanızı kontrol edecek, bir hata bulamazsa sonlanacak ya da bulduğu ilk hatada hatanın olduğu satır numarasını ekrana basarak sonlanacaktır. İlgili hatayı düzelttikten sonra komutu tekrar çalıştırarak, dosyayı tekrar kontrol edebilirsiniz. Bu şekilde hiç söz dizimi hatası kalmayana kadar kodu tekrar tekrar çalıştırarak dosyanızı hatalardan arındırabilirsiniz.</p>
<p>Bu şekilde problemimi giderip dosyayı sunucuya tekrar yükledim. Problemim giderilmişti.</p>
<div class="shr-publisher-256"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fphp-soz-dizimi-kontrolu%2F' data-shr_title='PHP+s%C3%B6z+dizimi+kontrol%C3%BC'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fphp-soz-dizimi-kontrolu%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fphp-soz-dizimi-kontrolu%2F' data-shr_title='PHP+s%C3%B6z+dizimi+kontrol%C3%BC'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fphp-soz-dizimi-kontrolu%2F' data-shr_title='PHP+s%C3%B6z+dizimi+kontrol%C3%BC'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/php-soz-dizimi-kontrolu/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>&#8220;Ambiguous match found&#8221; hatası neden kaynaklanır, nasıl düzeltilir?</title>
		<link>http://www.karalamalar.net/ambiguous-match-found-hatasi-neden-kaynaklanir-nasil-duzeltilir/</link>
		<comments>http://www.karalamalar.net/ambiguous-match-found-hatasi-neden-kaynaklanir-nasil-duzeltilir/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 19:58:54 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[ambiguous match found]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[Hata]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=251</guid>
		<description><![CDATA[ASP.NET ile uygulama geliştirirken çok ilginç bir sorunla karşılaştım. Biraz uğraştıktan sonra sorunu çözdüm. Şansıma çok büyük bir proje değildi ve yine şansıma küçük bir değişiklik yaptığım sırada karşıma çıktı. Bu yüzden problemi çok daha kolay tanımlayabildim ve bu da çözüme daha kolay ulaşmamı sağladı. Problem derleme sırasında karşınıza çıkmıyor. Proje sorunsuz bir şekilde yapılandırılıyor [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.karalamalar.net/etiket/asp-net">ASP.NET</a> ile uygulama geliştirirken çok ilginç bir sorunla karşılaştım. Biraz uğraştıktan sonra sorunu çözdüm. Şansıma çok büyük bir proje değildi ve yine şansıma küçük bir değişiklik yaptığım sırada karşıma çıktı. Bu yüzden problemi çok daha kolay tanımlayabildim ve bu da çözüme daha kolay ulaşmamı sağladı.</p>
<p>Problem derleme sırasında karşınıza çıkmıyor. Proje sorunsuz bir şekilde yapılandırılıyor fakat problemin olduğu web sayfasını açmak istediğinizde ilk satırda belirsiz eşleşme (Ambiguous match) bulunduğu ile ilgili bir hata mesajı alıyorsunuz ve sayfa açılmıyor. Aşağıdaki ekran görüntüsüne benzer bir görüntü ortaya çıkıyor.</p>
<p><a href="http://www.karalamalar.net/dosyalar/2011/04/AmbiguosMatchFound.png"><img src="http://www.karalamalar.net/dosyalar/2011/04/AmbiguosMatchFound-300x206.png" alt="" title="Ambiguos Match Found hatası" width="300" height="206" class="aligncenter size-medium wp-image-252" /></a></p>
<p>Bir süre webde araştırınca sorunun neden oluştuğunu, nasıl çözüleceğini <a href="http://dotnetdebug.net/2006/03/21/ambiguous-match-found-in-a-web-control-a-possible-bug/">burada</a> buldum. Temel olarak problem, web sayfasında tanımlanmış bir kontrol ile aynı isme sahip bir değişken tanımlandığında ortaya çıkıyor. C# büyük/küçük harf duyarlı bir dil olsa da nedense bu durumda düzgün çalışmıyor ve hata üretiyor. Yani sayfanızda &#8220;Metin&#8221; isimli bir kontrol bulunuyorsa &#8220;metin&#8221; isimli bir değişken kullanmamanız gerekiyor.</p>
<p>Karşımıza açıklayıcı bir hata mesajı çıkmadığı için bu davranışın bir bug olduğunu düşünüyorum. İşin ilginç yanı konuyla ilgili bulduğum makale 2006 yılına ait, yani en az 5 senedir bu problem var ve Microsoft tarafından konu ile ilgili bir geliştirme/açıklama/düzeltme söz konusu değil&#8230;</p>
<div class="shr-publisher-251"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fambiguous-match-found-hatasi-neden-kaynaklanir-nasil-duzeltilir%2F' data-shr_title='%22Ambiguous+match+found%22+hatas%C4%B1+neden+kaynaklan%C4%B1r%2C+nas%C4%B1l+d%C3%BCzeltilir%3F'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fambiguous-match-found-hatasi-neden-kaynaklanir-nasil-duzeltilir%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fambiguous-match-found-hatasi-neden-kaynaklanir-nasil-duzeltilir%2F' data-shr_title='%22Ambiguous+match+found%22+hatas%C4%B1+neden+kaynaklan%C4%B1r%2C+nas%C4%B1l+d%C3%BCzeltilir%3F'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fambiguous-match-found-hatasi-neden-kaynaklanir-nasil-duzeltilir%2F' data-shr_title='%22Ambiguous+match+found%22+hatas%C4%B1+neden+kaynaklan%C4%B1r%2C+nas%C4%B1l+d%C3%BCzeltilir%3F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/ambiguous-match-found-hatasi-neden-kaynaklanir-nasil-duzeltilir/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>&#8220;Could not set the selected property. Unspecified error.&#8221; hatası ve olası çözümü</title>
		<link>http://www.karalamalar.net/could-not-set-the-selected-property-unspecified-error-hatasi-ve-olasi-cozumu/</link>
		<comments>http://www.karalamalar.net/could-not-set-the-selected-property-unspecified-error-hatasi-ve-olasi-cozumu/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 12:42:17 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Option]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[Seçenek]]></category>
		<category><![CDATA[Seçim Kutusu]]></category>
		<category><![CDATA[SelectBox]]></category>
		<category><![CDATA[setTimeout]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=237</guid>
		<description><![CDATA[jQuery kullandığım bir projede, seçim kutusu(select elemanı) seçeneklerini(option) değişkende saklayarak, istediğim zaman istediğim kadar kullanmayı planladım. Daha iyi anlaşılabilmesi için ufak bir kod örneği vereyim; var secenekler = '&#60;option value="34"&#62;İstanbul&#60;/option&#62;&#60;option value="6"&#62;Ankara&#60;/option&#62;&#60;option value="35"&#62;İzmir&#60;/option&#62;'; $('#Baslangic').html(secenekler); $('#Varis').html(secenekler); Buraya kadar bir sorun ortaya çıkmadı. Ne zaman ki, bu şekilde doldurduğum seçim kutularında bir elemanı seçili hale getirmeye çalıştım, işte [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.karalamalar.net/etiket/jquery">jQuery</a> kullandığım bir projede, seçim kutusu(select elemanı) seçeneklerini(option) değişkende saklayarak, istediğim zaman istediğim kadar kullanmayı planladım. Daha iyi anlaşılabilmesi için ufak bir kod örneği vereyim;</p>
<pre class="brush:js">
  var secenekler = '&lt;option value="34"&gt;İstanbul&lt;/option&gt;&lt;option value="6"&gt;Ankara&lt;/option&gt;&lt;option value="35"&gt;İzmir&lt;/option&gt;';
  $('#Baslangic').html(secenekler);
  $('#Varis').html(secenekler);
</pre>
<p>Buraya kadar bir sorun ortaya çıkmadı. Ne zaman ki, bu şekilde doldurduğum seçim kutularında bir elemanı seçili hale getirmeye çalıştım, işte o zaman Internet Explorer 6&#8242;da (IE6) garip bir hata mesajı ile karşılaştım: <strong>&#8220;Could not set the selected property. Unspecified error.&#8221;</strong> IE7, IE8, Firefox, Opera, Chrome ve Safari&#8217;de sorunsuz bir şekilde çalışırken, IE6 bu şekilde, anlaşılmaz bir hata mesajı ile beni çıkmaza soktu. Seçim yapmak için kullandığım kod öbeğini de eklersek kod örneğimiz şu hale geliyor;</p>
<pre class="brush:js">
  var secenekler = '&lt;option value="34"&gt;İstanbul&lt;/option&gt;&lt;option value="6"&gt;Ankara&lt;/option&gt;&lt;option value="35"&gt;İzmir&lt;/option&gt;';
  $('#Baslangic').html(secenekler).val(34);
  $('#Varis').html(secenekler).val(35);
</pre>
<p>Hata mesajının ilk bölümü, kısmen problemin neden kaynaklandığını açıklasa da ikinci bölümdeki &#8220;Belirsiz hata&#8221; ibaresi direkt olarak bir çözüme yönlenmemi engelledi. Internetlerde yaptığım ufak bir araştırma ile <a href="http://csharperimage.jeremylikness.com/2009/05/jquery-ie6-and-could-not-set-selected.html">bu sayfa</a>da probleme ve olası bir çözüme ulaştım. Problem IE6&#8242;da DOM&#8217;un yeteri kadar hızlı çalışamamasından kaynaklanıyormuş. DOM ağacını zamanında hazırlayamadığı için, seçim yapmak istediğimizde seçim kutusunda ilgili elemanı bulamıyor ve ilgili hata mesajını ekrana basıyor.</p>
<p>Problemi çözmek için bir çok alternatif yöntem uygulayabilirsiniz. Problem ile ilgili bilgi bulduğum sayfadaki çözüm, try/catch bloğunu iş akışının bir parçası olarak kullandığından benim gözümde ideal bir çözüm değil. Tabi tercih size kalmış. Benzer bir durum için benim önerebileceğim çözüm şu olabilir;</p>
<pre class="brush:js">
  var secenekler = '&lt;option value="34"&gt;İstanbul&lt;/option&gt;&lt;option value="6"&gt;Ankara&lt;/option&gt;&lt;option value="35"&gt;İzmir&lt;/option&gt;';
  var $Baslangic = $('#Baslangic').html(secenekler);
  var $Varis = $('#Varis').html(secenekler);
  if($.browser.msie &#038;&#038; $.browser.version === "6.0") {
    setTimeout(function() {
      $Baslangic.val(34);
      $Bitis.val(35);
    }, 1);
  }
  else {
    $Baslangic.val(34);
    $Bitis.val(35);
  }
</pre>
<p>İşin püf noktası, tarayıcı IE6 ise, seçim işlemlerini 1 milisaniyelik bir gecikme ile gerçekleştirip, bu ufacık gecikme ile DOM&#8217;a kendini toparyalabilmesi için zaman tanımak.</p>
<p>Alternatif olarak, imkanınız varsa, seçeneklerden seçili olmasını istediğiniz elemana da <strong>selected=&#8221;selected&#8221;</strong> özelliğini atayarak bu hatadan kaçınabilirsiniz. Bu örnekte aynı seçenekleri birden çok kez kullanacağım için ve varsayılan olarak belirli bir tanesini seçili durumda oluşturamayacağım için bu şekilde bir çözüm yoluna gittim.</p>
<div class="shr-publisher-237"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcould-not-set-the-selected-property-unspecified-error-hatasi-ve-olasi-cozumu%2F' data-shr_title='%22Could+not+set+the+selected+property.+Unspecified+error.%22+hatas%C4%B1+ve+olas%C4%B1+%C3%A7%C3%B6z%C3%BCm%C3%BC'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcould-not-set-the-selected-property-unspecified-error-hatasi-ve-olasi-cozumu%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcould-not-set-the-selected-property-unspecified-error-hatasi-ve-olasi-cozumu%2F' data-shr_title='%22Could+not+set+the+selected+property.+Unspecified+error.%22+hatas%C4%B1+ve+olas%C4%B1+%C3%A7%C3%B6z%C3%BCm%C3%BC'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcould-not-set-the-selected-property-unspecified-error-hatasi-ve-olasi-cozumu%2F' data-shr_title='%22Could+not+set+the+selected+property.+Unspecified+error.%22+hatas%C4%B1+ve+olas%C4%B1+%C3%A7%C3%B6z%C3%BCm%C3%BC'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/could-not-set-the-selected-property-unspecified-error-hatasi-ve-olasi-cozumu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# ile SEO uyumlu daha anlaşılır web adresleri hazırlama</title>
		<link>http://www.karalamalar.net/csharp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama/</link>
		<comments>http://www.karalamalar.net/csharp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama/#comments</comments>
		<pubDate>Mon, 17 May 2010 06:53:30 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Sanitization]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Slug]]></category>
		<category><![CDATA[URL ReWrite]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=235</guid>
		<description><![CDATA[PHP ile bu işi nasıl yapabileceğimizi daha önce anlatmıştım. C# ile geliştirdiğimiz bir uygulamada da gerekli olunca biraz araştırdım. PHP ile olan deneyimlerimden yola çıkarak ihtiyaç listesi çıkarttım ve bu ihtiyaçlar doğrultusunda biraz araştırma yaptım. Bu araştırmalardan bir tanesi HTML etiketlerinin temizlenmesi konusuydu ki ondan da bahsetmiştim. Geriye çentikli karakterlerin (ğ,ü,ş,ö,ç, ì, é vb.) çentiksiz [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>PHP ile bu işi nasıl yapabileceğimizi daha önce <a href="http://www.karalamalar.net/php-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama/">anlatmıştım</a>. C# ile geliştirdiğimiz bir uygulamada da gerekli olunca biraz araştırdım. PHP ile olan deneyimlerimden yola çıkarak ihtiyaç listesi çıkarttım ve bu ihtiyaçlar doğrultusunda biraz araştırma yaptım. Bu araştırmalardan bir tanesi HTML etiketlerinin temizlenmesi konusuydu ki ondan da <a href="http://www.karalamalar.net/net-icin-html-etiketleri-temizleme-metodu/">bahsetmiştim</a>. Geriye çentikli karakterlerin (ğ,ü,ş,ö,ç, ì, é vb.) çentiksiz hallerine ulaşmak gibi bir problem kalmıştı. Problemin çözümüne <a href="http://bytes.com/topic/net/answers/689193-how-remove-accents-umlaut">burada</a> ulaştım.<br />
<span id="more-235"></span><br />
PHP deneyimlerim ile ulaştığım metotları birleştirince aşağıdaki kod öbeği ortaya çıktı. Önce bir örnek vererek nasıl kullanacağınızı göstereyim;</p>
<pre class="brush:csharp">string baslik = "Öğümce yolları çakıl taşları ile dolmuş - Test başlığı";
MakeSlug(baslik); // "ogumce-yollari-cakil-taslari-ile-dolmus-test-basligi" değerini döndürecektir.</pre>
<p>Bu işi yapan kod öbeği:</p>
<pre class="brush:csharp">public string MakeSlug(string input)
{
  input = input.ToLower(new CultureInfo("tr-TR"));
  input = StripTags(input);
  input = RemoveAccents(input);
  input = Regex.Replace(input, "&#038;.+?;", "");
  input = Regex.Replace(input, "[^.a-z0-9 _-]", "");
  input = Regex.Replace(input, @"\.|\s+", "-");
  input = Regex.Replace(input, "-+", "-");
  input = input.Trim('-');
  return input;
}

public string RemoveAccents(string input)
{
  string normalized = input.Replace('ı', 'i').Normalize(NormalizationForm.FormKD);
  char[] array = new char[input.Length];
  int arrayIndex = 0;
  foreach (char c in normalized)
  {
    if (char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
    {
      array[arrayIndex] = c;
      arrayIndex++;
    }
  }
  return new string(array, 0, arrayIndex);
}

public string StripTags(string input)
{
  char[] array = new char[input.Length];
  int arrayIndex = 0;
  bool inside = false;

  for (int i = 0; i < input.Length; i++)
  {
    char let = input[i];
    if (let == '<')
    {
      inside = true;
      continue;
    }
    if (let == '>')
    {
      inside = false;
      continue;
    }
    if (!inside)
    {
      array[arrayIndex] = let;
      arrayIndex++;
    }
  }
  return new string(array, 0, arrayIndex);
}</pre>
<div class="shr-publisher-235"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcsharp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama%2F' data-shr_title='C%23+ile+SEO+uyumlu+daha+anla%C5%9F%C4%B1l%C4%B1r+web+adresleri+haz%C4%B1rlama'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcsharp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcsharp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama%2F' data-shr_title='C%23+ile+SEO+uyumlu+daha+anla%C5%9F%C4%B1l%C4%B1r+web+adresleri+haz%C4%B1rlama'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcsharp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama%2F' data-shr_title='C%23+ile+SEO+uyumlu+daha+anla%C5%9F%C4%B1l%C4%B1r+web+adresleri+haz%C4%B1rlama'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/csharp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript için HTML etiketleri temizleme metodu</title>
		<link>http://www.karalamalar.net/javascript-icin-html-etiketleri-temizleme-metodu/</link>
		<comments>http://www.karalamalar.net/javascript-icin-html-etiketleri-temizleme-metodu/#comments</comments>
		<pubDate>Sun, 16 May 2010 07:57:31 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[etiket temizleme]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Strip Tags]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=234</guid>
		<description><![CDATA[Daha önce bahsettiğim .NET için HTML etiketleri temizleme metodunu JavaScript uygulamalarında kullanmak için düzenledim. Şöyle buyrun: function StripTags(input) { var array = []; var inside = false; for (i = 0; i < input.length; i++) { var let = input.charAt(i); if (let == '') { inside = false; continue; } if (!inside) array.push(let); } return [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Daha önce bahsettiğim <a href="http://www.karalamalar.net/net-icin-html-etiketleri-temizleme-metodu/">.NET için HTML etiketleri temizleme metodu</a>nu JavaScript uygulamalarında kullanmak için düzenledim. Şöyle buyrun:</p>
<pre class="brush:javascript">function StripTags(input)
{
  var array = [];
  var inside = false;

  for (i = 0; i < input.length; i++)
  {
    var let = input.charAt(i);
    if (let == '<')
    {
      inside = true;
      continue;
    }
    if (let == '>')
    {
      inside = false;
      continue;
    }
    if (!inside)
      array.push(let);
  }
  return array.join('');
}</pre>
<div class="shr-publisher-234"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fjavascript-icin-html-etiketleri-temizleme-metodu%2F' data-shr_title='JavaScript+i%C3%A7in+HTML+etiketleri+temizleme+metodu'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fjavascript-icin-html-etiketleri-temizleme-metodu%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fjavascript-icin-html-etiketleri-temizleme-metodu%2F' data-shr_title='JavaScript+i%C3%A7in+HTML+etiketleri+temizleme+metodu'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fjavascript-icin-html-etiketleri-temizleme-metodu%2F' data-shr_title='JavaScript+i%C3%A7in+HTML+etiketleri+temizleme+metodu'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/javascript-icin-html-etiketleri-temizleme-metodu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>.NET için HTML etiketleri temizleme metodu</title>
		<link>http://www.karalamalar.net/net-icin-html-etiketleri-temizleme-metodu/</link>
		<comments>http://www.karalamalar.net/net-icin-html-etiketleri-temizleme-metodu/#comments</comments>
		<pubDate>Sat, 15 May 2010 10:32:50 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[VB.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[etiket temizleme]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Strip Tags]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[Visual Basic]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=233</guid>
		<description><![CDATA[Bir metnin içindeki HTML etiketlerini temizlemek için çözüm yolları ararken, çok ilginç bir çözüm ile karşılaştım. Bu ve benzeri durumlarda genellikle ilk olarak, problemi kendim nasıl çözerim diye düşünürüm. İlk aklıma gelen, düzgün yapılandırılmış bir düzenli ifade (regular expression) ile metnin içindeki tüm HTML etiketlerini temizlemek oldu. Uygulamaya geçmeden önce bir de internette araştırayım dedim [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Bir metnin içindeki HTML etiketlerini temizlemek için çözüm yolları ararken, çok ilginç bir çözüm ile karşılaştım. Bu ve benzeri durumlarda genellikle ilk olarak, problemi kendim nasıl çözerim diye düşünürüm. İlk aklıma gelen, düzgün yapılandırılmış bir düzenli ifade (regular expression) ile metnin içindeki tüm HTML etiketlerini temizlemek oldu. Uygulamaya geçmeden önce bir de internette araştırayım dedim ve <a href="http://dotnetperls.com/remove-html-tags">burada</a> probleme çok ilginç bir yönden yaklaşan bir çözüm buldum. Makalede benim aklıma da gelen düzenli ifadeler ile karşılaştırma da yapılmış ve makalede görebileceğiniz gibi bu yöntem çok daha hızlı çalışıyor. Bunun en önemli sebebi de çok yalın bir mantık kullanılmış olması.<br />
<span id="more-233"></span><br />
Makalede yazılanları tekrar etmek istemiyorum. Metodun <a href="http://www.karalamalar.net/etiket/csharp/">C#</a> ve <a href="http://www.karalamalar.net/etiket/vb-net/">VB.NET</a> sürümlerini aşağıya ekliyorum.</p>
<p>Metodun C# sürümü</p>
<pre class="brush:csharp">public string StripTags(string input)
{
  char[] charArray = new char[input.Length];
  int arrayIndex = 0;
  bool inside = false;
  for (int i = 0; i < input.Length; i++)
  {
    char tmp = input[i];
    if (tmp == '<')
    {
      inside = true;
      continue;
    }
    if (tmp == '>')
    {
      inside = false;
      continue;
    }
    if (!inside)
    {
      charArray[arrayIndex] = tmp;
      arrayIndex++;
    }
  }
  return new string(charArray, 0, arrayIndex);
}</pre>
<p>Metodun VB.NET sürümü</p>
<pre class="brush:vb">Public Function StripTags(ByVal input As String) As String
  Dim charArray As Char() = New Char(input.Length - 1) {}
  Dim arrayIndex As Integer = 0
  Dim inside As Boolean = False

  For i As Integer = 0 To input.Length - 1
    Dim tmp As Char = input(i)
    If tmp = "< "c Then
      inside = True
      Continue For
    End If
    If tmp = ">"c Then
      inside = False
      Continue For
    End If
    If Not inside Then
      charArray(arrayIndex) = tmp
      arrayIndex += 1
    End If
  Next
  Return New String(charArray, 0, arrayIndex)
End Function</pre>
<div class="shr-publisher-233"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fnet-icin-html-etiketleri-temizleme-metodu%2F' data-shr_title='.NET+i%C3%A7in+HTML+etiketleri+temizleme+metodu'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fnet-icin-html-etiketleri-temizleme-metodu%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fnet-icin-html-etiketleri-temizleme-metodu%2F' data-shr_title='.NET+i%C3%A7in+HTML+etiketleri+temizleme+metodu'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fnet-icin-html-etiketleri-temizleme-metodu%2F' data-shr_title='.NET+i%C3%A7in+HTML+etiketleri+temizleme+metodu'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/net-icin-html-etiketleri-temizleme-metodu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP ile SEO uyumlu daha anlaşılır web adresleri hazırlama</title>
		<link>http://www.karalamalar.net/php-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama/</link>
		<comments>http://www.karalamalar.net/php-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama/#comments</comments>
		<pubDate>Fri, 14 May 2010 06:38:11 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Sanitization]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Slug]]></category>
		<category><![CDATA[URL ReWrite]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=232</guid>
		<description><![CDATA[Uzun zamandır, geliştirdiğim web sitelerinde, hem daha anlaşılır olması, hem de SEO açısından daha faydalı olduğu genel kanaat olduğu için, adresleri ilgili sayfanın başlığından oluşturuyorum. İlk başlarda başlığı adrese çeviren bir metot yazmıştım, fakat zaman geçtikçe bu metodun çeşitli durumlarda düzgün çalışmadığını gözledim. Bunun üzerine örnekler ve en iyi pratiklere göz atmaya başladım. Bu konuda [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Uzun zamandır, geliştirdiğim web sitelerinde, hem daha anlaşılır olması, hem de <a href="http://www.karalamalar.net/etiket/seo/">SEO</a> açısından daha faydalı olduğu genel kanaat olduğu için, adresleri ilgili sayfanın başlığından oluşturuyorum. İlk başlarda başlığı adrese çeviren bir metot yazmıştım, fakat zaman geçtikçe bu metodun çeşitli durumlarda düzgün çalışmadığını gözledim. Bunun üzerine örnekler ve en iyi pratiklere göz atmaya başladım.</p>
<p>Bu konuda en başarılı bulduğum uygulama <a href="http://www.wordpress-tr.com">WordPress</a> oldu. <a href="http://www.karalamalar.net/etiket/wordpress/">WordPress</a> açık kaynak kodlu bir uygulama olduğundan hemen kaynak kodlarını inceleyerek bu problemin üstesinden nasıl geldiklerini inceledim ve gerekli kısımları bir araya getirdim. WordPress&#8217;i seçme sebeplerimden birisi de, uygulamanın bir çok dilde kullanılması ve ilgili metotların bu dilleri destekleyecek şekilde geliştirilmeleriydi.<br />
<span id="more-232"></span><br />
Neyse lafı fazla uzatmadan kodları paylaşayım, önce bir örnek ile nasıl kullanacağınızı göstereyim:</p>
<pre class="brush:php">$baslik = "Öğümce yolları çakıl taşları ile dolmuş - Test başlığı";
echo sanitize_title_with_dashes($baslik);
// "ogumce-yollari-cakil-taslari-ile-dolmus-test-basligi" çıktısını üretecektir.
</pre>
<p>Son olarak da gerekli metotlar:</p>
<pre class="brush:php">/**
 * Sanitizes title, replacing whitespace with dashes.
 *
 * Limits the output to alphanumeric characters, underscore (_) and dash (-).
 * Whitespace becomes a dash.
 *
 * @since 1.2.0
 *
 * @param string $title The title to be sanitized.
 * @return string The sanitized title.
 */
function sanitize_title_with_dashes($title) {
	$title = strip_tags($title);
	// Preserve escaped octets.
	$title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
	// Remove percent signs that are not part of an octet.
	$title = str_replace('%', '', $title);
	// Restore octets.
	$title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);

	$title = remove_accents($title);
	if (seems_utf8($title)) {
		if (function_exists('mb_strtolower')) {
			$title = mb_strtolower($title, 'UTF-8');
		}
		$title = utf8_uri_encode($title, 200);
	}

	$title = strtolower($title);
	$title = preg_replace('/&#038;.+?;/', '', $title); // kill entities
	$title = str_replace('.', '-', $title);
	$title = preg_replace('/[^%a-z0-9 _-]/', '', $title);
	$title = preg_replace('/\s+/', '-', $title);
	$title = preg_replace('|-+|', '-', $title);
	$title = trim($title, '-');

	return $title;
}

/**
 * Converts all accent characters to ASCII characters.
 *
 * If there are no accent characters, then the string given is just returned.
 *
 * @since 1.2.1
 *
 * @param string $string Text that might have accent characters
 * @return string Filtered string with replaced "nice" characters.
 */
function remove_accents($string) {
	if ( !preg_match('/[\x80-\xff]/', $string) )
		return $string;

	if (seems_utf8($string)) {
		$chars = array(
		// Decompositions for Latin-1 Supplement
		chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
		chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
		chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
		chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
		chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
		chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
		chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
		chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
		chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
		chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
		chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
		chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
		chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
		chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
		chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
		chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
		chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
		chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
		chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
		chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
		chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
		chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
		chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
		chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
		chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
		chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
		chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
		chr(195).chr(191) => 'y',
		// Decompositions for Latin Extended-A
		chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
		chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
		chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
		chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
		chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
		chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
		chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
		chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
		chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
		chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
		chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
		chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
		chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
		chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
		chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
		chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
		chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
		chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
		chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
		chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
		chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
		chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
		chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
		chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
		chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
		chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
		chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
		chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
		chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
		chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
		chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
		chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
		chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
		chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
		chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
		chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
		chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
		chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
		chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
		chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
		chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
		chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
		chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
		chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
		chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
		chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
		chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
		chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
		chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
		chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
		chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
		chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
		chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
		chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
		chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
		chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
		chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
		chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
		chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
		chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
		chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
		chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
		chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
		chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
		// Euro Sign
		chr(226).chr(130).chr(172) => 'E',
		// GBP (Pound) Sign
		chr(194).chr(163) => '');

		$string = strtr($string, $chars);
	} else {
		// Assume ISO-8859-1 if not UTF-8
		$chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
			.chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
			.chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
			.chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
			.chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
			.chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
			.chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
			.chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
			.chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
			.chr(252).chr(253).chr(255);

		$chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";

		$string = strtr($string, $chars['in'], $chars['out']);
		$double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
		$double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
		$string = str_replace($double_chars['in'], $double_chars['out'], $string);
	}

	return $string;
}

/**
 * Checks to see if a string is utf8 encoded.
 *
 * NOTE: This function checks for 5-Byte sequences, UTF8
 *       has Bytes Sequences with a maximum length of 4.
 *
 * @author bmorel at ssi dot fr (modified)
 * @since 1.2.1
 *
 * @param string $str The string to be checked
 * @return bool True if $str fits a UTF-8 model, false otherwise.
 */
function seems_utf8($str) {
	$length = strlen($str);
	for ($i=0; $i < $length; $i++) {
		$c = ord($str[$i]);
		if ($c < 0x80) $n = 0; # 0bbbbbbb
		elseif (($c &#038; 0xE0) == 0xC0) $n=1; # 110bbbbb
		elseif (($c &#038; 0xF0) == 0xE0) $n=2; # 1110bbbb
		elseif (($c &#038; 0xF8) == 0xF0) $n=3; # 11110bbb
		elseif (($c &#038; 0xFC) == 0xF8) $n=4; # 111110bb
		elseif (($c &#038; 0xFE) == 0xFC) $n=5; # 1111110b
		else return false; # Does not match any model
		for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
			if ((++$i == $length) || ((ord($str[$i]) &#038; 0xC0) != 0x80))
				return false;
		}
	}
	return true;
}

/**
 * Encode the Unicode values to be used in the URI.
 *
 * @since 1.5.0
 *
 * @param string $utf8_string
 * @param int $length Max length of the string
 * @return string String with Unicode encoded for URI.
 */
function utf8_uri_encode( $utf8_string, $length = 0 ) {
	$unicode = '';
	$values = array();
	$num_octets = 1;
	$unicode_length = 0;

	$string_length = strlen( $utf8_string );
	for ($i = 0; $i < $string_length; $i++ ) {

		$value = ord( $utf8_string[ $i ] );

		if ( $value < 128 ) {
			if ( $length &#038;&#038; ( $unicode_length >= $length ) )
				break;
			$unicode .= chr($value);
			$unicode_length++;
		} else {
			if ( count( $values ) == 0 ) $num_octets = ( $value < 224 ) ? 2 : 3;

			$values[] = $value;

			if ( $length &#038;&#038; ( $unicode_length + ($num_octets * 3) ) > $length )
				break;
			if ( count( $values ) == $num_octets ) {
				if ($num_octets == 3) {
					$unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]) . '%' . dechex($values[2]);
					$unicode_length += 9;
				} else {
					$unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]);
					$unicode_length += 6;
				}

				$values = array();
				$num_octets = 1;
			}
		}
	}

	return $unicode;
}</pre>
<div class="shr-publisher-232"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fphp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama%2F' data-shr_title='PHP+ile+SEO+uyumlu+daha+anla%C5%9F%C4%B1l%C4%B1r+web+adresleri+haz%C4%B1rlama'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fphp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fphp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama%2F' data-shr_title='PHP+ile+SEO+uyumlu+daha+anla%C5%9F%C4%B1l%C4%B1r+web+adresleri+haz%C4%B1rlama'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fphp-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama%2F' data-shr_title='PHP+ile+SEO+uyumlu+daha+anla%C5%9F%C4%B1l%C4%B1r+web+adresleri+haz%C4%B1rlama'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/php-ile-seo-uyumlu-daha-anlasilir-web-adresleri-hazirlama/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>valiDate v2.1</title>
		<link>http://www.karalamalar.net/validate-v2-1/</link>
		<comments>http://www.karalamalar.net/validate-v2-1/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 14:52:06 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[doğrulama]]></category>
		<category><![CDATA[tarih]]></category>
		<category><![CDATA[valiDate]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=230</guid>
		<description><![CDATA[Bugün valiDate metodunu çalışma arkadaşıma gösterirken, neden doğrulama başarılı olduğunda tarih nesnesini döndürmediğim sorusu aklıma geldi. Toplam 7 byte&#8217;lık ufak bir ekleme ile, doğrulama başarılı olduğunda JavaScript tarih nesnesi döndürecek şekilde metodu güncelledim. Bu sayede metottan dönen değeri hala if ifadesi içinde kullanabilirken, isterseniz if ifadesinden önce metottan dönen değeri bir değişkene atayarak, bu değişkeni [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Bugün <a href="http://www.karalamalar.net/validate-v2-0/">valiDate</a> metodunu çalışma arkadaşıma gösterirken, neden doğrulama başarılı olduğunda tarih nesnesini döndürmediğim sorusu aklıma geldi. Toplam 7 byte&#8217;lık ufak bir ekleme ile, doğrulama başarılı olduğunda <strong>JavaScript tarih nesnesi</strong> döndürecek şekilde metodu güncelledim. Bu sayede metottan dönen değeri hala if ifadesi içinde kullanabilirken, isterseniz if ifadesinden önce metottan dönen değeri bir değişkene atayarak, bu değişkeni if ifadesinde kullanabilir ve doğrulamayı geçerse değişkeni tarih nesnesi olarak kullanabilirsiniz. Hatta abartıp doğrulamadan dönen değeri direkt if ifadesi içinde değişkeninize atayarak da kullanabilirsiniz. </p>
<pre class="brush:js">/*
 * valiDate
 * http://www.karalamalar.net/
 *
 * Copyright (c) 2009 İzzet Emre Erkan
 * Licensed under Creative Commons Attribution-Share Alike 3.0 Unported License
 * http://creativecommons.org/licenses/by-sa/3.0/
 *
 * Date: 2010-04-16 17:08:32 +0300 (Fri, 16 Apr 2010)
 * Revision: 7
 */
String.prototype.valiDate =
  function() {
    if(/^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)[0-9]{2}$/.test(this)) {
      var v = this.replace(/[- /]/g,'.').split('.');
      var d=parseInt(v[0],10), m=parseInt(v[1],10), y=parseInt(v[2],10);
      var o = new Date(y, m - 1, d);
      return o.getDate() == d &#038;&#038; o.getMonth() + 1 == m &#038;&#038; o.getFullYear() == y ? o : false;
    }
    else
      return false;
  }</pre>
<p>Metodun küçültülmüş halini (647 byte) <a href='http://www.karalamalar.net/dosyalar/2010/04/valiDate.zip'>buradan</a> edinebilirsiniz.</p>
<div class="shr-publisher-230"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fvalidate-v2-1%2F' data-shr_title='valiDate+v2.1'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fvalidate-v2-1%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fvalidate-v2-1%2F' data-shr_title='valiDate+v2.1'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fvalidate-v2-1%2F' data-shr_title='valiDate+v2.1'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/validate-v2-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Cannot create/shadow copy &#8216;dll ismi&#8217; when that file already exists&#8221; probleminin çözümü</title>
		<link>http://www.karalamalar.net/cannot-createshadow-copy-dll-ismi-when-that-file-already-exists-probleminin-cozumu/</link>
		<comments>http://www.karalamalar.net/cannot-createshadow-copy-dll-ismi-when-that-file-already-exists-probleminin-cozumu/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 08:49:17 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[çözüm]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[shadow copy]]></category>
		<category><![CDATA[solution]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=227</guid>
		<description><![CDATA[Geçen gün uygulamalarımızın çalıştığı sunucunun olay kayıtlarını incelerken ASP.NET&#8217;in sürekli olarak bu hata ile karşılaştığını gördüm. Bunun neticesinde web siteleri kimi zaman cevap veremez duruma geliyordu. Internette biraz araştırma yaptığımda genelde geliştiricilerin Visual Studio&#8217;da çalışırken bu hatayla karşılaştıklarını gördüm. Bir süre çözüm aradıktan sonra bu yazıyı bulduk(Engin ile birlikte). Benim gibi bu problemle karşılaşmış ve [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Geçen gün uygulamalarımızın çalıştığı sunucunun olay kayıtlarını incelerken ASP.NET&#8217;in sürekli olarak bu hata ile karşılaştığını gördüm. Bunun neticesinde web siteleri kimi zaman cevap veremez duruma geliyordu. Internette biraz araştırma yaptığımda genelde geliştiricilerin Visual Studio&#8217;da çalışırken bu hatayla karşılaştıklarını gördüm. Bir süre çözüm aradıktan sonra <a href="http://bloggingabout.net/blogs/rick/archive/2007/02/14/cannot-create-shadow-copy-your-assembly-info-here-when-that-file-already-exists.aspx">bu yazıyı</a> bulduk(<a href="http://www.enginpolat.com">Engin</a> ile birlikte). Benim gibi bu problemle karşılaşmış ve çözüm yolu arayışındaki başka bir geliştiricinin bulduğu çözümü ben de sizlerle paylaşayım dedim.</p>
<p>web.config dosyanızda system.web elemanına aşağıdaki kod öbeğini ekleyerek sorundan kurtulabilirsiniz.</p>
<pre class="brush:xml"><hostingenvironment shadowCopyBinAssemblies="false" /></pre>
<p><strong>shadowCopyBinAssemblies</strong> özelliği şu şekilde tanımlanmış: Bir Boolean(Evet/Hayır) değeri ile uygulamanın Bin klasöründe yer alan bileşenlerinin, gölge kopyalarının (shadow copy) uygulamanın ASP.NET geçici dosyalar klasörüne kopyalanıp kopyalanmayacağını belirtir.</p>
<p>Umarım işinize yarar.</p>
<div class="shr-publisher-227"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcannot-createshadow-copy-dll-ismi-when-that-file-already-exists-probleminin-cozumu%2F' data-shr_title='%22Cannot+create%2Fshadow+copy+%27dll+ismi%27+when+that+file+already+exists%22+probleminin+%C3%A7%C3%B6z%C3%BCm%C3%BC'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcannot-createshadow-copy-dll-ismi-when-that-file-already-exists-probleminin-cozumu%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcannot-createshadow-copy-dll-ismi-when-that-file-already-exists-probleminin-cozumu%2F' data-shr_title='%22Cannot+create%2Fshadow+copy+%27dll+ismi%27+when+that+file+already+exists%22+probleminin+%C3%A7%C3%B6z%C3%BCm%C3%BC'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fcannot-createshadow-copy-dll-ismi-when-that-file-already-exists-probleminin-cozumu%2F' data-shr_title='%22Cannot+create%2Fshadow+copy+%27dll+ismi%27+when+that+file+already+exists%22+probleminin+%C3%A7%C3%B6z%C3%BCm%C3%BC'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/cannot-createshadow-copy-dll-ismi-when-that-file-already-exists-probleminin-cozumu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BOM karakter dizisi olmadan XmlWriter ile UTF-8 kullanımı</title>
		<link>http://www.karalamalar.net/bom-karakter-dizisi-olmadan-xmlwriter-ile-utf-8-kullanimi/</link>
		<comments>http://www.karalamalar.net/bom-karakter-dizisi-olmadan-xmlwriter-ile-utf-8-kullanimi/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 08:05:15 +0000</pubDate>
		<dc:creator>kara</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>
		<category><![CDATA[Yazılım]]></category>
		<category><![CDATA[BOM]]></category>
		<category><![CDATA[Encoding]]></category>
		<category><![CDATA[UTF-8]]></category>
		<category><![CDATA[UTF8]]></category>
		<category><![CDATA[XmlWriter]]></category>

		<guid isPermaLink="false">http://www.karalamalar.net/?p=226</guid>
		<description><![CDATA[C# ile geliştirdiğim projelerde XML üretmem gerektiğinde, bu konuda çok becerikli olduğunu düşündüğüm XmlWriter nesnesini kullanırım. Nesneyi oluştururken aşağıdaki gibi oluştururdum; XmlWriter writer = new XmlTextWriter(stream, Encoding.UTF8); Bilmediğim şey ise, bu şekilde nesneyi oluştururken otomatik olarak streamin başına UTF-8 tanımlayıcısı olan üç baytlık BOM karakter dizisinin ekleniyor olduğuydu. Yazmış olduğum bir servisi kullanan firmadan gelen [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>C# ile geliştirdiğim projelerde XML üretmem gerektiğinde, bu konuda çok becerikli olduğunu düşündüğüm XmlWriter nesnesini kullanırım. Nesneyi oluştururken aşağıdaki gibi oluştururdum;</p>
<pre class="brush:csharp">XmlWriter writer = new XmlTextWriter(stream, Encoding.UTF8);</pre>
<p>Bilmediğim şey ise, bu şekilde nesneyi oluştururken otomatik olarak streamin başına UTF-8 tanımlayıcısı olan üç baytlık BOM karakter dizisinin ekleniyor olduğuydu. Yazmış olduğum bir servisi kullanan firmadan gelen dönüş ile, gönderdiğim XML&#8217;de BOM olduğunu ve bu yüzden XML&#8217;i düzgün işleyemediklerini öğrendim. Bunun üzerine BOM olmadan XML&#8217;i nasıl oluştururum diye araştırdım ve <a href="http://baleinoid.com/whaly/2009/07/xmlwriter-and-utf-8-encoding-without-signature/">buradaki</a> makaleye ulaştım.</p>
<p>Yapmamız gereken çok basit. Daha önce <strong>Encoding.UTF8</strong> ile elde ettiğimiz <strong>Encoding</strong> nesnesini bu sefer yeni bir Encoding nesnesi oluşturarak hallediyoruz. Yeni Encoding nesnemizi oluştururken de <strong>encoderShouldEmitUTF8Identifier</strong> parametresini <strong>false</strong> olarak kullanıyoruz;</p>
<pre class="brush:csharp">XmlWriter writer = new XmlTextWriter(stream, new UTF8Encoding(false));</pre>
<p>Ben XmlWriter kullanırken bu sorunla karşılaştığımdan yazı da bu konu etrafında şekillendi. Elbette ki Encoding kullandığınız başka durumlarda da bu şekilde Encoding nesneleri oluşturabilirsiniz.</p>
<div class="shr-publisher-226"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fbom-karakter-dizisi-olmadan-xmlwriter-ile-utf-8-kullanimi%2F' data-shr_title='BOM+karakter+dizisi+olmadan+XmlWriter+ile+UTF-8+kullan%C4%B1m%C4%B1'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fbom-karakter-dizisi-olmadan-xmlwriter-ile-utf-8-kullanimi%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fbom-karakter-dizisi-olmadan-xmlwriter-ile-utf-8-kullanimi%2F' data-shr_title='BOM+karakter+dizisi+olmadan+XmlWriter+ile+UTF-8+kullan%C4%B1m%C4%B1'></a><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fwww.karalamalar.net%2Fbom-karakter-dizisi-olmadan-xmlwriter-ile-utf-8-kullanimi%2F' data-shr_title='BOM+karakter+dizisi+olmadan+XmlWriter+ile+UTF-8+kullan%C4%B1m%C4%B1'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://www.karalamalar.net/bom-karakter-dizisi-olmadan-xmlwriter-ile-utf-8-kullanimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

