<?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>...olur arada öyle...</description>
	<lastBuildDate>Mon, 18 Jan 2010 13:23:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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/</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>ibrahim dursun</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[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 paketleri ile birlikte kurun.
C:\cygwin altına kurulumu gerçekleştirdiğinizi varsayarsak, c:\cygwin\bin\ash.exe aracını çalıştırın.
/bin/rebaseall komutunu çalıştırın. (Bu işlem cygwin [...]]]></description>
			<content:encoded><![CDATA[<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:\cygwin\home\&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 class='prettyprint'><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 class='prettyprint'><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 class='prettyprint'><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/</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>ibrahim dursun</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[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 Hausladen) öyle bir yama yapıyorki derleme zamanı %75 azalıyor.  Görünen o ki; derleme işlemi başlatıldığında [...]]]></description>
			<content:encoded><![CDATA[<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/</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>ibrahim dursun</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[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 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) [...]]]></description>
			<content:encoded><![CDATA[<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
  'ahmet':;
  'metin':;
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 > 0 then Console.Write(';');
  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 [1..10]) then</pre>
Oxygene:
<pre class="prettyprint">if a not in [1..10] 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;> null then
  if node.parent &lt;> null then
   if node.parent.parent &lt;> 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/</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>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[DelphiPI]]></category>

		<guid isPermaLink="false">http://www.thexpot.net/?p=134</guid>
		<description><![CDATA[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. 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 [...]]]></description>
			<content:encoded><![CDATA[<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/</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>ibrahim dursun</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[.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:
Assert.IsNotNull(items);
Assert.AreEqual(2, items.Count);
artık şu şekilde yazabiliriz:
Assert.That(items, Is.Not.Null);
Assert.That(items.Count, Is.EqualTo(2));
İşinize yarayabilir.
]]></description>
			<content:encoded><![CDATA[<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:
<pre class="prettyprint">Assert.IsNotNull(items);
Assert.AreEqual(2, items.Count);</pre>
artık şu şekilde yazabiliriz:
<pre class="prettyprint">Assert.That(items, Is.Not.Null);
Assert.That(items.Count, Is.EqualTo(2));</pre>
İş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/</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>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></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.]]></description>
			<content:encoded><![CDATA[<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-112"></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'><code>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;
</code></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'><code>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
}
</code></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'><code>private static readonly int[] dx = { 1, 0, -1, 0 };
private static readonly int[] dy = { 0, 1, 0, -1 };
</code></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'><code>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;
    }
  }
}
</code></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'><code>int target = 99;
List path = new List&lt;int&gt;();
while(Previous[target]!=-1)
{
    path.Add(target);
    target = Previous[target];
}
path.Reverse();
</code></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'><code>private int GetCostOfGoing(int bi, int ci)
{
    int diff = Height[bi] - Height[ci];
    if (diff &lt; 0) return -diff / 2;
    return diff;
}
</code></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/</link>
		<comments>http://www.thexpot.net/2008/04/birkac-guzel-websitesi/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Notlar]]></category>

		<guid isPermaLink="false"></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>]]></description>
			<content:encoded><![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>&#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/</link>
		<comments>http://www.thexpot.net/2008/04/csharp-1-2-3/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false"></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>]]></description>
			<content:encoded><![CDATA[<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">
//C# 1
public Form1()
{
  InitializeComponent();
  button1.Click += new EventHandler(button1<em>Click);
}
void button1</em>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<em>Click;
}
void button1</em>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[] nums = new string[] { "1","2","3","4","5","6" };
int[] arr =Array.ConvertAll&lt;string, int>(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[] nums = new string[] { "1","2","3","4","5","6" };
int[] arr =Array.ConvertAll&lt;string, int>(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[] nums = new string[] { "1","2","3","4","5","6" };
var arr =Array.ConvertAll(nums, x=>int.Parse(x));
</pre>
Hatta array oluşturma işini de şöyle yazabiliriz:
<pre class="prettyprint">
string[] nums = new [] { "1","2","3","4","5","6" };
//ya da kısaca:
string[] nums = { "1","2","3","4","5","6" };
</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/</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>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[ReSharper]]></category>

		<guid isPermaLink="false"></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.]]></description>
			<content:encoded><![CDATA[<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/</link>
		<comments>http://www.thexpot.net/2008/03/resharper/#comments</comments>
		<pubDate>Thu, 20 Mar 2008 17:57:12 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[ReSharper]]></category>

		<guid isPermaLink="false"></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.]]></description>
			<content:encoded><![CDATA[<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>5</slash:comments>
		</item>
		<item>
		<title>Floyd-Warshall Algoritması</title>
		<link>http://www.thexpot.net/2008/01/floyd-warshall-algoritmasi/</link>
		<comments>http://www.thexpot.net/2008/01/floyd-warshall-algoritmasi/#comments</comments>
		<pubDate>Mon, 14 Jan 2008 19:04:35 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Floyd-Warshall, graf olarak ifade edilebilecek herhangi bir veri yapısında herhangi iki nokta arasındaki en kısa yolu bulmak için kullanılabilecek kodlaması oldukça basit bir algoritmadır. 

İnternette bu algoritmayı anlatan birçok kaynak bulabilirsiniz. Benim burada anlatacaklarım ise minimum teori ile maksimum pratik sunmak olacak. Pseudo kod yerine örnekler ve kod parçaları üzerinden açıklamaya çalışacağım. Floyd-Warshall algoritmasının özü çok basit bir formülden oluşuyor. A,B,C diye 3 tane noktamız olduğunu varsayalım. Bu durumda A ile C arasındaki en kısa mesafe min(mesafe(A,C), mesafe(A,B) + mesafe(B,C)) kadar olacaktır. ]]></description>
			<content:encoded><![CDATA[<p>Floyd-Warshall Algoritması, graf olarak ifade edilebilecek herhangi bir veri yapısında herhangi iki nokta arasındaki en kısa yolu bulmak için kullanılabilecek kodlaması oldukça basit bir algoritmadır.
İnternette bu algoritmayı anlatan birçok kaynak bulabilirsiniz. Benim burada anlatacaklarım ise minimum teori ile maksimum pratik sunmak olacak. Pseudo kod yerine örnekler ve kod parçaları üzerinden açıklamaya çalışacağım. Floyd-Warshall algoritmasının özü çok basit bir formülden oluşuyor. A,B,C diye 3 tane noktamız olduğunu varsayalım. Bu durumda A ile C arasındaki en kısa mesafe <code>min(mesafe(A,C), mesafe(A,B) + mesafe(B,C))</code> kadar olacaktır.
<span id="more-107"></span>
Floyd-Warshall&#8217;ı uygulayabilmek için bir tabloya ihtiyacımız var. Bu tablonun boyutu nokta sayısına bağlı olarak belirlenecek. N tane noktamız var ise tablonun ebatları <code>N*N</code> olacaktır.
<img src="http://www.thexpot.net/img/107graf1.png" border="0" alt="" align="right" />Sağdaki örnek resme baktığımızda 5 nokta ve 5 kenardan oluşan bir graf görüyoruz. Bu grafdaki her bir kenar bitişikliği temsil ediyor. Bu durumda oluşturmamız gereken tablonun boyutu 5*5 olmalıdır.</p>

<pre class='prettyprint'><code>int[,] table = new int[5,5];
</code></pre>

<p>Algoritmanın temelinde min fonksiyonu kullanıldığı için bu tablonun girdilerinin ilk değerleri maksimum olarak atıyoruz. Her bir noktanın kendine olan mesafesini 0, diğer noktalara olan mesafesini ise sonsuz kabul ederek başlayacağız.</p>

<pre class='prettyprint'><code>int INFINITY = 9999999;
int N = 5;
for (int i = 0; i &lt; N; i++)
  for(int j = 0; j &lt; N; j++)
    table[i,j] = i == j ? 0 : INFINITY;
</code></pre>

<p>Bu işlemden sonra tablonun ilk değerleri aşağıdaki gibi olacaktır.
<table border="0" cellspacing="0" cellpadding="2" align="center">
<tbody>
<tr>
<td>table</td>
<td><strong>1</strong></td>
<td><strong>2</strong></td>
<td><strong>3</strong></td>
<td><strong>4</strong></td>
<td><strong>5</strong></td>
</tr>
<tr>
<td><strong>1</strong></td>
<td>0</td>
<td>INF</td>
<td>INF</td>
<td>INF</td>
<td>INF</td>
</tr>
<tr>
<td><strong>2</strong></td>
<td>INF</td>
<td>0</td>
<td>INF</td>
<td>INF</td>
<td>INF</td>
</tr>
<tr>
<td><strong>3</strong></td>
<td>INF</td>
<td>INF</td>
<td>0</td>
<td>INF</td>
<td>INF</td>
</tr>
<tr>
<td><strong>4</strong></td>
<td>INF</td>
<td>INF</td>
<td>INF</td>
<td>0</td>
<td>INF</td>
</tr>
<tr>
<td><strong>5</strong></td>
<td>INF</td>
<td>INF</td>
<td>INF</td>
<td>INF</td>
<td>0</td>
</tr>
</tbody></table>
İkinci olarak noktalar arasındaki bağlantıları tutmak ve sorgulamak için <a href="http://en.wikipedia.org/wiki/Adjacency_matrix" target="_blank">bitişiklik matrisi</a> oluşturmalıyız. Eğer bir noktadan diğerine bir kenar var ise tabloda o girdiye 1 değerini veriyoruz. Örneğin nokta 2&#8242;den nokta 3&#8242;e ve nokta 4&#8242;e birer kenar bulunuyor. Bundan dolayı tablomuzun <code>[2,3] = [2,4] = 1 = [3,2] = [4,2]</code>. Grafımız yönlü olmadığı için elde ettiğimiz bitişiklik matrisinin diyagonale göre simetrik olması gerekiyor. Çünkü 1&#8242;den 4&#8242; e kenar varsa bu aynı zamanda 4&#8242;den 1&#8242;e de kenar var anlamına gelmektedir. Eğer örneğimiz yönlü bir graf olsaydı bunu söyleyemezdik. Bu işlemden sonra tablomuzun son hali aşağıdaki gibi olacak:
<table border="0" cellspacing="0" cellpadding="2" align="center">
<tbody>
<tr>
<td>table</td>
<td><strong>1</strong></td>
<td><strong>2</strong></td>
<td><strong>3</strong></td>
<td><strong>4</strong></td>
<td><strong>5</strong></td>
</tr>
<tr>
<td><strong>1</strong></td>
<td>0</td>
<td>INF</td>
<td>INF</td>
<td>1</td>
<td>INF</td>
</tr>
<tr>
<td><strong>2</strong></td>
<td>INF</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>INF</td>
</tr>
<tr>
<td><strong>3</strong></td>
<td>INF</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>INF</td>
</tr>
<tr>
<td><strong>4</strong></td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td><strong>5</strong></td>
<td>INF</td>
<td>INF</td>
<td>INF</td>
<td>1</td>
<td>0</td>
</tr>
</tbody></table>
Simdi Floyd-Warshall formülünü uygulayabiliriz:
<pre class="prettyprint">for( int k = 0; k &lt; N; k++)
  for( int i = 0; i &lt; N; i++)
    for( int j = 0; j &lt; N; j++)
      table[i,j] = Math.Min(table[i,j], table[i,k] + table[k,j]);</pre>
Hepsi bu kadar. Bu işlemden sonra tablomuzun son hali şu şekilde olacak.
<table border="0" cellspacing="0" cellpadding="2" align="center">
<tbody>
<tr>
<td>table</td>
<td><strong>1</strong></td>
<td><strong>2</strong></td>
<td><strong>3</strong></td>
<td><strong>4</strong></td>
<td><strong>5</strong></td>
</tr>
<tr>
<td><strong>1</strong></td>
<td>0</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td><strong>2</strong></td>
<td>2</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td><strong>3</strong></td>
<td>2</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td><strong>4</strong></td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td><strong>5</strong></td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>1</td>
<td>0</td>
</tr>
</tbody></table>
Artık tabloyu kullanarak her iki nokta arasındaki (a,b) en kısa mesafeyi sorgulayabiliriz. table[a,b] = table[b,a]
Şimdi biraz koda yüklenelim ve daha değişik bir örnek üzerinde çalışalım. Farz edelim ki bize bir harita verilmiş ve A noktasından B noktasına en kısa mesafeyi bulmamız istenmiş olsun.</p>

<pre class='prettyprint'><code>.......AXXXXXXX
..........X...X
.....XXXXXXXXXX
.....X........X
.XXXXXXXXXXXXXX
.X.....X..X....
.X.....X..X...X
.XXXXXXXXXXBXXX
</code></pre>

<p>X olan noktalar gidilebilecek yolu ifade etsin. Harita üzerindeki her bir karakteri yukarıdaki graftaki bir nokta olarak kabul edebiliriz. Bu durumda elimizde genişlik * yükseklik kadar nokta olacaktır. Her bir noktanın tablodaki yerini de (satır * genişlik) + sütun olarak belirleyebiliriz. Bitişiklik matrisini oluştururken her bir noktanın sağındaki, solundaki, üstündeki ve altındaki karakterlerin X,A,B karakterlerinden biri olup olmadığını kontrol etmek yeterli olacaktır. Eğer bu karakterlerden birisi ise kenar var diyeceğiz ve tabloya 1 değerini atayacağız. Örnek kod aşağıdaki gibi:</p>

<pre class='prettyprint'><code>private readonly string[] map = new string[]
     {
        ".......AXXXXXXX",
        "..........X...X",
        ".....XXXXXXXXXX",
        ".....X........X",
        ".XXXXXXXXXXXXXX",
        ".X.....X...X..X",
        ".X.....X...X..X",
        ".XXXXXXXXXXBXXX",
     };

int findShortestPath()
{
  int width = map[0].Length;
  int height = map.Length;
  int N = width*height;
  int[,] table = new int[N,N];
  int INF = 9999999;

  //tablonun ilk değerlerini atıyoruz
  for (int i = 0; i &lt; N; i++)
    for (int j = 0; j &lt; N; j++)
      table[i, j] = i == j ? 0 : INF;

  // bitişiklik matrisini oluşturuyoruz
  for (int i = 0; i &lt; N; i++)
  {
    int row = i/width;
    int col = i%width;
    if (map[row][col] == '.') continue;
    // yapılabilecek tüm hareketler için olasıkları üretiyoruz
    // ve kontrol ediyoruz
    for (int dx = -1; dx &lt;= 1; dx++)
      for (int dy = -1; dy &lt;= 1; dy++)
      {
        // (1,1) (1,-1) gibi hareketler yapamıyoruz
        if (Math.Abs(dy) + Math.Abs(dx) == 2) continue;
        if (col + dx &lt; width &amp;&amp; col + dx &gt;= 0 &amp;&amp;
            row + dy &lt; height &amp;&amp; row + dy &gt;= 0)
        {
          char c = map[row + dy][col + dx];
          if (c == 'X' || c == 'A' || c == 'B')
          {
            int newindex = (row + dy)*width + col + dx;
            table[i, newindex] = table[newindex, i] = 1;
          }
        }
      }
    }

  for (int k = 0; k &lt; N; k++)
    for (int i = 0; i &lt; N; i++)
      for (int j = 0; j &lt; N; j++)
        table[i, j] = Math.Min(table[i, j], table[i, k] + table[k, j]);

  string joined = String.Join(String.Empty, map);
  int startIndex = joined.IndexOf('A');
  int endIndex = joined.IndexOf('B');
  return table[startIndex, endIndex];
</code></pre>

<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2008/01/floyd-warshall-algoritmasi/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Etkili Birim Testleri Yazmaaaağğhh!!!</title>
		<link>http://www.thexpot.net/2007/12/etkili-birim-testleri-yazmaaaagghh/</link>
		<comments>http://www.thexpot.net/2007/12/etkili-birim-testleri-yazmaaaagghh/#comments</comments>
		<pubDate>Sun, 30 Dec 2007 18:24:23 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Birçoğumuz <a href="http://en.wikipedia.org/wiki/Agile_development" target="_blank">Agile Development</a>, <a href="http://en.wikipedia.org/wiki/Test_Driven_Development" target="_blank">Test Driven Development</a> (TDD) ve <a href="http://en.wikipedia.org/wiki/Extreme_Programming" target="_blank">Extreme Programming</a> gibi terimleri sıkça duyuyoruzdur. Altlı üstlü bu yöntemlerin tümünün uzlaştığı bir nokta ise yazılımımızın sağlığı için gerekli birim testlerin (Unit Test) yazılmasıdır. 

Peki bu birim testleri nasıl yazmalıyız ki hem etkili olsunlar hem de bakımları kolay olsun?]]></description>
			<content:encoded><![CDATA[<p>Birçoğumuz <a href="http://en.wikipedia.org/wiki/Agile_development">Agile Development</a>, <a href="http://en.wikipedia.org/wiki/Test_Driven_Development">Test Driven Development</a> (TDD) ve <a href="http://en.wikipedia.org/wiki/Extreme_Programming">Extreme Programming</a> gibi terimleri sıkça duyuyoruzdur. Altlı üstlü bu yöntemlerin tümünün uzlaştığı bir nokta ise yazılımımızın sağlığı için gerekli birim testlerin (Unit Test) yazılmasıdır.</p>

<p>Peki bu birim testleri nasıl yazmalıyız ki hem etkili olsunlar hem de bakımları kolay olsun?
Aslında bu sorunun cevabının büyük bir kısmı sizin projenizin tasarımızla ilişkili. Çünkü birim testler adı üzerinde birimleri test etmelidir. Nesne yönelimli programlama (OOP) paradigması ışığında hazırlanmış bir yazılımın birimleri ise sınıflardır. Sınıflarımızı tasarlarken de hayatımızı kolaylaştırması için uymamız gereken belli başlı prensipler var. Mesela her sınıf değişime kapalı fakat genişletilebilirliğe karşı açık olmalıdır ki buna -<a href="http://en.wikipedia.org/wiki/Open/closed_principle" target="_blank">Açık Kapalı Prensibi</a>- denir. vs vs..</p>

<p><span id="more-106"></span>
Duralımda bir soluklanalım derim ben bu noktada. Bütün bu prensipleri biliyoruz da kaçımız uyguluyoruz merak ediyorum. Teori ile pratik arasında dağlar kadar fark olabilir. MFÖ&#8217;nün dediği gibi &#8220;Teori de desen zehir gibi pratik dersen sallanmakta&#8221; da olabilir. Hatta &#8220;fazla teorik bilgi yaratıcılığı öldürür&#8221; de diyebiliriz.</p>

<p>Ben size benim nasıl yazılım geliştirdiğimi anlatayım. Efendim, her şeyden önce yukarıda bahsi geçen metodolojiler, prensipler vs hakkında az çok bilgimizin olması güzeldir, işe yarar. Fakat bunları uygulayacağım diye asıl yapmamız gereken işten uzaklaşmakta pek akıl karı değil. Bundan dolayı ben gidipte bir projeye testleri yazarak başlamam. Önceden tasarım yapıp ta başlamam. Kafamda üstün körü bir tasarım yaparım fakat benim için asıl önemli olan, test edilecek, tasarımı yansıtacak kod olmasıdır. Kod yazarak başlarım ve yazdığım kodun doğru çalışıp çalışmadığını kontrol etmek için test yazarım. Kodu değiştirdikçe testleri de değiştiririm.</p>

<p>Peki diyeceksiniz ki, öyle paldır küldür kod yazamaya başlarsak tasarımımız ne kadar iyi olabilir? Bence her yeni bug çıktığında veya her yeni özellik eklemek istediğinizde sınıflarınızı ve dolayısıyla ilk tasarımınızı değiştirmek zorunda kalırsınız. Bunu hızlı bir şekilde yapabilmek için iyi bir IDE ve iyi bir Refactoring aracı kullanmanız şart. Ben Visual Studio&#8217;yu <a href="http://www.jetbrains.com/resharper/">Resharper</a> olmadan kullanamıyorum. Kodu parçalama bölme değiştirme işlemlerini Resharper ile saniyeler içinde hallediyorum. Bunun verdiği rahatlıkla sınıfları aklıma ilk gelen şekilde yazıyorum. Yazdığım metod bu sınıfa mı ait olmalıymış, adı ne olmalıymış, buraya bir interface tanımlasam daha mı iyi olurmuş diye hiç derdim tasam yok. Kodu yazarım. Oraya interface lazımsa zaten bir sonraki özelliği eklemem gerektiğinde bunun gereğini göreceğim ve Resharper&#8217;a Extract Interface diyeceğim. Metoda oraya ait değilse, Move diyeceğim, adını değiştirmem gerekiyorsa rename diyeceğim. İşime devam edeceğim.
Herkes bir yöntem ortaya atıyor ya, alın size Bug Driven Development! Her bug çıktığında onun için bir test yazarım sonra bug&#8217;ı düzeltirim. Her hatada tasarım daya iyiye gider diyorum o zaman alın size Nature Driven Development!
Uzun sözün kısası; bu prensipleri bilelim ama onlarla kafamızı da bulandırmayalım. Bütün bu prensipleri uygulayacağız diye ortaya bir şey çıkartamıyorsak bir sorunumuz var demektir. Efendim, bazılarınız böyle kod yazmak buglara davetiye çıkarır diyebilir. Tasarım iyi olmazsa ileride daha ciddi problemlerle boğuşulur diyebilir. Ben bu güne kadar, ilk tasarımı ile yıllarca hiç değişmemiş bir kütüphaneye rastlamadım. Her yazılımın illaki hatası olacaktır ve hiç bir tasarım mükemmel çıkmayacaktır. Ne tasarlıyorsanız bugün için tasarlayın. Yeterki ortaya bir şey çıksın.
Bu yazıda olmadı ama ilerki yazılarda yine birim testler, kullanabileceğimiz kütüphanelerden bahsedeceğim ama bunları hangi sıra ve ne sıklıkla kullanacağınız size kalmış. Mutlu yıllar!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/12/etkili-birim-testleri-yazmaaaagghh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asal sayılar üzerine</title>
		<link>http://www.thexpot.net/2007/11/asal-sayilar-uzerine/</link>
		<comments>http://www.thexpot.net/2007/11/asal-sayilar-uzerine/#comments</comments>
		<pubDate>Sat, 24 Nov 2007 15:20:18 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Matematik]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<strong>Tanım</strong>: Sadece 1' ve kendisine tam bölünebilen pozitif tam sayılara asal sayı denir.

Peki bir sayının asal olup olmadığını nasıl kontrol edebiliriz? 
Sayımız n olsun. Bu durumda 2 ile n-1 arasında tüm tam sayılara tam bölünüp bölünmediğini kontrol ederek asal olup olmadığını söyleyebiliriz. Bu durumda (n-3) tane bölme işlemi yapmamız gerekiyor. 
<strong>Bilgi</strong>: Tek çift asal sayı 2'dir.
Bu bilgi ışığında; yaptığımız bölme işlemlerinin sayısını yarıya indirebiliriz. 2 hariç çift sayılar için asallık kontrolü yapmamıza gerek yok.
<strong>Teorem</strong>: Bir sayısı kareköküne kadar hiçbir sayıya tam bölünmüyorsa o sayı asaldır.]]></description>
			<content:encoded><![CDATA[<p><em>Tanım</em>: Sadece 1&#8242; ve kendisine tam bölünebilen pozitif tam sayılara asal sayı denir.
Peki bir sayının asal olup olmadığını nasıl kontrol edebiliriz?
Sayımız n olsun. Bu durumda 2 ile n-1 arasında tüm tam sayılara tam bölünüp bölünmediğini kontrol ederek asal olup olmadığını söyleyebiliriz. Bu durumda (n-3) tane bölme işlemi yapmamız gerekiyor.</p>

<p><em>Bilgi</em>: Tek çift asal sayı 2&#8242;dir.
Bu bilgi ışığında; yaptığımız bölme işlemlerinin sayısını yarıya indirebiliriz. 2 hariç çift sayılar için asallık kontrolü yapmamıza gerek yok.</p>

<p><em>Teorem</em>: Bir sayısı kareköküne kadar hiçbir sayıya tam bölünmüyorsa o sayı asaldır.
Bu durumda yaptığımız bölme işlemlerinin sayısı baya bir azalacak, çünkü sadece çift olmayan ve karekök n&#8217;den küçük tam sayılar için bu testi yapmamız yeterli olacaktır.</p>

<pre class='prettyprint'><code>public bool isPrime(int n)
{
  if (n &lt; 2) return false;
  for (int i = 2; i*i &lt;= n; i+=2)
    if (n % i == 0) return false;
  return true;
}
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/11/asal-sayilar-uzerine/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WPF ve Lambda Converterlar</title>
		<link>http://www.thexpot.net/2007/11/wpf-ve-lambda-converterlar/</link>
		<comments>http://www.thexpot.net/2007/11/wpf-ve-lambda-converterlar/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<a href="http://msdn2.microsoft.com/en-us/vstudio/products/aa700831.aspx" target="_blank">Visual Studio 2008</a>'in çıkmasının ardından .Net 3.5 kullanan yazılımlarda da artık bir artış bekleyebiliriz. Bana göre, .Net 3.0 ile gelen yeni teknolojilerden en göze batanı ise <a href="http://msdn2.microsoft.com/en-us/netframework/aa663326.aspx" target="_blank">Windows Presentation Foundation</a>. WPF ile yapılabilecekleri gördükten sonra insanın ağzının açık kalmaması mümkün değil. Görsellik, esneklik, doğrulama (validation) ve veri bağlama (databinding) gibi arayüz hazırlarken karşılaşılan bir çok güçlük için hazır yapılar WPF ile sunuluyor. ]]></description>
			<content:encoded><![CDATA[<p><a href="http://msdn2.microsoft.com/en-us/vstudio/products/aa700831.aspx" target="_blank">Visual Studio 2008</a>&#8216;in çıkmasının ardından .Net 3.5 kullanan yazılımlarda da artık bir artış bekleyebiliriz. Bana göre, .Net 3.0 ile gelen yeni teknolojilerden en göze batanı ise <a href="http://msdn2.microsoft.com/en-us/netframework/aa663326.aspx" target="_blank">Windows Presentation Foundation</a>. WPF ile yapılabilecekleri gördükten sonra insanın ağzının açık kalmaması mümkün değil. Görsellik, esneklik, doğrulama (validation) ve veri bağlama (databinding) gibi arayüz hazırlarken karşılaşılan bir çok güçlük için hazır yapılar WPF ile sunuluyor.</p>

<p>Bu kadar güzel olan bu teknolojinin bence eksik kalan taraflarından birisi veri dönüştürücüler (Data Converter). Arayüzde sunmak istediğiniz verinin bazı durumlarda dönüştürülmesini veya formatlanmasını isteyebilirsiz. Ne kadar gariptirki WPF ile hazır gelen dönüştürücü yok. En basitinden, DateTime tipindeki bir veriyi formatlayarak görüntületebilmenin tek yolu bunun için bir converter yazmak.</p>

<p>M.Orçun Topdağı, <a href="http://www.fikrimvar.net/lestirelim" target="_blank">blogunda</a> buna çok basit ve güzel bir çözüm sunmuş. Üstelik hali hazırda mevcut olan parçaları bir araya getirerek. Lamda expression&#8217;lardan faydalanarak veri dönüştürme nasıl olur diye merak ediyorsanız <a href="http://www.fikrimvar.net/lestirelim/?p=15" target="_blank">yazısını</a> okumanızı tavsiye ederim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/11/wpf-ve-lambda-converterlar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 haziran 1999 roland garros bayanlar finali</title>
		<link>http://www.thexpot.net/2007/10/5-haziran-1999-roland-garros-bayanlar-finali/</link>
		<comments>http://www.thexpot.net/2007/10/5-haziran-1999-roland-garros-bayanlar-finali/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Notlar]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[tarih 5 haziran 1999. final maçı steffi graf ile martina hingis ile oynanıyor. graf uzun bir aradan sonra jubile yapmak için sahalara geri dönmüş ve finale kadar yükselmiş. hingis ise 16 yaşında graf'ı wimbledonda eleyerek adını duyurmuş, dolayısıyla bu final ikisi için de önemli. hingis genç, atik, teknik. graf ise tecrübeli ve yaşına göre oldukça iyi durumda. maç çok hızlı başlıyor kesinlikle tenisin en uç noktalarında ceyran ediyor, olmayacak toplar çevriliyor, kıran kırana bir birinci setin ardından hingis 6-4 önde ilk seti alıyor.]]></description>
			<content:encoded><![CDATA[<p>tarih 5 haziran 1999. final maçı steffi graf ile martina hingis ile oynanıyor. graf uzun bir aradan sonra jubile yapmak için sahalara geri dönmüş ve finale kadar yükselmiş. hingis ise 16 yaşında graf&#8217;ı wimbledonda eleyerek adını duyurmuş, dolayısıyla bu final ikisi için de önemli. hingis genç, atik, teknik. graf ise tecrübeli ve yaşına göre oldukça iyi durumda. maç çok hızlı başlıyor kesinlikle tenisin en uç noktalarında ceyran ediyor, olmayacak toplar çevriliyor, kıran kırana bir birinci setin ardından hingis 6-4 önde ilk seti alıyor.
<span id="more-103"></span>
<a href="http://www.youtube.com/watch?v=9bYmsCGo56Q" target="_blank">http://www.youtube.com/watch?v=9bYmsCGo56Q</a></p>

<p>ikinci sete de hingis hızlı başlıyor. ilk oyunu alıyor, graf&#8217;ın servisini kırıyor, durum 2-0 oluyor. her şey hingisin lehine gelişmekte fakat bu maçı efsanevi yapan ne varsa bundan sonra gerçekleşiyor. durum 2-0 iken hingisin bir topu arka çizgiye düşüyor, hakem dışarıda diyor, hingis itiraz ediyor. saha toprak olduğu için hakem inip topun izine bakmaya gidiyor ve izi göremediğini söylüyor, sayı tekrarlanacak fakat hingis kendinden emin &#8220;ben burdan görüyorum, iz işte orada&#8221; diye kendi yarı sahasından işaret ediyor. hakem tekrarlanacak diyor. işte o an genç kızımız hingis yapmaması gereken bir şey yapıyor ve karşı yarı sahaya geçip topun izini gösteriyor. sonra ortam geriliyor, seyirci fransız tabi, anında dönüyor ve &#8220;steffi! steffi!&#8221; diye tempo tutmaya başlıyor. hingisin morali iyice bozuluyor. graf ise eski kurt, gidip ortamı biraz daha geriyor ve hakeme &#8220;buraya konuşmaya mı geldik tenis oynamaya mı?&#8221; diye söylüyor. sonuç olarak hingisin bir sayısı siliniyor ve tekrarlanması gereken sayı graf&#8217;a yazılıyor.</p>

<p><a href="http://video.google.com/videoplay?docid=4417724168600909561" target="_blank">http://video.google.com/videoplay?docid=4417724168600909561</a></p>

<p>tenis maçlarında sadece kazanılan sayılar alkışlanır fakat kudurmuş seyirci hingisin kaçırdığı her sayıyı alkışlıyor, servis atarken susmuyor. hingisde ne yapacağını şaşırıyor, iki defa tuvalet molası alıyor ve sonuna kadar kullanıyor. 2. seti kaybediyor sonra da maçı.</p>

<p><em>[videoların hepsini seyredin pişman olmazsınız]</em>
<a href="http://www.youtube.com/watch?v=fRuGUTbdf00" target="_blank">http://www.youtube.com/watch?v=fRuGUTbdf00</a>
<a href="http://www.youtube.com/watch?v=hND_CQfFqnQ" target="_blank">http://www.youtube.com/watch?v=hND_CQfFqnQ</a>
<a href="http://www.youtube.com/watch?v=BshTRjeHDpY" target="_blank">http://www.youtube.com/watch?v=BshTRjeHDpY</a>
gerçekten hafızalarda yer eden mükemmel bir finaldi. hingis kaybetti, 2. oldu sonra gidip ferrarisinde ağladı. sonra sakatlandı ve 23 yaşında tenisi bıraktı. 2006&#8242;da geri döndü. ertesi gün de ben gidip öss sınavına girdim. o da ayrı bir hikayedir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/10/5-haziran-1999-roland-garros-bayanlar-finali/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Resharper gösterimi</title>
		<link>http://www.thexpot.net/2007/10/resharper-gosterimi/</link>
		<comments>http://www.thexpot.net/2007/10/resharper-gosterimi/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[ReSharper]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<a href="http://www.jetbrains.com/resharper/" target="_blank">Resharper</a>, JetBrains tarafından geliştirilmiş bir Visual Studio eklentisinin adı.

Bu eklenti kod yazmayı oldukça kolaylaştıran ve hatta bazı durumlarda olası buglar için bile sizi uyaran mükemmel bir araç. Resharper ile kod yazmanın nasıl olduğunu göstermek için 9 dakika civarında bir video hazırladım. Kullanabildiğim kadar çok özelliği kullanmaya çalıştım. Bazı yerlerde sırf neler önerdiğini göstermek için bilerek hatalı ya da eksik yazdım. Video bittikten sonra birde kendim seyrettim ve size şunu söyleyebilirimki videoda kullandıklarım Resharper'ın yapabildiklerinin sadece %10'u olabilir. Fakat size yinede fikir verir umarım.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jetbrains.com/resharper/" target="_blank">Resharper</a>, JetBrains tarafından geliştirilmiş bir Visual Studio eklentisinin adı.</p>

<p>Bu eklenti kod yazmayı oldukça kolaylaştıran ve hatta bazı durumlarda olası buglar için bile sizi uyaran mükemmel bir araç. Resharper ile kod yazmanın nasıl olduğunu göstermek için 9 dakika civarında bir video hazırladım. Kullanabildiğim kadar çok özelliği kullanmaya çalıştım. Bazı yerlerde sırf neler önerdiğini göstermek için bilerek hatalı ya da eksik yazdım. Video bittikten sonra birde kendim seyrettim ve size şunu söyleyebilirimki videoda kullandıklarım Resharper&#8217;ın yapabildiklerinin sadece %10&#8242;u olabilir. Fakat size yinede fikir verir umarım.</p>

<p>Bir de son not olarak yazdığım kodun bir anlamı veya mantığı yok, sadece bir şeyler yazmak için yazdım <img src='http://www.thexpot.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p><a href="http://www.thexpot.net/files/resharper_action/resharper_action.html" target="_blank">Videoyu izlemek için buraya tıklayın</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/10/resharper-gosterimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependency Injection de ne?</title>
		<link>http://www.thexpot.net/2007/10/dependency-injection-de-ne/</link>
		<comments>http://www.thexpot.net/2007/10/dependency-injection-de-ne/#comments</comments>
		<pubDate>Thu, 11 Oct 2007 22:13:12 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[GoF'un Design Pattern kataloğundan sonra da bir sürü pattern adı ortaya atıldı ve atılmaya devam ediyor. Bu iş tam bir çılgınlığa döndü. Aynen  Extreme Programming paradigmalarından sonra Agile Development, Alt.Net adıyla bir sürü türevinin ortaya çıkması gibi. 

Efendim, nedir bu Dependency Injection?

Bir sınıfın ne olduğuna bakmaksızın ortak bir arayüz veya ortak bir sınıfı kullanması, yani o sınıfa ya da arayüze bağımlı hale getirilmesi. Örneğin bir veritabanı bağlantısı için IDbConnection diye bir arayüz tanımlanmış olsun. MSSQL, MySQL, vb veritabanlarına bağlanmak için bağlantı sınıfları oluştururken doğal olarak bu arayüzü kullanarak sınıflar tanımlarızki araya bir katman koyalım da veritabanı bağlantısıyla işi olan sınıflar veritabanının ne olduğuna bakmasızın işlerini yapabilsinler. Aşağıdaki kodda da dependency injection yapmış oluyoruz. 
Hatta bunların türleri var: ]]></description>
			<content:encoded><![CDATA[<p>GoF&#8217;un Design Pattern kataloğundan sonra da bir sürü pattern adı ortaya atıldı ve atılmaya devam ediyor. Bu iş tam bir çılgınlığa döndü. Aynen  Extreme Programming paradigmalarından sonra Agile Development, Alt.Net adıyla bir sürü türevinin ortaya çıkması gibi.</p>

<p>Efendim, nedir bu Dependency Injection?</p>

<p>Bir sınıfın ne olduğuna bakmaksızın ortak bir arayüz veya ortak bir sınıfı kullanması, yani o sınıfa ya da arayüze bağımlı hale getirilmesi. Örneğin bir veritabanı bağlantısı için IDbConnection diye bir arayüz tanımlanmış olsun. MSSQL, MySQL, vb veritabanlarına bağlanmak için bağlantı sınıfları oluştururken doğal olarak bu arayüzü kullanarak sınıflar tanımlarızki araya bir katman koyalım da veritabanı bağlantısıyla işi olan sınıflar veritabanının ne olduğuna bakmasızın işlerini yapabilsinler. Aşağıdaki kodda da dependency injection yapmış oluyoruz.
Hatta bunların türleri var:
<span id="more-101"></span>
<ul>
    <li>Interface Injection (Type1): Bağımlılığın interface olarak tanımlanması
<pre class="prettyprint">public class EmployeeLister {
  public EmployeeLister() {}
  public IList GetEmployees(IDbConnection connection) {}
}</pre>
</li>
    <li>Property Injection (Type2): Bağımlılığın bir property&#8217;e atanması
<pre class="prettyprint">public class EmployeeLister {
  public EmployeeLister() {}
  public IList GetEmployees() {}
  public IDbConnection Connection {get;set;}
}</pre>
</li>
    <li>Constructor Injection (Type3): Bağımlılığın constructorda geçilmesi
<pre class="prettyprint">public class EmployeeLister {
  public EmployeeLister(IDbConnection connection) {}
  public IList GetEmployees{}
}</pre>
</li>
</ul>
Şimdi biz yıllardır yaptığımızdan farklı ne yaptık? OOP&#8217;nin temellerinden polymorphismi kullanmaktan başka ne yaptık? Ortak bir ata sınıf yarattık ve onu kullandık, adına da Dependecy Injection dedik de afili durdu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/10/dependency-injection-de-ne/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Operator Overloading kod okunurluğunu düşürür mü?</title>
		<link>http://www.thexpot.net/2007/10/operator-overloading-kod-okunurlugunu-dusurur-mu/</link>
		<comments>http://www.thexpot.net/2007/10/operator-overloading-kod-okunurlugunu-dusurur-mu/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programlama]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Javada operator overloading yok. Baya bir süre neden koymuyorlar diye merak etmiştim, hatta bir yerde operator overloading'in kodun okunurluğunu azaltacağı için Sun'ın bu özelliği eklemeye sıcak bakmadığını okumuştum. O zaman da saçma gelmişti, şimdi de. Ne yani? Bir yerimizi keseriz diye evde hiç bıçak bulundurmayalım mı?

Elbette fütursuzca kullanıldığında kodun okunurluğunu düşürür fakat inanılmaz derecede arttıracağı yerler de yok değil. 

.Net için <a href="http://www.entityspaces.net">Entity Spaces</a> adında veritabanı kataanı var. <a href="http://www.nhibernate.org">NHibernate</a>'in aksine bu katman hiç reflection kullanmıyor, onun yerine veritabanı şablonuna göre kod oluşturuyor. Böylece xml ayar dosyalarıyla uğraşmıyorsunuz ve oldukça iyi performans elde ediyorsunuz. İşin en güzel yanı ise kod içindeki sorgular aynen bir SQL sorgusu gibi görünüyor ve okunurluğu arttırıyor. 
Peki bunu nasıl yapıyor? Operator Overloading ile...]]></description>
			<content:encoded><![CDATA[<p>Javada operator overloading yok. Baya bir süre neden koymuyorlar diye merak etmiştim, hatta bir yerde operator overloading&#8217;in kodun okunurluğunu azaltacağı için Sun&#8217;ın bu özelliği eklemeye sıcak bakmadığını okumuştum. O zaman da saçma gelmişti, şimdi de. Ne yani? Bir yerimizi keseriz diye evde hiç bıçak bulundurmayalım mı?</p>

<p>Elbette fütursuzca kullanıldığında kodun okunurluğunu düşürür fakat inanılmaz derecede arttıracağı yerler de yok değil.</p>

<p>.Net için <a href="http://www.entityspaces.net">Entity Spaces</a> adında veritabanı katmanı var. <a href="http://www.nhibernate.org">NHibernate</a>&#8216;in aksine bu katman hiç reflection kullanmıyor, onun yerine veritabanı şablonuna göre kod oluşturuyor. Böylece xml ayar dosyalarıyla uğraşmıyorsunuz ve oldukça iyi performans elde ediyorsunuz. İşin en güzel yanı ise kod içindeki sorgular aynen bir SQL sorgusu gibi görünüyor ve okunurluğu arttırıyor.
Peki bunu nasıl yapıyor? Operator Overloading ile&#8230;
<span id="more-100"></span>
<pre class="prettyprint">
CustomerQuery cust = new CustomerQuery("c");
OrderQuery order = new OrderQuery("o");
OrderItemQuery item = new OrderItemQuery("oi");</p>

<p>cust.Select(cust.CustomerName, (item.Quantity * item.UnitPrice).Sum().As("TotalSales"));
cust.InnerJoin(order).On(order.CustID == cust.CustomerID);
cust.InnerJoin(item).On(item.OrderID == order.OrderID);
cust.GroupBy(cust.CustomerName);
cust.OrderBy("TotalSales", esOrderByDirection.Descending);</p>

<p>CustomerCollection coll = new CustomerCollection();
coll.Load(cust);
</pre>
Matematikteki en kolay ispat yöntemini kullanmış olduk. Proof by counter example.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/10/operator-overloading-kod-okunurlugunu-dusurur-mu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Maziye gittim şöyle bir</title>
		<link>http://www.thexpot.net/2007/10/maziye-gittim-soyle-bir/</link>
		<comments>http://www.thexpot.net/2007/10/maziye-gittim-soyle-bir/#comments</comments>
		<pubDate>Thu, 11 Oct 2007 19:43:19 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[İlk çıktığında Visual C# 2008 Express Edition Beta 2'yi indirmiştim ama fırsat buldukça kurcalıyordum. Özellikle WPF'yi kurcalıyorum fakat henüz beta olduğu için sürekli göçüp duruyor hatta belli bir zaman sonra doğru yazdığım XAML'i bile derleyemez hale geliyor ve hatalı olduğunu söylerek beni yanıltıyordu. Ben de bir süre WPF'ye ara verdim ve diğer yenilikleri inceleye başladım.

Mesela LINQ. Deneme olsun diye bir klasör içinde yer alan dosyalardan adında önce o sonra a harfi geçen kaç tane var bir saydırayım dedim. Efendim oldu bitti. Yaptım, gözlerim karardı bir an ve şöyle bir maziye gittim, taa pascal günlerine...

Turbo Pascal veya Delphi veya dinamik olmayan herhangi bir dilde bu işi yapmak için en az 5-10 satır kod yazmak lazım. Peki bu işlem c# 3.0'da kaç satır? Bu yazıyı yazdığıma göre 5 satırdan kısa ve büyük ihtimalle 1 satır. Evet bildiniz, ben kod ekrandan taşmasın diye birkaç satıra bölüp yazıyorum buraya ama aslında 1 satır. 
<blockcode type="csharp">
Console.WriteLine(
  new DirectoryInfo(@"c:\downloads")
  .GetFiles()
  .Count(f => Regex.IsMatch(System.IO.Path.GetFileName(f.Name), "o.*a"))
);
</blockcode>

Aynı dosyaların toplam boyutu??
<blockcode type="csharp">
Console.WriteLine(
  new DirectoryInfo(@"c:\downloads")
  .GetFiles()
  .Where(x => Regex.IsMatch(System.IO.Path.GetFileName(x.Name), "o.*a"))
  .Sum(x => x.Length)
);
</blockcode>
Hiçbir döngü yok. Önümüz de bayram, hadi hayırlısı.]]></description>
			<content:encoded><![CDATA[<p>İlk çıktığında Visual C# 2008 Express Edition Beta 2&#8242;yi indirmiştim ama fırsat buldukça kurcalıyordum. Özellikle WPF&#8217;yi kurcalıyorum fakat henüz beta olduğu için sürekli göçüp duruyor hatta belli bir zaman sonra doğru yazdığım XAML&#8217;i bile derleyemez hale geliyor ve hatalı olduğunu söylerek beni yanıltıyordu. Ben de bir süre WPF&#8217;ye ara verdim ve diğer yenilikleri inceleye başladım.</p>

<p>Mesela LINQ. Deneme olsun diye bir klasör içinde yer alan dosyalardan adında önce o sonra a harfi geçen kaç tane var bir saydırayım dedim. Efendim oldu bitti. Yaptım, gözlerim karardı bir an ve şöyle bir maziye gittim, taa pascal günlerine&#8230;</p>

<p>Turbo Pascal veya Delphi veya dinamik olmayan herhangi bir dilde bu işi yapmak için en az 5-10 satır kod yazmak lazım. Peki bu işlem c# 3.0&#8242;da kaç satır? Bu yazıyı yazdığıma göre 5 satırdan kısa ve büyük ihtimalle 1 satır. Evet bildiniz, ben kod ekrandan taşmasın diye birkaç satıra bölüp yazıyorum buraya ama aslında 1 satır.</p>

<pre class='prettyprint'><code>Console.WriteLine(
  new DirectoryInfo(@"c:\downloads")
  .GetFiles()
  .Count(f =&gt; Regex.IsMatch(System.IO.Path.GetFileName(f.Name), "o.*a"))
);
</code></pre>

<p>Aynı dosyaların toplam boyutu??</p>

<pre class='prettyprint'><code>Console.WriteLine(
  new DirectoryInfo(@"c:\downloads")
  .GetFiles()
  .Where(x =&gt; Regex.IsMatch(System.IO.Path.GetFileName(x.Name), "o.*a"))
  .Sum(x =&gt; x.Length)
);
</code></pre>

<p>Hiçbir döngü yok.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/10/maziye-gittim-soyle-bir/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Yayılma Öncelikli Arama (Breadth-First Search)</title>
		<link>http://www.thexpot.net/2007/10/yayilma-oncelikli-arama/</link>
		<comments>http://www.thexpot.net/2007/10/yayilma-oncelikli-arama/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Recursion doğru kullanıldığı zaman çok işimize yarayabilir. Özellikle ağaç tipi data yapılarının tüm nodelarını dolaşmak istediğimizde recursiondan faydalanabiliriz. Fakat bu ağaç yapısının ne kadar derinliğe sahip olduğunu kestiremediğimiz durumlarda bu yönteme çok da bel bağlamamak lazım zira stack (yığın) taşabilir ve overflow hatasıyla karşılaşabiliriz.

Alternatif bir yöntem ise kendi yığınımızı kullanarak bu işi yapmaktır. 
Genel adı ile Breadth First Search (Yayılma Öncelikli Arama):
<ul>
<li>Bir stack yaratılır ve root node'u bu yığına eklenir. (Queue ile de yapılabilir sadece işleme sıranız değişir)
<li>Herhangi bir node'un alt node'ları varsa bunlar da yığına eklenir
<li>Bulunduğumuz node işlenir ve yığından bir sonraki node çekilir. 
<li>Yığın boşalana kadar bu işlem tekrarlanır.
</ul>

Tüm dizin yapısını dolaşan örnek kod:]]></description>
			<content:encoded><![CDATA[<p>Recursion doğru kullanıldığı zaman çok işimize yarayabilir. Özellikle ağaç tipi data yapılarının tüm nodelarını dolaşmak istediğimizde recursiondan faydalanabiliriz. Fakat bu ağaç yapısının ne kadar derinliğe sahip olduğunu kestiremediğimiz durumlarda bu yönteme çok da bel bağlamamak lazım zira stack (yığın) taşabilir ve overflow hatasıyla karşılaşabiliriz.</p>

<p>Alternatif bir yöntem ise kendi yığınımızı kullanarak bu işi yapmaktır.
Genel adı ile Breadth First Search (Yayılma Öncelikli Arama):
<ul>
    <li>Bir stack yaratılır ve root node&#8217;u bu yığına eklenir. (Queue ile de yapılabilir sadece işleme sıranız değişir)</li>
    <li>Herhangi bir node&#8217;un alt node&#8217;ları varsa bunlar da yığına eklenir</li>
    <li>Bulunduğumuz node işlenir ve yığından bir sonraki node çekilir.</li>
    <li>Yığın boşalana kadar bu işlem tekrarlanır.</li>
</ul>
Tüm dizin yapısını dolaşan örnek kod:
<span id="more-98"></span>
<pre class="prettyprint">
Stack stack = new Stack();
stack.Push(new DirectoryInfo(@"c:\"));
while(stack.Count > 0)
{
  DirectoryInfo dir = stack.Pop();
  Console.WriteLine(dir.FullName);
  foreach (DirectoryInfo info in dir.GetDirectories())
    stack.Push(info);
}
</pre>
Queue kullanarak ise:
<pre class="prettyprint">
Queue queue = new Queue();
queue.Enqueue(new DirectoryInfo(@"c:\"));
while(queue.Count > 0)
{
  DirectoryInfo dir = queue.Dequeue();
  Console.WriteLine(dir.FullName);
  foreach (DirectoryInfo info in dir.GetDirectories())
    queue.Enqueue(info);
}
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/10/yayilma-oncelikli-arama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testlerimiz kodumuzun ne kadarını kapsıyor?</title>
		<link>http://www.thexpot.net/2007/10/testlerimiz-kodumuzun-ne-kadarini-kapsiyor/</link>
		<comments>http://www.thexpot.net/2007/10/testlerimiz-kodumuzun-ne-kadarini-kapsiyor/#comments</comments>
		<pubDate>Tue, 02 Oct 2007 18:20:54 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Yazdığımız kodun doğru çalışıp çalışmadığını, istediğimiz özellikleri sağlayıp sağlamadığını testler yazarak garantilemeye çalışırız. Birçok programlama dili için test araçları mevcut, Delphi için <a href="http://dunit.sourceforge.net/" targer="_blank">DUnit</a>, java için <a href="http://www.junit.org/" target="_blank">JUnit</a>, .Net için <a href="http://www.nunit.org/" target="_blank">NUnit</a>, <a href="http://www.mbunit.com/" target="_blank">MbUnit</a> vs... Fakat yazdığımız bu testlerin kodumuzun ne kadarını test ettiğini, hiç atladığımız durumlar olup olmadığını merak etmiyor musunuz? İşte bunun içinde başka bir araç var ve adı <a href="http://ncover.org/" target="_blank">NCover</a>. 
<h3>Kod Kapsama nedir?</h3>
Testlerimizin kodun ne kadarına uğradığını ve dolayısıyla tümüne oranla ne kadarlık kod parçasının testlere dahil olduğunu ölçmek için kullanılan kalite kontrol yöntemi "Code Coverage" <i>(Kod Kapsama)</i> diye adlandırılır. 

Kod kapsama ile ne gibi bir ölçüm yaparız?
<ul>
<li>Test senaryolarımız tarafından ulaşılmayan, test edilmeyen kod parçacıklarını tespit edebiliriz
<li>Test edilmeyen kod parçalarını da içerecek yeni testler yazabilir ya da eski testlerimizi genişletebiliriz.
<li>Gereksiz testleri tespit edip kaldırabiliriz.
<li>Aslında hiç kullanmadığımız kod parçacıklarını ayıklayabiliriz
</ul>

Ben Visual Studio için <a href="http://www.testdriven.net/" target="_blank">TestDriven.Net</a> eklentisi kullanıyorum ve bu eklenti ile hazır NCover desteği de geliyor ki işimizi fazlasıyla kolaylaştırıyor. TestDriven.Net, kişisel kullanım için ücretsiz, fakat Visual C# Express Edition kullanıyorsanız bu eklentiden faydalanamazsınız çünkü Express Editionlar eklenti yüklenmesine izin vermiyor. <strike>Başka bir alternatif ise JetBrains'in <a href="http://www.jetbrains.com/unitrun/" target="_blank">UnitRun</a>'ı ki bu üründe ücretsiz.</strike>

Diyelimki bir tane <em>Registration</em> adında bir DTO sınıfınız ve bu sınıftaki bilgileri doğrulayan <em>RegistrationValidator</em> diye başka bir sınıfız var.]]></description>
			<content:encoded><![CDATA[<p>Yazdığımız kodun doğru çalışıp çalışmadığını, istediğimiz özellikleri sağlayıp sağlamadığını testler yazarak garantilemeye çalışırız. Birçok programlama dili için test araçları mevcut, Delphi için <a href="http://dunit.sourceforge.net/">DUnit</a>, java için <a href="http://www.junit.org/" target="_blank">JUnit</a>, .Net için <a href="http://www.nunit.org/" target="_blank">NUnit</a>, <a href="http://www.mbunit.com/" target="_blank">MbUnit</a> vs&#8230; Fakat yazdığımız bu testlerin kodumuzun ne kadarını test ettiğini, hiç atladığımız durumlar olup olmadığını merak etmiyor musunuz? İşte bunun içinde başka bir araç var ve adı <a href="http://ncover.org/" target="_blank">NCover</a>.
<h3>Kod Kapsama nedir?</h3>
Testlerimizin kodun ne kadarına uğradığını ve dolayısıyla tümüne oranla ne kadarlık kod parçasının testlere dahil olduğunu ölçmek için kullanılan kalite kontrol yöntemi &#8220;Code Coverage&#8221; <em>(Kod Kapsama)</em> diye adlandırılır.</p>

<p>Kod kapsama ile ne gibi bir ölçüm yaparız?
<ul>
    <li>Test senaryolarımız tarafından ulaşılmayan, test edilmeyen kod parçacıklarını tespit edebiliriz</li>
    <li>Test edilmeyen kod parçalarını da içerecek yeni testler yazabilir ya da eski testlerimizi genişletebiliriz.</li>
    <li>Gereksiz testleri tespit edip kaldırabiliriz.</li>
    <li>Aslında hiç kullanmadığımız kod parçacıklarını ayıklayabiliriz</li>
</ul>
Ben Visual Studio için <a href="http://www.testdriven.net/" target="_blank">TestDriven.Net</a> eklentisi kullanıyorum ve bu eklenti ile hazır NCover desteği de geliyor ki işimizi fazlasıyla kolaylaştırıyor. TestDriven.Net, kişisel kullanım için ücretsiz, fakat Visual C# Express Edition kullanıyorsanız bu eklentiden faydalanamazsınız çünkü Express Editionlar eklenti yüklenmesine izin vermiyor. <span style="text-decoration: line-through;">Başka bir alternatif ise JetBrains&#8217;in <a href="http://www.jetbrains.com/unitrun/" target="_blank">UnitRun</a>&#8216;ı ki bu üründe ücretsiz.</span></p>

<p>Diyelimki bir tane <em>Registration</em> adında bir DTO sınıfınız ve bu sınıftaki bilgileri doğrulayan <em>RegistrationValidator</em> diye başka bir sınıfız var.
<span id="more-95"></span>
<pre class="prettyprint">
public class Registration
{
  string name;
  string password;
  public string Name
  {
    get { return name; }
    set { name = value; }
  }
  public string Password
  {
    get { return password; }
    set { password = value; }
  }
}
public class Validator
{
  public const int MIN<em>PASSWORD</em>LENGTH = 6;
  public const int MIN<em>NAME</em>LENGTH = 5;
  protected virtual bool IsValidUserName(Registration registration)
  {
    return registration.Name.Length > MIN<em>NAME</em>LENGTH;
  }
  protected virtual bool IsValidPassword(Registration registration)
  {
    return
      registration.Password.Length > MIN<em>PASSWORD</em>LENGTH &amp;&amp;
      registration.Password.IndexOfAny("0123456789".ToCharArray())>-1;
  }
  public virtual bool IsValid(Registration registration)
  {
    return IsValidUserName(registration) &amp;&amp; IsValidPassword(registration);
  }
}</pre>
Testlermizi de yazmışız:
<pre class="prettyprint">
[TestFixture]
public class ValidationTests
{
  private Validator <em>validator = new Validator();
  private Registration _registration;
  [SetUp]
  public void SetUp()
  {
    _registration = new Registration();
    _registration.Name = "t-hex";
    _registration.Password = "abcd";
  }
  [Test]
  public void Should</em>not<em>validate</em>if<em>name</em>is<em>shorter</em>than<em>minumun</em>length()
  {
    Assert.IsFalse(<em>validator.IsValid(</em>registration));
  }
  [Test]
  public void Should<em>not</em>validate<em>if</em>password<em>doesnt</em>contain<em>numbers()
  {
    Assert.IsFalse(</em>validator.IsValid(<em>registration));
  }
  [Test]
  public void Should</em>not<em>validate</em>if_password__is_shorter_than_minimum_length()
  {
    Assert.IsFalse(_validator.IsValid(_registration));
  }
}</pre>
Buraya kadar her şey güzel, testlerimizi çalıştırdık ve beklediğimiz sonucu aldık.
<code>
3 passed, 0 failed, 0 skipped, took 0,42 seconds.
</code></p>

<p>Peki gerçekten doğru mu yaptık? Bir de NCover ile bakalım:<br />
<img src="http://www.thexpot.net/img/95_ncover1.png" alt="" />
Neden oranlar bu kadar düşük? 100% olması lazım zaten iki üç tane metodu test ediyoruz burada. Hatta sonuçlardan anladımıza göre <em>get_Password</em>, <em>IsPasswordValid</em> metodları hiç çağırılmamış!</p>

<p>Bunun nedeni lazy evaluation. C# derleyicisi tümü &#8220;ve&#8221; ile bağlanmış bir ifade de ilk false döndükten sonrakileri hiç çalıştırmaz çünkü zaten her durumda tüm sonuç false olacaktır. Bu durumda da biz ilk testi yaptığımızda uzunluk 5 karakterden kısa olduğu için false alıyoruz ve aslında şifreyi hiç kontrol etmiyoruz. Hatta daha vahimi ise şifreyi test eden kodumuzu gerçektende yanlış yazmışız, IndexOfAny metodu -1&#8242; eşit değil -1&#8242;den büyük olmalıydı.</p>

<p>Kodumuzu düzeltelim:
<pre class="prettyprint">
protected virtual bool IsValidPassword(Registration registration)
{
  bool valid = registration.Password.Length > MIN<em>PASSWORD</em>LENGTH;
  valid = valid &amp;&amp; registration.Password.IndexOfAny("0123456789".ToCharArray()) > -1;
  return valid;
}
//testlerde de
[Test]
public void Should<em>not</em>validate<em>if</em>password<em>doesnt</em>contain<em>numbers()
{
  _registration.Name = "longername";
  _registration.Password = "abcdefg";
  Assert.IsFalse(</em>validator.IsValid(_registration));
}</pre>
Çalıştıralım ve 100% kapsamayı görelim.</p>

<p>Burdan 2 sonuç çıkarabiliriz:
Birincisi; Test edilmesi gereken koşulların hepsini &#8220;ve&#8221; ile bağlamayın, bu hem okunurluğu azaltır, hem de yukarıdaki gibi hatalara neden olabilir. Onun yerine önce boolean değişkenlere değerleri atayın sonra kontrol edin.
İkincisi de hiçbir zaman emin olmayın.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/10/testlerimiz-kodumuzun-ne-kadarini-kapsiyor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dot Net Rocks TV (dnrTV)</title>
		<link>http://www.thexpot.net/2007/09/dot-net-rocks-tv-dnrtv/</link>
		<comments>http://www.thexpot.net/2007/09/dot-net-rocks-tv-dnrtv/#comments</comments>
		<pubDate>Sun, 09 Sep 2007 10:11:45 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[.Net]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Son dönemde ciddi bir şekilde .Net çatısını kullanarak yazılım geliştirdiğimden dolayı yaptığım araştırma ve çalışmalarda bu çatı ile ilgili yayınların olduğu kaynaklara yöneldi. Geçenlerde çok güzel bir websitesiyle karşılaştım: <a href="http://www.dnrtv.com">(Dot Net Rocks TV) dnrTV</a>. 

Carl Franklin'in geliştiricileri daha akıllı çalışmaya yönelten videoların bulunduğu bir websitesi. Her hafta .Net ve yazılımla ile ilgili bir konu üzerine konuklar alıp karşılıklı sohbet ederek bir konuyu veya bir kavramı açıklıyorlar.  Site uzun zamandır yayında da ben daha yeni farkettim. ]]></description>
			<content:encoded><![CDATA[<p>Son dönemde ciddi bir şekilde .Net çatısını kullanarak yazılım geliştirdiğimden dolayı yaptığım araştırma ve çalışmalarda bu çatı ile ilgili yayınların olduğu kaynaklara yöneldi. Geçenlerde çok güzel bir websitesiyle karşılaştım: <a href="http://www.dnrtv.com">(Dot Net Rocks TV) dnrTV</a>.</p>

<p>Carl Franklin&#8217;in geliştiricileri daha akıllı çalışmaya yönelten videoların bulunduğu bir websitesi. Her hafta .Net ve yazılımla ile ilgili bir konu üzerine konuklar alıp karşılıklı sohbet ederek bir konuyu veya bir kavramı açıklıyorlar.  Site uzun zamandır yayında da ben daha yeni farkettim.
<span id="more-93"></span></p>

<p>Aynı sitesinin bir de sadece podcastleri bulunan bir <a href="http://www.dotnetrocks.com">kardeş</a>i var.</p>

<p>İşlenen konular güncel ve yararlı. WPF, WCF, Linq, SQL Server, ASP.Net etc. Duyup duymadığınız her şey için bir şeyler söylenmiş bu güne kadar.</p>

<p>Baştan sona ingilizce fakat inglizce oldukça anlaşılır ve sohbet gerçekten sıcak.</p>

<p>Bir kaç örnek:
<ul>
    <li> Tasarım Desenleri üzerine:<a href="http://perseus.franklins.net/dnrtv/0063/parta.html" target="_blank">
</a>
<ul>
    <li> <a href="http://perseus.franklins.net/dnrtv/0063/parta.html" target="_blank">Jean-Paul Boodhoo on Demystifying Design Patterns Part 1</a></li>
    <li><a href="http://perseus.franklins.net/dnrtv/0065/parta.html" target="_blank">dnrTV #65 &#8211; Jean-Paul Boodhoo on Demystifying Design Patterns Part 2</a></li>
    <li><a href="http://perseus.franklins.net/dnrtv/0068/parta.html" target="_blank">dnrTV #68 &#8211; Jean-Paul Boodhoo on Demystifying Design Patterns Part 3</a></li>
    <li><a href="http://perseus.franklins.net/dnrtv/0071/parta.html" target="_blank">dnrTV #71 &#8211; Jean-Paul Boodhoo on Demystifying Design Patterns Part 4</a></li>
</ul>
</li>
</ul>
<ul>
    <li>Agile Development üzerine
<ul>
    <li><a href="http://perseus.franklins.net/dnrtv/0073/parta.html" target="_blank">dnrTV #73 &#8211; Venkat Subramaniam on Fundamentals of Agile Design</a></li>
    <li><a href="http://perseus.franklins.net/dnrtv/0074/parta.html" target="_blank">dnrTV #74 &#8211; Venkat Subramaniam on Fundamentals of Agile Design Part 2</a></li>
</ul>
</li>
    <li>Windows Presentation Foundation üzerine
<ul>
    <li><a href="http://perseus.franklins.net/dnrtv/0056/parta.html" target="_blank">dnrTV #56 &#8211; Brian Noyes on Windows Presentation Foundation Part 1</a></li>
    <li><a href="http://perseus.franklins.net/dnrtv/0059/parta.html" target="_blank">dnrTV #59 &#8211; Brian Noyes on Windows Presentation Foundation Part 2</a></li>
    <li><a href="http://perseus.franklins.net/dnrtv/0021/parta.html" target="_blank">dnrTV Show No 21 &#8211; Michael Stiefel on Workflow Foundation</a></li>
    <li><a href="http://perseus.franklins.net/dnrtv/0022/parta.html" target="_blank">dnrTV Show No 21 &#8211; Michael Stiefel on Workflow Foundation</a></li>
    <li><a href="http://perseus.franklins.net/dnrtv/0023/parta.html" target="_blank">dnrTV Show No 23 &#8211; Michael Stiefel on Workflow Foundation</a></li>
    <li><a href="http://perseus.franklins.net/dnrtv/0024/parta.html" target="_blank">dnrTV Show No 24 &#8211; Michael Stiefel on Workflow Foundation</a></li>
</ul>
</li>
</ul>
Ben mi beceremedim bilmiyorum ama site üzerinde tüm bölümlerin linklerini bulabileceğim bir sayfaya rastlayamadım. Neyse ben de bir program yazıp tüm bölümler için olan linkleri bir dosyaya kaydettirdim. Dosyaya <a href="http://www.thexpot.net/files/dnrtv_links.html">buradan</a> ulaşabilirsiniz.
İyi seyirler <img src='http://www.thexpot.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/09/dot-net-rocks-tv-dnrtv/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>String de null kontrolü</title>
		<link>http://www.thexpot.net/2007/07/string-de-null-kontrolu/</link>
		<comments>http://www.thexpot.net/2007/07/string-de-null-kontrolu/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C# ve Java gibi dillerde string genelde bir sınıf ile temsil edilir. Dolayısıyla null olma durumu mevcuttur. Null kontrolünü 
<blockcode type="java">
if (name != null &#38;&#38; name == "t-hex") {
...}
</blockcode>

yazmak yerine kısaca

<blockcode type="java">
if ("t-hex".equals(name)) {
...}
</blockcode>

yazmak daha bir afilli durur(muş).]]></description>
			<content:encoded><![CDATA[<p>C# ve Java gibi dillerde string genelde bir sınıf ile temsil edilir. Dolayısıyla null olma durumu mevcuttur. Null kontrolünü 
<pre class="prettyprint">
if (name != null &amp;&amp; name == "t-hex") {
...}
</pre></p>

<p>yazmak yerine kısaca</p>

<pre class="prettyprint">
if ("t-hex".equals(name)) {
...}
</pre>

<p>yazmak daha bir afilli durur(muş).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/07/string-de-null-kontrolu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DelphiPI &#8211; Delphi Package Installer</title>
		<link>http://www.thexpot.net/2007/07/delphipi-021-delphi-package-installer/</link>
		<comments>http://www.thexpot.net/2007/07/delphipi-021-delphi-package-installer/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[DelphiPI]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<b>DelphiPI'nin yeni sürümünü hazırladım: <a href="node/94">0.21</a></b>

<a href="http://delphipi.googlecode.com" target="_blank">Delphi <i><font face="arial" size="3px">&#960;</font></i></a>, Delphi bileşen paketlerini bağımlılık sırasını gözeterek derler, yükler.

Diyelimki elinizde kocaman bir bileşen kütüphanesi var. Bunu kurmak için hangi sırayla paketlerin derleneceğini ve yükleneceğini çıkarmanız lazım. Bu işlem oldukça zaman alır.

Örneğin; Developer Express'in bileşenleri (Quantum Grid+ Express Bars+SpreadSheet,vs...). Tüm seti kurmak için 30'a yakın paketi tek tek açıp derleyip yüklemeniz lazım.

Delphi PI ile bu işi bir iki tıklamayla halledebilirsiniz. ]]></description>
			<content:encoded><![CDATA[<p><a href="http://delphipi.googlecode.com" target="_blank">DelphiPI</a>, Delphi bileşen paketlerini bağımlılık sırasını gözeterek derler, yükler.</p>

<p>Diyelimki elinizde kocaman bir bileşen kütüphanesi var. Bunu kurmak için hangi sırayla paketlerin derleneceğini ve yükleneceğini çıkarmanız lazım. Bu işlem oldukça zaman alır.</p>

<p>Örneğin; Developer Express&#8217;in bileşenleri (Quantum Grid+ Express Bars+SpreadSheet,vs&#8230;). Tüm seti kurmak için 30&#8242;a yakın paketi tek tek açıp derleyip yüklemeniz lazım.
<span id="more-84"></span>
Delphi PI ile bu işi bir iki tıklamayla halledebilirsiniz.</p>

<p>Tek yapmanız gereken tüm paketlerin bulunduğu klasörü seçmek ve adımları takip etmek.</p>

<p>Siz bunu yaptıktan sonra DelphiPI
<ul>
    <li> paketleri tespit edecek</li>
    <li> paketler arasındaki bağımlıklıklara göre derleme listesi çıkaracak</li>
    <li> paketleri derleyecek</li>
    <li> paketleri delphi&#8217;ye yükleyecek</li>
    <li> SourcePath&#8217;leri arayıp LibraryPath&#8217;e ekleyecek</li>
    <li> Delphi 7 ve önceki sürümlerde; bulduğu yardım dosyalarını OpenHelp&#8217;e kaydecek.</li>
</ul>
<a href="http://delphipi.googlecode.com/files/delphipi_select_folders.png"> <img src="http://delphipi.googlecode.com/files/delphipi_select_folders.png" alt="" /></a></p>

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

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

<p><a href="http://code.google.com/p/delphipi/downloads/list" target="_blank">DelphiPI&#8217;yi indirmek için tıklayın</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/07/delphipi-021-delphi-package-installer/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Arayüz hazırlarken HTML&#8217;den faydalanmak</title>
		<link>http://www.thexpot.net/2007/07/arayuz-hazirlarken-htmlden-faydalanmak/</link>
		<comments>http://www.thexpot.net/2007/07/arayuz-hazirlarken-htmlden-faydalanmak/#comments</comments>
		<pubDate>Fri, 06 Jul 2007 21:27:24 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Genellikle yazılımlarımızda HTML içeriği görüntülememiz gerektiğinde, VCL ile gelen WebBrowser bileşeninden faydalanırız.
Bir adım ileri gidip bu bileşenden ve HTML'den yararlanarak görsel bakımdan zengin arayüzler oluşturmamız mümkündür. Aslında çok küçük bir hile ile HTML kullanarak hazırladığımız sayfalarla tek yönlü olarak haberleşebiliriz.

HTML kullanarak dinamik yardım veya menüler oluşturabilir ve HTML sayfasındaki bağlantılara tıklanıldığı zamanda yapılması gereken işlemi 
WebBrowser nesnesinin BeforeNavigate2 olayını kullanarak değiştirebiliriz.

Bunu yapmak için HTML içinde belirtilen bağlantı yollarının http'den farklı, kendimizin belirlediği bir protokolle şekillendirilmiş olması yeterlidir. ]]></description>
			<content:encoded><![CDATA[<p>Genellikle yazılımlarımızda HTML içeriği görüntülememiz gerektiğinde, VCL ile gelen WebBrowser bileşeninden faydalanırız.
Bir adım ileri gidip bu bileşenden ve HTML&#8217;den yararlanarak görsel bakımdan zengin arayüzler oluşturmamız mümkündür. Aslında çok küçük bir hile ile HTML kullanarak hazırladığımız sayfalarla tek yönlü olarak haberleşebiliriz.</p>

<p>HTML kullanarak dinamik yardım veya menüler oluşturabilir ve HTML sayfasındaki bağlantılara tıklanıldığı zamanda yapılması gereken işlemi
WebBrowser nesnesinin BeforeNavigate2 olayını kullanarak değiştirebiliriz.</p>

<p>Bunu yapmak için HTML içinde belirtilen bağlantı yollarının http&#8217;den farklı, kendimizin belirlediği bir protokolle şekillendirilmiş olması yeterlidir.
<span id="more-82"></span>
Örneğin :
<pre><a href="app://actShowHelpBox">Yardımı görüntüle</a></pre>
<pre class="prettyprint">procedure TForm1.WebBrowserBeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
var
 ActionName : string;
 Action : TContainedAction;
begin
  ActionName := '';
  // başında app stringi olan URL'lerden action adını çıkarıyoruz.
  if pos('app:',URL)=1 then
    ActionName := copy(URL,5,length(URL)-4);
  // action adı çıkarabildiysek bu URL'yi biz işleyeceğiz
  // dolayısıyla WebBrowser nesnesinin işlem yapmasını iptal ediyoruz.
  Cancel := Length(ActionName) > 0;</p>

<p>// ActionList'ten action bulmaya çalışıyoruz.
  Action := FindAction(ActionList,ActionName);
  // Eğer bulduysak çalıştırıyoruz.
  if Assigned(Action) then
    Action.Execute;
end;</pre>
Yukarıdaki kodda sadece gidilmesi istenen URL&#8217;nin app protokolü ile mi başladığını kontrol edip, eğer öyle ise ActionListten aynı isimli bir action arıyoruz.
Bulduğumuzda da çalıştırıyoruz.</p>

<p>FindAction fonksiyonu ise şu şekilde:
<pre class="prettyprint">function TForm1.FindAction(anActionList: TActionList;
  actionName: String): TContainedAction;
var
  i: Integer;
begin
  Result := nil;
  for I := 0 to anActionList.ActionCount - 1 do
    if UpperCase(anActionList.Actions[i].Name) = UpperCase(actionName) then begin
       Result := anActionList.Actions[i];
       exit;
    end;
end;</pre>
İki tane örnek uygulama:</p>

<p><a href="http://www.thexpot.net/files/html_arayuz.zip">html_arayuz.zip</a> (257 KB)
<a href="http://www.thexpot.net/files/dinamikyardim.zip">dinamikyardim.zip</a> (268 KB)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/07/arayuz-hazirlarken-htmlden-faydalanmak/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>EclipseCoder</title>
		<link>http://www.thexpot.net/2007/05/eclipsecoder/</link>
		<comments>http://www.thexpot.net/2007/05/eclipsecoder/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Eclipse hızlı kod yazmak için şahane bir yazılım. Bu yüzden ara sıra katıldığım programlama yarışmalarında Eclipse'i tercih ediyorum. Topcoder Arena için FileEdit diye bir plugin mevcut. Soruyu ve soruda istenen sınıf yapısını bir dosyaya kaydediyor ve sizde favori IDE'nizde açıp kodlayıp yolluyorsunuz. Ben de uzun zamandır bu plugini ve Eclipse'i kullanıyordum. Bu ikili hayli zaman kazandırıyordu.

Geçenlerde ise yine Topcoder yarışmaları için hazırlanmış bir eclipse pluginine rastladım: <b>EclipseCoder.</b>]]></description>
			<content:encoded><![CDATA[<p>Eclipse hızlı kod yazmak için şahane bir yazılım. Bu yüzden ara sıra katıldığım programlama yarışmalarında Eclipse&#8217;i tercih ediyorum. Topcoder Arena için FileEdit diye bir plugin mevcut. Soruyu ve soruda istenen sınıf yapısını bir dosyaya kaydediyor ve sizde favori IDE&#8217;nizde açıp kodlayıp yolluyorsunuz. Ben de uzun zamandır bu plugini ve Eclipse&#8217;i kullanıyordum. Bu ikili hayli zaman kazandırıyordu.</p>

<p>Geçenlerde ise yine Topcoder yarışmaları için hazırlanmış bir eclipse pluginine rastladım: <a title="EclipseCoder" href="http://fornwall.net/eclipsecoder/" target="_blank"><strong>EclipseCoder</strong></a>
<span id="more-81"></span></p>

<p>EclipseCoder, sizin için
<ul>
    <li>tüm problem arşivini gösteriyor,</li>
    <li><span style="text-decoration: line-through;">seçtiğiniz problem için testleri de parse edip ayrı test uniti bile yaratıyor</span>. (50-100 testcase) <strong>(TopCoder Inc. isteği üzerine bu özelliği kaldırmışlar)</strong></li>
</ul>
Yarışma sırasında;
<ul>
    <li>Eclipse içinden Topcoder Arena&#8217;ya bağlanıyor,</li>
    <li>soru metnini gömülü bir browserda gösteriyor,</li>
    <li>soru için istenen sınıf yapısını oluşturuyor,</li>
    <li>örnekleri junit testleri halinde ayrı bir sınıfa atıyor. (4-5 testcase)</li>
</ul>
yani sadece soruyu açmanız yeterli oluyor&#8230; Kodla, test et, yolla.</p>

<p><a href="http://fornwall.net/eclipsecoder/">http://fornwall.net/eclipsecoder/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/05/eclipsecoder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Codegear Delphi 2007 for Win32</title>
		<link>http://www.thexpot.net/2007/04/codegear-delphi-2007-for-win32/</link>
		<comments>http://www.thexpot.net/2007/04/codegear-delphi-2007-for-win32/#comments</comments>
		<pubDate>Fri, 06 Apr 2007 14:59:36 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Benim IDE'lerden hiçbir zaman şu teknolojiyi  desteklesin diye bir beklentim olmadı. Tek istediğim işimi kolaylaştırmaları. Amele işleri benim yerime doğru dürüst yapmaları yeterlidir. Hız ve stabilite benim için çok önemlidir. Uğraşımın saçma nedenlerle yarım kalmasını veya yok olmasını doğal olarak istemem ve hoş karşılamam. <br /><br />Delphi 7'den sonra çıkan Delphi sürümleri genel itibariyle hantal ve bug dolu olduklarından Delphi 7 hala benim en çok kullandığım IDE olarak kalmıştır. <br /><br />BDS 2006 refactoring, unit testing vs. gibi özellikleriyle divane etsede yavaşlığı ve exception factory misyonuyla da deli etmeye devam ediyor.<br />]]></description>
			<content:encoded><![CDATA[<p>Benim IDE&#8217;lerden hiçbir zaman şu teknolojiyi  desteklesin diye bir beklentim olmadı. Tek istediğim işimi kolaylaştırmaları. Amele işleri benim yerime doğru dürüst yapmaları yeterlidir. Hız ve stabilite benim için çok önemlidir. Uğraşımın saçma nedenlerle yarım kalmasını veya yok olmasını doğal olarak istemem ve hoş karşılamam. <br /><br />Delphi 7&#8242;den sonra çıkan Delphi sürümleri genel itibariyle hantal ve bug dolu olduklarından Delphi 7 hala benim en çok kullandığım IDE olarak kalmıştır. <br /><br />BDS 2006 refactoring, unit testing vs. gibi özellikleriyle divane etsede yavaşlığı ve exception factory misyonuyla da deli etmeye devam ediyor.<br /><br />Bugün CodeGear Delphi 2007 for Win32&#8242;nin deneme sürümünü kurdum. Görünüş olarak BDS 2006&#8242;dan pek bir fark olmadığından ben de doğal olarak performan testleri uyguladım.<br /><ul><br /><li><b>Aç</b>. <br /></li><ul><li>Hatasız ve nispeten hızlı açılış. 10 puan.&nbsp;</li><li><i>BDS 2006 açılırken laptopumun fanı deli gibi ötmeye başlardı.  Bilgisayar geçici bir süre donardı.</i><br /></li></ul><li><b>Hiçbir şey yapmadan kapat</b>. <br /></li><ul><li>Vay! Hiçbir hata vermeden saniyeden kısa bir sürede kapandı. 20 puan.&nbsp;</li><li><i>BDS 2006 kapanırken illaki geçersiz 3-5 işlem yürütürdü. Kapanamazdı. Genelde Task Managerdan kapatırdım.</i><br /></li></ul><li><b>Tekrar aç</b>. <br /></li><ul><li>Yine sorun yok. 5 puan<br /></li></ul><li><b>Hiç kod yazmadan derle. <br /></b></li><ul><li>İşte bu noktada inanılmaz gerçekten. 1000 kat mı hızlı desem. Lightining fast mi desem bilemiyorum. O ne hız. O ne endam. 500 puan.</li></ul><ul><li>&nbsp;<i>BDS 2006&#8242;da debug için kütüphaneler yüklenirken tek tek hangi kütüphanenin yüklendiği takip edebiliyordunuz. Delphi 2007&#8242;de göremiyorsunuz bile.</i><br /></li></ul><li>Code completion penceresi de bu iyileştirmeden payını almış. Öneriler çok çabuk geliyor. 5 puan.<br /></li></ul><br />Diğer özellikler şu an için beni ilgilendirmiyor. CodeGear Delphi 2007, BDS 2006&#8242;nın on bin milyon kat kadar hızlandırılmışı olmuş. Tam süper olmuş!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/04/codegear-delphi-2007-for-win32/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google&#8217;dan Açık kaynak kodlu proje barındırma desteği</title>
		<link>http://www.thexpot.net/2007/01/googledan-acik-kaynak-kodlu-proje-barindirma-destegi/</link>
		<comments>http://www.thexpot.net/2007/01/googledan-acik-kaynak-kodlu-proje-barindirma-destegi/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Google apilerini karıştırırken Google'ın proje barındırma hizmeti vermeye başladığını farkettim. SourceForge'unki kadar teferruatlı olmasada küçük çaplı projeler için yeterli gibi görünüyor. 

Projenizi oluşturmak çok kolay, sadece bir form dolduruyorsunuz, projeniz için açıklama yazıyorsunuz ve etiketler belirliyorsunuz, hangi lisansı istiyorsanız onu seçiyorsunuz ve tamam. Hepsi bu kadar. Proje onay falan beklemenize gerek yok. İsterseniz tek bir düğmeye tıklayarak projenizi kaldırmanızda mümkün. 

Peki google size hangi hizmetleri sunuyor?]]></description>
			<content:encoded><![CDATA[<p>Google apilerini karıştırırken Google&#8217;ın proje barındırma hizmeti vermeye başladığını farkettim. SourceForge&#8217;unki kadar teferruatlı olmasada küçük çaplı projeler için yeterli gibi görünüyor.</p>

<p>Projenizi oluşturmak çok kolay, sadece bir form dolduruyorsunuz, projeniz için açıklama yazıyorsunuz ve etiketler belirliyorsunuz, hangi lisansı istiyorsanız onu seçiyorsunuz ve tamam. Hepsi bu kadar. Proje onay falan beklemenize gerek yok. İsterseniz tek bir düğmeye tıklayarak projenizi kaldırmanızda mümkün.</p>

<p>Peki google size hangi hizmetleri sunuyor?
<span id="more-76"></span>
<ul>
    <li>Toplam 100MB alan veriyor.</li>
    <li>Herbiri en fazla 10MB olmak şartıyla dosya yayınlayabilmenize izin veriyor.</li>
    <li>SVN desteği sağlıyor.</li>
    <li>Güzel bir Wiki desteği sunuyor.</li>
</ul>
E daha ne olsun? Bireysel projelerinizi flash disklerde barındırmaktansa googlecode&#8217;a taşımanın tam zamanı.</p>

<p><a title="http://code.google.com/hosting/" href="http://code.google.com/hosting/" target="_blank">http://code.google.com/hosting/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2007/01/googledan-acik-kaynak-kodlu-proje-barindirma-destegi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yasal olmayan asal sayı</title>
		<link>http://www.thexpot.net/2006/08/yasal-olmayan-asal-sayi/</link>
		<comments>http://www.thexpot.net/2006/08/yasal-olmayan-asal-sayi/#comments</comments>
		<pubDate>Wed, 09 Aug 2006 09:43:36 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Matematik]]></category>
		<category><![CDATA[Notlar]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Hepiniz DVD’leri bilirsiniz, 8 gb civarında bilgi saklayabilen CD’lerin gelişmiş türevleridir ve sinema endüstrisinde sıkça kullanılırlar. DVD’lerin 40/1 oranında sıkıştırma yapması için MPEG-2 algoritması geliştirilmiştir. Daha sonradan daha iyi bir algoritma olan MPEG-4 (DivX) geliştirildi. ]]></description>
			<content:encoded><![CDATA[<p>Hepiniz DVD’leri bilirsiniz, 8 gb civarında bilgi saklayabilen CD’lerin gelişmiş türevleridir ve sinema endüstrisinde sıkça kullanılırlar. DVD’lerin 40/1 oranında sıkıştırma yapması için MPEG-2 algoritması geliştirilmiştir. Daha sonradan daha iyi bir algoritma olan MPEG-4 (DivX) geliştirildi. <span id="more-71"></span></p>

<p>Film endüstrisi DVD filmlerinin kopyalanması engellemek için <strong>CSS</strong> (Content Scrambling System) adıyla bir yöntem geliştirdi. DVD’lerin içinde gördüğünüz büyük boyutlardaki VOB dosyaları bu CSS yöntemi kullanılarak içerikleri şifrelenmiş MPEG-2 dosyalardır. DVD oynatıcı üreten tüm firmalar bu şifreyi çözmek için gerekli olan algoritmayı <strong>DVD-CCA</strong> adında bir şirkete bir miktar ücret ödeyerek lisanslamak zorundadırlar. Bu firma aslen DVD’nin ve CSS’in geliştirmesini gerçekleştiren firmadır.</p>

<p>CSS algoritması DVD endüstrisine bazı kısıtlamalar getirmektedir. 6 tanesi coğrafi bölge olmak üzere (Kuzey Amerika, avrupa, vs ) ve son olarakta 1999 yılında eklenen “Uçaklar” ile birlikte toplam 7 tane bölge için bu sınırlamalar belirlenmiştir. Bu bölgelerden biri için üretilmiş bir DVD oynatıcı diğer bir bölge için üretilmiş DVD’yi bu kısıtlmalardan dolayı çalıştıramaz.</p>

<p>Uzunca bir süre bu lisanslama bedelinden dolayı Linux için DVD oynatan bir yazılım olmadı. Ekim 1999’da kimliği bilinmeyen bir grup Alman hacker tarafından CSS algoritmasını çözen yöntem geliştirildi ve 15 yaşındaki bir Norveçli genç tarafından da internette yayınlandı. <strong>deCSS</strong> adı verilen bu program şifreyi çözerek VOB dosyalarını bildiğimiz MPEG-2 dosyaları haline getiriyordu.</p>

<p>Fakat doğal olarak DVD-CAA ve Motion Pictures firması bu kodun izini sürüp internetten kaldırılması için dava açtılar. 15 yaşındaki çocuk ise Norveç polisi tarafından tutuklandı fakat suçlu bulunmadı.</p>

<p>Bu kodu bulundurmak, kullanmak ve açık olarak yayınlamak suç kapsamına giriyordu. Hackerlar bu kodu yayınlamak için çeşitli yöntemler aradılar. Bu yöntemlerden en yaratıcı 2 tanesi şöyledir:</p>

<p>deCSS kodunu JPEG dosyalarının içine gömdüler ve bu kodu çıkaracak yöntemi ise düz metin biçiminde internette yayınladılar.</p>

<p>İkincisi ise <strong>Phil Carmondy</strong> adındaki bir sayı bilimciden geldi. Phil, C ile yazılmış deCSS kodunu <strong>gzip</strong> yöntemini kullanarak sıkıştırdı. Oluşan dosyanın boyutu sadece 600 bayt civarındaydı. Phil’in bu dosyayı yayınlayabilmek için özel bir nedene ihtiyacı vardı. Dosyadaki her bir bayt sayıya çevrilip yanyana yazıldığında oluşan kocaman sayı asal olabiliyorsa bu yeterli bir sebepti. Uzun uğraşlar sonunda bu sayının sonuna 2 karakterlik bir sayı eklediğinde oluşan sayının asal bir sayı olduğu tespit edildi. Bu asal sayı aşağıdaki gibidir:</p>

<p><img src="http://www.thexpot.net/img/sahteasal_.png"/></p>

<p>Dolayısıyla bu deCSS kodunu elde etmek için bu büyük asal sayıyı binary şeklinde bir dosyaya kaydedip sonra da gunzip gibi standart bir aracı kullanarak açmanız yeterl <img src='http://www.thexpot.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p>Kaynak: Bu hikaye, Peter van der Linden’in Just Java 2 kitabından alınıp kısaltılarak tarafımdan türkçeye çevrilmiştir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/08/yasal-olmayan-asal-sayi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uçuk C/C++</title>
		<link>http://www.thexpot.net/2006/07/ucuk-ccpp/</link>
		<comments>http://www.thexpot.net/2006/07/ucuk-ccpp/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C/C++'ı neden çoğu insanın sevmediğine ve bazı algoritmacılarında taptığına ilişkin iste size bir kaç örnek:

İki farklı değişkendeki değerleri birbirleriyle değiştirmek (swap) istiyorsanız bunu nasıl yaparsınız? Geçici bir değişken kullanarak yaparsınız değil mi? C++'da geçici değişken kullanmadan da yapılabiliyormuş:
<blockcode type="cpp">
int swap(int&#38; a,int&#38; b) {
   a ^= b ^= a ^= b;
}
</blockcode>

Bu kod C++'da doğru Java'da yanlış çalışıyor.

İki farklı sayıyı bölen en büyük sayıya iki sayının OBEB'i denir. OBEB bulmak için kodlaması en kolay yöntem Euclid algoritmasıdır.]]></description>
			<content:encoded><![CDATA[<p>C/C++&#8217;ı neden çoğu insanın sevmediğine ve bazı algoritmacılarında taptığına ilişkin iste size bir kaç örnek:</p>

<p>İki farklı değişkendeki değerleri birbirleriyle değiştirmek (swap) istiyorsanız bunu nasıl yaparsınız? Geçici bir değişken kullanarak yaparsınız değil mi? C++&#8217;da geçici değişken kullanmadan da yapılabiliyormuş:
<pre class="prettyprint">
int swap(int&amp; a,int&amp; b) {
   a ^= b ^= a ^= b;
}
</pre></p>

<p>Bu kod C++&#8217;da doğru Java&#8217;da yanlış çalışıyor.</p>

<p>İki farklı sayıyı bölen en büyük sayıya iki sayının OBEB&#8217;i denir. OBEB bulmak için kodlaması en kolay yöntem Euclid algoritmasıdır.
Büyük sayı küçüğe bölünür, kalan sıfır değilse küçük sayı kalana bölünür ve bu işlem kalan 0 olana kadar devam ettirilir. Kalan 0 olduğu zaman OBEB bir önceki kalana eşittir.</p>

<p>Bunu kodlamak kolay fakat C/C++&#8217;da bu işlem tek bir for döngüsünde halledilebiliyor. 
<pre class="prettyprint">
int obeb(int M,int N) {
    for (int r=M;r!=0;r=M%N,M=N,N=r);
    return M;
}
</pre>
C/C++ stili for döngüsü tartışmasız en mükemmeli.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/07/ucuk-ccpp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Datagenerator</title>
		<link>http://www.thexpot.net/2006/06/open-datagenerator/</link>
		<comments>http://www.thexpot.net/2006/06/open-datagenerator/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[DataGenerator (alpha bile olmayan sürümü)

DataGenerator, adı üstünde çeşitli veritabanları için test verisi oluşturmak üzere tasarladığım programın adı. Piyasada bu işi yapan bir çok yazılım zaten mevcut ama ben diğerlerinde olmayan bir kaç özellik ekleyerek ücretsiz ve birden çok veritabanı ile çalışabilecek bir program hazırlamak istedim. Sonuçta bu Datagenerator çıktı ortaya. Bitmiş değil, eksikleri çok, bugları var. Zaten şu an kullanılması için değil, sadece incelenip değerlendirilmesi için buraya koyuyorum.

<b>Yapabildikleri</b>
<ul>
<li>ZeosLib'in desteklediği tüm veritabanlarına bağlanıp, bunlar için veri üretebilmesi. Şu an sadece PostgreSQL ve Firebird için test ettim.
<li>Script kullanarak veri üretebilme.
<li>Bir alan için üretilecek değerleri, başka alanlar için üretilmiş olanları da dikkate alarak sınırlayabilme. Mesela SATISFIYATI alanına yazılacak değerin ALISFIYATI alanına yazılmış olandan daha büyük bir değer olması.]]></description>
			<content:encoded><![CDATA[<p>DataGenerator (alpha bile olmayan sürümü)</p>

<p>DataGenerator, adı üstünde çeşitli veritabanları için test verisi oluşturmak üzere tasarladığım programın adı. Piyasada bu işi yapan bir çok yazılım zaten mevcut ama ben diğerlerinde olmayan bir kaç özellik ekleyerek ücretsiz ve birden çok veritabanı ile çalışabilecek bir program hazırlamak istedim. Sonuçta bu Datagenerator çıktı ortaya. Bitmiş değil, eksikleri çok, bugları var. Zaten şu an kullanılması için değil, sadece incelenip değerlendirilmesi için buraya koyuyorum.</p>

<p><strong>Yapabildikleri</strong>
<ul>
    <li>ZeosLib&#8217;in desteklediği tüm veritabanlarına bağlanıp, bunlar için veri üretebilmesi. Şu an sadece PostgreSQL ve Firebird için test ettim.</li>
    <li>Script kullanarak veri üretebilme.</li>
    <li>Bir alan için üretilecek değerleri, başka alanlar için üretilmiş olanları da dikkate alarak sınırlayabilme. Mesela SATISFIYATI alanına yazılacak değerin ALISFIYATI alanına yazılmış olandan daha büyük bir değer olması.</li>
    <li>Dosya, Liste veya SQL sorgusu sonuçlarından dönen değerleri kullanarak değer üretebilme</li>
</ul>
<strong>Yapılacaklar</strong></p>

<p>Testler, dökümantasyon, test , test&#8230;.</p>

<p>Projenin adresi arık sourceforge oldu!</p>

<p><a href="http://www.sourceforge.net/projects/datagenerator" target="_blank">http://www.sourceforge.net/projects/datagenerator</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/06/open-datagenerator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# 3.0 Yenilikleri</title>
		<link>http://www.thexpot.net/2006/04/csharp-30-yenilikleri/</link>
		<comments>http://www.thexpot.net/2006/04/csharp-30-yenilikleri/#comments</comments>
		<pubDate>Thu, 27 Apr 2006 06:51:22 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[c# 3.0 da kod yazımını kolaylaştırmak için bir çok yeni özellik eklenecek. Özellikle iyi bir IDE kullanmayan yazılımcıların ağzını sulandırabilecek bu özelliklerden en çarpıcı olanı bence Lamda ve Sorgu İfadeleri (SQL &#38; XQuery) ]]></description>
			<content:encoded><![CDATA[<p>C# 3.0 da kod yazımını kolaylaştırmak için bir çok yeni özellik eklenecek. Özellikle iyi bir IDE kullanmayan yazılımcıların ağzını sulandırabilecek bu özelliklerden en çarpıcı olanı bence Lamda ve Sorgu İfadeleri (SQL &amp; XQuery) 
<span id="more-59"></span></p>

<p>Özelliklerin bir kısmı söyle belirtilmiş Microsoft tarafından:
<h2><strong>Implicitly typed local variables</strong> (Kapalı tipli yerel değişkenler)</h2>
Bir değişkene atadığınız değerin ya da yapının tipinin belli olduğu durumlarda değişkenin tipini ayrıca belirtmenize gerek kalmayacak:
<pre class="prettyprint">var i = 5;
var s = "Hello";
var d = 1.0;
var numbers = new int[] {1, 2, 3};
var orders = new Dictionary();</pre>
Yukarıdaki kod aşağıdaki ile tamamen aynıdır
<pre class="prettyprint">int i = 5;
string s = "Hello";
double d = 1.0;
int[] numbers = new int[] {1, 2, 3};
Dictionary orders = new Dictionary();</pre>
Bu özellik sayesinde, foreach döngüsü de şu şekilde kullanılabilir::
<pre class="prettyprint">int[] numbers = { 1, 3, 5, 7, 9 };
foreach (var n in numbers) Console.WriteLine(n);</pre>
foreach için de ayrıca tipi tanımlamanıza gerek yok nasıl olsa numbers hep int&#8217;lerden oluşuyor.
<h2><strong>Extension methods</strong> (Genişletme metodları)</h2>
Delphi Dot Net&#8217;teki Helper Class&#8217;larla aynı kapıya çıkan yapılar. Yeni bir metod eklemek istediğiniz sınıfı değiştirmeden yazdığınız başka bir sınıfla yeni metodlar eklemenize olanak sağlıyor. Delphi&#8217;deki uyarı bunun içinde geçerli:
<span style="color: red;">Sadece çok mecbur kaldığınızda kullanın. Asla bir tasarım öğesi olarak kullanmayın</span></p>

<p>Aşağıdaki örnek int[] tipine Slice adında bir metod ekliyor
<pre class="prettyprint">namespace Acme.Utilities
{
    public static class Extensions
    {
        public static T[] Slice(this T[] source, int index, int count) {
            if (index &lt; 0 || count &lt; 0 || source.Length – index &lt; count)
                throw new ArgumentException();
            T[] result = new T[count];
            Array.Copy(source, index, result, 0, count);
            return result;
        }
    }
}</pre>
<pre class="prettyprint">int[] digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] a = digits.Slice(4, 3); // Extensions.Slice(digits, 4, 3) ile aynı işi yapar</pre>
<h2><strong>Lambda Expressions</strong> (Lambda İfadeleri)</h2>
Efendim, Phytonla hiç alakam olmadı ama duyduğuma göre phytonda fonksiyon döndüren lambda diye bir keyword varmış.</p>

<p>C# 3.0 bahsedilen Lambda ifadelerde bunun gibi bir iş yapıyor. Aslında bu az çok C++ macrolarına da benziyor ama çok daha gelişmiş bir şekli tabiî ki.
İster tip belirterek, ister belirtmeden generic fonksiyon gövdesi yazıyorsunuz. Tabi böyle yazılmış bir kodun okunabilirliği ne derece olur onu bilmiyorum ama esneklik bakımından çok şey katacağı kesin.
<pre class="prettyprint">class ItemList: List
{
    public int Sum(Func&lt;T,int> selector) {
        int sum = 0;
        foreach (T item in this) sum += selector(item);
        return sum;
    }
    public double Sum(Func&lt;T,int> selector) {
        double sum = 0;
        foreach (T item in this) sum += selector(item);
        return sum;
    }
}</pre>
Yukarıda ItemList adıyla bir sınıf tanımlanmış ve iki tane Sum metodu var. Sum metodu tüm Itemları parametre geçilen bir selector fonksiyonuna göre topluyor. Burada toplama işlemi için gerekli fonksiyonu da geçebildiğinize dikkat çekerim. Kullanımı da şöyle örneklenmiş:
<pre class="prettyprint">class Detail
{
    public int UnitCount;
    public double UnitPrice;
    ...
}
void ComputeSums() {
    ItemList orderDetails = GetOrderDetails(...);
    int totalUnits = orderDetails.Sum(d => d.UnitCount);
    double orderTotal = orderDetails.Sum(d => d.UnitPrice * d.UnitCount);
    ...
}</pre>
İlk toplam için sadece birim toplamını döndüren bir fonksiyon, ikinci toplam için birim fiyatının karesini döndüren bir fonksiyon geçilmiş oluyor. Dolayısıyla ilk toplam tüm item&#8217;ların birim toplamı olurken ikinci toplam ise tüm item&#8217;ların birim fiyatlarının kareleri toplamı oluyor.
<h2><strong>Object and collection initializers</strong> (Nesne ve Koleksiyon Başlatıcıları)</h2>
Bu özellikte yine programcıyı kod kalabalığından kurtarmak ve okunabilirliği arttırmak için eklenmiş zannımca:
<pre class="prettyprint">public class Point
{
    int x, y;
    public int X { get { return x; } set { x = value; } }
    public int Y { get { return y; } set { y = value; } }
}</pre>
Yukarı da bir Nokta sınıfı tanımlanmış ve X,Y adıyla iki tane propertysi mevcut. Public olarak tanımlandıkları için erişip değiştirmemiz mümkün. Bunu şöyle yapabiliriz
<pre class="prettyprint">Point p = new Point();
p.X = 4;
p.Y = 5;</pre>
ya da c# 3.0&#8242;da şöyle yapabiliriz:
<pre>var p = new Point {X=4,Y=5};</pre>
İkinci bir örnek ise şöyle verilebilir:
<pre class="prettyprint">public class Contact
{
    string name;
    List phoneNumbers = new List();
    public string Name { get { return name; } set { name = value; } }
    public List PhoneNumbers { get { return phoneNumbers; } }
}
var contacts = new List {
    new Contact {
        Name = "Chris Smith",
        PhoneNumbers = { "206-555-0101", "425-882-8080" }
    },
    new Contact {
        Name = "Bob Harris",
        PhoneNumbers = { "650-555-0199" }
    }
};</pre>
Yukarıdaki kodu aslen şöyle yazmalıydık:
<pre class="prettyprint">var contacts = new List();
var <strong>c1 = new Contact();
__c1.Name = "Chris Smith";
__c1.PhoneNumbers.Add("206-555-0101");
__c1.PhoneNumbers.Add("425-882-8080");
contacts.Add(</strong>c1);
var <strong>c2 = new Contact();
__c2.Name = "Bob Harris";
__c2.PhoneNumbers.Add("650-555-0199");
contacts.Add(</strong>c2);</pre>
<h2><strong>Query Expressions</strong> (Sorgu İfadeleri)</h2>
Koleksiyonlarda, arraylerde Hibernate&#8217;in HQL&#8217;sine benzer sorgular yazarak çalışabiliyoruz. Aslında bu C Omega ve LinQ karışımı bir şey olmuş. Sorgu ifadesi <em>from</em> kelimesiyle başlayıp <em>select</em> kelimesiyle sonlanıyor. Gruplama, süzme gibi işlemleri de belirtebiliyorsunuz.
<pre class="prettyprint">from c in customers
where c.City == "London"
select c.Name</pre>
Bu sorgu şu kodu yazmakla aynı :
<pre class="prettyprint">customers.
Where(c => c.City == "London").
Select(c => c.Name)</pre>
Doküman çokça yazım kuralı ve sorguların nasıl işleneceği üzerine odaklanmış. Hala geliştirilmekte olduğundan pek bir örnek mevcut değil şu an. İştah kabartıcı olduğu kesin!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/csharp-30-yenilikleri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dot Net ile T.C. Kimlik Sorgulama</title>
		<link>http://www.thexpot.net/2006/04/dot-net-ile-tc-kimlik-sorgulama/</link>
		<comments>http://www.thexpot.net/2006/04/dot-net-ile-tc-kimlik-sorgulama/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Delphi de <b>WSDL Importer</b> sihirbazı ile web servislerini kullanabilmek için gerekli kodu üretip projemizde kullanabiliyorduk. Benzer bir araç .Net Framework içinde de mevcut. ]]></description>
			<content:encoded><![CDATA[<p>Delphi de <strong>WSDL Importer</strong> sihirbazı ile web servislerini kullanabilmek için gerekli kodu üretip projemizde kullanabiliyorduk. Benzer bir araç .Net Framework içinde de mevcut. </p>

<p>Adı <strong>wsdl.exe</strong> ve kullanımı da çok basit. Parametre olarak sadece adresi geçiyorsunuz.</p>

<p>wdsl <a href="http://tckimlik.nvi.gov.tr/kpspublic.asmx?WSDL">http://tckimlik.nvi.gov.tr/kpspublic.asmx?WSDL</a></p>

<p>Sonuçta KPSPublicWebService.cs adıyla bir dosya elde ediyosunuz. Bunu projeye eklemeniz yeterli.
<pre class="prettyprint">
KPSPublicWebService ws = new KPSPublicWebService();
String tckimlikno = edtTCKimlikNo.Text;
TCKimlikNoDogrulamaSonucu sonuc = ws.TCKimlikNoDogrula(95464647544);
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/dot-net-ile-tc-kimlik-sorgulama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hbm2ddl</title>
		<link>http://www.thexpot.net/2006/04/old57/</link>
		<comments>http://www.thexpot.net/2006/04/old57/#comments</comments>
		<pubDate>Fri, 21 Apr 2006 13:18:01 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ant Script içinde <b>taskdef</b> ile yeni bir görev olarak belittiğiniz <b>hibernatetool</b> taginin içersinde kullanabileceğiniz altgörevlerden birinin adı <b>hbm2ddl</b>. Adı ise ne yaptığını açıklamaya yetiyor: HBM dosyalarını kullanarak bir DDL script oluşturmak.

build.xml scriptine aşağıdaki eklemeyi yapıp

<code lang="xml">
        <hibernatetool destdir="src">
            <configuration configurationfile="src/hibernate.cfg.xml">
                <fileset dir="src">
                    <include name="*.hbm.xml"/>
                </fileset>
            </configuration>
            <hbm2ddl 
                create="true" 
                update="true" 
                format="true" 
                outputfilename="ddl.sql" 
                delimiter=";"
            />
        </hibernatetool>
</code>]]></description>
			<content:encoded><![CDATA[<p>Ant Script içinde <b>taskdef</b> ile yeni bir görev olarak belittiğiniz <b>hibernatetool</b> taginin içersinde kullanabileceğiniz altgörevlerden birinin adı <b>hbm2ddl</b>. Adı ise ne yaptığını açıklamaya yetiyor: HBM dosyalarını kullanarak bir DDL script oluşturmak.</p>

<p>build.xml scriptine aşağıdaki eklemeyi yapıp</p>

<pre class='prettyprint'><code>&lt;hibernatetool destdir="src"&gt;
   &lt;configuration configurationfile="src/hibernate.cfg.xml"&gt;
     &lt;fileset dir="src"&gt;
    &lt;include name="*.hbm.xml"/&gt;
 &lt;/fileset&gt;
   &lt;/configuration&gt;
   &lt;hbm2ddl 
      create="true" 
      update="true" 
      format="true" 
      outputfilename="ddl.sql" 
      delimiter=";" /&gt;
&lt;/hibernatetool&gt;
</code></pre>

<p>çalıştırdığımızda console&#8217;da şöyle bir sonuç almamız lazım.</p>

<pre class='prettyprint'><code>Buildfile: C:\eclipse32\workspace\HibernateTest\build.xml
default:
[hibernatetool] Executing Hibernate Tool with a Standard Configuration
[hibernatetool] 1. task: hbm2ddl (Generates database schema)
[hibernatetool] create table Musteri (ID integer not null, AD varchar(20), SOYAD varchar(20), YAS integer, primary key (ID))
BUILD SUCCESSFUL
Total time: 4 seconds
</code></pre>

<p>Gördüğünüz gibi, Musteri tablosunun DDL bizim için hazırlandı.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/old57/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ant Script</title>
		<link>http://www.thexpot.net/2006/04/old55/</link>
		<comments>http://www.thexpot.net/2006/04/old55/#comments</comments>
		<pubDate>Fri, 21 Apr 2006 13:11:51 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Eclipse içinde zaten Ant Script editörü mevcut. Tek yapmanız gereken build.xml adıyla bir dosya oluşturmak ve içeriğini şu şekilde belirlemek:

<code lang="xml">
<?xml version="1.0"?>
<project name="project" default="default">
    <property name="hibernate.path" location="c:/eclipse32/hibernate"/>
    <property name="jaybird.path" location="c:/eclipse32/jaybird"/>
    <taskdef 
        name="hibernatetool" 
        classname="org.hibernate.tool.ant.HibernateToolTask">
        <classpath>
            <fileset dir="${hibernate.path}">
                <include name="*.jar"/>
                    <include name="lib/*.jar"/>
                    <include name="tools/*.jar"/>
            </fileset>
            <fileset dir="${jaybird.path}">
                <include name="*.jar"/>
            </fileset>
        </classpath>
    </taskdef>
    <target name="default" description="açıklama">
        <hibernatetool destdir="src">
            <configuration configurationfile="src/hibernate.cfg.xml">
                <fileset dir="src">
                    <include name="*.hbm.xml"/>
                </fileset>
            </configuration>
        </hibernatetool>
    </target>
</project>
</code>
Bu script dosyasını çalıştırmak için üzerine tıklayın Run As > Ant Build... seçeneğini veya editör açıkken Alt+Shift+X,Q kısayol tuşlarını kullanabilirsiniz.

Hibernate Tools ile ilgili detaylı açıklama ve bir el kitabı hibernate.org adresinde mevcut. O yüzden detaylara girmeyeceğim şimdilik.]]></description>
			<content:encoded><![CDATA[<p>Eclipse içinde zaten Ant Script editörü mevcut. Tek yapmanız gereken build.xml adıyla bir dosya oluşturmak ve içeriğini şu şekilde belirlemek:</p>

<pre class='prettyprint'><code>&lt;?xml version="1.0"?&gt;
&lt;project name="project" default="default"&gt;
    &lt;property name="hibernate.path" location="c:/eclipse32/hibernate"/&gt;
    &lt;property name="jaybird.path" location="c:/eclipse32/jaybird"/&gt;
    &lt;taskdef 
        name="hibernatetool" 
        classname="org.hibernate.tool.ant.HibernateToolTask"&gt;
        &lt;classpath&gt;
            &lt;fileset dir="${hibernate.path}"&gt;
                &lt;include name="*.jar"/&gt;
                    &lt;include name="lib/*.jar"/&gt;
                    &lt;include name="tools/*.jar"/&gt;
            &lt;/fileset&gt;
            &lt;fileset dir="${jaybird.path}"&gt;
                &lt;include name="*.jar"/&gt;
            &lt;/fileset&gt;
        &lt;/classpath&gt;
    &lt;/taskdef&gt;
    &lt;target name="default" description="açıklama"&gt;
        &lt;hibernatetool destdir="src"&gt;
            &lt;configuration configurationfile="src/hibernate.cfg.xml"&gt;
                &lt;fileset dir="src"&gt;
                    &lt;include name="*.hbm.xml"/&gt;
                &lt;/fileset&gt;
            &lt;/configuration&gt;
        &lt;/hibernatetool&gt;
    &lt;/target&gt;
&lt;/project&gt;
</code></pre>

<p>Bu script dosyasını çalıştırmak için üzerine tıklayın <code>Run As &gt; Ant Build...</code> seçeneğini veya editör açıkken Alt+Shift+X,Q kısayol tuşlarını kullanabilirsiniz.</p>

<p>Hibernate Tools ile ilgili detaylı açıklama ve bir el kitabı hibernate.org adresinde mevcut. O yüzden detaylara girmeyeceğim şimdilik.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/old55/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Kurulum</title>
		<link>http://www.thexpot.net/2006/04/old54/</link>
		<comments>http://www.thexpot.net/2006/04/old54/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Hibernate Tools, eclipse'e plugin olarak hazırlanmış olarak dağıtılıyor. Yani zip dosyası içindeki klasörleri eclipse'in içine kopyaladığınız zaman bu pluginleri kullanmaya başlayabilirsiniz. Ben Ant Script yoluyla bu araçları kullanmayı daha pratik buluyorum o yüzden bir build.xml dosyası hazırlamamız gerekecek. Bunu yapmadan önce indirdiğiniz zip doyasının içinde bulunan plugins\org.hibernate.eclipse_3.1.0.beta4\lib\tools\ klasörünün içindeki tüm jar dosyalarını hibernate'i kurduğunuz klasörün içine  tools diye bir klasör altına kopyalayın.]]></description>
			<content:encoded><![CDATA[<p>Hibernate Tools, eclipse&#8217;e plugin olarak hazırlanmış olarak dağıtılıyor. Yani zip dosyası içindeki klasörleri eclipse&#8217;in içine kopyaladığınız zaman bu pluginleri kullanmaya başlayabilirsiniz. Ben Ant Script yoluyla bu araçları kullanmayı daha pratik buluyorum o yüzden bir build.xml dosyası hazırlamamız gerekecek. Bunu yapmadan önce indirdiğiniz zip doyasının içinde bulunan plugins\org.hibernate.eclipse_3.1.0.beta4\lib\tools\ klasörünün içindeki tüm jar dosyalarını hibernate&#8217;i kurduğunuz klasörün içine  tools diye bir klasör altına kopyalayın.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/old54/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate Tools</title>
		<link>http://www.thexpot.net/2006/04/old53/</link>
		<comments>http://www.thexpot.net/2006/04/old53/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Şu ana kadar bir java sınıfı, bir veritabanı tablosu ve bir de bunları eşleyen Mapping Doyası (*.hbm.xml) dosyası oluşturduk. Tanım modelimizi (Domain model) geliştirdikçe veya değiştirdikçe tek tek bütün bu dosyalara uygulamamız gerekecek. Bu işlem çok vakit alır ve zaman kaybına neden olur. 

Hibernate için hazırladığımız eşleme dosyaları tamamen java sınıfı odaklıdır. Yani bu dosyaları tasarlarken hep java tarafından düşünmeliyiz. Veri tabanı ise sadece bunları saklamak için gerekli ve yeni bir model hazırlarken önemli değildir. İşte bu noktada Hibernate bize <a href="">Hibernate Tools</a> adıyla bir takım araçlar sunuyor. Bu araçları kullanarak eşleme dosyalarından DDL ve Java sınıflarını otomatik olarak oluşturabilirsiniz. ]]></description>
			<content:encoded><![CDATA[<p>Şu ana kadar bir java sınıfı, bir veritabanı tablosu ve bir de bunları eşleyen Mapping Doyası (*.hbm.xml) dosyası oluşturduk. Tanım modelimizi (Domain model) geliştirdikçe veya değiştirdikçe tek tek bütün bu dosyalara uygulamamız gerekecek. Bu işlem çok vakit alır ve zaman kaybına neden olur. </p>

<p>Hibernate için hazırladığımız eşleme dosyaları tamamen java sınıfı odaklıdır. Yani bu dosyaları tasarlarken hep java tarafından düşünmeliyiz. Veri tabanı ise sadece bunları saklamak için gerekli ve yeni bir model hazırlarken önemli değildir. İşte bu noktada Hibernate bize <a href="http://www.hibernate.org/255.html">Hibernate Tools</a> adıyla bir takım araçlar sunuyor. Bu araçları kullanarak eşleme dosyalarından DDL ve Java sınıflarını otomatik olarak oluşturabilirsiniz. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/old53/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kayıtları listelemek</title>
		<link>http://www.thexpot.net/2006/04/old52/</link>
		<comments>http://www.thexpot.net/2006/04/old52/#comments</comments>
		<pubDate>Thu, 20 Apr 2006 09:15:02 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Kod yazarak kayıtları listelemek istiyorsanız: Session sınıfının createQuery metodunu kullanmanız gerekir. 
Aşağıdaki örneği inceleyin.

<code lang="java">
import java.util.Iterator;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class Test1 {
  public static void main(String[] args) {
    Configuration conf = new Configuration();
    conf.addResource("Musteri.hbm.xml");
    SessionFactory sessionFactory = conf.configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    List list = session.createQuery("from Musteri").list();
    for (Iterator iter = list.iterator(); iter.hasNext();) {
        Musteri musteri = (Musteri) iter.next();]]></description>
			<content:encoded><![CDATA[<p>Kod yazarak kayıtları listelemek istiyorsanız: Session sınıfının createQuery metodunu kullanmanız gerekir.
Aşağıdaki örneği inceleyin.</p>

<pre class='prettyprint'><code>import java.util.Iterator;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;&lt;/code&gt;

public class Test1 
{
  public static void main(String[] args) 
  {
    Configuration conf = new Configuration();
    conf.addResource("Musteri.hbm.xml");
    SessionFactory sessionFactory = conf.configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    List list = session.createQuery("from Musteri").list();
    for (Iterator iter = list.iterator(); iter.hasNext();) 
    {
      Musteri musteri = (Musteri) iter.next();
      System.out.print(musteri.getId()+" ");
      System.out.print(musteri.getAd()+" ");
      System.out.print(musteri.getSoyad()+" ");
      System.out.println(musteri.getYas()+" ");
    }
    session.close();
  }
}
</code></pre>

<p>Dikkat ettiyseniz createQuery metodundan sonra list metodunu çağırıyoruz ve sonuç olarak da bize bir List arayüzü (interface) döndürülüyor. Tercihinize göre array(), iterator() metodlarını da kullanabilirsiniz. Eğer dönen kayıtlar üzerinde bir ileri bir geri gidebilmek istiyorsanız scroll() metodunu kullanın.</p>

<p>Parametreli sorgular da hazırlamanız mümkün. Örneğin:</p>

<pre class='prettyprint'><code>List list = session.createQuery("from Musteri where yas &amp;gt; :yas")
.setInteger("yas", 25)
.list();
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/old52/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kayıt girmek</title>
		<link>http://www.thexpot.net/2006/04/old51/</link>
		<comments>http://www.thexpot.net/2006/04/old51/#comments</comments>
		<pubDate>Wed, 19 Apr 2006 13:06:35 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Hibernate mapping açıklamalarına ve örneklerine girmeden hibernate'in neler yapabileceğine dair küçük bir fikriniz olması için küçük bir örnek yazalım.

Öncelikle, yapılandırmada belirttiğimiz veritabanına bağlanıp bir tablo oluşturalım.
<code lang="sql">
create table MUSTERI (
   id integer not null primary key,
   ad varchar(20),
   soyad varchar(20),
   yas smallint 
);
</code>

Tablomuzdaki her kayıt bir java sınıfına denk geleceği için Musteri adıyla bir java sınıfı oluşturmamız gerekiyor. Daha sonra bu tablo ile bu sınıfı eşleyeceğiz.]]></description>
			<content:encoded><![CDATA[<p>Hibernate mapping açıklamalarına ve örneklerine girmeden hibernate&#8217;in neler yapabileceğine dair küçük bir fikriniz olması için küçük bir örnek yazalım.</p>

<p>Öncelikle, yapılandırmada belirttiğimiz veritabanına bağlanıp bir tablo oluşturalım.</p>

<pre class='prettyprint'><code>create table MUSTERI (
   id integer not null primary key,
   ad varchar(20),
   soyad varchar(20),
   yas smallint 
);
</code></pre>

<p>Tablomuzdaki her kayıt bir java sınıfına denk geleceği için Musteri adıyla bir java sınıfı oluşturmamız gerekiyor. Daha sonra bu tablo ile bu sınıfı eşleyeceğiz.
<span id="more-51"></span></p>

<pre class='prettyprint'><code>public class Musteri {
    private int id;
    private String ad;
    private String soyad;
    private int yas;
    public String getAd() {
        return ad;
    }
    public void setAd(String ad) {
        this.ad = ad;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getSoyad() {
        return soyad;
    }
    public void setSoyad(String soyad) {
        this.soyad = soyad;
    }
    public int getYas() {
        return yas;
    }
    public void setYas(int yas) {
        this.yas = yas;
    }
}
</code></pre>

<p><em>Not</em>:Getter ve Setter metodlarını tek tek yazmak yerine, private alanları belirttikten sonra Eclipse&#8217;in <code>Source &gt; Generate Getter and Setter...</code>  seçeneğini kullanabilirsiniz.</p>

<p>Şimdi bu sınıfla veritabanımızdaki <code>MUSTERI</code> tablosunu eşleyecek mapping dosyasını hazırlamaya geldi. Hibernate.cfg.xml dosyasının bulunduğu klasöre <em>Musteri.hbm.xml</em> adında yeni bir dosya açın ve içeriğini şöyle belirleyin.</p>

<pre class='prettyprint'><code>&lt;?xml version='1.0' encoding='utf-8' ?&gt;
&lt;!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;
&lt;hibernate-mapping&gt;
  &lt;class name="Musteri"&gt;
    &lt;id name="id" column="ID" type="int"/&gt;
    &lt;property name="ad" column="AD" type="string" length="20" /&gt;
    &lt;property name="soyad" column="SOYAD" type="string" length="20" /&gt;
    &lt;property name="yas" column="YAS" type="int"/&gt;
  &lt;/class&gt;
&lt;/hibernate-mapping&gt;
</code></pre>

<p>Bu eşleme dosyasında yaptığımız tek şey Musteri sınıfındaki değişkenlerin hangi tablodaki hangi alanlara denk geldiğini belirtmek.</p>

<p>Artık veritabanımıza kayıt girebiliriz. Kodumuzu şu şekilde değiştirmemiz lazım:</p>

<pre class='prettyprint'><code>import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class Test1 {
  public static void main(String[] args) {
        Configuration conf = new Configuration();
        conf.addResource("Musteri.hbm.xml");
        SessionFactory sessionFactory = conf.configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        for (int i = 1; i &lt; 10; i++) {
            Musteri musteri = new Musteri();
            musteri.setId(i);
            musteri.setAd("Deneme "+i);
            musteri.setSoyad("Müşterisi");
            musteri.setYas(20+i);
            session.save(musteri);
        }
        tx.commit();
        session.close();
  }
}
</code></pre>

<p>Çalıştırıp bir bakın <code>MUSTERI</code> tablosuna yeni bir kayıt girilmiş mi diye.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/old51/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yapılandırma (Konfigürasyon)</title>
		<link>http://www.thexpot.net/2006/04/old50/</link>
		<comments>http://www.thexpot.net/2006/04/old50/#comments</comments>
		<pubDate>Wed, 19 Apr 2006 12:00:24 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Firebird + Hibernate kütüphanelerinin Eclipse'e nasıl ekleneceğini anlatalım:

Eclipse'e alışkın olmayanlar için adım adım neler yapılması gerektiğinden bahsedeceğim. İlk aşamada yapacaklarımız Hibernate ve Jaybird için gerekli JAR dosyalarını Kullanıcı Kütüphanesi (User Library) olarak Eclipse'e eklemek.

1)Hibernate ve JayBird'ü indirin.

<ol>
<li>Window > Preferences > Build Path > User Libraries ekranında, en sağda New... . düğmesine tıklayın.
<li>User Library Name olarak Hibernate yazın ve Ok'e tıklayın. Hibernate öğesi listede belirdikten sonra seçin ve sağ taraftaki Add Jar... düğmesine tıklayın.]]></description>
			<content:encoded><![CDATA[<p>Firebird + Hibernate kütüphanelerinin Eclipse&#8217;e nasıl ekleneceğini anlatalım:</p>

<p>Eclipse&#8217;e alışkın olmayanlar için adım adım neler yapılması gerektiğinden bahsedeceğim. İlk aşamada yapacaklarımız Hibernate ve Jaybird için gerekli JAR dosyalarını Kullanıcı Kütüphanesi (User Library) olarak Eclipse&#8217;e eklemek.
<span id="more-50"></span>
1)Hibernate ve JayBird&#8217;ü indirin.</p>

<p><ol>
<li>Window > Preferences > Build Path > User Libraries ekranında, en sağda New&#8230; . düğmesine tıklayın.
<li>User Library Name olarak Hibernate yazın ve Ok&#8217;e tıklayın. Hibernate öğesi listede belirdikten sonra seçin ve sağ taraftaki Add Jar&#8230; düğmesine tıklayın.
<li>Hibernati kurduğunuz klasöre gidin ve hibernate3.jar dosyasını seçip listeye ekleyin. Yalnız bu Jar dosyası yeterli değil. <em>lib</em> klasörü içinde bulunan
<ul>
<li>jdbc2_0-stdext.jar
<li>jta.jar
<li>antlr-XXX.jar
<li>asm.jar
<li>asm-attrs.jar
<li>commons-collections-XXX.jar
<li>commons-logging-XXX.jar
<li>dom4j-XXX.jar
<li>ehcache-XXX.jar
<li>cglib-XXX.jar
</ul>
<li>Jar dosylarını da eklemeniz gerekiyor.
Son görünüm şöyle olmalı:
<img src="img/hibernate1.png"></img>
<li>Jaybird içinde yeni bir User Library oluşturun ve içine jaybird-full-XXX.jar dosyasını ekleyin. Bu Jar dosyasının yanındaki + işaretine tıklayın ve  açılan listeden Native Library öğesine çift tıklayarak jaybird2.dll dosyasını seçin
</ol>
Yukarıdaki adımları tamamladıktan sonra yeni bir Java projesi oluşturun ve kütüphaneler sekmesinde Hibernate ve Jaybird öğelerini ekleyin.</p>

<p>Artık bu yeni proje içerisinde hibernate&#8217;i sorunsuz kullanabilmemiz lazım. Emin olmak için aşağıdaki kodu yazıp çalıştırın.</p>

<pre class='prettyprint'><code>import java.util.Properties;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;

public class Test1 {
  public static void main(String[] args) {
    Configuration conf = new Configuration();
    Properties props = new Properties();
    props.put(Environment.DRIVER , "org.firebirdsql.jdbc.FBDriver");
    props.put(Environment.URL, "jdbc:firebirdsql:localhost/3050:c:/test.fdb" );
    props.put(Environment.DIALECT, "org.hibernate.dialect.FirebirdDialect");
    props.put(Environment.USER, "SYSDBA");
    props.put(Environment.PASS, "masterkey");
    conf.addProperties(props);
    conf.addProperties(System.getProperties());
    conf.buildSessionFactory().openSession().close();
  }
}
</code></pre>

<p>Eğer console ekranında hiçbir Exception yazısı görmüyorsanız her şey çalışıyor demektir.</p>

<p>Hibernate bağlantısı için gerekli parametreler kodun içine yazıldı. Hibernate bu yapılandırmayı ayrı bir dosyadan da okuyabilir. Böylece farklı veritabanlarına bağlanmak için kodu değiştirmek yerine sadece yapılandırma dosyasını değiştirmemiz yeterli olur. </p>

<p>iki tip yapılandırma dosyası oluşturabilirsiniz. 
<ul>
<li>Hibernate 1 ve 2&#8242;de kullanılan hibernate.properties
<li>Hibernate 3 ile kullanılmaya başlayan <b>hibernate.cfg.xml</b>
</ul>
Biz hibernate.cfg.xml dosyasını kullanalım.
Projenizde Test1.java dosyasının bulunduğu paketin üstüne sağ tıklayarak New>File seçenekleri ile <b>hibernate.cfg.xml</b> adında yeni bir dosya oluşturun. </p>

<p>İçeriğini de şöyle belirleyin</p>

<pre class='prettyprint'><code>&lt;!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;

&lt;hibernate-configuration&gt;
   &lt;session-factory&gt;
        &lt;property name="hibernate.connection.driver_class"&gt;
                org.firebirdsql.jdbc.FBDriver
        &lt;/property&gt;
    &lt;property name="hibernate.connection.url"&gt;
                jdbc:firebirdsql:localhost/3050:c:/test.fdb
        &lt;/property&gt;
    &lt;property name="hibernate.connection.username"&gt;
                 SYSDBA
         &lt;/property&gt;
     &lt;property name="hibernate.connection.password"&gt;
                masterkey
         &lt;/property&gt;
     &lt;property name="dialect"&gt;
               org.hibernate.dialect.FirebirdDialect
         &lt;/property&gt;
     &lt;property name="show_sql"&gt;false&lt;/property&gt;
  &lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;
</code></pre>

<p>Daha önce yazdığımız Test1.java dosyasının içeriğini de artık değiştirebiliriz.</p>

<pre class='prettyprint'><code>import org.hibernate.cfg.Configuration;

public class Test1 {
  public static void main(String[] args) {
    Configuration conf = new Configuration();
    conf.configure()
            .buildSessionFactory()
            .openSession()
            .close();
  }
}
</code></pre>

<p>Hibernate&#8217;e diğer veritabanlarını kullanarak bağlantı kurmayı deneyebilirsiniz. Yapmanız gerekenler
<ul>
<li>Bağlantı kuracağınız veritabanının Jar dosyalarını projeye eklemek,
<li>Bağlantı için gerekli URL&#8217;yi değiştirmek
<li>Bu veritabanına ait dialect sınıfının yolunu yazmak. Bu dialectlerin bir listesi hibernate içindeki dokümanlarda belirtilmiştir.
<li>Kullanıcı adı ve şifreyi belirtmek
</ul></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/old50/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Hibernate</title>
		<link>http://www.thexpot.net/2006/04/old49/</link>
		<comments>http://www.thexpot.net/2006/04/old49/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Araçlar]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<a href="http://www.hibernate.org">Hibernate</a>, Java ile yazılmış ve özellikleri itibariyle de Java camiasında kabul görmüş ORM (Object Relation Mapping) katmanıdır. Hibernate, birçok veritabanıyla çalışabilir. Şu an için söyleyebileceklerim Hibernate'in yazılımcı için en büyük avantajı Domain Modelin (Tanım Modelinin) veritabanından soyutlanarak yazılmasına imkan tanımasıdır.  ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.hibernate.org">Hibernate</a>, Java ile yazılmış ve özellikleri itibariyle de Java camiasında kabul görmüş ORM (Object Relation Mapping) katmanıdır. Hibernate, birçok veritabanıyla çalışabilir. Şu an için söyleyebileceklerim Hibernate&#8217;in yazılımcı için en büyük avantajı Domain Modelin (Tanım Modelinin) veritabanından soyutlanarak yazılmasına imkan tanımasıdır.  <!--break--></p>

<p>Adım adım Hibernate ile neler yapılabileceğini açıklamaya çalışacağım. Örnekleri denemek ve çalıştırmak için  Eclipse kullanın. Konu başlıkları ise aşağıdaki gibi:</p>

<p><b>Henüz tamamlanmadı ve eklemeler devam edecek</b> (02.03.2008: Eklemeler devam etmeyecek <img src='http://www.thexpot.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/04/old49/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Designer Savaşları</title>
		<link>http://www.thexpot.net/2006/03/designer-savaslari/</link>
		<comments>http://www.thexpot.net/2006/03/designer-savaslari/#comments</comments>
		<pubDate>Fri, 10 Mar 2006 06:30:06 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Java ve .Net IDE'leri designer bakımından nerdeyse birbirinin aynı olmak üzere!]]></description>
			<content:encoded><![CDATA[<p>Java ve .Net IDE&#8217;leri designer bakımından nerdeyse birbirinin aynı olmak üzere!</p>

<p><img src="http://www.thexpot.net/img/matisse.png"></img><br />
Netbeans IDE&#8217;nin Matisse designerı</p>

<p><img src="http://www.thexpot.net/img/matisse4myeclipse.png"></img><br />
Eclipse&#8217;in bol pluginli ve 30$ ücretli derlemesi olan MyEclipse, Matisse&#8217;i Eclipse&#8217;e uydurmayı başarmış</p>

<p><img src="http://www.thexpot.net/img/vs2005.png"></img><br />
.NET&#8217;in designer&#8217;ı da Control Alignment yetilerine kavuşturulmuş.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/03/designer-savaslari/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>actionscript</title>
		<link>http://www.thexpot.net/2006/03/actionscript/</link>
		<comments>http://www.thexpot.net/2006/03/actionscript/#comments</comments>
		<pubDate>Fri, 03 Mar 2006 08:17:33 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[ActionScript bilmem ama flash ile başarılanları gördükçe oturup inceleyesim geliyordu. Macromedia Flash ile gelen help dosyalarını oturdum okudum ve ilk günün sonunda işte bu arcanoid benzeri oyun çıktı ortaya. Bu iş böyle mi yapılır bilmiyorum ama ben aklıma yattığı şekilde bir şeyler yapmaya çalıştım.]]></description>
			<content:encoded><![CDATA[<p>ActionScript bilmem ama flash ile başarılanları gördükçe oturup inceleyesim geliyordu. Macromedia Flash ile gelen help dosyalarını oturdum okudum ve ilk günün sonunda işte bu arcanoid benzeri oyun çıktı ortaya. Bu iş böyle mi yapılır bilmiyorum ama ben aklıma yattığı şekilde bir şeyler yapmaya çalıştım.<span id="more-41"></span></p>

<p>Buyrun <a href ="http://www.thexpot.net/files/flash1.zip">kaynak kod</a> burada.</p>

<p><object>
<param name="movie" value="http://www.thexpot.net/files/arcanoid.swf">
<embed src="http://www.thexpot.net/files/arcanoid.swf" width="500" height="350">
</embed>
</object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/03/actionscript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PostgreSQL üzerine</title>
		<link>http://www.thexpot.net/2006/02/postgresql-uzerine/</link>
		<comments>http://www.thexpot.net/2006/02/postgresql-uzerine/#comments</comments>
		<pubDate>Tue, 28 Feb 2006 14:56:35 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Veritabanı]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ingres, 1976 yılında Berkeley Üniversitesinde geliştirilmeye başlayan unix tabanlı RDBMS'dir. 1986 yılında Michael Stonebraker tarafından Ingres veritabanının bir uzantısı olarak geliştirilmeye başlanan RDBMS'ye postgres - <em>ingres'den sonra gelen, post-gres</em>- adını verdi. Bu projenin geliştirilmesindeki amaç "nesne ilişkili" bir yapı kullanarak veri saklamaktı. Aslında PostgreSQL ORDBMS olarak nitelendirilebilir.]]></description>
			<content:encoded><![CDATA[<p>Ingres, 1976 yılında Berkeley Üniversitesinde geliştirilmeye başlayan unix tabanlı RDBMS&#8217;dir. 1986 yılında Michael Stonebraker tarafından Ingres veritabanının bir uzantısı olarak geliştirilmeye başlanan RDBMS&#8217;ye postgres &#8211; <em>ingres&#8217;den sonra gelen, post-gres</em>- adını verdi. Bu projenin geliştirilmesindeki amaç &#8220;nesne ilişkili&#8221; bir yapı kullanarak veri saklamaktı. Aslında PostgreSQL ORDBMS olarak nitelendirilebilir.
Proje, 90&#8242;lı yıllara kadar geliştirilmeye devam etti. Daha sonra Michael StoneBreaker&#8217;ın asistanları 1996 yılında Postgres&#8217;i bir adım ileri taşıyarak PostgreSQL adıyla geliştirmeye devam ettiler. O zamandan bu zamana kadar bir çok özellikle zenginleştirilen PostgreSQL, sağlam yapısı ile nam salmıştır. Windows port&#8217;u ise 7. sürümde gerçekleşti.
PostgreSQL,
<ul>
    <li>Stored Procedures,</li>
    <li>Triggers,</li>
    <li>Primary/Foreign Keys</li>
    <li>Sequences,</li>
    <li>Views</li>
</ul>
özelliklerinin yanında
<ul>
    <li>Inheritance</li>
    <li>Operator Classes</li>
    <li>Partial Indices</li>
    <li>Rules</li>
</ul>
gelişmiş özelliklerde sunuyor.
<span id="more-38"></span>
Bu özelliklerden bazıları:
<strong>Stored Procedures</strong>
PostgreSQL&#8217;de stored procedure&#8217;ler PL/TCL, PL/pgSQL, Java, C++, Ruby, PHP gibi dillerde yazılabilir.
<pre class="prettyprint">create or replace function
   stok<em>performans2(kod varchar(10))
   returns double precision as $$
declare
  stok</em>islem<em>rec record;
  stok</em>rec record;
  performans  integer := 0;
  toplam integer := 0;
begin
  select into stok_rec * from stok where kod = ?kod;
  if not found then
     raise exception '% kodlu stok bulunamadı!',?kod;</p>

<p>for stok<em>islem</em>rec in
    select * from stok<em>islem
    where stok</em>kodu = ?kod
    loop
     if stok<em>islem</em>rec.tip = 1 then
        performans := performans
            + stok<em>islem</em>rec.miktar * fiyat * 2.7;
     else
        performans := performans
             + stok<em>islem</em>rec.miktar * fiyat;
     end if;
     toplam := toplam + 1;
  end loop;</p>

<p>return performans / toplam;
end;
$$ language plpgsql;</pre>
<strong>Partial Indices (Kısmi İndex)</strong>
Sadece belirli koşula sahip kayıtlar için index oluşturabilirsiniz. Örneğin stok<em>islem tablosunda 2006 yılına ait kayıtlar için bir index oluşturulabilir.
<pre class="prettyprint">create index idx</em>stok<em>islem</em>2006 on stok<em>islem(tarih)
  where extract(year from tarih) = 2006;</pre>
Dolayısıyla şişmiş bir stok</em>islem tablosunda tüm kayıtlar için bir index oluşturmak yerine yılları baz alarak index oluşturmak performansı arttıracaktır.</p>

<p><strong>Rules (Kurallar)</strong>
Tablodaki kayıtlar üzerinde yapılan işlemler için kurallar tanımlayabilirsiniz. Örneğin stok tablosundan bir kayıt silindiğinde log tablosuna bu işlemin kaydını tutan bir kural
<pre class="prettyprint">create or replace rule stok<em>rule as
   on delete to stok</em>islem
   do insert into stok<em>islem</em>log
      values(current<em>timestamp,'DEL',old.stok</em>kodu,current<em>user);</pre>
şeklinde yazılabilir. Tabi bu işlemler trigger kullanılarakta yapılabilir fakat bazı durumlarda trigger yerine rule tercih etmek performans kazancı sağlayabilir çünkü triggerlar genelde her kayıt için teker teker çalışırken rule&#8217;lar birden fazla kayıt için aynı anda kullanılabilir.
<strong>Geçici Tablolar</strong>
PostgreSQL select ifadeleri kullanarak  geçici veya kalıcı tablolar yaratmanıza izin verir.
<pre class="prettyprint">create temp table stok</em>yedek as select * from stok;</pre>
<strong>Import/Export (İthal/ihraç)</strong>
PostgreSQL&#8217;de bir tablodaki tüm veriler bir dosyaya kaydedebilir ve bir dosyadan geri yükleyebilirsiniz.
<pre class="prettyprint">copy stok to './stok.kopya';</pre>
<pre>copy stok from './stok.kopya';</pre>
<strong>Partioned Tables (Parçalanmış Tablolar)</strong>
PostgreSQL&#8217;de verilerin tamamını bir tabloda saklamak yerine verileri belli koşullara göre farklı tablolara kaydetmek mümkündür. Bunu yapmak için Inheritance ve Rule mekanizması kullanılır. Örneğin depo ve depo işlem diye tablolar oluşturalım.
<pre class="prettyprint">create table depo (
  id serial not null primary key,
  kod varchar(10),
  adi varchar(30)
);</p>

<p>create table depo<em>islem (
   id serial not null primary key,
   depo</em>id integer not null
      references depo(id)
      on delete restrict
      on update cascade,
   tip smallint,
   tarih date default current<em>date
);</pre>
Depo</em>islem tablosundaki kayıtları, kayıdın yılına göre depo<em>islem</em>2005, depo<em>islem</em>2006 adlı tablolara ayırmak istiyoruz. Bunun için depo<em>islem tablosundan bu tabloları türetmemiz lazım.
<pre class="prettyprint">create table depo</em>islem<em>2005() inherits(depo</em>islem);
create table depo<em>islem</em>2006() inherits(depo<em>islem);</pre>
Depo</em>islem<em>2005 ve 2006 tabloları depo</em>islem tablosuyla aynı alanlara sahip. Bu noktada depo<em>islem tablosuna kaydedilmek üzere yollanan kayıtları yılları baz alarak ayrıştırmamız lazım ve bunu rule ile yapabiliriz.
<pre class="prettyprint">create or replace rule depo</em>islem<em>2005</em>rule as
on insert to depo<em>islem
where extract(year from tarih) = 2005
do instead
  insert into depo</em>islem<em>2005(depo</em>id,tip,tarih)
  values(new.depo_id,new.tip,new.tarih);</p>

<p>create or replace rule depo<em>islem</em>2006<em>rule as
on insert to depo</em>islem
where extract(year from tarih) = 2006
do instead
  insert into depo<em>islem</em>2006(depo<em>id,tip,tarih)
  values(new.depo</em>id,new.tip,new.tarih);</pre>
Bu kadar. Çok fazla SQL yazmak gerekiyor ama sağlam bir yapı oluşturmaya çalışıyorsak bundan yakınmamalıyız.
<pre class="prettyprint">select * from depo<em>islem;
-- tüm depo</em>islem kayıtlarını döndürür.
select * from depo<em>islem</em>2006;
-- sadece 2006 yılına ait işlemleri döndürür.</pre>
Postgre SQL  <a href="http://www.postgresql.org" target="_blank">http://www.postgresql.org</a> adresinde ikamet etmektedir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/02/postgresql-uzerine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse nedir?</title>
		<link>http://www.thexpot.net/2006/01/eclipse-nedir/</link>
		<comments>http://www.thexpot.net/2006/01/eclipse-nedir/#comments</comments>
		<pubDate>Mon, 02 Jan 2006 08:19:56 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Eclipse hakkında yüzeysel bilgisi olan birisine "Eclipse nedir?" diye bir soru sorsanız büyük ihtimalle Java ile yazılım geliştirme aracı diyecektir. Aslında eclipse bundan daha fazlasıdır.  Eclipse IBM'in tüm yazılım geliştirme araçlarını tek bir çatı altında toplama isteğinin ürünüdür. Proje açık kodludur ve tamamen java ile geliştirilmiştir. Eclipse, eklentiler (extensions) ile genişletilebilir bir mimari gözetilerek geliştirilmiştir. ]]></description>
			<content:encoded><![CDATA[<p>Eclipse hakkında yüzeysel bilgisi olan birisine &#8220;Eclipse nedir?&#8221; diye bir soru sorsanız büyük ihtimalle Java ile yazılım geliştirme aracı diyecektir. Aslında eclipse bundan daha fazlasıdır.  Eclipse IBM&#8217;in tüm yazılım geliştirme araçlarını tek bir çatı altında toplama isteğinin ürünüdür. Proje açık kodludur ve tamamen java ile geliştirilmiştir. Eclipse, eklentiler (extensions) ile genişletilebilir bir mimari gözetilerek geliştirilmiştir. <span id="more-20"></span></p>

<p>Peki bu mimariyi sıradan plugin tabanlı mimarilerden ayıran özellik nedir? Eclipse&#8217;deki eklenti mekanizması; her eklentinin üzerine yeni bir eklenti yapılmasına izin verir. Yani, yazdığınız eklentiler her zaman çekirdek kodu değil, halihazırda bulunan bir eklentinin özelliklerini de genişletebilir. </p>

<p><img src="http://www.thexpot.net/img/eclipse_rcp.png"></img></p>

<p>Eclipse RCP (Rich Client Platform) pluginlerin otomatik olarak yüklenip çalışıtırılması için gerekli en küçük jar kümesidir <img src='http://www.thexpot.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  İsteyen şahıs ya da kurum kendi pluginlerini RCP&#8217;ye ekleyip ayrı bir ürün olarak dağıtabilir.</p>

<p>Eclipse RCP üzerine JDT ve PDE eklendiğinde de herkesin bildiği Java yazılım geliştirme aracı ortaya çıkar. (Eclipse SDK)</p>

<p><img src="http://www.thexpot.net/img/eclipse_sdk.png"></img></p>

<p>Eclipse dahilinde geliştirilen ufaklı projelerin bazıları:</p>

<dl><b>GEF (Graphical Editing Framework)</b> <dd>Görsel öğeler içeren yazılımlar oluşturmak için kullanılan çatı. WYSIWYG editör, akış diyagramları, UML tasarımı hatta Form Editör&#8217;ü yazılabilecek kadar esnek.</dd></dl>

<p><dl><b>VE (Visual Editor)</b> <dd>Swing ve SWT için form tasarımlarını kolaylaştıran, tasarım anında gerekli kodları oluşturan plugin. GEF ve UML2 projelerini kullanır.</dd></dl>
<dl><b>BIRT (Business Intelligence and Reporting Tools)</b> <dd>Band tabanlı rapor oluşturma ve tasarlama pluginleri. </dd></dl>
<dl><b>DTP (Data Tools Platform)</b><dd>Veritabanı bağlantı düzenleme, oluşturma ve tasarlama için gerekli tüm pluginler. SQL Editor, Query Builder gibi alt projeleri mevcut</dd></dl>
<dl><b>CDT (C/C++ Developer Tools)</b><dd>JDT&#8217;nin C/C++ için olanı.</dd></dl></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2006/01/eclipse-nedir/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SWT ve JFace</title>
		<link>http://www.thexpot.net/2005/11/swt-ve-jface/</link>
		<comments>http://www.thexpot.net/2005/11/swt-ve-jface/#comments</comments>
		<pubDate>Mon, 21 Nov 2005 12:22:49 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[IBM, <a href="http://www.eclipse.org">eclipse</a> projesine başladığında Swing kütüphanesinin performans açısından düşündükleri tarzda bir IDE oluşturmak için yeterli olmadığına karar verdi. Bu yüzden yeni bir GUI kütüphanesi yazdılar(SWT). Bu yeni kütüphanede çalışan kod yerel kod olduğu için performans açısından büyük bir kazanım oldu. Her işletim sistemi için SWT'nin özelleştirilmesi ile de platformdan bağımsızlık sağlandı. Drag&#38;Drop gibi işletim sistemine özgü yeteneklerden direk yararlanma imkanı doğdu. 

SWT sayesinde elde edilenler:
<ul>
<li><b>Performans</b>: Çalışan uygulamalar sanki çalıştırıldığı işletim sistemi için hazırlanmış gibi hızlı çalışabildiler.]]></description>
			<content:encoded><![CDATA[<p>IBM, <a href="http://www.eclipse.org">eclipse</a> projesine başladığında Swing kütüphanesinin performans açısından düşündükleri tarzda bir IDE oluşturmak için yeterli olmadığına karar verdi. Bu yüzden yeni bir GUI kütüphanesi yazdılar(SWT). Bu yeni kütüphanede çalışan kod yerel kod olduğu için performans açısından büyük bir kazanım oldu. Her işletim sistemi için SWT&#8217;nin özelleştirilmesi ile de platformdan bağımsızlık sağlandı. Drag&amp;Drop gibi işletim sistemine özgü yeteneklerden direk yararlanma imkanı doğdu. </p>

<p>SWT sayesinde elde edilenler:
<ul>
<li><b>Performans</b>: Çalışan uygulamalar sanki çalıştırıldığı işletim sistemi için hazırlanmış gibi hızlı çalışabildiler.
<li><b>Uyumluluk</b>: SWT ile hazırlanmış uygulamalar herhangi bir eklemeye gerek duymadan işletim sisteminin görünümü alabileceklerdi. Swing uygulamaları da Look&amp;Feel desteği içermekte ama bu görünümler önceden hazırlanmış kütüpheneler halinde. Eğer kullanıcı WindowBlind gibi üçüncü parti yazılımlarla işletim sisteminin görünümünü değiştirirse, swing uygulamaları buna tepki veremez ama SWT uygulamaları bu değişikliği anında yansıtır.
</ul></p>

<p>Swing&#8217;in en beğenilen tarafı ise MVC (Model-View-Controller) tasarım şablona bağlı kalınarak hazırlanmış olmasıydı. SWT ise Olay tabanlı (Event based) bir kütüphane olmuştu. Oluşturulan nesneler sistem kaynaklarını kullanıyor bu yüzden yok edildiklerinde ise dispose metodu ile bu kaynakların işletim sistemine geri verilmesi gerekiyordu. Basit bir pencere açmak için bir ton kod yazmak gerekiyor,<br />
Swingde Garbage collector&#8217;un yaptığı işler ise programlayana bırakılıyordu.</p>

<pre class='prettyprint'><code>import org.eclipse.swt.widgets.*;

public class MainWindow {
    public MainWindow() {
        final Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Main Window");
        shell.setBounds(100,100,400,400);
        shell.open();
        // Even Loop - Olay döngüsü
        while(!shell.isDisposed()) {
            display.readAndDispatch();
        }
        display.dispose(); // iş bittikten sonra yoket
    }

    public static void main(String[] args) {
        MainWindow mw = new MainWindow();
    }
}
</code></pre>

<p>Bu noktada programcılara yardımcı olması ve Eclipse geliştirilken oluşabilecek bir kaosu önlemek için yardımcı bir kütüphane oluşturuldu (JFace)</p>

<p>JFace, MVC ayrımını yapan bir çok sınıftan oluşturulmuş bir kütüphanedir.</p>

<p>Yukarıdaki örneği JFace kullanarak şu şekilde yazmak mümkün:</p>

<pre class='prettyprint'><code>import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class MainWindow2 extends ApplicationWindow {
    public MainWindow2() {
        super(null);
    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText("Main Window 2");
    }

    @Override
    protected Point getInitialLocation(Point initialSize) {
        return new Point(100,100);
    }

    @Override
    protected Point getInitialSize() {
        return new Point(400,400);
    }

    public static void main(String[] args) {
        MainWindow2 mw2 = new MainWindow2();
        mw2.setBlockOnOpen(true);
        mw2.open();
        Display.getCurrent().dispose();
    }
}
</code></pre>

<p>JFace&#8217;in belli başlı kazanımları
<ul>
<li><b>Action ve Contribution</b>: Kullanıcı ile iletişim sağlanması sırasında aynı kodun tekrar tekrar yazılması yerine merkezi bir kontrol tabakası oluşturmak için gerekli sınıflar. Mesela kullanıcının, bir menü öğesini seçmesi veya bir düğmeye tıklaması gibi işlemler ilişkilendirilmiş  Action sınıfa yönlendiriliyor.
<li><b>Dialog ve Wizard Pencereleri</b>: Uygulamalarda çok kullanılan belli tip pencereler sınıflar haline getirildi. TitleAreaDialog, MessageDialog, ErrorDialog vb..
<li><b>Viewerlar</b>: TreeView ve Table gibi widgetlar için Model oluşturulmasına olanak tanıyan sınıflar eklendi. TreeViewer, TableViewer vb.
</ul></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2005/11/swt-ve-jface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Expression Evaluation</title>
		<link>http://www.thexpot.net/2005/11/expression-evaluation/</link>
		<comments>http://www.thexpot.net/2005/11/expression-evaluation/#comments</comments>
		<pubDate>Thu, 17 Nov 2005 18:28:43 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Merhaba,

Recursion yöntemini kullanarak neler yapılabileceğini göstermek amacıyla
<blockcode highlight="off">
     12
  -------- + 6
   13 + 1

<hr />

<pre class='prettyprint'><code>28
</code></pre>

</blockcode>
gibi ifadeleri (Expression) hesaplayan örnek bir program yazalım dedim.

Program bölme ve toplama işlemlerini tanıyabilecek. Bölme için gerekli çizgiler ‘-‘ karakteri kullanılarak çizilecek.

İfadeler ya bölme ya toplama işlemi olacak o yüzden şöyle bir class hiyerarşisi oluşturuyoruz.

İlk olarak bütün ifadelerin hesaplama yapan bir metodu olmalı ve bu metod Real bir değer döndürmeli. O yüzden TExpression diye abstract bir class tanımlıyoruz ve içine Evaluate metodunu yazıyoruz.]]></description>
			<content:encoded><![CDATA[<p>Merhaba,</p>

<p>Recursion yöntemini kullanarak neler yapılabileceğini göstermek amacıyla</p>

<pre class='prettyprint'><code>   12
-------- + 6
 13 + 1
 ------
   28
</code></pre>

<p>gibi ifadeleri (Expression) hesaplayan örnek bir program yazalım dedim.</p>

<p>Program bölme ve toplama işlemlerini tanıyabilecek. Bölme için gerekli çizgiler ‘-‘ karakteri kullanılarak çizilecek.</p>

<p>İfadeler ya bölme ya toplama işlemi olacak o yüzden şöyle bir class hiyerarşisi oluşturuyoruz.</p>

<p>İlk olarak bütün ifadelerin hesaplama yapan bir metodu olmalı ve bu metod Real bir değer döndürmeli. O yüzden TExpression diye abstract bir class tanımlıyoruz ve içine Evaluate metodunu yazıyoruz.
<span id="more-4"></span></p>

<pre class='prettyprint'><code>TExpression =  class
public
  function Evaluate:Real;virtual;abstract;
end;
</code></pre>

<p>Tek başına yazılmış bir sayı da bir çeşit ifade olduğu için TExpression classından TSingleExpression adında bir class türetiyoruz</p>

<pre class='prettyprint'><code>TSingleExpression = class(TExpression)
private
  FValue : Real;
public
  function Evaluate: Real;override;
  constructor Create(AValue : Real);
end;
</code></pre>

<p>Bu classın Evaluate metodu çalışıtırıldığında Fvalue alanındaki değeri döndürecek.</p>

<p>Toplama işlemi için TAdditionExpression adıyla bir class daha tanımlıyoruz:</p>

<pre class='prettyprint'><code>TAdditionExpression = class(TExpression)
protected
  FLeft : TExpression;
  FRight: TExpression;
public
  function Evaluate: Real;override;
  constructor Create(Left,Right:TExpression);
  destructor Destroy;override;
end;
</code></pre>

<p>Bu classın evaluate metoduda Fleft ve Fright alanlarındaki Expression classlarının evaluate metodlarını çalıştırıp çıkan sonucu toplayarak döndürecek</p>

<p>Bölme işlemi de toplama işleminden çok farklı olmadığı için</p>

<pre class='prettyprint'><code>TDivisionExpression = class(TAdditionExpression)
public
  function Evaluate: Real;override;
end;
</code></pre>

<p>Program şöyle bir algoritma izleyecek:</p>

<pre class='prettyprint'><code>function Parse(Lines: TstringList):Texpression;
basla
  // bölme işlemi için
  eger &lt;&gt; basla
     &lt;&lt;İfadeyi o satırdan Sag ve Sol olamk üzere ikiye ayır&gt;&gt;
     Expr1 = parse(Sag);
     Expr2 = parse(Sol);
     Result := TDivisionExpression.Create(Expr1,Expr2);
     Exit;
  bitir;
  // toplama işlemi için
  eger &lt;&gt; basla
     &lt;&lt;İfadeyi o sütundan Ust ve Alt olam üzere ikiye ayır&gt;&gt;
     Expr1 = parse(Ust);
     Expr2 = parse(Alt);
     Result := TAdditionExpression.Create(Expr1,Expr2);
     Exit;
  bitir;
  // sayılar için
  eger &lt;&gt; basla
     Result := TSingleExpression.Create(Deger)
  bitir;
  // hiçbir koşula düşmediyse
  Hata;
bitir;
</code></pre>

<p>Hesaplama işlemi aşağıdaki kodla yapılabilecek</p>

<pre class='prettyprint'><code>var
  Exp : TExpression;
begin
Exp:=Parse(memo1.lines);
ShowMessage(FloatToStr(Exp.Evaluate));
End;
</code></pre>

<p>Metod çalıştırıldığında recursive olarak İfade Ağacı (Expression Tree) oluşturulacak.</p>

<p>Kaynak Kod: <a href="http://www.thexpot.net/files/memoevaluate.rar">memoevaluate.rar</a>
Çalıştırılabilir Dosya : <a href="http://www.thexpot.net/files/memoevaluate.exe.rar">memoevaluate.exe.rar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2005/11/expression-evaluation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backtracking</title>
		<link>http://www.thexpot.net/2005/11/backtracking/</link>
		<comments>http://www.thexpot.net/2005/11/backtracking/#comments</comments>
		<pubDate>Thu, 17 Nov 2005 17:25:09 +0000</pubDate>
		<dc:creator>ibrahim dursun</dc:creator>
				<category><![CDATA[Yazılar]]></category>
		<category><![CDATA[Algoritmalar]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Merhaba arkadaşlar,
İlk algoritma olarak kodlaması kolay ama kolay olduğu kadarda masraflı çok olan “Aynı yere geri dönme” (Backtrack) algoritmasını seçtim. Makelenin geri kalanında backtrack olarak söz edeceğim.

Backtrack algoritması özyineleme (recursion) desteklenen her dilde kodlanabilir ve basit bir algoritma olmasına rağmen de bir çok ufak iş için kullanılabilir. Bu algoritmanın dezavantajı maximum adım sayısı bilinmeyen durumlarda stackoverflow hatasına neden olabilmesidir.

Algoritmanın pseudo-code’u aşağıdaki gibi :
<code>
  procedure backtrack(i:integer;deger: integer);
  basla
    Eger sonuclardan-biriyse
      &#60;&#60; sonucla ilgili islemleri yap >>
    degilse
       her adaydeger icin backtrack(i+1,adaydeger);
    bitir;]]></description>
			<content:encoded><![CDATA[<p>Merhaba arkadaşlar,
İlk algoritma olarak kodlaması kolay ama kolay olduğu kadarda masraflı çok olan “Aynı yere geri dönme” (Backtrack) algoritmasını seçtim. Makelenin geri kalanında backtrack olarak söz edeceğim.</p>

<p>Backtrack algoritması özyineleme (recursion) desteklenen her dilde kodlanabilir ve basit bir algoritma olmasına rağmen de bir çok ufak iş için kullanılabilir. Bu algoritmanın dezavantajı maximum adım sayısı bilinmeyen durumlarda stackoverflow hatasına neden olabilmesidir.</p>

<p>Algoritmanın pseudo-code’u aşağıdaki gibi :</p>

<pre class='prettyprint'><code>procedure backtrack(i:integer;deger: integer);
basla
  Eger sonuclardan-biriyse
    &lt;&lt; sonucla ilgili islemleri yap &gt;&gt;
  degilse
    her adaydeger icin backtrack(i+1,adaydeger);
  bitir;
bitir;
</code></pre>

<p>Tabi ilk bakışta bu pseudo-code’dan her şeyi anlamak kolay değil, o yüzden hemen bir örnek verelim. Bu algoritmayı kullanarak bir kümenin bütün alt kümelerini oluştururalım. Kümemiz 1’den 5’e kadar olan sayılardan oluşsun. Algoritmada bahsi geçen her adım için adaylar true ve false değerlerini alacak. Yani herhangi bir indexdeki eleman o altkümenin içindeyse true değilse false olarak işaretlenecek. Eger adım sayısı kümenin eleman sayısına eşit olduysa tüm kombinasyonlar üretildi demektir, sonucu ekrana yazıyoruz. Eger adım sayısı kümenin eleman sayısından küçükse daha üretilmesi gerek kombinasyonlar var demektir, bizde bir sonraki adım için tüm olası değerleri veriyoruz.</p>

<pre class='prettyprint'><code>arr : array[1..5] of boolean;

procedure Recurse(i : integer; val:boolean);
var 
  j : integer;
begin
  arr[i]:= val;
  if (i=Length(arr)) then begin
    Write('{ ');
    for j := 0 to Length(Arr) do  if(arr[j]) then Write(j,' ');
    WriteLN(' }');
  end else begin
    recurse(i+1,true);
    recurse(i+1,false);
  end;
end;
begin
  recurse(1,true);
  recurse(1,false);
  readln;
end.
</code></pre>

<p>n elemanlı bir kümenin 2^n tane altkümesi vardır, dolayısıyla örneği çalıştırdığımızda 32 tane sonuç göreceğiz.</p>

<p>İkinci örnek olarak da bir string içindeki karakterlerin bütün permütasyonlarını oluşturalım. Yine aynı mantığı kullanıcaz ama bu sefer biraz daha fazla çalışmamız lazım.</p>

<pre class='prettyprint'><code>var
  str : string = 'ABC';

 procedure backtrack(str:string;i:integer);
 var
  j: integer;
  ch : char;
 begin
   if i = length(str) then begin
     WriteLn(str);
   end else begin
     for j := i to length(str) do begin
        ch := str[i];
        str[i] := str[j];
        str[j] := ch;
        backtrack(str,i+1);
     end;
   end;
 end;

begin
  backtrack(str,1);
  Readln;
end.
</code></pre>

<p>Örnekteki i değeri str değişkeninin uzunluğuna denk olduğunda bunu ekrana yazıyoruz, eğer değilse i ve length(Str) arasındaki karakterleri str değişkeninin i. karakteri ile değiştirip prosedürü tekrar çağırıyoruz.
Üç karakterden oluşan stringin toplam 3! = 6 tane permütasyonu olması lazım, yalnız biz bunu yaparken bütün karakterlerin birbirinden farklı olduğunu farzediyoruz. ‘AAA’ şeklinde tanımlanmış bir değişkende birbirinin aynısı olmasına rağmen 6 tane satır göreceğiz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thexpot.net/2005/11/backtracking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
