<?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>thexpot.net &#187; Yazılar</title>
	<atom:link href="http://www.thexpot.net/category/yazilar/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thexpot.net</link>
	<description>C++ is a gift from sadists to masochists</description>
	<lastBuildDate>Wed, 16 Nov 2011 08:28:37 +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>Google Code: Subversion&#8217;dan Mercurial&#8217;a dönüştürme</title>
		<link>http://www.thexpot.net/2009/11/google-code-subversiondan-mercuriala-donusturme/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=google-code-subversiondan-mercuriala-donusturme</link>
		<comments>http://www.thexpot.net/2009/11/google-code-subversiondan-mercuriala-donusturme/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 10:39:37 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[google-code]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://www.thexpot.net/?p=265</guid>
		<description><![CDATA[<a href="http://www.thexpot.net/2009/11/google-code-subversiondan-mercuriala-donusturme/" title="Google Code: Subversion&#039;dan Mercurial&#039;a dönüştürme"></a>Google Code, Mayıs 2009 tarihinden beridir barındırdığı projelerde sürüm kontrol sistemi olarak SubVersion veya Mercurial kullanabilmemize olanak sağlıyor. Fakat daha önceden oluşturulmuş Subversion ambarlarının Mercurial&#8217;a dönüştürülmesinin ise elle yapılması lazım. Dönüşüm için benim uyguladığım adımlar şöyle: Cygwin&#8216;i svn-pyhton ve mercurial &#8230;<p class="read-more"><a href="http://www.thexpot.net/2009/11/google-code-subversiondan-mercuriala-donusturme/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2009/11/google-code-subversiondan-mercuriala-donusturme/" title="Google Code: Subversion&#039;dan Mercurial&#039;a dönüştürme"></a><p><a href="http://www.googlecode.com/">Google Code</a>, Mayıs 2009 tarihinden beridir barındırdığı projelerde sürüm kontrol sistemi olarak <a href="http://subversion.tigris.org/">SubVersion</a> veya <a href="http://mercurial.selenic.com/">Mercurial</a> kullanabilmemize olanak sağlıyor. Fakat daha önceden oluşturulmuş Subversion ambarlarının Mercurial&#8217;a dönüştürülmesinin ise elle yapılması lazım. </p>

<p>Dönüşüm için benim uyguladığım adımlar şöyle:</p>

<ul>
<li><a href="http://www.cygwin.com/">Cygwin</a>&#8216;i svn-pyhton ve mercurial paketleri ile birlikte kurun.</li>
<li><code>C:\cygwin</code> altına kurulumu gerçekleştirdiğinizi varsayarsak, <code>c:\cygwin\bin\ash.exe</code> aracını çalıştırın.</li>
<li><code>/bin/rebaseall</code> komutunu çalıştırın. (Bu işlem cygwin altında pyhton&#8217;un düzgün çalışması için gerekli)</li>
<li><p><code>c:\cygwinhome\&lt;kullanıcıadı&gt;</code> klasörü altına <code>.hgrc</code> adında bir dosya oluşturun. Ve içeriğini şu şekilde belirleyin:</p>

<pre><code>[extensions]
hgext.convert=
</code></pre></li>
<li><p>Cygwin&#8217;i çalıştırın.</p></li>
<li><p>Sırası ile aşağıdaki komutları çalıştırın:</p>

<pre><code>svn co http://&lt;projeadı&gt;.googlecode.com/svn svn-repo
hg convert svn-repo hg-repo
</code></pre></li>
<li><p>Google code projenizin sürümleme kontrol sistemini Mercurial olarak değiştirin.</p></li>
<li><p>Yerel mercurial ambarınızı google code ambarına gönderin (push)</p>

<pre><code>cd hg-repo
hg push https://&lt;projeadı&gt;.googlecode.com/hg/
</code></pre></li>
</ul>

<p>Mercurial istemcisi olarak <a href="http://bitbucket.org/tortoisehg/stable/">TortoiseHG</a> kullanabilirsiniz. Ayrıca Visual Studio entegrasyonu için de <a href="http://bitbucket.org/zzsergant/hgsccpackage/overview/">hgscc</a> eklentisini deneyebilirsiniz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2009/11/google-code-subversiondan-mercuriala-donusturme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>180 milyon dolar maliyetli bug</title>
		<link>http://www.thexpot.net/2009/01/180-milyon-dolar-maliyetli-bug/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=180-milyon-dolar-maliyetli-bug</link>
		<comments>http://www.thexpot.net/2009/01/180-milyon-dolar-maliyetli-bug/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 13:28:57 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Notlar]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false">http://www.thexpot.net/?p=195</guid>
		<description><![CDATA[<a href="http://www.thexpot.net/2009/01/180-milyon-dolar-maliyetli-bug/" title="180 milyon dolar maliyetli bug"></a>Düşününki C++ için bir IDE hazırlamışsınız ve bu IDE de oldukça popüler olmuş. 20,000 geliştirici tarafından kullanılıyor ve yıllardır da bunu satıyorsunuz. IDE&#8217;nin performansı fena değil ne de olsa C++ derleyiciler yavaşlıkları ile ünlüdürler. Fakat bu IDE&#8217;nin kullanıcılarından birisi (Andread &#8230;<p class="read-more"><a href="http://www.thexpot.net/2009/01/180-milyon-dolar-maliyetli-bug/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2009/01/180-milyon-dolar-maliyetli-bug/" title="180 milyon dolar maliyetli bug"></a><p>Düşününki C++ için bir IDE hazırlamışsınız ve bu IDE de oldukça popüler olmuş. 20,000 geliştirici tarafından kullanılıyor ve yıllardır da bunu satıyorsunuz. IDE&#8217;nin performansı fena değil ne de olsa C++ derleyiciler yavaşlıkları ile ünlüdürler.<br />
<img src="http://imgs.xkcd.com/comics/compiling.png" alt="My code is compiling" /></p>

<p>Fakat bu IDE&#8217;nin kullanıcılarından birisi (<a href="http://andy.jgknet.de/blog/">Andread Hausladen</a>) öyle bir <a title="bcc32ptch" href="http://groups.google.com/group/borland.public.cppbuilder.non-technical/browse_thread/thread/5abe3bfd133f745a/84c2667dc99b4ffe?pli=1" target="_blank">yama</a> yapıyorki derleme zamanı %75 azalıyor.  Görünen o ki; derleme işlemi başlatıldığında derleyiciye IDE tarafından bazı callback fonksiyonları kaydediliyormuş ve bunlardan birisi de OpenFile fonksiyonuymuş. Sorun ise OpenFile fonksiyonunun aynı zamanda dosya var mı yok  mu kontrol etmek için de kullanılıyor olmasıymış ki bu da oldukça zaman kaybına neden oluyormuş. Andreas ise yamasında OpenFile çağırılmadan önce GetFileAttributes fonksiyonu ile dosyanın var olup olmadığının kontrol edilmesini, dosya varsa OpenFile çağırılmasını sağlamış ki bu da 30 saniyelik derleme süresini 4.5 saniyeye düşürmüş!</p>

<p>İşin ironik tarafı ise <a href="http://stackoverflow.com/questions/422539/energy-efficient-application-development" target="_blank">enerji tasarruflu uygulama geliştirme</a> için yapılabileceklerle ilgili StackOverflow&#8217;da sorulan bu soruda karşıma çıktı. İlk cevap şu an C++ Builder&#8217;ı geliştiren CodeGear&#8217;ın ürün sorumlusu <a href="http://blogs.codegear.com/nickhodges/" target="_blank">Nick Hodges</a>&#8216;dan gelmiş, ikinci cevap ise tam bir <a href="http://sozluk.sourtimes.org/show.asp?t=ayar+vermek" target="_blank">ayar</a> niteliğinde.</p>

<p>C++ Builder&#8217;ın yılda 200 gün çalışıp, günde 15 dakikasını derleme işleminin bitmesini bekleyerek harcayan  20000 geliştirici tarafından 5 yıldır kullanıldığını düşünürsek saatte 50$ masraf ile toplam maliyet 187.5 milyon doları buluyor. Borland&#8217;ın neden bu hale geldiğine şaşmamak lazım.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2009/01/180-milyon-dolar-maliyetli-bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi&#8217;ye Oksijen lazım</title>
		<link>http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=delphiye-oksijen-lazim</link>
		<comments>http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 18:01:25 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Oxygene]]></category>

		<guid isPermaLink="false">http://www.thexpot.net/?p=142</guid>
		<description><![CDATA[<a href="http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/" title="Delphi&#039;ye Oksijen lazım"></a>Delphi&#8217;nin hızlı yazılım geliştirmeye getirdiği kolaylıklar anlatmakla bitmez. 90&#8242;ların sonu ve 2000&#8242;lerin başında; saniyeler içinde derleme, tüm uygulamanın tek exe olarak çıkarılabilmesi, veritabanından arayüze data bağlamadaki kolaylıkları ve arkasındaki çok büyük bir komünite ile zirvedeydi diyebiliriz. Öncesinde Java, sonrasında .Net&#8217;in &#8230;<p class="read-more"><a href="http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/" title="Delphi&#039;ye Oksijen lazım"></a><p>Delphi&#8217;nin hızlı yazılım geliştirmeye getirdiği kolaylıklar anlatmakla bitmez. 90&#8242;ların sonu ve 2000&#8242;lerin başında; saniyeler içinde derleme, tüm uygulamanın tek exe olarak çıkarılabilmesi, veritabanından arayüze data bağlamadaki kolaylıkları ve arkasındaki çok büyük bir komünite ile zirvedeydi diyebiliriz.</p>

<p>Öncesinde Java, sonrasında .Net&#8217;in gelmesi ve Borland-Inprise-Borland-CodeGear-Embarcadero arasında sekmesi sürecinde oldukça kötü delphi sürümleri (Delphi 8, Delphi 2005, Delphi 2006) arkası arkasına geldi ve Delphi popüleritesini kaybetti.
<span id="more-142"></span>
Son 2 yıldır Delphi ile yazılım geliştirmiyorum. Ben de soğudum fakat soğumamın nedini birbiri arkasında gelen hantal ve hatalı IDE&#8217;ler değildi. Yıllardır aynı yerde sayan Object Pascal&#8217;dı. Delphi, delphi olalı kullandığımız object pascal dili nerdeyse 90&#8242;lardaki ile aynıydı.</p>

<p>Pascal, okunabilirlik olarak iyi bir dildir fakat iş kodlamaya geldikçe dildeki bazı yapılar gerçekten sinir bozucu oluyor. Tabi rakipleri görmeden bu eksiklikleri tümüyle göremiyorsunuz. Bir kere görünce de görmemezlikten gelemiyorsunuz.</p>

<p>Object Pascal&#8217;ı ayrı köklerden geldikleri için C# veya Java ile karışlaştırmak doğru olmaz. Kendi klasmanında <a href="http://www.remobjects.com/product/?id={DC0A9947-5FED-4D34-8CC8-F2DCFA87A1FE}" target="_blank">RemObjects Oxygene</a> (eski adıyla Chrome) ile karşılaştırabiliriz.
<h3>Tüm değişkenleri var bloğunda tanımlamak</h3>
Delphi&#8217;de tüm değişkenler var bloğu içinde tanımlanmak zorundadır. Bu geçtim kod okunurluğunu kod yazımını düşürüyor. Her yeni değişken için yukarı çıkıp tanım yapmak aşağı gelip koda devam etmek gerekirki, bunu yapmazsanız code completiondan yararlanamazsınız.</p>

<p>Oysa oxygene&#8217;de buna gerek yok. Değişkeninizi kod içerisinde herhangi bir yerde tanımlayabilirsiniz. Type inference ise cabası&#8230;
<h3>Stringleri case içinde kullanamamak</h3>
Evet, case içinde string değerleri kullanamıyorsunuz.
<pre class="prettyprint">case name of
  &#39;ahmet&#39;:;
  &#39;metin&#39;:;
else
end;</pre>
Object Pascal&#8217;da yukarıdaki kodu derleyemezsiniz. Oxygene buna izin veriyor. Hatta yanlış hatırlamıyorsam bunu <a href="http://andy.jgknet.de/dlang/" target="_blank">Delphi Language Extension</a> adıyla bir projede de ele almışlardı.
<h3>Değer döndüren metotları &#8220;function&#8221;, döndürmeyenleri ise &#8220;procedure&#8221; anahtarı ile tanımlamak</h3>
En sinir olduklarımdan bir tanesi. Delphi&#8217;de eğer bir metod değer döndürecekse:
<pre class="prettyprint">function yap(a,b:integer):integer;</pre>
değer döndürmeyecekse
<pre class="prettyprint">procedure yap(a,b:integer):integer;</pre>
şeklinde tanımlamamamız gerekiyor. Bence çok gereksiz bir ayrım. Oxygene&#8217;deki gibi sadece <strong>method</strong> diyip geçebiliriz:
<pre class="prettyprint">method yap(a,b:integer):integer;
method yap(a,b:integer);</pre>
<h3>Generic ya da template gibi bir yapının olmaması</h3>
Delphi&#8217;de herhangi bir collection oluşturmak istediğimizde ya TList, TCollection ya da TStringList sınıflarından türetmemiz gerekiyor. Eğer bunu yapmazsak pointer&#8217;lara ve typecastlere uğraşmak zorundayız. Templateler C++ da zaten vardı. C#&#8217;a 2.0&#8242;da Java&#8217;ya ise 1.5 sürümlerinde templatelerden biraz daha farklı olan genericler eklendi. Sene 2009, Delphi&#8217;ye yeni ekleniyor. Oxygene&#8217;de bu özellik 1.0 sürümünden beri bulunuyor.
<pre class="prettyprint">Dictionary = public class
 ...
end;</pre>
<h3>foreach yapısının yetersizliği</h3>
Delphi&#8217;ye foreach yapısı 2006 sürümünde eklendi. En azından her loop için bir değişken ile for döngüsü yazmaktan kurtulduk. Fakat bazen foreach ile bir koleksiyonda ilerlerken bir de index&#8217;e ihtiyacımız olabiliyor. Oxygene bunu çok güzel bir şekilde aşmış:
<pre class="prettyprint">for each u in Users index i do begin
  if i &gt; 0 then Console.Write(&#39;;&#39;);
  Console.Write(u.Name);
end;</pre>
i değişkenini tanımlamama gerek yok, zaten index olduğu için integer olmak zorunda.
<h3>&#8216;try/except/finally&#8217; bloğunun olmayışı</h3>
Delphi&#8217;de try/finally ve try/except blokları mevcut ama bunları ayrı ayrı kullanabiliyoruz. try/except/finally olarak kullanamıyoruz. Bu Oxygene&#8217;de ise olması gerektiği gibi yapılmış.
<h3>return gibi bir keywordun olmayışı</h3>
Delphi&#8217;de bir fonksiyondan değer döndürmek için önce Result değişkenine atama yapar sonra da exit ile fonksiyondan çıkarız yani basit bir değer döndürme işlemini ancak iki adımda yapabiliriz. Oxygene&#8217;de ise bu işlemi tek adımda yapabiliyoruz:
<pre class="prettyprint">method sum(a,b:integer):integer;
begin
  exit a + b;
end;</pre>
Şimdiye kadar saydıklarım Delphi&#8217;de olması gerekipte olmayanlar, bir de olsa güzel olacaklar var, bunları da karşılıklı örnekler vererek size sunuyorum:
<h3>gelişmiş if</h3>
Delphi:
<pre class="prettyprint">if (0 &lt;= a) and (a &lt; 10) then</pre>
Oxygene:
<pre class="prettyprint">if 0 &lt;= a &lt; 10 then</pre>
Delphi:
<pre class="prettyprint">if not (a in &#91;1..10&#93;) then</pre>
Oxygene:
<pre class="prettyprint">if a not in &#91;1..10&#93; then</pre>
<h3>Oxygene&#8217;in en çok takdir ettiğim özelliklerinden birisi</h3>
node.Parent.Parent.Caption gibi bir değere ulaşmak istiyorsunuz fakat Parent değerleri null olabilir bu durumda Delphi&#8217;de (ve diğer dillerde) hepsini null kontrolünden geçirmek gerekir
<pre class="prettyprint">result := null;
if node &lt;&gt; null then
  if node.parent &lt;&gt; null then
   if node.parent.parent &lt;&gt; null then
     result := node.parent.parent.caption;</pre>
oysa Oxygene&#8217;de bunu tek satırda yazabilirsiniz:
<pre class="prettyprint">result:= node:parent:parent:caption;</pre>
eğer node veya parentlardan birisi null ise tüm ifade null döndürecek, değilse caption değeri dönecek.</p>

<p>Oxygene&#8217;in daha sayamadığım bir çok güzel özelliği var hepsini RemObject sayfasından inceleyebilirsiniz. Eğer Delphi&#8217;ye oksijen verilirse geri dönmesi işten bile değil, merakla beklemekteyim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/09/delphiye-oksijen-lazim/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>DelphiPI 0.33 hazır</title>
		<link>http://www.thexpot.net/2008/09/delphipi-033-hazir/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=delphipi-033-hazir</link>
		<comments>http://www.thexpot.net/2008/09/delphipi-033-hazir/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 23:41:10 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[DelphiPI]]></category>

		<guid isPermaLink="false">http://www.thexpot.net/?p=134</guid>
		<description><![CDATA[<a href="http://www.thexpot.net/2008/09/delphipi-033-hazir/" title="DelphiPI 0.33 hazır"></a>DelphiPI&#8216;nin 0.33 sürümünü hazırladım. Bu sürümdeki bazı yenilikler: Yerelleştirme: Şimdilik sadece Türkçe ve İngilizce dilleri destekleniyor. Yeni diller eklenebilir. Yerelleştirme işlemi için dxgettext kütüphanesini kullandım. Paketlerin seçildiği sayfada bazı iyileştimeler yaptım. Paketleri listelerken artık listview yerine mük-kemmel virtualtreeview bileşenini kullandım. &#8230;<p class="read-more"><a href="http://www.thexpot.net/2008/09/delphipi-033-hazir/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2008/09/delphipi-033-hazir/" title="DelphiPI 0.33 hazır"></a><p><a href="http://code.google.com/p/delphipi/" target="_blank">DelphiPI</a>&#8216;nin 0.33 sürümünü hazırladım. Bu sürümdeki bazı yenilikler:</p>

<p><strong>Yerelleştirme</strong>: Şimdilik sadece Türkçe ve İngilizce dilleri destekleniyor. Yeni diller eklenebilir. Yerelleştirme işlemi için <a title="dxgettext" href="http://dybdahl.dk/dxgettext/" target="_blank">dxgettext</a> kütüphanesini kullandım.</p>

<p>Paketlerin seçildiği sayfada bazı iyileştimeler yaptım. Paketleri listelerken artık listview yerine mük-kemmel <a title="Virtual TreeView" href="http://www.soft-gems.net/index.php?option=com_content&amp;task=view&amp;id=12&amp;Itemid=33" target="_blank">virtualtreeview</a> bileşenini kullandım. Böylece kullanıcı hem istediği paketleri seçebiliyor, hem de klasör yapısını görebiliyor. Ayrıca ağaç üzerine sağ tıklayarak çıkan yardımcı menü ile bir <strong>dosya şablonu (*d7.dpk gibi) kullanarak da paketleri seçebiliyorsunuz</strong>. Şimdilik paket bağımlılıkları ile ilgili bir geribildirim verilmiyor fakat ilerideki sürümlerde bunu da ekleyeceğim. Böylece kendisine bağımlı bir paket kaldırıldığında, bağımlı paketler de otomatik olarak kaldırılacak. Şu andaki kod bunu yapmaya müsait, sadece bu özelliği mükemmelleştirecek zaman bulamadım.</p>

<p><span id="more-134"></span></p>

<p><img src="http://delphipi.googlecode.com/files/delphipi_033_select_packages.png" alt="" /></p>

<p>Diğer bir yenilik ise BPL ve DCP <strong>çıktı klasörlerini artık kullanıcının belirleyebilmesi</strong>. Varsayılan olarak seçilen delphi sürümündekini kullanıyoruz fakat isterseniz bunu değiştirebiliyorsunuz.<img src="http://delphipi.googlecode.com/files/delphipi_033_select_delphi_version.png" alt="" /></p>

<p>Bir de kurulum sonuna <strong>özet sayfası ekledim</strong>. Burada yapılan tüm işlemler görülebiliyor. Hangi paketler derlendi, hangileri derlenemedi, hangi kaynak dosya yolları delphi&#8217;ye eklendi, vs&#8230; Aslında tamamlamaya zaman bulamadığım &#8220;<strong>kurulumu betik olarak kaydetme</strong>&#8221; özelliği de ileriki sürümlerde bu sayfada yer alacak.</p>

<p><img src="http://delphipi.googlecode.com/files/delphipi_033_summary_page.png" alt="" />
<ul></ul>
DelphiPI&#8217;nin bu sürümünü sadece Delphi 7 ve Delphi 2007 ile test ettim. Kod yapısını oldukça fazla değiştirdiğim için eskiden çalışan bir özelliği bozmuş olabilirim. Birim testler yazmadım, zaten Delphi&#8217;de birim testi yazmak bir ölüm, onun yerine zamanımı özellikleri kodlamaya ayırdım.</p>

<p>Bu sürümü ara sürüm olarak değerlendirebilirsiz. DelphiPI&#8217;nin daha iyi ve sağlam bir sürümünü önümüzdeki günlerde yayınlayacağım. Şimdilik keyfini çıkarın, hataları ve önerilerinizi bana bildirmeye devam edin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/09/delphipi-033-hazir/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>NUnit.Framework.SyntaxHelpers</title>
		<link>http://www.thexpot.net/2008/07/nunit-framework-syntaxhelpers/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nunit-framework-syntaxhelpers</link>
		<comments>http://www.thexpot.net/2008/07/nunit-framework-syntaxhelpers/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 16:19:41 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[NUnit]]></category>

		<guid isPermaLink="false">http://www.thexpot.net/?p=122</guid>
		<description><![CDATA[<a href="http://www.thexpot.net/2008/07/nunit-framework-syntaxhelpers/" title="NUnit.Framework.SyntaxHelpers"></a>.Net&#8217;te test için NUnit&#8217;ten başka kütüphane kullanmıyorum. Uzun zamandır da 2.2 sürümünü kullanmaktaydım ve memnundum fakat geçenlerde 2.4 sürümündeki bir özellik dikkatimi çekti. NUnit.Framework.SyntaxHelpers namespace&#8217;inin altında testleri daha okunaklı kılacak bir takım yardımcı sınıflar ve metodlar eklemişler, güzel olmuş. Örneğin &#8230;<p class="read-more"><a href="http://www.thexpot.net/2008/07/nunit-framework-syntaxhelpers/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2008/07/nunit-framework-syntaxhelpers/" title="NUnit.Framework.SyntaxHelpers"></a><p>.Net&#8217;te test için NUnit&#8217;ten başka kütüphane kullanmıyorum. Uzun zamandır da 2.2 sürümünü kullanmaktaydım ve memnundum fakat geçenlerde 2.4 sürümündeki bir özellik dikkatimi çekti.
NUnit.Framework.SyntaxHelpers namespace&#8217;inin altında testleri daha okunaklı kılacak bir takım yardımcı sınıflar ve metodlar eklemişler, güzel olmuş.
Örneğin önceden yazdığımız bu testi:</p>

<pre><code>Assert.IsNotNull(items);
Assert.AreEqual(2, items.Count);
</code></pre>

<p>artık şu şekilde yazabiliriz:</p>

<pre><code>Assert.That(items, Is.Not.Null);
Assert.That(items.Count, Is.EqualTo(2));
</code></pre>

<p>İşinize yarayabilir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/07/nunit-framework-syntaxhelpers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dijkstra&#8217;nın En Kısa Yol Algoritması</title>
		<link>http://www.thexpot.net/2008/05/dijkstranin-en-kisa-yol-algoritmasi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dijkstranin-en-kisa-yol-algoritmasi</link>
		<comments>http://www.thexpot.net/2008/05/dijkstranin-en-kisa-yol-algoritmasi/#comments</comments>
		<pubDate>Sun, 18 May 2008 17:06:27 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://idursun.webfactional.com/blog/?p=114</guid>
		<description><![CDATA[Dijkstra'nın en kısa yol algoritması (DJK) ya da Dijkstra'nın deyişiyle "benim en kısa yol algoritmam"&#160; graf üzerinde bir noktadan diğer tüm noktalara en kısa yolu çıkarır ve bunu n noktalı bir grafta en kötü olarak O(n*n) zorlukta tamamlar. Daha önceden bahsettiğim <a href="http://www.thexpot.net/?q=node/107" target="_blank">Floyd-Warshall algoritması</a> ise tüm noktalar arasındaki en kısa mesafeyi O(n*n*n) zorlukta çıkarıyordu. Dikkat ettiyseniz birisi yolu diğeri mesafeyi çıkarıyor.<p class="read-more"><a href="http://www.thexpot.net/2008/05/dijkstranin-en-kisa-yol-algoritmasi/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2008/05/dijkstranin-en-kisa-yol-algoritmasi/" title="Dijkstra&#039;nın En Kısa Yol Algoritması"></a><p>Dijkstra&#8217;nın en kısa yol algoritması (DJK) ya da Dijkstra&#8217;nın deyişiyle &#8220;benim en kısa yol algoritmam&#8221;  graf üzerinde bir noktadan diğer tüm noktalara en kısa yolu çıkarır ve bunu n noktalı bir grafta en kötü olarak <code>O(n*n)</code> zorlukta tamamlar. Daha önceden bahsettiğim <a href="http://www.thexpot.net/2008/01/floyd-warshall/" target="_blank">Floyd-Warshall algoritması</a> ise tüm noktalar arasındaki en kısa mesafeyi O(n<em>n</em>n) zorlukta çıkarıyordu. Dikkat ettiyseniz birisi yolu diğeri mesafeyi çıkarıyor.
Algoritmanın aşamalarını ayrı ayrı değerlendirdiğimizde anlamamız daha kolay olacaktır. Örnek olarak 10&#215;10&#8242;luk bir tahtanın üzerinde olduğumuzu düşünün. İlerlemeye (0,0) noktasından başlayıp, (9,9) noktasına ulaşmaya çalışacağız. Tahta üzerindeki her karede bir sayı olsun ve biz o kare üzerine geldiğimizde orada yazılı olan sayı kadar saniye beklemek zorunda kalalım. Bu durumda hedefimiz olan (9,9) noktasına en kısa zamanda nasıl ulaşırız?
<span id="more-114"></span>
Başlangıç noktasının diğer tüm noktalara olan mesafesini tutmak için bir tane Distance dizisine ve gittiğimiz yolu hatırlamamız için ise Previous dizisine ihtiyacımız olacak. Dizinin her elemanı tahta üzerindeki bir koordinata karşılık gelecektir. Örneğin (3,8) noktasının indeksini 3*Genişlik + 8 = 38 olarak hesaplayabiliriz. Başlangıç noktasının üzerinde olduğumuz için buraya olan mesafemiz 0, diğer tüm noktalara olan mesafemiz ise sonsuz olsun:</p>

<pre class='prettyprint'>Distances = new int[W*H];
Previous = new int[W*H];
for (int i = 0; i &lt; W*H; i++)
{
  Distances[i] = INF;
  Previous[i] = -1;
}
Distances[0] = 0;
</pre>

<p>Algoritmadaki her adımda kaynak bir nokta seçip, bu noktadan komşu noktalara gitmenin bize maliyetini hesaplayacağız ve bu nokta için bir daha hesap yapmayacağız. Bu yüzden hangi noktalar üzerinde çalıştığımızı da bir şekilde tutmamız gerekiyor. Bunun için bir liste kullanabilirsiniz. Gidilen noktaları listeden çıkarıp geriye kalanlar içinde hedefe en yakın olanı seçerek devam edebilirsiniz. Liste boşalana kadar bu işleme devam edip tüm noktalar için hesaplamalarımızı yapmış oluruz:</p>

<pre class='prettyprint'>var list = new List&lt;int&gt;();
for (int i = 0; i &lt; W * H; i++) list.Add(i);
while(list.Count &gt; 0)
{
  //hesaplamalar
}
</pre>

<p>Çapraz hareketler yapamayacağımız için her kare üzerinde gidilebilecek 4 yön var: sağa, sol, yukarı ve aşağı.</p>

<pre class='prettyprint'>private static readonly int[] dx = { 1, 0, -1, 0 };
private static readonly int[] dy = { 0, 1, 0, -1 };
</pre>

<p>Tüm bu yönlere hareket etmenin bizim için maliyeti nedir hesaplayalım ve Distance dizisinde bu noktaya karşılık gelen indekse bu değeri yazalım.</p>

<pre class='prettyprint'>while (list.Count &gt; 0)
{
  // hedefe en yakın noktanın indeksini al
  int bi = GetClosestIndex(list);
  int cx = bi % W, cy = bi / W; 

  for (int i = 0; i &lt; dx.Length; i++ )
  {
    int nx = cx + dx[i];
    int ny = cy + dy[i];
    // dışarıda kalıyorsa çık
    if (0 &gt; nx || nx &gt;= W || 0 &gt; ny || ny &gt;= H) continue;
    int ci = ny * W + nx;
    // bi'den ci'ye gidersek maliyeti nedir
    int cost = CostOfGoing(bi,ci);
    int alt = Distances[bi] + cost;
    //daha kazançlıysa burdan gidelim
    if (Distances[ci] &gt; alt)
    {
      Distances[ci] = alt;
      Previous[ci] = bi;
    }
  }
}
</pre>

<p>Bu işlem tüm noktalar için yapıldığında hedef noktanın kaynak noktaya olan mesafesi Distance[Hedef] olacaktır. Gidilecek yol ise şöyle çıkarılabilir:</p>

<pre class='prettyprint'>int target = 99;
List path = new List&lt;int&gt;();
while(Previous[target]!=-1)
{
    path.Add(target);
    target = Previous[target];
}
path.Reverse();
</pre>

<p>Dijkstra Algoritmasının en güçlü taraflarından birisi, çalışma süresinin kısa olmasıdır. Örnekte, kaynaktan başlayarak diğer tüm noktalara olan mesafeyi hesaplıyoruz sonra hedefimize giden yolu çıkarıyoruz. Bunu tüm noktalar için yapmak zorunda değiliz; eğer isterseniz algoritma içinde bi = target olduğu zaman algoritmayı sonlandırarak çalışma süresini de kısaltmış olabiliriz.
İkinci olarak ise; bir noktanın diğer noktaya olan mesafesini bir maliyet fonksiyonu ile hesaplıyorruz. Sadece bu fonksiyonu değiştirerek farklı sonuçlar elde edebiliriz. Örneğin; tahtanın üzerindeki her kareyi bir tepe olarak düşünelim ve üzerindeki sayı ise o tepenin yüksekliği olsun. Bir tepeden diğerine geçerken; tırmanmamız yükseklik farkı kadar, aşağı inmemiz ise yükseklik farkının yarısı kadar zaman alsın. Bu durumda maliyet fonksiyonumuzu aşağıdaki gibi değiştirmek bize istediğimiz sonucu verecektir:</p>

<pre class='prettyprint'>private int GetCostOfGoing(int bi, int ci)
{
    int diff = Height[bi] - Height[ci];
    if (diff &lt; 0) return -diff / 2;
    return diff;
}
</pre>

<p>Tüm bu işlemi görsel olarak takip etmeniz için bir WPF projesi hazırladım. <a href="http://www.thexpot.net/files/dijkstra.zip" target="_blank">Buradan</a> indirip inceleyebilirsiniz.</p>

<p>DipNot: Bu yazıyı, yazarken kaybettiğim o tuşuma armağan ediyorum.
<img src="http://www.thexpot.net/img/o.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/05/dijkstranin-en-kisa-yol-algoritmasi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Birkaç güzel websitesi</title>
		<link>http://www.thexpot.net/2008/04/birkac-guzel-websitesi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=birkac-guzel-websitesi</link>
		<comments>http://www.thexpot.net/2008/04/birkac-guzel-websitesi/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 17:25:32 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Notlar]]></category>

		<guid isPermaLink="false">http://idursun.webfactional.com/blog/?p=111</guid>
		<description><![CDATA[<ul>
<li><a href="http://www.aiderss.com" target="_blank">AideRSS.com</a>
Okuduğunuz bir sürü blog var fakat hepsini okuyacak kadar zamanınız yok mu? İyi içeriği olan yazıları da kaçırmak istemiyor musunuz? O zaman bu site tam size göre. Okuduğunuz blogları buraya yazın ve içerik kalitesine göre filtrelenmesini sağlayın. Mesela ben <a href="http://www.codebetter.com">codebetter.com</a>'u okuyorum fakat burayı takip etmeyi bir iki günlüğüne kaçırdığınızda okunmamış gönderi sayısı 30'u geçiyor. Bende aiderss ile sadece "en iyi" olarak puanlanmış içerikleri alıyorum. Rahat ediyorum. Hemen arayın!
<li><a href="http://www.projecteuler.net" target="_blank">Project EULER</a><p class="read-more"><a href="http://www.thexpot.net/2008/04/birkac-guzel-websitesi/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2008/04/birkac-guzel-websitesi/" title="Birkaç güzel websitesi"></a><ul>
    <li><a href="http://www.aiderss.com" target="_blank">AideRSS.com</a>
Okuduğunuz bir sürü blog var fakat hepsini okuyacak kadar zamanınız yok mu? İyi içeriği olan yazıları da kaçırmak istemiyor musunuz? O zaman bu site tam size göre. Okuduğunuz blogları buraya yazın ve içerik kalitesine göre filtrelenmesini sağlayın. Mesela ben <a href="http://www.codebetter.com">codebetter.com</a>&#8216;u okuyorum fakat burayı takip etmeyi bir iki günlüğüne kaçırdığınızda okunmamış gönderi sayısı 30&#8242;u geçiyor. Bende aiderss ile sadece &#8220;en iyi&#8221; olarak puanlanmış içerikleri alıyorum. Rahat ediyorum. Hemen arayın!</li>
    <li><a href="http://www.projecteuler.net" target="_blank">Project EULER</a>
Matematiğe ilginiz var ve ilginç matematik sorularını çözmeyi seviyorsanız Project Euler&#8217;i ziyaret edebilirsiniz. Bu sitede matematik ve geometri ile ilgili 170&#8242;in üzerinde soru var. İster kod yazarak ister kağıt kalem kullanarak bu soruları çözebilirsiniz. Çözdükten sonra forumdan diğerlerinin nasıl bir yaklaşım izlediğini görebilir, kendinizinkini paylaşabilirsiniz.</li>
    <li><a href="http://www.spoj.pl" target="_blank">Sphere Online Judge</a>
Project Euler&#8217;e benzeyen bir site ama bu sefer sadece kağıt kalem yok, sadece kod ile çözüyorsunuz ve kullanabileceğiniz programlama dilleri oldukça çeşitli: (Java, C/C++, Ruby, Mono .Net, Pascal, Pyhton, vs). Çeşitli yarışmalarda çıkmış problemlerin devasa bir arşivi diyebiliriz. Problemlerin hepsinde süre kısıtlaması var. Bazı problemlerde kaynak kod boyutu veya derleyici sınırlaması var. Ben baya sardım, tavsiye ederim.</li>
    <li><a href="http://www.topcoder.com" target="_blank">TopCoder</a>
SPOJ&#8217;un ticari ve popüler hali.</li>
    <li><a href="http://www.stumbleupon.com" target="_blank">StumbleUpon</a>
Bazen internette ne yapacağınız bilemiyorsanız ve zevkinize göre farklı websitelerini rastgele gezmek istiyorsanız, gidin tarayıcınız için uygun eklentiyi indirin, bir hesap açın, ilgilendiğinizi kategorileri seçin ve sörf yapmaya başlayın. Siz stumble düğmesine bastıkça karşınıza farklı websiteleri gelecektir. Saatleriniz geçer bunu yaparken, benden uyarması.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/04/birkac-guzel-websitesi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C# 1 =&gt; 2 =&gt; 3</title>
		<link>http://www.thexpot.net/2008/04/csharp-1-2-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=csharp-1-2-3</link>
		<comments>http://www.thexpot.net/2008/04/csharp-1-2-3/#comments</comments>
		<pubDate>Sat, 05 Apr 2008 12:27:42 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false">http://idursun.webfactional.com/blog/?p=110</guid>
		<description><![CDATA[C#'ın gelişmiyle birlikte  söz diziminde (syntax) de bazı iyileştirmeler olduğunu heralde duymuşsunuzdur. Bu yazıda c# 1'den itibaren c# 3'e kadar ne gibi değişikler olduğunu kısaca bir toparlayalım.

Bahsedeceğim iyileştirmelerin bir çoğunun temeli C# 2'de atıldı. Örneğin C# 1'de bir formu kapatmak için bir butona event handler eklemek istediğimizde aşağıdaki gibi bir kod yazmamız gerekiyordu.
<blockcode lang="csharp">
//C# 1
public Form1()
{
  InitializeComponent();
  button1.Click += new EventHandler(button1<em>Click);
}
void button1</em>Click(object sender, EventArgs e)
{
  Close();
}
</blockcode><p class="read-more"><a href="http://www.thexpot.net/2008/04/csharp-1-2-3/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2008/04/csharp-1-2-3/" title="C# 1 =&gt; 2 =&gt; 3"></a><p>C#&#8217;ın gelişmiyle birlikte  söz diziminde (syntax) de bazı iyileştirmeler olduğunu heralde duymuşsunuzdur. Bu yazıda c# 1&#8242;den itibaren c# 3&#8242;e kadar ne gibi değişikler olduğunu kısaca bir toparlayalım.</p>

<p>Bahsedeceğim iyileştirmelerin bir çoğunun temeli C# 2&#8242;de atıldı. Örneğin C# 1&#8242;de bir formu kapatmak için bir butona event handler eklemek istediğimizde aşağıdaki gibi bir kod yazmamız gerekiyordu.
<span id="more-110"></span>
<pre class="prettyprint">
&#47;&#47;C# 1
public Form1()
{
  InitializeComponent();
  button1.Click += new EventHandler(button1&lt;em&gt;Click);
}
void button1&lt;&#47;em&gt;Click(object sender, EventArgs e)
{
  Close();
}
</pre>
Fakat c# 2&#8242;de ise metodu EventHandler delegate&#8217;i içine almamıza gerek kalmadı çünkü compiler bizim yerimize bunu yapıyordu. Dolayısıyla kodumuzu şu şekilde sadeleştirebildik.
<pre class="prettyprint">
public Form1()
{
  InitializeComponent();
  button1.Click += button1&lt;em&gt;Click;
}
void button1&lt;&#47;em&gt;Click(object sender, EventArgs e)
{
  Close();
}
</pre>
C# 2 ile birlikte gelen Anonymous Delegate özelliği sayesinde ise yukarıdaki kodu şu şekilde kısaltabildik:
<pre class="prettyprint">
public Form1()
{
  InitializeComponent();
  button1.Click += delegate(object sender, EventArgs e) { Close(); };
}
</pre>
Hatta anonymous delegate içinde geçilen parametreleri hiç kullanmadığımız için bunları yazmamıza da gerek yoktu:
<pre class="prettyprint">
public Form1()
{
  InitializeComponent();
  button1.Click += delegate { Close(); };
}
</pre>
C# 2&#8242;de Genericlerin eklenmesiyle de aşağıdaki gibi kod yazabilmeye başladık.
<pre class="prettyprint">
string&#91;&#93; nums = new string&#91;&#93; { &#34;1&#34;,&#34;2&#34;,&#34;3&#34;,&#34;4&#34;,&#34;5&#34;,&#34;6&#34; };
int&#91;&#93; arr =Array.ConvertAll&lt;string, int&gt;(nums, delegate(string input)
                                                              {
                                                                  return int.Parse(input);
                                                              });
</pre>
ConvertAll metodu string array ve string alıp int döndüren bir metod kabul ediyor. Fakat int.Parse metodu zaten string alıp int döndürüyor dolayısıyla yazımı şu şekilde sadeleştirebiliriz:
<pre class="prettyprint">
string&#91;&#93; nums = new string&#91;&#93; { &#34;1&#34;,&#34;2&#34;,&#34;3&#34;,&#34;4&#34;,&#34;5&#34;,&#34;6&#34; };
int&#91;&#93; arr =Array.ConvertAll&lt;string, int&gt;(nums, int.Parse);
</pre>
Ve C# 3&#8242;de iyileşen type inference ve lambda expressionlar sayesinde yine bir kısaltma yapıp Type argumentlerden kurtulabiliriz:
<pre class="prettyprint">
string&#91;&#93; nums = new string&#91;&#93; { &#34;1&#34;,&#34;2&#34;,&#34;3&#34;,&#34;4&#34;,&#34;5&#34;,&#34;6&#34; };
var arr =Array.ConvertAll(nums, x=&gt;int.Parse(x));
</pre>
Hatta array oluşturma işini de şöyle yazabiliriz:
<pre class="prettyprint">
string&#91;&#93; nums = new &#91;&#93; { &#34;1&#34;,&#34;2&#34;,&#34;3&#34;,&#34;4&#34;,&#34;5&#34;,&#34;6&#34; };
&#47;&#47;ya da kısaca:
string&#91;&#93; nums = { &#34;1&#34;,&#34;2&#34;,&#34;3&#34;,&#34;4&#34;,&#34;5&#34;,&#34;6&#34; };
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/04/csharp-1-2-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ReSharper: Konumlanma, Arama, Tarama</title>
		<link>http://www.thexpot.net/2008/03/resharper-konumlanma-arama-tarama/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=resharper-konumlanma-arama-tarama</link>
		<comments>http://www.thexpot.net/2008/03/resharper-konumlanma-arama-tarama/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 18:34:39 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[ReSharper]]></category>

		<guid isPermaLink="false">http://idursun.webfactional.com/blog/?p=109</guid>
		<description><![CDATA[Biraz da ReSharper'ın konumlanma, arama tarama özellikleri üzerinden bahsetmek istiyorum. Visual Studio'da bir dosyaya gitmek, bir tipe konumlanmak veya bir dosya içerisinde arama yapmak o kadar zor ve yavaşki Resharper'ın bu özellikleri altın değerinde oluyor.<p class="read-more"><a href="http://www.thexpot.net/2008/03/resharper-konumlanma-arama-tarama/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2008/03/resharper-konumlanma-arama-tarama/" title="ReSharper: Konumlanma, Arama, Tarama"></a><p>Biraz da ReSharper&#8217;ın konumlanma, arama tarama özellikleri üzerinden bahsetmek istiyorum. Visual Studio&#8217;da bir dosyaya gitmek, bir tipe konumlanmak veya bir dosya içerisinde arama yapmak o kadar zor ve yavaşki Resharper&#8217;ın bu özellikleri altın değerinde oluyor.<span id="more-109"></span>
Resharper&#8217;da bir Tipe (Goto Type,<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">T</span>), dosyaya (Goto File, <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Shift</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">T</span>), sembole (Goto Symbol, <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Shift</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">T</span>) veya üyeye (Goto Member, <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">*</span>) konumlanma işlemlerinin tümü birbirinin aynı bir arayüzden yapılıyor:
Konumlanmak istediğiniz öğenin ister baş harflerini, isterseniz içinde geçen büyük harfleri ya da DOS&#8217;tan kalma joker karakterleri yazarak arama yapabilirsiniz.<br /></p>

<p><img src="http://www.thexpot.net/img/resharper/rs_gototype.png"/>
Kod editörü içersinde de amaca yönelik konumlanma kısayolları mevcut:</p>

<h5><strong>Navigate To:</strong> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">,</span>)</h5>

<p>Herhangi bir tipin üzerindeyken bu komutu çalıştırdığınızda o tip ile ilgili yapabileceklerinizin menüsü ile karşılaşırsınız. Bir sınıf üzerindeyseniz, alt/üst sınıflarına, tipin tanımlandığı dosyaya gidebilirsiniz:</p>

<p><img src="http://www.thexpot.net/img/resharper/rs_navigate_to.png"/>
<h5><strong>Find Usages:</strong> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Shift</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">F12</span>)</h5>
Bir tipin tüm proje içinde kullanıldığı yerleri listeletmek için bu komutu kullanabilirsiniz.<br />
<img src="http://www.thexpot.net/img/resharper/rs_find_usages.png"/>
Sonuçlar bir popup içerisinde gelecektir. Eğer sonuçlar görebileceğinizden fazla ise bunları numpaddeki <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">+</span> tuşuna basarak Arama sonuçları penceresine aktarabilirsiniz.</p>

<h5><strong>Highlight Usages In File:</strong> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Shift</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">F11</span>)</h5>

<p>Kursörün üzerinde bulunduğu tipin dosya içerisinde kullanıldığı tüm yerler işaretlenecektir. Kırmızı zemin rengiyle gösterilenlerde atama/yazma işlemi varken mavi zemin rengi olanlar sadece okuma olduğunuzu gösterir. İşaretli bölgeler arasında dolaşmak için <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">PgUp</span> ve <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">PgDown</span> tuşlarını kullanabilirsiniz.<br />
<img src="http://www.thexpot.net/img/resharper/rs_highlight_usages.png"/></p>

<h5><strong>Type Hierarchy:</strong> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">E</span>,<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">H</span>)</h5>

<p>Kursörün üzerinde bulunduğu bir tipin içinde bulunduğu tüm hiyerarşik yapıyı sorgulayabilirsiniz:<br />
<img src="http://www.thexpot.net/img/resharper/rs_type_hierarchy.png"/></p>

<h5><strong>Locate In Solution Explorer:</strong> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Shift</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">L</span>)</h5>

<p>Kod editöründe açık olan bir dosyaya solution explorerda konumlanır. Çok basit ama çok pratik bir özellik.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/03/resharper-konumlanma-arama-tarama/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ReSharper</title>
		<link>http://www.thexpot.net/2008/03/resharper/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=resharper</link>
		<comments>http://www.thexpot.net/2008/03/resharper/#comments</comments>
		<pubDate>Thu, 20 Mar 2008 17:57:12 +0000</pubDate>
		<dc:creator>idursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[ReSharper]]></category>

		<guid isPermaLink="false">http://idursun.webfactional.com/blog/?p=108</guid>
		<description><![CDATA[Efendim, uzun zamandır yapmak isteyipte bir türlü zaman bulamadığım <a href="http://www.jetbrains.com/ReSharper" target="_blank">ReShaper</a> yazı dizisine başlıyorum ziyadesiyle. Öncelikle ReSharper nedir bilmeyen arkadaşları onunla tanışmaya davet ediyorum. Hemen gidip <a href="http://www.jetbrains.net/confluence/display/ReSharper/ReSharper+4.0+Nightly+Builds">Nightly Build</a>lerden "Works here" yazanlardan bir tanesini indirip kurun ki anlattıklarımın bir anlamı olsun. ReSharper için kısaca Visual Studio'yu kullanılabilir kılan bir eklenti diyebiliriz. Benzer bir ürün de Developer Express'in <a href="http://www.devexpress.com/Products/NET/IDETools/CodeRush/" target="_blank">CodeRush</a>'ıdır.<p class="read-more"><a href="http://www.thexpot.net/2008/03/resharper/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.thexpot.net/2008/03/resharper/" title="ReSharper"></a><p>Efendim, uzun zamandır yapmak isteyipte bir türlü zaman bulamadığım <a href="http://www.jetbrains.com/resharper" target="_blank">ReShaper</a> yazı dizisine başlıyorum ziyadesiyle. Öncelikle ReSharper nedir bilmeyen arkadaşları onunla tanışmaya davet ediyorum. Hemen gidip <a href="http://www.jetbrains.net/confluence/display/ReSharper/ReSharper+4.0+Nightly+Builds">Nightly Build</a>lerden &#8220;Works here&#8221; yazanlardan bir tanesini indirip kurun ki anlattıklarımın bir anlamı olsun. ReSharper için kısaca Visual Studio&#8217;yu kullanılabilir kılan bir eklenti diyebiliriz. Benzer bir ürün de Developer Express&#8217;in <a href="http://www.devexpress.com/Products/NET/IDETools/CodeRush/" target="_blank">CodeRush</a>&#8216;ıdır. Fakat ikisini de tam anlamıyla denedikten sonra sizde benim gibi Developer Express otursun grid yazmaya devam etsin diyeceksiniz.  ReSharper&#8217;ın belli başlı özelliklerini 4 kategoride toplayabiliriz:
<ul>
    <li>Kullanım kolaylığı sağlayan özellikleri (Smart Enter, Smart Code Completion, Surround With, vs)</li>
    <li><a href="http://www.thexpot.net/2008/03/resharper-konumlanma-arama-tarama/">Konumlanma özellikleri (Find Type, Find Usages, Go To Inheritor )</a></li>
    <li>Refactoringler</li>
    <li>Kod analizi (Quick Fix, Context Actions, vs)</li>
</ul>
<span id="more-108"></span>
Sırayla anlatmaya başlayayım:
<h5><strong>Smart Enter:</strong> </h5>(<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color:black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Shift</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Enter</span>)
Herhangi bir dil elemanı veya bloğun otomatik olarak tamamlanmasını sağlar. Örneğin:<br /></p>

<p><img src="http://www.thexpot.net/img/resharper/rs_smart_enter.png" alt="" /></p>

<p>if anahtar kelimesinden sonra Ctrl+Shift+Enter tuşlarına basınca if bloğu otomatik olarak tamamlanacaktır.
<h5><strong>Type  Completion:</strong></h5> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Shift</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Space</span>)
using ile dahil etmediğiniz bir sınıf kullanmanız gerektiğinde önekleri yazdıktan sonra çalıştırdığınızda hem using eklenmesini hem de istediğiniz sınıf adının tamamlanmasını sağlar. Örnek:<br /></p>

<p><img src="http://www.thexpot.net/img/resharper/rs_smart_completion.png" alt="" /></p>

<p>Tamamlama listesinden WebRequest seçildiği zaman usingler arasına System.Net namespace&#8217;i de eklenecektir. Dikkat ettiyseniz WebRequest&#8217;i anlatmak için WebR yazmadık sadece WR harflerini yazmamız yetti, ReSharper&#8217;ın her yerinde CamelHump kullanarak tamamlama yapabilirsiniz.
<h5><strong>Smart Code Completion:</strong></h5> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Space</span>)
Çoğu zaman Bir yerde kod tamamla istediğimizde sadece bulunduğumuz yere uygun önermeleri görmek isteriz. ReSharper bunu yaparken bazı ekstra özelliklerde sunuyor. Örneğin:<br /></p>

<p><img src="http://www.thexpot.net/img/resharper/rs_smart_completion3.png" alt="" /></p>

<p>Count Extension metoduna lambda expression, Predicate veya anonymous delegate geçebiliriz. Yani count içine Func&lt;int,bool&gt; imzasına sahip herhangi bir şey yazılabilir. ReSharper bize hepsini öneriyor. Create method Predicate(int) seçeneğinizi seçersen bool döndüren ve int tipinde tek parametre kabul eden bir metot otomatik olarak oluşturulacaktır.
<h5><strong>Symbol Completion:</strong></h5> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">→</span>)
Bir tipi belirttikten sonra değişken ismini <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">→</span> tuşlarını kullanarak tamamlatabiliriz. Örneğin:<br /></p>

<p><img src="http://www.thexpot.net/img/resharper/rs_smart_completion2.png" alt="" /></p>

<p>WebRequest sınıfı için 2 tane öneri ile geliyor, çoğu durumda bu önerilerden birisi zaten yazmak istediğimiz olacaktır. Bu özelliğin aktif olması için ReSharper&#8217;ın intellisense&#8217;ini kullanıyor olmanız lazım.
<h5><strong>Surround With:</strong></h5> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">E</span>, <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">U</span>)
Herhangi bir kodu seçtikten sonra bu tuş kombinasyonunu uygularsanız, Surround With kısayol menüsü açılır:<br />
<img src="http://www.thexpot.net/img/resharper/rs_surround_with.png" alt="" />
Bu menüde de bir şey yazmanıza gerek yok. Kullanmak istediğiniz seçeneğin kısayoluna basmanız yeterli. Bu özelliği kullandıkça ne kadar rahatlık getirdiğini anlayacaksınız.
<h5><strong>Incremental Selection:</strong></h5> (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">W</span> ya da <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Shift</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">→</span>) ve (<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Shift</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">W</span> ya da <span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Ctrl</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">Alt</span>+<span style="border:0.2em solid; border-color:#ddd #bbb #bbb #ddd; background:#eee; color: black; padding:0.1em 0.4em; font-size:0.8em; white-space:nowrap;">←</span>)
Incremental Selection komutunu her kullandığımızda kod bloklarına göre seçim gitgide arttırılacaktır. Birkaç deneme yaparak bu özelliğin nasıl çalıştığını anlayabilirsiniz.<br />
<img src="http://www.thexpot.net/img/resharper/rs_incremental_selection.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/03/resharper/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

