<?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; Programlama</title>
	<atom:link href="http://www.thexpot.net/tag/programlama/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>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>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>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>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>
	</channel>
</rss>
