<?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>Barış Velioğlu&#039;nun Programlama Notları</title>
	<atom:link href="http://barisvelioglu.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://barisvelioglu.net</link>
	<description>Css, XHTML, JavaScript, C++, C#, JAVA ve diğer programlama dilleri</description>
	<lastBuildDate>Sun, 20 May 2012 22:25:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Regular Expression &#8211; Lookahead ve Lookbehind</title>
		<link>http://barisvelioglu.net/2012/05/21/regular-expression-lookahead-ve-lookbehind/</link>
		<comments>http://barisvelioglu.net/2012/05/21/regular-expression-lookahead-ve-lookbehind/#comments</comments>
		<pubDate>Sun, 20 May 2012 22:22:52 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[regex.replace]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=962</guid>
		<description><![CDATA[Geçen günlerde loglama için kullandığımız bir xml dosyasındaki 15 ya da 16 haneli olabilen bir numarayı maskelemem gerekiyordu. Aşağıdaki gibi bir xmlden, number elementi içerisindeki ifadeyi .NET&#8216;in Regex.Replace methodu ile ***&#8216;e dönüştürdüm. Bunu daha önce de bahsetmiş olduğum lookahead ve lookbehind yöntemlerini kullanarak gerçekleştirdim. Test xml 123456789101112 Uyguladığım yöntem Regex.Replace(xmlInput, @"(?< =>)\d{15,16}(?=< )", "***"); Sonuç [...]]]></description>
			<content:encoded><![CDATA[<p>Geçen günlerde loglama için kullandığımız bir xml dosyasındaki 15 ya da 16 haneli olabilen bir numarayı maskelemem gerekiyordu. Aşağıdaki gibi bir xmlden, number elementi içerisindeki ifadeyi <code>.NET</code>&#8216;in <code>Regex.Replace</code> methodu ile <code>***</code>&#8216;e dönüştürdüm. Bunu daha önce de bahsetmiş olduğum <a href="http://barisvelioglu.net/2011/10/10/biraz-regex/" target="_blank">lookahead ve lookbehind yöntemlerini</a> kullanarak gerçekleştirdim.  </p>
<pre class="brush:xml">
<root>
     <test>Test xml</test>
     <number>123456789101112</number>
</root>
</pre>
<p><strong>Uyguladığım yöntem</strong></p>
<pre class="brush:csharp">
Regex.Replace(xmlInput, @"(?< =>)\d{15,16}(?=< )", "***");
</pre>
<p><strong>Sonuç</strong></p>
</pre>
<pre class="brush:xml">
<root>
     <test>Test xml</test>
     <number>***</number>
</root>
</pre>
<p><strong>Açıklaması</strong></p>
<ul>
<li><strong>(?< =>)</strong> -> &#8220;>&#8221; ile başlayan (Positive lookbehind)</li>
<li><strong>\d{15,16}</strong> -> 15 ya da 16 haneli bir numara içeren</li>
<li><strong>(?=< )</strong> -> &#8220;< " ile biten (Positive lookahead)</li>
<p></strong></li>
</ul>
<p>Burada expression&#8217;ın positif olmasını sağlayan <code>=</code> işaretedir. Eğer <code>!</code> kullanılmış olsaydı negatif diyecektik, yani eşleşene değil, eşleşmeyene bakacaktık. <code>Lookbehind </code>ya da <code>lookahead </code>olmasını sağlayan şey işe <code>< </code> işaretedir. Eğer </code><code>< </code> işareti varsa </code><code>lookbehind</code>, yani arkana bak anlamı taşır. Lookahead için ise özel bir simge kullanılmaz.</p>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/05/21/regular-expression-lookahead-ve-lookbehind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript&#8217;de Var ve Function Tanımlamalarının Yukarı Taşınma Olayı</title>
		<link>http://barisvelioglu.net/2012/05/19/javascriptde-var-ve-function-tanimlamalarinin-yukari-tasinma-olayi/</link>
		<comments>http://barisvelioglu.net/2012/05/19/javascriptde-var-ve-function-tanimlamalarinin-yukari-tasinma-olayi/#comments</comments>
		<pubDate>Sat, 19 May 2012 14:27:08 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[Kısa Notlar]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=959</guid>
		<description><![CDATA[İşin ayrıntısına indikçe özellikle ülkemizde neden native javascript&#8217;le çok fazla ilgilenilmediğini daha iyi anlıyorum. CrossBrowser sıkıntılar bir yana, bu dili öğrenmek için diğer dillerde bildiklerinizi bir kenara bırakmanız gerekebiliyor. Hemen konuya girersek, sayfada ilgili javascript kodlarınız çalıştırılmadan önce değişkenler kapsamları doğrultusunda yukarı taşınıyorlar. Bir örnekle izah edeyim. if (!test) { var test = {}; } [...]]]></description>
			<content:encoded><![CDATA[<p>İşin ayrıntısına indikçe özellikle ülkemizde neden native javascript&#8217;le çok fazla ilgilenilmediğini daha iyi anlıyorum. CrossBrowser sıkıntılar bir yana, bu dili öğrenmek için diğer dillerde bildiklerinizi bir kenara bırakmanız gerekebiliyor.</p>
<p>Hemen konuya girersek, sayfada ilgili javascript kodlarınız çalıştırılmadan önce değişkenler kapsamları doğrultusunda yukarı taşınıyorlar. Bir örnekle izah edeyim. </p>
<pre class="brush:js">

if (!test) {
    var test = {};
}
</pre>
<p>Bu program sorunsuz bir şekilde çalışacaktır. Oysa test değişkinini ilgili if ifadesi içerisinde tanımlamıştık. Normalde <strong><em>Uncaught ReferenceError: test is not defined</em> </strong> isimli referans hatasını vermesini beklerdik. </p>
<p>Bu kodun çalışmasının sebebi javascript çalıştırılmadan hemen önce <strong>var</strong> ya da <strong>function</strong> gibi değişkenlerin atamalarını kapsamları doğrultusunda yukarıya taşıyor olmasıdır. Yani yukarıdaki kod aşağıdaki hale dönüştürüldükten sonra çalıştıralacaktır.</p>
<pre class="brush:js">

var test;

if (!test) {
    test = {};
}
</pre>
<p>Bu sebeple de kod ilk çalıştırıldığında test tanımlı ama değerini undefined olacaktır, undefined da javascript&#8217;de false değerini döndürücektir.  </p>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/05/19/javascriptde-var-ve-function-tanimlamalarinin-yukari-tasinma-olayi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>setTimeout&#8217;un Recursive Kullanımında Farkettiğim Ayrıntı &#8211; setInverval ile Arasındaki Fark</title>
		<link>http://barisvelioglu.net/2012/05/19/settimeoutun-recursive-kullanimi-setinverval-ile-arasindaki-fark/</link>
		<comments>http://barisvelioglu.net/2012/05/19/settimeoutun-recursive-kullanimi-setinverval-ile-arasindaki-fark/#comments</comments>
		<pubDate>Fri, 18 May 2012 22:55:23 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=947</guid>
		<description><![CDATA[Javascript&#8217;in bu iki timer fonksiyonu(setTimeout, setInterval) hakkında çok temel bilgiler vermeyeceğim, zira tekerleği tekrar tekrar anlatmaya gerek yok. En azından bu konudan farklı birşeyler öğrenerek ayrılmanızı diliyorum. Javascript&#8217;in yalnızca tek thread&#8216;de çalıştığını hatırlatarak, asenkron olaylar bir kuyruğa atılarak tek tek çalıştırılır. Yani gerçek manada aynı anda iki iş yapılamaz. Örneğin ilk iş bitmeden ikinci işe [...]]]></description>
			<content:encoded><![CDATA[<p>Javascript&#8217;in bu iki timer fonksiyonu(setTimeout, setInterval) hakkında çok temel bilgiler vermeyeceğim, zira tekerleği tekrar tekrar anlatmaya gerek yok. En azından bu konudan farklı birşeyler öğrenerek ayrılmanızı diliyorum.</p>
<p>Javascript&#8217;in yalnızca <strong>tek thread</strong>&#8216;de çalıştığını hatırlatarak,<strong> asenkron olaylar bir kuyruğa</strong> atılarak tek tek çalıştırılır. Yani gerçek manada aynı anda iki iş yapılamaz. Örneğin ilk iş bitmeden ikinci işe geçmek istemiyorsanız, setInterval tercihi çok doğru olmayacaktır. Zira setInterval ile belirlediğiniz süre içerisinde mevcut iş bitmemiş olabilir, ama bu durum gözardı edilir ve ikinci işe çoktan başlanmış olunur. Böylesi bir senaryo setTimeout recursive kullanılarak aşılabilir. Ancak bu da beklediğiniz aralıklarla işi gerçekleştirememiz anlamına gelebilir. </p>
<p>Ne demek bu ? Yani her saniye çalışacak bir recursive setTimeout kullanmanız durumunda, önce setTimeout&#8217;un içerisindeki fonksiyon çalıştırılacak daha sonra verilen süre kadar beklenip yeniden aynı fonksiyon çalıştırılacaktır. Bu da (fonksiyonun tamamlanma süresi + verilen bekleme süresi) demek oluyor.</p>
<p>Hemen bunu gerçekleştirecek bir fonksiyon yazdım ve olan oldu beklediğim gibi çalışmadı.</p>
<pre class="brush:js">

var i = 1;

var setTimeoutFunction = setTimeout(function(){
    console.log(i++);
    setTimeout(setTimeoutFunction,1000);
},1000);
</pre>
<p>İlk örnek konsole&#8217;a 1 yazıp bıraktı, beklediğim gibi fonksiyon kendisini çağırmadı. Bir de aşağıdaki gibi artık kullanılmayan yöntemle denedim.</p>
<pre class="brush:js">

var i = 1;

var setTimeoutFunction = setTimeout(function(){
    console.log(i++);
    setTimeout(arguments.callee,1000);
},1000);
</pre>
<p>Bu ise sorunsuz çalıştı. Sebep ise ilk örnekte setTimeoutFunction&#8217;ın fonksiyonun kendisini değil de ilgili değişkene integer unique bir değer döndürmesiydi. Bu değer daha sonra clearTimeout fonksiyonunda ilgili setTimeout fonksiyonunu çalışmaz hale getirmek için kullanılıyormuş. Bunun dışında derin bir manası yok bildiğim kadarıyla. Örneğin:</p>
<pre class="brush:js">

clearTimeout(setTimeoutFunction); //sayacı durdurur
</pre>
<p>Aynı recursive kullanımı bir de self executive fonksiyon ile yapıp konuyu noktalayalım.</p>
<pre class="brush:js">
var i = 1;
var stillRunning = true;

(function setTimeoutFunction(){
	console.log(i++);
	if(stillRunning)
	{
		setTimeout(setTimeoutFunction,1000);
	}
})();
</pre>
<p>Burada diğerlerinden farklı olarak stillRunning isimli global bir değişken tanımladım. Programlamatik olarak bu değişken setlenerek, ilgili recursive fonksiyon durdurulabilir.</p>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/05/19/settimeoutun-recursive-kullanimi-setinverval-ile-arasindaki-fark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tek Satır Çözümler &#8211; Extension Methodlar, Linq Sorgular</title>
		<link>http://barisvelioglu.net/2012/04/29/tek-satir-cozumler-extension-methodlar-linq-sorgular/</link>
		<comments>http://barisvelioglu.net/2012/04/29/tek-satir-cozumler-extension-methodlar-linq-sorgular/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 16:51:53 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=901</guid>
		<description><![CDATA[Yazdığınız kodda ne yapmak istediğinizi proje dışından biri pek zorluk yaşamadan anlayabiliyorsa doğru yolda ilerliyorsunuz demektir. Bu sebeple hatasız kod yazmak dışında, anlaşılabilir kod yazmak da oldukça önemli bir konu. Sadelik kuşkusuz anlaşılabilirliği arttıran en önemli hususlardan biri. Bu noktada bu yazıda zaman zaman uzun uzun yazdığımız kod bloklarını tek satır anlaşılabilir ifadelerle örneklemeye çalışacağım. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazdığınız kodda ne yapmak istediğinizi proje dışından biri pek zorluk yaşamadan anlayabiliyorsa doğru yolda ilerliyorsunuz demektir. Bu sebeple hatasız kod yazmak dışında, anlaşılabilir kod yazmak da oldukça önemli bir konu. Sadelik kuşkusuz anlaşılabilirliği arttıran en önemli hususlardan biri. Bu noktada bu yazıda zaman zaman uzun uzun yazdığımız kod bloklarını tek satır anlaşılabilir ifadelerle örneklemeye çalışacağım.</p>
<h3><strong><em>Örnek 1: Mevcut liste elamanları arasına ayraç koyma</em></strong></h3>
<pre class="brush:csharp">var httpStatus = new List&lt;string&gt;{"1xx Informational","2xx Success"
                 ,"3xx Redirection","4xx Client Error","5xx Server Error"};</pre>
<h3><strong>Yöntem 1</strong></h3>
<pre class="brush:csharp">var result = String.Empty;

foreach (var status in httpStatus) {
	if (String.IsNullOrEmpty(result))
		result = status;
	else
		result += ", " + status;
}</pre>
<h3><strong>Yöntem 2</strong></h3>
<pre class="brush:csharp">var result = string.Join(", ", httpStatus );</pre>
<p>&nbsp;<br />
&nbsp;</p>
<h3><strong><em>Örnek 2: Bir tipten başka bir tipe çevirme işlemi </em></strong></p>
<pre class="brush:csharp">List prices = new List&lt;int&gt;{100,200,300,400,500,600,610};</pre>
</h3>
<h3><strong>Yöntem 1</strong></h3>
<pre class="brush:csharp">var newPrices = new List&lt;double&gt;();

for (int i = 0; i &lt; prices.Count; i++)
{
	newPrices.Add(Convert.ToDouble(prices[i]));
}</pre>
<h3><strong>Yöntem 2</strong></h3>
<pre class="brush:csharp">var newPrices = prices.ConvertAll(p =&gt; Convert.ToDouble(p));</pre>
<p>&nbsp;<br />
&nbsp;<br />
<span id="more-901"></span></p>
<h3><strong><em>Örnek 3: Kurala göre yeni bir liste oluşturma</em></strong></h3>
<pre class="brush:csharp">List elements= new List&lt;int&gt;{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,61};</pre>
<h3><strong>Yöntem 1</strong></h3>
<pre class="brush:csharp">

var newList = new List&lt;int&gt;();

for (int i = 0; i &lt; elements.Count; i++){
     if (elements[i] &gt; 5 &amp;&amp; elements[i] &lt; 61)
     newList.Add(elements[i]);
}
</pre>
<h3><strong>Yöntem 2</strong></h3>
<pre class="brush:csharp">var newList= elements.Where(n =&gt; n &gt; 5 &amp;&amp; n &lt; 61 );</pre>
<p>&nbsp;<br />
&nbsp;</p>
<h3><strong><em>Örnek 4: Tekrarlayan kelimeleri ve kaç kere tekrarladığını bulmak</em></strong></h3>
<pre class="brush:csharp">string sentence = "Ali ata bak ama sonra ona bak sonra ...";</pre>
<h3><strong>Kısa Yöntem</strong></h3>
<pre class="brush:csharp">
var duplicates =
	from word in words
	group word.ToUpper() by word.ToUpper() into g
	where g.Count() > 1
	select new { g.Key, Count = g.Count() };
</pre>
<h3><strong>Sonuç</strong></h3>
<p><a href="http://barisvelioglu.net/wp-content/uploads/duplicate.png"><img src="http://barisvelioglu.net/wp-content/uploads/duplicate.png" alt="" title="duplicate" width="149" height="91" class="alignleft size-full wp-image-942" /></a></p>
<p>Böyle birşeyi normal yoldan yapmak şüphesiz içiçe fazlasıyla döngüye girmemize sebep olacaktı.</p>
<p>Şimdilik uyguladıklarım, kimisini ise nette görüp uygulama fırsatı bulamadığım güzel örnekler bunlar. Kullandıkça eklemeye devam edeceğim. Umarım!</p>
<p>&nbsp;<br />
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/04/29/tek-satir-cozumler-extension-methodlar-linq-sorgular/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Jam – Problem C. T9 Spelling</title>
		<link>http://barisvelioglu.net/2012/04/23/code-jam-%e2%80%93-problem-c-t9-spelling/</link>
		<comments>http://barisvelioglu.net/2012/04/23/code-jam-%e2%80%93-problem-c-t9-spelling/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 13:56:06 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=888</guid>
		<description><![CDATA[Bu kez mobile aygıtlarda sıkça kullandığımız T9 heceleme uygulamasının algoritması istenmiş. Özellikle her mesajın a-z arası 26 küçük harf ve boşluk ' ' içerdiği, ayrıca 0&#8242;a basılması durumunda ek boşluk bırakılması gerektiği belirtilmiş. Eğer aynı sırada iki karakter basmak isteniyorsa, ilk karakter basıldıktan sonra kullanıcının beklemesi gerekiyor. Bunu ifade etmek için de yine boşluk karakterinin [...]]]></description>
			<content:encoded><![CDATA[<p>Bu kez mobile aygıtlarda sıkça kullandığımız T9 heceleme uygulamasının algoritması istenmiş. Özellikle her mesajın <code>a-z arası 26 küçük harf</code> ve boşluk <code>' '</code> içerdiği, ayrıca 0&#8242;a basılması durumunda ek boşluk bırakılması gerektiği belirtilmiş. </p>
<p><a href="http://barisvelioglu.net/wp-content/uploads/indir.png"><img src="http://barisvelioglu.net/wp-content/uploads/indir.png" alt="" title="indir" width="164" height="234" class="alignleft size-full wp-image-893" /></a></p>
<p>Eğer aynı sırada iki karakter basmak isteniyorsa, ilk karakter basıldıktan sonra kullanıcının beklemesi gerekiyor. Bunu ifade etmek için de yine boşluk karakterinin <code>' '</code> basılması gerekiyor. Örn: <code>2 2 -> AA</code> değerini verirken, <code>22 -> B</code> değerini veriyor. </p>
<p><strong>Verilen Örnek</strong></p>
<p><a href="http://barisvelioglu.net/wp-content/uploads/codejam2.png"><img src="http://barisvelioglu.net/wp-content/uploads/codejam2.png" alt="" title="codejam2" width="466" height="150" class="alignleft size-full wp-image-892" /></a></p>
<p>Bu uygulamayı yine diğerlerine nazaran daha hakim olduğum C#&#8217;da gerçekleştirdim. 100 satırlık bir inputta yaklaşık 70 milisaniye sürüyor. Varsa siz de çözümlerinizi paylaşabilirsiniz.</p>
<pre class="brush:csharp">
            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();

            string[] numbers = new string[8] { "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };

            using (StreamReader sr = new StreamReader(@"c:\C-large-practice.in.txt"))
            {
                using (StreamWriter sw = new StreamWriter(@"c:\C-large-practice.out.txt"))
                {
                    int n = int.Parse(sr.ReadLine());

                    for (int i = 1; i < = n; i++)
                    {
                        string s = sr.ReadLine();

                        StringBuilder sb = new StringBuilder();

                        for (int k = 0; k < s.Length; k++)
                        {
                            int l = 0, indx = -1;

                            while (l < numbers.Length)
                            {
                                if (string.IsNullOrWhiteSpace(s[k].ToString()))
                                {
                                    if ((k-1 >= 0) &#038;&#038; string.IsNullOrWhiteSpace(s[k - 1].ToString()))
                                        sb.Append(" " + 0);
                                    else
                                        sb.Append(0);

                                    break;
                                }

                                if ((indx = numbers[l].IndexOf(s[k].ToString())) >= 0)
                                {
                                    for (int m = 0; m < = indx; m++)
                                        sb.Append(l + 2);

                                    break;
                                }

                                l++;
                            }

                            if (indx != -1 &#038;&#038; (k + 1 < s.Length) &#038;&#038; (numbers[l].Contains(s[k + 1].ToString())))
                                sb.Append(" ");
                        }

                        sw.WriteLine("Case #{0}: {1}", i, sb.ToString());
                        sb.Clear();
                    }
                }
            }

            stopWatch.Stop();
            Console.WriteLine(stopWatch.ElapsedMilliseconds);
</pre>
<p><a href="http://barisvelioglu.net/dosyalar/codejam/C-large-practice.in.txt" target="_blank">INPUT </a>ve <a href="http://barisvelioglu.net/dosyalar/codejam/C-large-practice.out.txt" target="_blank">OUTPUT </a>dosyalarını buradan indirebilirsiniz.</pre>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/04/23/code-jam-%e2%80%93-problem-c-t9-spelling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Jam &#8211; Problem B. Reverse Words</title>
		<link>http://barisvelioglu.net/2012/04/23/code-jam-problem-b-reverse-words/</link>
		<comments>http://barisvelioglu.net/2012/04/23/code-jam-problem-b-reverse-words/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 09:46:37 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=875</guid>
		<description><![CDATA[Yaklaşık 5 gün sonra Round 1A 2012 Google Code Jam yarışması başlıyor. Bu kez vakit bulabilirsem katılmayı düşünüyorum. Daha önceki yarışmalarda sorulmuş soruları inceleyerek en azından pratik yapmak istedim. Geçen yıl Google Code Jam Africa&#8217;da sorulmuş olan sorulardan birini C#&#8217;da çözerek işe başladım. Verilen Örnek Yukarıdaki input bize bir dosyada veriliyor ve sağdaki output isteniyor. [...]]]></description>
			<content:encoded><![CDATA[<p>Yaklaşık 5 gün sonra Round 1A 2012 Google Code Jam yarışması başlıyor. Bu kez vakit bulabilirsem katılmayı düşünüyorum. Daha önceki yarışmalarda sorulmuş soruları inceleyerek en azından pratik yapmak istedim. Geçen yıl Google Code Jam Africa&#8217;da sorulmuş olan sorulardan birini C#&#8217;da çözerek işe başladım.</p>
<p><strong>Verilen Örnek</strong></p>
<p><a href="http://barisvelioglu.net/wp-content/uploads/codejam1.png"><img src="http://barisvelioglu.net/wp-content/uploads/codejam1.png" alt="" title="codejam1" width="463" height="124" class="alignleft size-full wp-image-877" /></a></p>
<p>Yukarıdaki input bize bir dosyada veriliyor ve sağdaki output isteniyor. Basit bir reverse işlemi ama bu yarışma da çözüm kadar performasında önemli olduğunu gözardı etmemek lazım. Örneğin, geniş set bir input için 4 dakikayı aşan çözümler sonuç olarak doğru output&#8217;u versede, doğru kabul edilmiyor. Benim c# çözümüm aşağıdaki gibi oldu. 100 satırlık bir input için yaklaşık 4 milisaniye sürüyor. </p>
<p>Muhtemelen makine diline daha yakın diller performans açısından daha olumlu sonuç verecektir. Denemedim ama vakit bulursam en azından c&#8217;de deneyeceğim. Varsa siz de çözümlerinizi paylaşabilirsiniz.</p>
<pre class="brush:csharp">

            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();

            using (StreamReader sr = new StreamReader(@"c:\B-large-practice.in.txt"))
            {
                using (StreamWriter sw = new StreamWriter(@"c:\B-large-practice.out.txt"))
                {
                    int n = int.Parse(sr.ReadLine());

                    for (int i = 1; i < n; i++)
                    {
                        string[] str = sr.ReadLine().Split(' ');

                        StringBuilder sb = new StringBuilder();

                        for (int j = str.Length - 1; j >= 0; j--)
                        {
                            sb.Append(str[j] + " ");
                        }

                        sw.WriteLine("Case #{0}: {1}", i, sb.ToString());
                    }
                }
            }

            stopWatch.Stop();
            Console.WriteLine(stopWatch.ElapsedMilliseconds);
</pre>
<p><a href="http://barisvelioglu.net/dosyalar/codejam/B-large-practice.in.txt" target="_blank">INPUT </a> ve <a href="http://barisvelioglu.net/dosyalar/codejam/B-large-practice.out.txt" target="_blank">OUTPUT </a>dosyalarını buradan indirebilirsiniz.</p>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/04/23/code-jam-problem-b-reverse-words/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eşit Eşit Eşit de Neyin Nesi ?</title>
		<link>http://barisvelioglu.net/2012/04/15/esit-esit-esit-de-neyin-nesi/</link>
		<comments>http://barisvelioglu.net/2012/04/15/esit-esit-esit-de-neyin-nesi/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 15:15:03 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=866</guid>
		<description><![CDATA[Javascript&#8217;de === , !== operatörleri katı karşılaştırma operatörleri ( strict comparison operators ) olarak bilinirler.  == ve != ile tip bağımsız karşılaştırmalar yapabilirken, bu operatörler karşılaştırma yaparken tipleri gözardı etmez. Aşağıdaki örnek üzerinden bunlar arasındaki farkı daha iyi anlayabileceksiniz. C#&#8217;da ya da JAVA&#8217;da bu tip operatörler bulunmamakla birlikte, eğer olsaydı herhalde şunun gibi birşey olurdu. bool TripleEqual(object [...]]]></description>
			<content:encoded><![CDATA[<p>Javascript&#8217;de <code>=== , !==</code> operatörleri katı karşılaştırma operatörleri ( strict comparison operators ) olarak bilinirler.  <code>== ve !=</code> ile tip bağımsız karşılaştırmalar yapabilirken, bu operatörler karşılaştırma yaparken tipleri gözardı etmez.</p>
<p>Aşağıdaki örnek üzerinden bunlar arasındaki farkı daha iyi anlayabileceksiniz.</p>
<p><a href="http://barisvelioglu.net/wp-content/uploads/equalequalequak.jpg"><br />
<img class="alignleft size-full wp-image-869" title="equalequalequak" src="http://barisvelioglu.net/wp-content/uploads/equalequalequak.jpg" alt="" width="187" height="169" /></a></p>
<p>C#&#8217;da ya da JAVA&#8217;da bu tip operatörler bulunmamakla birlikte, eğer olsaydı herhalde şunun gibi birşey olurdu.</p>
<pre class="brush:csharp">
bool TripleEqual(object obj1, object obj2)
{
        return obj1.GetType() == obj2.GetType() &#038;&#038; obj1.Equals(obj2);
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/04/15/esit-esit-esit-de-neyin-nesi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Belirlediğiniz Kolonlara Göre Tekrarlayan Satırları İlgili Tablodan Silmek (Delete Duplicate Rows in a  Table)</title>
		<link>http://barisvelioglu.net/2012/04/15/belirlediginiz-kolonlara-gore-tekrarlayan-satirlari-ilgili-tablodan-silmek-delete-duplicate-rows-in-a-table/</link>
		<comments>http://barisvelioglu.net/2012/04/15/belirlediginiz-kolonlara-gore-tekrarlayan-satirlari-ilgili-tablodan-silmek-delete-duplicate-rows-in-a-table/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 10:03:36 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=851</guid>
		<description><![CDATA[Zaman zaman veritabanına script geçerken use BuVeritabanı yerine use ŞuVeritabanı diyerek, tablolarda birden fazla tekrarlayan alana sebebiyet vermem nedeniyle bu tekrarlayan alanları silecek bir SP (Store procedure) yazmaya karar verdim. Önceden basit bir sql sorgusu ile bunu hallederken, daha dinamik birşeyler oluşturmak istedim ve herşey bununla başladı. Bir yandan yeni birşeyler öğrenirken, diğer yandan bildiklerimi [...]]]></description>
			<content:encoded><![CDATA[<p>Zaman zaman veritabanına script geçerken <strong>use BuVeritabanı</strong> yerine <strong>use ŞuVeritabanı</strong> diyerek, tablolarda birden fazla tekrarlayan alana sebebiyet vermem nedeniyle bu tekrarlayan alanları silecek bir SP (Store procedure) yazmaya karar verdim. Önceden basit bir sql sorgusu ile bunu hallederken, daha dinamik birşeyler oluşturmak istedim ve herşey bununla başladı. Bir yandan yeni birşeyler öğrenirken, diğer yandan bildiklerimi pekiştirme fırsatı buldum.</p>
<p><strong>1-</strong> Sql cümlelerinde from&#8217;dan sonra @Degisken kullanamıyoruz. Örn: (Select * from @TableName &#8212; HATALI)<br />
<strong>2-</strong> Temp tablolar mevcut tablonun kopyasını oluşturur, onları işaret etmezler. Bu da temp tablolar üzerinde yapılacak delete, update, insert gibi işlemlerin yalnızca temp tabloya etki edeceğiniz.<br />
<strong>3-</strong> View ise ilgili tablodaki alanlara işaret eder. Tablo güncellendiği an view güncellenir ; view&#8217;de bir işlem yapılırsa asıl tablo güncellenir.</p>
<p>Aşağıdaki store procedure ilk parametre olarak tablo adı, ikinci parametre olarak bir ya da birden fazla kolon adı, üçüncü parameter olarak hangi kolona göre sıralama yapacağı, son olarak da bu sıralamanın artan mı(ASC) azalan mı(DESC) olacağını belirtiyor. 3. ve 4. parametre opsiyonel olmakla birlikte, girilmedikleri takdirde mevcut sıra korunarak işlem yapılıyor.</p>
<p>Sonuç olarak ilgili tablo için kolon adlarına göre gruplandırma yaparak, tekrarlayan alanları buluyor ve siliyoruz.</p>
<pre class="brush:sql">

	create proc DeleteDuplicateRows
	(
		@TableName varchar(100),
		@Columns varchar(100),
		@OrderBy varchar(100) = '(select 0)',
		@Sort varchar(10) = ''
	)
	as
		declare @Sql varchar(max)
		set @Sql = 'create view DuplicatedValueView select ROW_NUMBER() over (partition by ' + @Columns + ' order by ' + @OrderBy + ' ' + @Sort + ') as RowNumber from ' + @TableName
		exec(@sql)
		set @Sql = 'delete from DuplicatedValueView where RowNumber > 1'
		exec(@Sql)
		set @Sql = 'drop view DuplicatedValueView'
		exec(@Sql)
</pre>
<p>Aşağıdaki sorgu ile ilk adı, soyadı ve doğum tarihi alanlarına göre partition by özelliğini kullanarak gruplandırma yapıyoruz. Bu gruplandırmayı da eklenme tarihine göre artan sırayla sıralıyoruz. İlk ad, soyad ve doğum tarihi aynı olan satırlardan sonradan eklenmiş olan satırların tümünü siliyoruz.</p>
<pre class="brush:sql">
exec DeleteDublicateRows 'Member','FirstName, LastName, Birthdate', 'InsertTime', 'ASC'
</pre>
<p>İyi çalışmalar,</p>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/04/15/belirlediginiz-kolonlara-gore-tekrarlayan-satirlari-ilgili-tablodan-silmek-delete-duplicate-rows-in-a-table/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bir Veritabanındaki Tabloyu Sql İfadesi ile Farklı Bir Veritabanına Kopyalama</title>
		<link>http://barisvelioglu.net/2012/01/20/bir-veritabanindaki-tabloyu-sql-ifadesi-ile-farkli-bir-veritabanina-kopyalama/</link>
		<comments>http://barisvelioglu.net/2012/01/20/bir-veritabanindaki-tabloyu-sql-ifadesi-ile-farkli-bir-veritabanina-kopyalama/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 22:49:08 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[tablo oluşturma]]></category>
		<category><![CDATA[tablo taşıma]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=836</guid>
		<description><![CDATA[Sql Server&#8217;da herhangi bir veritabanındaki bir tabloyu verileriyle ya da verileri olmadan başka bir veritabanında da oluşturmak istediğimde genellikle Sql Server&#8217;ın Generate Scripts özelliğinden yararlanıyordum. Ancak bu işlemi direkt olarak bir sql ifadesi yazarak yapmak da mümkün. Select * Into YeniTestDB.dbo.YeniFilmler From Filmler Where 1 = 2 Bu ifade ile Filmler isimli tablo YeniTestDB isimli [...]]]></description>
			<content:encoded><![CDATA[<p>Sql Server&#8217;da herhangi bir veritabanındaki bir tabloyu verileriyle ya da verileri olmadan başka bir veritabanında da oluşturmak istediğimde genellikle Sql Server&#8217;ın Generate Scripts özelliğinden yararlanıyordum. Ancak bu işlemi direkt olarak bir sql ifadesi yazarak yapmak da mümkün.</p>
<pre class="brush:sql">
Select * Into YeniTestDB.dbo.YeniFilmler
         From Filmler
         Where 1 = 2
</pre>
<p>Bu ifade ile Filmler isimli tablo YeniTestDB isimli veritabanında da oluşturulmuş oldu. Ancak yazmış olduğunuz where ifadesi sayesinde mevcut tablodaki verilerin aktarılmasını engellendi. </p>
<p>Eğer buradaki where ifadesi kaldırılırsa bu kez verileriyle birlikte Filmler isimli tablo, YeniTestDB isimli veritabanında oluşturulmuş olacaktı. </p>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/01/20/bir-veritabanindaki-tabloyu-sql-ifadesi-ile-farkli-bir-veritabanina-kopyalama/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ConnectionString&#8217;i UI Yardımıyla Yazmak</title>
		<link>http://barisvelioglu.net/2012/01/17/connectionstring-yazilisini-hatirlayamamak/</link>
		<comments>http://barisvelioglu.net/2012/01/17/connectionstring-yazilisini-hatirlayamamak/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 04:20:24 +0000</pubDate>
		<dc:creator>Barış Velioğlu</dc:creator>
				<category><![CDATA[Kısa Notlar]]></category>
		<category><![CDATA[connection string]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://barisvelioglu.net/?p=827</guid>
		<description><![CDATA[Çok sık kopyalanıp yapıştırılan birşey olduğu için mi, her projede genelde bir sefer yazıldığı için mi, yoksa farklı bir özel nedeni var mı bilemiyorum ancak ConnectionString&#8217;in yazılışını genelde sıkça unutuyorum. Bu sebeple şimdiye kadar ConnectionStrings.com isimli siteden sıkça yararlanıyordum. Ancak geçenlerde bana daha basit gelen bir yöntem öğrendim. Windows kullanıyorsanız eğer, adı önemli olmamakla birlikte [...]]]></description>
			<content:encoded><![CDATA[<p>Çok sık kopyalanıp yapıştırılan birşey olduğu için mi, her projede genelde bir sefer yazıldığı için mi, yoksa farklı bir özel nedeni var mı bilemiyorum ancak ConnectionString&#8217;in yazılışını genelde sıkça unutuyorum. Bu sebeple şimdiye kadar <a href="http://www.connectionstrings.com/" target="_blank">ConnectionStrings.com</a> isimli siteden sıkça yararlanıyordum. Ancak geçenlerde bana daha basit gelen bir yöntem öğrendim.</p>
<p>Windows kullanıyorsanız eğer, adı önemli olmamakla birlikte uzantısı udl (universal data link) olan bir dosya oluşturun ve oluşturulan dosyayı çift tıkla açın.</p>
<p><strong>Karşınıza aşağıdaki gibi, veritabanı ayarlarını yapabileceğiniz bir panel açılacak.<br />
</strong></p>
<p><a href="http://barisvelioglu.net/wp-content/uploads/connectionstring.jpg"><img src="http://barisvelioglu.net/wp-content/uploads/connectionstring.jpg" alt="" title="connectionstring" width="367" height="464" class="aligncenter size-full wp-image-828" /></a></p>
<p>Buradan veritabanı bağlantınız için gerekli tüm ayarları yaptıktan sonra dosyayı bir notepad aracılığıyla açın. ConnectionString karşınızda.</p>
<p><code>[oledb]<br />
; Everything after this line is an OLE DB initstring<br />
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TestDB;Data Source=TRABZON</code></p>
]]></content:encoded>
			<wfw:commentRss>http://barisvelioglu.net/2012/01/17/connectionstring-yazilisini-hatirlayamamak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

