<?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>anlak</title>
	<atom:link href="http://www.anlak.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.anlak.com</link>
	<description>bilinmeyen zamana atfen</description>
	<lastBuildDate>Mon, 06 Feb 2012 10:38:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Temel Bileşenler Analizi (PCA) çıkarımı</title>
		<link>http://www.anlak.com/temel-bilesenler-analizi-pca-cikarimi/</link>
		<comments>http://www.anlak.com/temel-bilesenler-analizi-pca-cikarimi/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 17:49:12 +0000</pubDate>
		<dc:creator>bitkidoku</dc:creator>
				<category><![CDATA[matematik]]></category>
		<category><![CDATA[çıkarım]]></category>
		<category><![CDATA[pca]]></category>
		<category><![CDATA[tba]]></category>
		<category><![CDATA[temel bileşen]]></category>
		<category><![CDATA[varyans]]></category>

		<guid isPermaLink="false">http://www.anlak.com/?p=120</guid>
		<description><![CDATA[Sevgili dostum İsmail Arı şuradaki yazısında PCA hakkında kapsamlı ve güzel bilgiler veriyor. İsmail yazısında kovaryans matrisini diyagonal hale getirecek dönüşüm üzerinden çıkarımı yapıyor. Ben problemi farklı bir açıdan ele alıp, PCA yapmak için neden özvektörleri bulmamız gerektiğini varyansın maksimizasyonu ile göstereceğim. Elimden geldiğince basit anlatmaya çalışacağım, mümkün olduğunca az süslü hatta Yunan alfabesinden olmayan [...]]]></description>
			<content:encoded><![CDATA[<p>Sevgili dostum İsmail Arı <a title="temel bileşenler analizi" href="http://ismailari.com/blog/temel-bilesenler-analizi/" target="_blank">şuradaki yazısı</a>nda PCA hakkında kapsamlı ve güzel bilgiler veriyor. İsmail yazısında kovaryans matrisini diyagonal hale getirecek dönüşüm üzerinden çıkarımı yapıyor. Ben problemi farklı bir açıdan ele alıp, PCA yapmak için neden özvektörleri bulmamız gerektiğini varyansın maksimizasyonu ile göstereceğim. Elimden geldiğince basit anlatmaya çalışacağım, mümkün olduğunca az süslü hatta Yunan alfabesinden olmayan harfler kullanacağım, buna rağmen anlamak için konu hakkında birazcık altyapıya sahip olmanız gerekebilir. Yine de yazının uzunluğu gözünüzü korkutmasın, yeterince anlaşılır olmak adına bilerek fazla açıklama yaptığımdan uzadı, içeriğin yeterince basit olduğunu umuyorum.</p>
<p>İlkin problemimizi tanımlayalım. Elimizde bir kısım veri var ve öyle bir dönüşüm yapmak istiyoruz ki, bu dönüşümün sonunda elimizdeki örnekler birbirinden mümkün olduğunca ayrılmış, dağılmış, saçılmış olsun.</p>
<p>Problemi matematiksel olarak ifade edelim. Elimizde $n$ adet veri örneği olsun. Her sütun bir veri örneğine denk gelecek şekilde $X$ matrisini oluşturalım. Dönüşüm matrisimiz $w$ olsun. Bu dönüşümün ($w^TX$) sonunda saçılımın en fazla olmasını istiyoruz.</p>
<p><a href="http://www.anlak.com/wp-files/pca.png"><img class="size-full wp-image-272 alignnone" title="pca" src="http://www.anlak.com/wp-files/pca.png" alt="" width="400" height="316" /></a></p>
<p>İlkin tek boyuta indirecek dönüşümü $w_1$ ele alalım. Bu dönüşümün sonucunda elde ettiğimiz yeni değişkenlere de $z_1$ diyelim. Öyle bir dönüşüm arıyoruz ki, $z_1$ için saçılımın en fazla olmasını istiyoruz:<br />
$$<br />
\arg\max\limits_{w_1} \; \text{Var}(z_1)<br />
$$</p>
<p>Başka bir deyişle:<br />
$$<br />
\arg\max\limits_{w_1} \; \text{Var}(w_1^TX)<br />
$$</p>
<p>$$<br />
\newcommand{\E}{\mathop{\mathbb E}}<br />
\renewcommand{\&lt; }{\left&lt;}<br />
\renewcommand{\&gt;}{\right&gt;}<br />
\newcommand{\Var}{\text{Var}}<br />
\newcommand{\CovSym}{\mathbf{\Sigma}}<br />
$$</p>
<p>Varyansın tanımını hatırlayalım, $\&lt; \cdot\&gt;$ beklenen değer operatörü olmak üzere:<br />
$$<br />
\Var(x) = \&lt; (x-\mu)^2\&gt;<br />
$$</p>
<p>İzdüşümden sonraki varyansı yerine koyalım, ortalamanın da aynı dönüşüme tabi olduğuna dikkatinizi çekerim:<br />
$$<br />
\begin{align*}<br />
\Var(w^TX) &amp;= \&lt; (w^TX-w^T\mu)^2\&gt; \\<br />
&amp;= \&lt; w^T(X-\mu)(X-\mu)^Tw \&gt; \\<br />
&amp;= w^T \&lt; (X-\mu)(X-\mu)^T \&gt; w\\<br />
\end{align*}<br />
$$</p>
<p>$\&lt; (X-\mu)(X-\mu)^T\&gt;$ ifadesinin kovaryansa, $\CovSym$, karşılık geldiğini biliyoruz (bilmiyorsak <a title="Kovaryans matrisi" href="http://tr.wikipedia.org/wiki/Kovaryans_matrisi" target="_blank">bakıp</a> öğreniyoruz), o halde:</p>
<p>$$<br />
\Var(w^TX) = w^T\CovSym w<br />
$$</p>
<p>Bu bulduğumuzu yerine koyduğumuz zaman, esas problemimiz şu hale gelmiş oldu:</p>
<p>$$<br />
\arg\max\limits_{w_1} \; w_1^T\CovSym w_1<br />
$$</p>
<p>Sözle ifade edecek olursak, $w_1$ yerine hangi değeri koyarsak $w_1^T\CovSym w_1$ ifadesi en büyük değerine ulaşır?</p>
<p>İfademize bakacak olursak, $w_1$ yerine sonsuz büyük/uzun bir değer koyarsak $w_1^T\CovSym w_1$ ifadesi en yüksek değerini alır. Bu sonuç pek işimize yaramıyor maalesef, elimize hiçbir şey geçmemiş oldu, o yüzden işimize yarayabilecek bir sonuç üretecek şekilde yeniden ifade etmeye çalışalım problemimizi.</p>
<p>$w_1$in uzunluğu değil, yönü önemli bizim için, çünkü onun üzerine sadece izdüşüm alıyoruz. 1 birim ya da 99 birim uzunluğunda olması bizi ilgilendirmiyor. O yüzden problemimizin düzgün bir çözümü olması için $w_1$in uzunluğunu 1 alalım:</p>
<p>$$<br />
||w_1|| = 1<br />
$$</p>
<p>Bu kısıtımızı esas ifademize yedirmemiz lazım. Bunu yapmanın yolu <a href="./lagrange-carpani-degisik-bir-bakis/" target="_blank">Lagrange Çarpanı</a> yöntemini kullanmak, <a href="./lagrange-carpani-degisik-bir-bakis/" target="_blank">şuradaki</a> yazımda bundan bahsetmiştim.<br />
$$<br />
\arg\max\limits_{w_1} \; w_1^T\CovSym w_1 &#8211; \lambda (||w_1|| &#8211; 1)<br />
$$</p>
<p>Başka bir deyişle:<br />
$$<br />
\arg\max\limits_{w_1} \; w_1^T\CovSym w_1 &#8211; \lambda (w_1^T w_1 &#8211; 1)<br />
$$</p>
<p>İfadeyi en yüksek ya da düşük yapan $w_1$ değerini bulmak için, $w_1$e göre türev alıp sıfıra eşitleriz (kalkülüsten hatırlarsınız):<br />
$$<br />
(\CovSym + \CovSym ^T) w_1 &#8211; 2 \lambda w_1 = 0<br />
$$</p>
<p>Kovaryans matrislerinin özelliğinden $\CovSym = \CovSym^T$ olduğunu biliyoruz. Bunu kullanıp ifadeyi düzenlersek:<br />
$$<br />
\begin{align*}<br />
2 \CovSym w_1 &#8211; 2 \lambda w_1 = 0\\<br />
\CovSym w_1 = \lambda w_1<br />
\end{align*}<br />
$$</p>
<p>elde ederiz ki, bu da tam olarak $w_1$in $\CovSym$&#8217;in özvektörü olduğunun ifadesidir. Kabaca hatırlatayım, $A$ bir matris, $\lambda$ bir skaler ve $x$ bir vektör ve $x$, $Ax = \lambda x$ sağlıyor ise $x$&#8217;e $A$&#8217;nın özvektörü denir.</p>
<p>Peki acaba $w_1$, $\CovSym$&#8217;in hangi özvektörü? Bunu bulmak için bulduğumuz sonucu esas problemimiz olan $w_1^T \CovSym w_1$ ifadesinde yerine koyalım, neticede bu ifadeyi maksimize etmeye çalışıyorduk en başından:<br />
$$<br />
\begin{align*}<br />
w_1^T \CovSym w_1 &amp;= w_1^T \lambda w_1 \\<br />
&amp;= \lambda w_1^T w_1\\<br />
&amp;= \lambda ||w_1||\\<br />
&amp;= \lambda<br />
\end{align*}<br />
$$</p>
<p>buluruz. $||w_1||$ uzunluğunun 1&#8242;e eşit olduğu bilgisini kullandık son adımda. Elde ettiğimiz sonuç ne demek? Şu demek: Esas ifademizi maksimize etmek istiyorsak $\lambda$&#8217;yı maksimize etmeliyiz. $\lambda$&#8217;nın da en büyük olması, en büyük özdeğer olduğu durumdur.</p>
<p>Sonuç olarak, ilk izdüşüm alacağımız yön, verinin kovaryans matrisinin en büyük özdeğerine denk düşen özvektör olarak seçilmelidir.</p>
<p>İkinci ve daha sonraki izdüşümler de benzer bir yolla bulunursa bunların da sırasıyla ikinci ve daha sonraki özdeğerlere denk düşen özvektörler olması gerektiği bulunabilir. Çıkarımı yaparken dikkat edilmesi gereken nokta, bir sonraki izdüşümleri yaparken bir önceki bulduğunuz yöne dik olmaları gerektiğidir, yani $w_1 \cdot w_2 = 0$. Bunu da Lagrange çarpanı olarak ifadenize eklemeniz gerekir.</p>
<p>Dikkat edilmesi gereken önemli noktalardan biri de, tüm bunları yaparken, verinizin ortalamasının $0$ olması gerekir, PCA öncesinde ve sonrasında bu gerekli dönüşümü yapmanız lazım.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/temel-bilesenler-analizi-pca-cikarimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oyuncak</title>
		<link>http://www.anlak.com/oyuncak/</link>
		<comments>http://www.anlak.com/oyuncak/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 14:17:51 +0000</pubDate>
		<dc:creator>keyholder</dc:creator>
				<category><![CDATA[Kategorisiz]]></category>
		<category><![CDATA[kişisel]]></category>

		<guid isPermaLink="false">http://www.anlak.com/?p=243</guid>
		<description><![CDATA[Bir gün bir çocuk evde bir sistem buldu. Sistem kapanmıştı. İçinde binlerce fotograf, video, ses, yazı,&#8230;. Bir kaçının hayatını merak etti. Ve onlarin kardeslerinin, anne ve babalarinin&#8230; Dizinleri gezindi bir müddet. Anlık , sistem geçmişinin snaphotları, kesik kesik, frame frame. Bu baktiği dünya gerçekten var olsaydi, nasıl olurdu? Tekrar sistemi çalıştırsa acaba herkes alınmış snapshotlardaki [...]]]></description>
			<content:encoded><![CDATA[<p>Bir gün bir çocuk evde bir sistem buldu. Sistem kapanmıştı. İçinde binlerce fotograf, video, ses, yazı,&#8230;.<br />
Bir kaçının hayatını merak etti.<br />
Ve onlarin kardeslerinin, anne ve babalarinin&#8230;<br />
Dizinleri gezindi bir müddet.<br />
Anlık , sistem geçmişinin snaphotları, kesik kesik, frame frame.<br />
Bu baktiği dünya gerçekten var olsaydi, nasıl olurdu?<br />
Tekrar sistemi çalıştırsa acaba herkes alınmış snapshotlardaki gibi aynı mı olurdu?<br />
Benzer mi?<br />
Tamamen farklı mı?<br />
Sistemi çalıştırdı.</p>
<p>Sistem ilk defasinda ayağa kalkmadı. Yıllardır bir köşede unutulmuş bu demode oyuncağın çeşitli sistem paramatreleri artık kullanılamaz olmuş, şebekedeki çesitli servis noktaları artık yok veya farklı arayüzler kullanmaktaydı.<br />
Çok meraklanmıştı. Elindeki christmas oyuncağını sallayıp içindeki suda yüzen kar tanelerinin nasıl yavaş yavaş su içinde hareket edip tabana düşeceklerini merak ediyordu.<br />
Babasına kostu. Saat geç olmustu. Babası oyuncağı hemen hatırladı, gülümsedi :)<br />
Oyuncağı kodlayan ustayı hatırlıyordu. Aldığı günü, usta hala yaşıyor muydu?</p>
<p>Geç oldu, yarın ilk iş ilgileneceğim dedi çocuğa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/oyuncak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lagrange Çarpanı &#8211; Değişik bir bakış</title>
		<link>http://www.anlak.com/lagrange-carpani-degisik-bir-bakis/</link>
		<comments>http://www.anlak.com/lagrange-carpani-degisik-bir-bakis/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 21:57:19 +0000</pubDate>
		<dc:creator>bitkidoku</dc:creator>
				<category><![CDATA[bilim]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[matematik]]></category>
		<category><![CDATA[kısıt]]></category>
		<category><![CDATA[lagrange çarpanları]]></category>
		<category><![CDATA[maksimizasyon]]></category>
		<category><![CDATA[minimizasyon]]></category>

		<guid isPermaLink="false">http://www.anlak.com/?p=209</guid>
		<description><![CDATA[Lagrange Çarpanı yöntemi genelde 2 fonksiyonun gradyanlarının birbirine paralel olmasıyla açıklanır. Bu yazıda maksimizasyon/minimizasyon problemlerinde Lagrange Çarpanları kullanımının biraz daha garip fakat daha kolay bir çıkarımından bahsedeceğim. Diyelim ki elimizde bir $f(x, y)$ fonksiyonu var ve bu fonksiyonun aldığı en büyük değeri bulmaya çalışıyoruz. Matematiksel olarak ifade edecek olursak: $$ \max\limits_{x,y} f(x,y) $$ Ve diyelim [...]]]></description>
			<content:encoded><![CDATA[<p>Lagrange Çarpanı yöntemi genelde 2 fonksiyonun gradyanlarının birbirine paralel olmasıyla açıklanır. Bu yazıda maksimizasyon/minimizasyon problemlerinde Lagrange Çarpanları kullanımının biraz daha garip fakat daha kolay bir çıkarımından bahsedeceğim.</p>
<p>Diyelim ki elimizde bir $f(x, y)$ fonksiyonu var ve bu fonksiyonun aldığı en büyük değeri bulmaya çalışıyoruz. Matematiksel olarak ifade edecek olursak:</p>
<p>$$<br />
\max\limits_{x,y} f(x,y)<br />
$$</p>
<p>Ve diyelim ki çözümün $g(x, y)=c$ gibi bir koşulu da sağlaması gereksin. Eğer böyle bir kısıtımız olmasaydı $f()$in kısmi türevlerini alıp sıfıra eşitlerdik ve çözüme ulaşırdık (fonksiyon limitlerde sonsuza büyümüyorsa tabi).</p>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www.anlak.com/wp-files/1000px-LagrangeMultipliers2D.svg_.png"><img class="size-medium wp-image-227 aligncenter" title="Lagrange multiplier" src="http://www.anlak.com/wp-files/1000px-LagrangeMultipliers2D.svg_-300x216.png" alt="Lagrange multiplier" width="300" height="216" /></a></p>
<p>Şimdi bu kısıtımızı denkleme yedirelim. Maximize edeceğimiz fonksiyona $0$ değerini eklemek ya da çıkartmak ifadeyi maximize eden değerleri değiştirmeyecektir. Yani:</p>
<p>$$<br />
\max\limits_{x,y} f(x,y) = \max\limits_{x,y}  \left[ f(x,y) + 0 \right]<br />
$$</p>
<p>Aynı şekilde sıfırın herhangi bir katını da ekleyip çıkarmam sonucu değiştirmeyecektir:</p>
<p>$$<br />
\max\limits_{x,y} f(x,y) = \max\limits_{x,y}  \left[ f(x,y) + k\cdot 0 \right]<br />
$$</p>
<p>$g(x, y)=c$ olan kısıtımızı da düzenlersek  $0=g(x, y)-c$ elde ederiz. Sıfırı yerine koyarsak üstteki denklemde:</p>
<p>$$<br />
\max\limits_{x,y} f(x,y) = \max\limits_{x,y}  \left[ f(x,y) + k(g(x, y)-c) \right]<br />
$$</p>
<p>Elde ettiğimiz ifade Lagrange Çarpanları ifadesi; $k$lar da Lagrange Çarpanı denilen şeyler. Kısıtmızı esas başladığımız maksimizasyon problemine Lagrange Çarpanlarını kullanarak yedirmiş olduk. Şimdi bu elde ettiğimiz yeni denklemin x&#8217;e ve y&#8217;ye göre kısmı türevini alıp sıfıra eşitleyip kısıtımıza göre en büyük aldığı değeri bulabiliriz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/lagrange-carpani-degisik-bir-bakis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using OpenCV 2.3.1 with Visual Studio 2010 (tutorial)</title>
		<link>http://www.anlak.com/using-opencv-2-3-1-with-visual-studio-2010-tutorial/</link>
		<comments>http://www.anlak.com/using-opencv-2-3-1-with-visual-studio-2010-tutorial/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 21:31:07 +0000</pubDate>
		<dc:creator>bitkidoku</dc:creator>
				<category><![CDATA[akademi]]></category>
		<category><![CDATA[programlama]]></category>
		<category><![CDATA[computer vision]]></category>
		<category><![CDATA[configure]]></category>
		<category><![CDATA[hello world]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[opencv]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[vs2010]]></category>

		<guid isPermaLink="false">http://www.anlak.com/?p=161</guid>
		<description><![CDATA[Here in this tutorial I am going to show how to configure Visual Studio 2010 to use OpenCV 2.3.1 in your computer vision projects. Also, I am going to write a couple of lines of code to show new OpenCV C++ API. By the time the tutorial was written the latest version of OpenCV was [...]]]></description>
			<content:encoded><![CDATA[<p>Here in this tutorial I am going to show how to configure Visual Studio 2010 to use <a href="http://opencv.willowgarage.com" target="_blank">OpenCV</a> 2.3.1 in your computer vision projects. Also, I am going to write a couple of lines of code to show <em>new</em> OpenCV C++ API.</p>
<p>By the time the tutorial was written the latest version of OpenCV was 2.3.1. The methods described below should, but may not, work for different versions. This tutorial targets computer vision course students at <a href="http://www.cmpe.boun.edu.tr/" target="_blank">Computer Engineering in BOUN</a>, but I will be generalizing as much as I can, so everyone can enjoy it.</p>
<h1>Foreword</h1>
<p>Before starting I would like to suggest a couple of things. </p>
<p>First, if you are ever going to write C++ code, read <a href="http://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876" target="_blank">Effective C++</a>, 3rd edition by Scott Meyers (CAUTION! 2nd edition is outdated, it is not worth reading imho). This book has many topics on how to write correct, working, easily maintainable C++ code. I see lots of boilerplate code around when it comes to C++, not only reading this book will reduce such practices, it will save you time. Besides, you will feel healthy mind-wise :) If there was to be only one book on C++, and the rest was to disappear, I would select this book. Be careful though, this book is <strong>*NOT*</strong> for beginners, you need to know a little bit of C++ to understand what it means.</p>
<p><a href="http://www.anlak.com/wp-files/effectiveCpp.jpg"><img class="alignnone size-medium wp-image-163" title="Effective C++" src="http://www.anlak.com/wp-files/effectiveCpp-238x300.jpg" alt="Effective C++ 3rd edition" width="238" height="300" /></a></p>
<p>For BOUN students who are taking Computer Vision course, the book is available as an electronic resource <a href="http://seyhan.library.boun.edu.tr/search~S5?/aMeyers%2C+Scott+%28Scott+Douglas%29/ameyers+scott+scott+douglas/-3%2C-1%2C0%2CB/frameset&amp;FF=ameyers+scott+scott+douglas&amp;4%2C%2C4" target="_blank">in the library</a>.</p>
<p>Second, Google has really good <a href="http://code.google.com/p/google-styleguide/" target="_blank">guidelines</a> on different programming languages, including <a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml" target="_blank">C++</a>. Although they are specialized for their internal use, I recommend following those guidelines. The guideline provide the motivation behind the rules, so it is also great place to learn how to write C++ properly. Again, it is not a place to learn C++, but to master C++.</p>
<h1>Preparation</h1>
<p>Make sure that you have Visual Studio 2010 (VS2010) installed.</p>
<p>For BOUN students, it is available in <a href="http://lmgtfy.com/?q=boun+license" target="_blank">license server</a>. I don&#8217;t quite know the details, you may need to work it on your own.</p>
<p>Download <a href="https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/" target="_blank">OpenCV 2.3.1</a> and extract the contents to a folder. I prefer to put directly under root like &#8220;C:\OpenCV-2.3.1\&#8221;.</p>
<p>Optionally, I recommend using <a href="http://www.wholetomato.com/" target="_blank">Visual Assist X</a> to write and refactor code easily.</p>
<h1>Configuring VS2010</h1>
<p>There are a couple of ways to configure Visual Studio 2010, I am going to show a way which I find convenient. We are going to configure it using property sheets. Whenever we need to create another project, we just need to add same property sheets to new project. Let&#8217;s start.</p>
<p>Launch VS2010 and select &#8220;New project&#8230;&#8221;.</p>
<p>Select &#8220;Empty Project&#8221;, enter &#8220;hello-opencv&#8221; as Name, select a location to place project. I also prefer, for simplicity, not creating directory for solution so I unchecked that option. See the image below.</p>
<p>When done, press &#8220;OK&#8221;.</p>
<p><a href="http://www.anlak.com/wp-files/new-project.png"><img class="alignnone size-medium wp-image-168" title="VS2010 new project dialog" src="http://www.anlak.com/wp-files/new-project-300x207.png" alt="" width="300" height="207" /></a></p>
<p>Now we have created a project from scratch. It is time to link the libraries and make our project use OpenCV.</p>
<p>Switch to Property manager by clicking on the tab below.</p>
<p><a href="http://www.anlak.com/wp-files/property-mng-tab.png"><img class="alignnone size-full wp-image-172" title="VS2010 property manager tab" src="http://www.anlak.com/wp-files/property-mng-tab.png" alt="" width="317" height="553" /></a></p>
<p>The default properties are for 32-bit systems (note the Win32 suffixes), because I am using 64-bit system, from now on I am going to describe the configuration for 64-bit systems.</p>
<p>From the &#8220;Build&#8221; menu, select &#8220;Configuration Manager&#8221;. Under &#8220;Active solution platform&#8221; Win32 should be selected by default. Click on it and select &#8220;New&#8230;&#8221;.</p>
<p><a href="http://www.anlak.com/wp-files/config-mng.png"><img class="alignright size-medium wp-image-177" title="VS2010 Configuration Manager" src="http://www.anlak.com/wp-files/config-mng-300x188.png" alt="" width="300" height="188" /></a></p>
<p>Select &#8220;x64&#8243; as the new platform and select Win32 to copy settings from. Make sure that &#8220;Create new project platforms&#8221; is checked.</p>
<p><a href="http://www.anlak.com/wp-files/new-platform.png"><img class="alignright size-full wp-image-178" title="VS2010 new platform" src="http://www.anlak.com/wp-files/new-platform.png" alt="" width="349" height="227" /></a></p>
<p>Now your Property Manager view should look like this:</p>
<p><a href="http://www.anlak.com/wp-files/property-manager.png"><img class="alignright size-full wp-image-179" title="VS2010 Property Manager 32-bit, 64-bit" src="http://www.anlak.com/wp-files/property-manager.png" alt="" width="297" height="185" /></a></p>
<p>Select the Win32 configurations and delete them, you won&#8217;t be needing those. Let me remind this one more time, these steps are only required if you are using 64-bit system and want to develop 64-bit applications.</p>
<p>To add a property sheet right click on &#8220;Debug | x64&#8243; and select &#8220;Add New Project Property Sheet&#8221;. This property sheet will/should only include the details on how to link the OpenCV library to our project. Once this is done, the property sheet can be shared between projects on the same computer.</p>
<p>On the add new property sheet dialog, I entered &#8220;OpenCV-Debug&#8221; as the sheet name, because this sheet will link debug libraries. After pressing &#8220;Add&#8221; the new property sheet will show up in Property Manager. Double click on it, a dialog with lots of properties will be shown.</p>
<p>Under &#8220;Common Properties&#8221; -&gt; &#8220;C/C++&#8221; -&gt; &#8220;General&#8221;, edit &#8220;Additional Include Directories&#8221; and add &#8220;C:\OpenCV-2.3.1\build\include&#8221;. Of course don&#8217;t forget to change the path accordingly if you have put OpenCV files to a different place. It is important that you select the &#8220;include&#8221; folder under &#8220;build&#8221; folder, not any other &#8220;include&#8221; folder.</p>
<p><a href="http://www.anlak.com/wp-files/additional-include-directories.png"><img class="alignright size-medium wp-image-182" title="additional-include-directories" src="http://www.anlak.com/wp-files/additional-include-directories-300x213.png" alt="" width="300" height="213" /></a></p>
<p>Under &#8220;Common Properties&#8221; -&gt; &#8220;Linker&#8221; -&gt; &#8220;General&#8221;, edit &#8220;Additional Library Directories&#8221; and add &#8220;C:\OpenCV-2.3.1\build\x64\vc10\lib&#8221;. I won&#8217;t tell you to change the path to your OpenCV path next time :) Here &#8220;x64&#8243; stands for 64-bit systems, if you are using 32-bit change it to x86. &#8220;vc10&#8243; stands for Visual C++ 2010, leave it as it is assuming you are using VS2010.</p>
<p>Under &#8220;Common Properties&#8221; -&gt; &#8220;Linker&#8221; -&gt; &#8220;Input&#8221;, edit &#8220;Additional Dependencies&#8221; and add the following lib files:</p>
<p><code>opencv_calib3d231d.lib<br />
opencv_contrib231d.lib<br />
opencv_core231d.lib<br />
opencv_features2d231d.lib<br />
opencv_flann231d.lib<br />
opencv_gpu231d.lib<br />
opencv_haartraining_engined.lib<br />
opencv_highgui231d.lib<br />
opencv_imgproc231d.lib<br />
opencv_legacy231d.lib<br />
opencv_ml231d.lib<br />
opencv_objdetect231d.lib<br />
opencv_ts231d.lib<br />
opencv_video231d.lib<br />
</code></p>
<p>Actually you won&#8217;t probably need all the libraries. Linking the only necessary ones may make linking operation a little bit faster but for our case, that speed up is not worth the effort. Note the letter &#8220;d&#8221; in filenames just before the dot, that &#8220;d&#8221; stands for &#8220;Debug&#8221;.</p>
<p>The steps are the same for &#8220;Release&#8221; configuration except the linked library filenames. You just need to get rid of the &#8220;d&#8221; letters before the dot. Debug libraries includes additional instructions for debugging purposes such as variable watching, and they are not optimized. This makes debug libraries run slower. When you are dealing with lots of data or you just need more processing power you should switch to release configuration which is free of extra instructions and optimizes your code, hence runs much faster.</p>
<h1>Hello OpenCV</h1>
<p>OK. Now we are (almost) ready to write our first lines of code. Switch to &#8220;Solution Explorer&#8221; by clicking the tab below. Right click on &#8220;Source Files&#8221;, select &#8220;Add&#8221; -&gt; &#8220;New Item&#8230;&#8221;. Select &#8220;C++ File&#8221; from the menu and type &#8220;main&#8221; as name.</p>
<p><a href="http://www.anlak.com/wp-files/add-new-item.png"><img class="alignright size-medium wp-image-186" title="VS2010 add new item" src="http://www.anlak.com/wp-files/add-new-item-300x207.png" alt="" width="300" height="207" /></a></p>
<p>Insert the following lines into the main.cpp and run the code (press F5).</p>
<pre>#include &lt;opencv2/opencv.hpp&gt;

using namespace cv;

int main()
{
    Mat img(Mat::zeros(100, 100, CV_8U));

    imshow("window", img);

    waitKey();

    return 0;
}</pre>
<p>You should get an error about a missing dll. Locate &#8220;hello-opencv.exe&#8221; in your project folder. Copy the dll files (preferably the ones that ends with letter &#8220;d&#8221;) from &#8220;C:\OpenCV-2.3.1\build\x64\vc10\bin&#8221; to that folder.</p>
<p>By the way, using full namespaces like &#8220;using namespace cv;&#8221; is discouraged. I recommend using &#8220;using cv::Mat;&#8221;, this will prevent name collisions and make the code more maintainable. See <a href="http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c" target="_blank">this discussion</a> for details.</p>
<p>Some people prefer adding these dll into PATH environment variable, I prefer my projects to be self sufficient. It is good to be in control of which dll the project is using. If you are dealing with multiple projects using the different versions of the same library, if the dll names are the same, PATH approach will not work. </p>
<p>Run the code again. It should work fine and display a 100&#215;100 black image in a window. If not that means there is a problem that you need to figure out. Try until you solve that problem.</p>
<p>Now modify the main.cpp so it is like:</p>
<pre>#include &lt;opencv2 /opencv.hpp&gt;

using namespace cv;

int main()
{
    Mat img;
    VideoCapture cap(0);

    while (true)
    {
        cap >> img;

        Mat edges;
        cvtColor(img, edges, CV_BGR2GRAY);

        Canny(edges, edges, 30, 60);

        imshow("window label", edges);
        waitKey(1);
    }

    return 0;
}</pre>
<p>The code above needs a webcam connected to the computer, it captures images from a camera.</p>
<p>And run the code. You should get a missing &#8220;tbb_debug.dll&#8221; error. This is a <a href="https://code.ros.org/trac/opencv/ticket/1392" target="_blank">bug of OpenCV-2.3.1</a>. It should be shipped with tbb_debug.dll but it is missing in the package. That dll is the part of Threading Building Blocks project by Intel, you should download the latest version from <a href="http://threadingbuildingblocks.org/file.php?fid=77" target="_blank">here</a>. The zip file that you have downloaded contains the dll, and you should copy that dll to the same folder under your project like other dlls (same directory as hello-opencv.exe).</p>
<p>Now run the code again. &#8220;Canny&#8221; is an edge detection algorithm, if the program runs well, you should see the detected edges of the captured image.</p>
<p><a href="http://www.anlak.com/wp-files/example-run.png"><img src="http://www.anlak.com/wp-files/example-run-300x236.png" alt="" title="Canny nimcap" width="300" height="236" class="alignright size-medium wp-image-188" /></a></p>
<p>This completes our tutorial. </p>
<h1>Closure</h1>
<p>The <a href="http://opencv.itseez.com/" target="_blank">documentation of OpenCV</a> is quite good. Use it extensively.</p>
<p>I highly recommend using new OpenCV C++ API. The new API is clean, slick and well-designed. Avoid using old API, e.g. IplImage, unless you really know what you are doing. There are lots of information on internet about OpenCV which is outdated, beware of those. Always use the latest official documentation first.</p>
<p><div class="randomhalfbanner">
<p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-1773604986031579";
/* anlak-yatay-tekli */
google_ad_slot = "0223890063";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</p>
</div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/using-opencv-2-3-1-with-visual-studio-2010-tutorial/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Çalışma kültürü</title>
		<link>http://www.anlak.com/calisma-kulturu/</link>
		<comments>http://www.anlak.com/calisma-kulturu/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 15:15:22 +0000</pubDate>
		<dc:creator>bitkidoku</dc:creator>
				<category><![CDATA[akademi]]></category>
		<category><![CDATA[boun]]></category>
		<category><![CDATA[çalışmak]]></category>
		<category><![CDATA[garaj]]></category>
		<category><![CDATA[inek]]></category>
		<category><![CDATA[ineklemek]]></category>
		<category><![CDATA[kolobratif]]></category>
		<category><![CDATA[kültür]]></category>
		<category><![CDATA[ortam]]></category>
		<category><![CDATA[study]]></category>

		<guid isPermaLink="false">http://www.anlak.com/?p=154</guid>
		<description><![CDATA[Burada study dedikleri bir kavram var. Öğrencilerin gidip birlikte çalışabilecekleri ortak çalışma alanlarına verilen isim study. Örnek cümle içinde kullanımı: &#8220;Madem öyle yemekten sonra study&#8216;ye gideriz&#8221;. Kütüphane&#8217;nin giriş katında ayrı bir bölümde büyük bir study var, bir de benim gördüğüm bölüm binalarının içerisinde de küçük küçük study&#8216;ler var. Eski laptopum çok külüstür olduğundan fişe takılmadan [...]]]></description>
			<content:encoded><![CDATA[<p>Burada <i>study</i> dedikleri bir kavram var. Öğrencilerin gidip birlikte çalışabilecekleri ortak çalışma alanlarına verilen isim <i>study</i>. Örnek cümle içinde kullanımı: &#8220;Madem öyle yemekten sonra <i>study</i>&#8216;ye gideriz&#8221;. Kütüphane&#8217;nin giriş katında ayrı bir bölümde büyük bir <i>study </i>var, bir de benim gördüğüm bölüm binalarının içerisinde de küçük küçük <i>study</i>&#8216;ler var.</p>
<p>Eski laptopum çok külüstür olduğundan fişe takılmadan çalışmıyor, bir keresinde acil laptop açıp internete bağlanmam gerekti, o zamanlar da bi lab&#8217;da çalışmadığım için mekansızım, kütüphaneye girip kurulmak zor geldiğinden bölümdeki <i>study</i>&#8216;ye giriverdim.</p>
<p><a href="http://4.bp.blogspot.com/_cpdTIrUJfUU/TRH4iXerrYI/AAAAAAAACfc/5C14zW_HNG0/s1600/conversation.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="213" src="http://4.bp.blogspot.com/_cpdTIrUJfUU/TRH4iXerrYI/AAAAAAAACfc/5C14zW_HNG0/s320/conversation.jpg" width="320" /></a><br />
İçerisi öğrenci evi bozması bir oda, ortada masalar sandalyeler, duvar diplerinde çiçek desenli, kirli kanepeler, boş duvarlar. Buraya ne zaman baksam içeride insanlar görüyordum, merak da ediyordum. Bir yanda uzay mekiği üzerine konuşan ufak bir grup var. Diğer tarafta tıkır tıkır kod yazıp ödev yapan çömezler. O sırada muhtemelen sınavı olduğu için bir gün önceden uyumamış her bölümün olmazsa olmazı bıyıklı kel, benden dahi yaşlı gösteren bi öğrenci geldi kanepelerden birine uzandı uyumaya başladı.</p>
<p><i>Study</i>&#8216;ler sadece ders çalışma alanları olmaktan çıkmış, öğrencilerin sosyalleştiği alanlar haline de gelmiş, ki bu acayip sevindirici. Çünkü çalışmayı inanılmaz teşvik ediyor, içeriye girince hem çalışıyorsunuz hem eğleniyorsunuz. Bir nevi <a href="http://en.wikipedia.org/wiki/Rules_of_the_garage">garaj</a> bu <i>study</i>&#8216;ler.&nbsp;<i>Study</i>&#8216;lerin dışında bölümün içerisinde de benzer bir anlayış var, bölüm binasının girişindeki koltuklarda da her daim çalışan, muhabbet eden öğrenciler var.</p>
<p><i>Study</i>&#8216;ler sadece bir örnek. Boğaziçi Üniversitesinde her alanda çalışmaya teşvik ediliyorsunuz ve bu zorlama olarak değil bir yaşam biçimi olarak hayatınıza nüfuz etmeye başlıyor. İTÜ ile gördüğüm en büyük fark bu herhalde, İTÜ&#8217;de çevre koşulları sizi bir yöne itmiyordu, bireysel çabalarınızla ayakta tutmalıydınız çalışma kültürünüzü. Başka bir deyişle kendinize ya da başkasına faydalı olmanızı sağlayacak maddi ve manevi koşullar sağlanmıyordu. Benim zamanında olduğum gibi,&nbsp;çalışmaya&nbsp;niyetiniz yoksa gayet tembel bir öğrenci olarak hayatta kalabiliyordunuz. Bunun İTÜ&#8217;de gerçekleşmemesinin nedeninin maddi olduğunu da zannettmiyorum, benzer fiziksel ortamlar yaratmanın maliyeti çok değil (çirkin masa ve sandalye neticede).</p>
<p>Boğaziçi Üniversitesi, hadi genellemeyeyim, Bilgisayar Mühendisliği bölümü bu şekilde bir çalışma kültürü oluşturduğu için çok doğru yapmış. Bu kadar ünlü olmasının altında bu kültürün önemli payı var (geldiğimden bu yana ününü de hakettiğini gördüm, o da ayrı). Bu kültür sayesinde güncel kalabiliyor, başarılı işler ortaya koyuyor ve bu iyi niteliklerin insanlar arasında yayılmasını sağlıyor.</p>
<p><span class="Apple-style-span" style="font-size: xx-small;">Fotoğraf: Cliff&nbsp;<a href="http://www.flickr.com/photos/nostri-imago/2866399803/">http://www.flickr.com/photos/nostri-imago/2866399803/</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/calisma-kulturu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pragmatik Araştırmacı</title>
		<link>http://www.anlak.com/pragmatik-arastirmaci/</link>
		<comments>http://www.anlak.com/pragmatik-arastirmaci/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 23:06:45 +0000</pubDate>
		<dc:creator>bitkidoku</dc:creator>
				<category><![CDATA[Kategorisiz]]></category>
		<category><![CDATA[academia]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[akademi]]></category>
		<category><![CDATA[çevik]]></category>
		<category><![CDATA[pragmatik]]></category>

		<guid isPermaLink="false">http://www.anlak.com/?p=144</guid>
		<description><![CDATA[Akademiye geçmeden önce bir süre özel bir şirkette çalışmıştım, orada çevik (agile) metodları benimsemiştik. Farkettim ki piyasadaki durum, öğrenci olarak yapılması gerekenlerle pek fazla örtüşmüyor. Bunun başlıca nedeni öğrenci iken bakımı yapılacak şekilde bir ürün üretmiyorsunuz. Örneğin yaptığınız ödevler tek seferlik; bir kere öyle ya da böyle çalışır birşey elde ettikten sonra sonuçlarınızı elde edip [...]]]></description>
			<content:encoded><![CDATA[<p>Akademiye geçmeden önce bir süre özel bir  şirkette çalışmıştım, orada çevik (agile) metodları benimsemiştik.  Farkettim ki piyasadaki durum, öğrenci olarak yapılması gerekenlerle pek  fazla örtüşmüyor. Bunun başlıca nedeni öğrenci iken bakımı yapılacak  şekilde bir ürün üretmiyorsunuz. Örneğin yaptığınız ödevler tek  seferlik; bir kere öyle ya da böyle çalışır birşey elde ettikten sonra  sonuçlarınızı elde edip yazdığınız kodları bir daha yüzüne bakmamak  üzere rafa kaldırıyorsunuz. Araştırma yaparken durum birazcık daha  farklı, yazdığınız kod üzerinde biraz daha uzun süre uğraşıyorsunuz , kodları elinizde biraz daha uzun süre tutuyorsunuz, fakat  tecrübe ettiğim kadarıyla sonuç pek fazla değişmiyor, kodlar iş  bittikten sonra bir köşeye terk ediliyor. Bu yüzden akademideki kod  kalitesi bazı istisnalar (ör. <a href="http://code.google.com/p/zemberek/" target="_blank">Zemberek</a>) dışında oldukça düşük.</p>
<p>Uzun süren araştırmalar bu duruma pek uymuyor, tez gibi uzun soluklu  çalışmalarda mecburen kodunuzun bakımını yapmanız gerekiyor. Kimse  yapmıyor o ayrı mesele. Yazdığınız kodu güzel yazmadıkça, bakımını  yapmadıkça teknik borç (<a href="http://stackoverflow.com/questions/1258775/what-is-technical-debt" target="_blank">technical debt</a>)  birikiyor. Bu borç kısa vadede ilerlemenizi sağlayan fakat orta vadede  size ayakbağı olacak eylemlerinizi açıklayan bir kavram. Bugün az bir  emek harcayıp kodunuzu güzelleştirmek, ya da bir şeyi doğru şekilde  yapmak yerine günü kurtarırsanız, daha sonra atacağınız adımlar daha da  güç olacaktır. Az evvel dediğim gibi akademide yazılan kodlar çok kısa  ömürlü olduğu için bu pek sorun olmuyor.</p>
<p><a href="http://i.imgur.com/aZmxB.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="http://i.imgur.com/aZmxB.jpg" width="190" /></a>En azından makro ölçekte bu böyle. Son dönemlerde deneyimlerim  ödevlerin, projelerin kısa ömürlü olmasına rağmen güzel programlama  pratiklerine ihtiyaç duyduğu yönünde. En son arkadaşımı benim 1 günde  bitirdiğim yapay sinir ağı ödevi için 3-4 gün harcamasını gördüğüm zaman  farkettim bu durumu. İşlerimizi kolaylaştıracak yöntemlerin başında  temiz kod yazmak geliyor. Temiz kod yazmanın, kısa süreli projeler olsa  dahi, hayatımızı nasıl daha güzel kılacağını bir örnekle tarif etmeye  çalışayım.</p>
<p>Diyelim ki $w_{i2}x+w_{i1}$ gibi bir ifadenin sonucunu <a href="http://mathworld.wolfram.com/SigmoidFunction.html" target="_blank">sigmoid</a>e sokacağız, bu işi halletmenin MATLAB&#8217;da en düz yolu:</p>
<pre><code>   y = 1 ./ (1 + exp(-x.*w(i, 2) + w(i, 1)));
</code></pre>
<p>Benim tercih edeceğim yol:</p>
<pre><code>   y = sigmoid(x.*w(i, 2) + w(i, 1))

   function ret = sigmoid(x)
      ret = 1 ./ (1 + exp(-x));
   end
</code></pre>
<p>Sigmoid&#8217;i fonksiyon olarak ayrıştırarak</p>
<ol>
<li><b>Yeniden  kullanılabilirliğini arttırdık.</b> Bu örnekte, yapay sinir ağlarıyla  uğraştığımızdan, birden fazla yerde sigmoid&#8217;i gönül rahatlığıyla  kullanabiliriz. Her defasında yeniden aynı ifadeyi yazmakla uğraşmayız.<br />
Sigmoid&#8217;i  yazarken bir yanlışlık yaptıysak dahi, bu yanlışlığı her yerde  düzeltmemiz gerekmez. Sadece bir yerde düzeltmemiz yeterli olur. Diğer  türlü sigmoid ifadesinin geçtiği her yeri bulmaya çalışırken gözümüzden  bir kaç tanesini kaçırmamız çok olası.<br />
Hatta bunun bir adım ötesi, yavaş yavaş kendi kullanacağınız kod  parçacıklarını kütüphaneleştirme yoluna gitmek olur. İleride size  avantaj sağlayacaktır. Doğrudan kendi deneyimimi paylaşayım. Bir dönem  projesi için çeşitli uzaklık metriklerini ($\chi^2$, Bhattacharaya,  Kolomogrov vs.) implement etmiştim. Bir sonraki dönem başka bir dersin  hocası verilen ödevde kullanacağımız her farklı uzaklık metriği için  bonus puan vereceğini söyledi. Hiç uğraşmadan elimdeki hazır yazılmış 3-5  metriği çaktım geçtim.</li>
<li><b>İfade daha anlaşılır oldu.</b> Anlaşılır olması tekrar geri dönüp  baktığınızda ilgili ifadede ne olup bittiğini çabucak kavramanızı  sağlar. Anlaşılır kılarken ayrıca bug oluşumunu da engellersiniz  aslında. Verdiğim <i>kötü</i> örnekte aslında bug var, exp() içine  alırken, &#8220;-&#8221; toplamın iki elemanını da negatiflemeliydi, yani ifade y = 1  ./ (1 + exp(-x.*w(i, 2) <b>-</b> w(i, 1))); olmalıydı. Gördüğünüz gibi&nbsp;  böylesi &#8220;obscure&#8221; durumda hata yapmak daha kolaylaşıyor, hatayı bulması  da zorlaşıyor. Sigmoid&#8217;i ayrı bir fonksiyon olarak yazdığımız durumda  hata çabucak gözümüze çarpardı.</li>
</ol>
<p>Bazıları önerdiğim yöntemin,  fonksiyon çağrıları ve pass-by-value yüzünden daha yavaş olduğunu  söyleyecektir, hele ki akademide mikro optimizasyonlar oldukça önemli  olabiliyorken. Pragmatik programcılığın altın kurallarından biri de</p>
<ol>
<li>Profile et</li>
<li>Darboğazı bul</li>
<li>Optimize et </li>
</ol>
<p>der.  Profile etmek, kodunuzdaki ifadelerin hangilerinin koşmasının ne kadar  zaman aldığını ölçmektir. Yıllardır yazdığım kodların hiçbirinde  (abartmıyorum, 1 tanesinde bile olmadı bu) darboğaz tahmin ettiğim yerde  değildi, ve bu tip mikro optimizasyonlar performansa hiç katkıda  bulunmadı. Ayrıca, modern diller, hatta hantal MATLAB, bile kodlarınızı  sizin için derlediğinizde ya da hemen koşturmadan önce optimize  edebiliyor. <a href="http://i.imgur.com/ybfkx.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" alt="awesome engineer" src="http://i.imgur.com/ybfkx.png" width="150" /></a>O yüzden mutlaka ilkin profile edin ve kodunuz en çok zamanı  nerede harcıyormuş onu bulun ve orayı hızlandırmaya çalışın.</p>
<p>Son olarak MATLAB&#8217;a özel bir tüyo vereyim, yıllardır MATLAB yazan  insanların kodlarında bile görüyorum bu kötü uygulamayı. Matris  işlemleri yaparken for döngüsü kullanmayın, kodunuzu <a href="http://www.mathworks.com/support/tech-notes/1100/1109.html">vektörize</a>  edin. Vektörize etmek kodunuzu daha anlaşılır kılar, çünkü matematiksel  ifadeleri neredeyse aynı şekilde ifade etmiş olursunuz hem de kodunuz  hızlanır. Çünkü MATLABda array elemanlarına erişim oldukça maliyetli.  Gerçi son dönemki MATLABdaki değişiklikler (<a href="http://www.mathworks.com/company/newsletters/news_notes/may03/profiler.html">JIT-accelerator</a>), döngüler ve vektörizasyon arasındaki farkı önemsiz kulabiliyor.Yine de benim önerim kodunuzun güzelliği ve aklınızın sağlığı açısından vektörizasyon kullanmanız.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/pragmatik-arastirmaci/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Laptop/Notebook/Bilgisayar hırsızlığına karşı</title>
		<link>http://www.anlak.com/laptopnotebookbilgisayar-hirsizligina-karsi/</link>
		<comments>http://www.anlak.com/laptopnotebookbilgisayar-hirsizligina-karsi/#comments</comments>
		<pubDate>Wed, 18 May 2011 15:00:54 +0000</pubDate>
		<dc:creator>bitkidoku</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[calinti]]></category>
		<category><![CDATA[hirsiz]]></category>
		<category><![CDATA[hırsızlık]]></category>
		<category><![CDATA[laptop]]></category>
		<category><![CDATA[notebook]]></category>
		<category><![CDATA[onlem]]></category>
		<category><![CDATA[tedbir]]></category>

		<guid isPermaLink="false">http://www.anlak.com/?p=108</guid>
		<description><![CDATA[Gecenlerde evimize hirsiz girdi ve evden bilgisayarlarimizi caldi. Yillarca yeni bilgisayar almayip, aldiktan 10 gun sonra calinmasi cok koydugundan edindigim deneyimleri paylasayim, baskalari da benzer duruma dusmesin istedim. Asagida cogu bilgisayarinizla ilgili olan, daha calinmadan yapabileceklerinizi listeledim. Keske birisi bunlari bana daha onceden deseydi dedigim seyler. 1. Kapi kilidinize rozet taktirin Eve geldigimde kilidin gobeginin [...]]]></description>
			<content:encoded><![CDATA[<p>Gecenlerde evimize hirsiz girdi ve evden bilgisayarlarimizi caldi. Yillarca yeni bilgisayar almayip, aldiktan 10 gun sonra calinmasi cok koydugundan edindigim deneyimleri paylasayim, baskalari da benzer duruma dusmesin istedim. Asagida cogu bilgisayarinizla ilgili olan, daha calinmadan yapabileceklerinizi listeledim. Keske birisi bunlari bana daha onceden deseydi dedigim seyler.</p>
<h2>1. Kapi kilidinize rozet taktirin</h2>
<p>Eve geldigimde kilidin gobeginin yerinde olmadigini gordum. Megersem eski tip kilitler kolaylikla ve ses cikarmadan kirilabiliyormus. Zaten cilingir geldiginde tornavidanin ufak bi dokunusuyla kapiyi aciverdi. Bunu engellemenin birkac yolu var, bunlardan biri kirmaya calisinca one yakin tarafindan kirilan boylece kilidin diline erisime izin vermeyen gobek kullanmak. Ikincisi ise rozet taktirmak, rozet dogrudan kirma girisimini engelliyor. Ikisini birden de yaptirabilirsiniz (ben oyle yaptim). Rozet yeni kapilarda zaten oluyor, fakat kilidiniz son 5 sene icerisinde yenilenmemisse buyuk ihtimalle yoktur. Rozet suna benzer birsey:</p>
<p><img src="http://i.imgur.com/SI6eE.jpg" alt="" title="Kilit Rozet" /></p>
<p>Bu da kirilabilir kilit (gobegin disa dogru cikmasi kilidi kirilabilir kiliyor):</p>
<p><img src="http://i.imgur.com/0rLS9.jpg" alt="" title="Gobekli kilit" /></p>
<p>Rozet takilmis kilit de buna benziyor:</p>
<p><img src="http://i.imgur.com/oI34J.jpg" alt="" title="Rozetli kapi kilidi" /></p>
<p>Evinizde hirsizin gezdigini bilmek bile yeterince psikolijiyi yipratan birsey, o yuzden bilgisayariniz olsun olmasin bundan yaptirmanizi tavsiye ederim. Tabi bu onlemlere ragmen yeterince donanimla ve cikan sesleri umursamayan komsularla hirsizin girmesi mumkun :)</p>
<h2>2. Bilgisayarinizin seri numarasini ve MAC adresini kaydedin</h2>
<p>Bilgisayarlarinizin seri numarasini ve uzerindeki mevcut tum network cihazlarinin (genelde ethernet ve wifi) MAC adresini bir yere kaydedin. Polise ifade verirken bunlari da bildirirseniz bilisim suclariyla mucadele birimi bunlardan, ozellikle MAC adresinden, faydalanabiliyormus. Telefonlardaki IMEI numarasi gibi kolay degistirilen birsey de degil. Cok da umitlenmemek lazim, bulunma oranlarinin cok da yuksek oldugunu zannetmiyorum, cunku ben bu bilgileri veremedigim icin cok da uzulmeye gerek olmadigini soylediler, zaten cok cok onemli bir cihaz degilse sonunda birsey cikma ihtimali dusukmus. Yine de her ihtimale karsi bunlari korumakta fayda var.</p>
<p>Eger bilgisayariniz coktan gittiyse, kutusunu atmadiysaniz kutunun uzerinde bu bilgiler oluyor genelde. Hic olmadi faturanin uzerinde seri numarasinin olma ihtimali var. Hicbiri yoksa gecmis olsun.</p>
<p><img src="http://i.imgur.com/BC4wg.jpg" alt="" title="Seri numarasi" /></p>
<h2>3. Prey Project</h2>
<p><a href="http://preyproject.com/">Prey</a> isimli bu yazilimi mutlaka yukleyin. Bilgisayarinizda kendini farkettirmeden arkaplanda calisiyor, ve web arayuzunden siz bilgisayarinizi kayip olarak isaretlediginizde bilgisayarinizin konumu gibi bilgilere erisebiliyorsunuz. Hatta bilgisayarin kamerasi varsa, hirsizin fotografini bile cekip size bildiriyor. Tabi tum bunlarin olmasi icin hirsizin bilgisayari formatlamadan internete baglanmasi gerekiyor. Bir de bilgisayara giris icin sifre olmamasi lazim, yoksa hirsiz giremedigi bilgisayara dogrudan format atar. Bu program Windows, MacOS, Linux, Android platformlarini destekliyor, telefonunuza bile yukleyebilirsiniz.</p>
<h2>4. Bilgilerinizi harici HDD&#8217;de koruyun / Yedek alin</h2>
<p>Bu konuda sansliydim, bilgilerimin hepsini harici bir HDD ile yanimda tasidigim icin bilgi kaybim olmadi, basima geleni maddi zarar ile sinirlayabilmis oldum. Maddi zarar gorece daha kolay sekilde telafi edilebilir fakat cektiginiz fotograflarin, yazdiginiz yazilarin, urettiginiz herseyin yerine yenisi koyulmaz. Harici HDD hirsizlara pek cekici gelmeyecektir. Harici HDD&#8217;de korumak benim buldugum bir cozum, DropBox gibi online depolara yedek de alinabilir.</p>
<h2>5. Sigorta yaptirin</h2>
<p>Duydugum kadariyla bilgisayarinizi sigortalatmak da oldukca ucuz bir alternatif olmus, hem bilgisayarinizin o gunku degeri uzerinden parasini oduyorlarmis. Bu konu hakkinda pek detayli bilgim yok. Bilgisayariniz calinmis olsa dahi, yenisini aldiysaniz yenisini de sigortalatmakta fayda var. Hirsiz bir eve girdi diye tekrar girmeyecek diye birsey yok, hatta tam tersi olduguna dair suphelerim var. Bir arkadasim bu sayede 2. laptop caldirisinda parasini alabilmis.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/laptopnotebookbilgisayar-hirsizligina-karsi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Goruntuyu yeniden boyutlandirma</title>
		<link>http://www.anlak.com/goruntuyu-yeniden-boyutlandirma/</link>
		<comments>http://www.anlak.com/goruntuyu-yeniden-boyutlandirma/#comments</comments>
		<pubDate>Sun, 12 Dec 2010 19:04:24 +0000</pubDate>
		<dc:creator>bitkidoku</dc:creator>
				<category><![CDATA[geek]]></category>
		<category><![CDATA[programlama]]></category>
		<category><![CDATA[jai]]></category>
		<category><![CDATA[kalite]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[performans]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[resize]]></category>
		<category><![CDATA[yeniden boyutlandirma]]></category>

		<guid isPermaLink="false">http://www.anlak.com/?p=105</guid>
		<description><![CDATA[OpenCV ekolunden geldigim icin Java&#8217;nin goruntu isleme icin kullandigi akis ilk asamada oldukca karmasik geldi. OpenCV ile goruntu islemeye devam etmememin nedeni 6 ay kadar Java kullandiktan sonra muptelasi oldugum C++&#8217; tan tiksinmem. Yok memory allocation, yok referansla const mu gonderecez parametreyi gibi kistaslar kafa yorgunlugundan baska bisey yapmiyordu. E tabi yeni bir dille beraber [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.intel.com/technology/computing/opencv/">OpenCV</a> ekolunden geldigim icin Java&#8217;nin goruntu isleme icin kullandigi akis ilk asamada oldukca karmasik geldi. OpenCV ile goruntu islemeye devam etmememin nedeni 6 ay kadar Java kullandiktan sonra muptelasi oldugum C++&#8217; tan tiksinmem. Yok memory allocation, yok referansla const mu gonderecez parametreyi gibi kistaslar kafa yorgunlugundan baska bisey yapmiyordu. E tabi yeni bir dille beraber onun kendine has sorunlari basgosterdi. Neyse efenim konumuza geri donelim. Bir image&#8217;i resize etmeye calisirken neler ogrendik?</p>
<ol>
<li><span style="font-family: 'courier new';">Image.getScaledInstance()</span> kullanmak pek hayirli degil.<br />
Sonuclar guzel olsa da performans o kadar dusuk ki, scalable hic degil.</li>
<li><span style="font-family: 'courier new';">Graphics.drawImage()</span> downsampling yaparken pek guzel sonuclar vermiyor.<br />
Ne kadar anti-aliasing yaparsaniz, rendering quality arttirsaniz da yine de kirpik kirpik gorunuyor kenarlar.</li>
<li><span style="font-family: 'courier new';">AffineTransform.scale()</span> ile resize etmek yerine tek satirda Graphics.drawImage() ayni isi yapabiliyorsunuz.</li>
<li><a href="http://java.sun.com/javase/technologies/desktop/media/jai/">JAI</a> kullanmak da kaliteyi arttirmada pek fayda saglamiyor.
</li>
</ol>
<p>Peki durum boyleyken en duzgun resize etme nasil olacak? Hos kalitesiz downsampling benim isimi cok etkilemiyordu cunku bilgisayarli goru ile ugrasiyorum, insanlara sunacak bi resim uretmiyorum, ama yine de gun gelir ihtiyacim olur diye paylasayim.</p>
<p><span style="font-family: 'courier new';">Graphics.drawImage()</span> eger giris goruntusunu yariya kadar kucultecekseniz ise yariyor, yaridan fazla kucultecekseniz (ornegin 1/3 oraninda) kalitesiz sonuc veriyor.<br />
O halde istedigimiz kucultme oranina yaklasana kadar yarim yarim kucultecegiz, yaklastigimizda ise istedigimiz oranda kucultecegiz.<br />
Ornegin 500&#215;500 boyutlarinda bir goruntuyu 100&#215;100 boyutlarina kuculteceksek ilk once 250&#215;250 boyutlarina, ardindan 125&#215;125 boyutlarina, son olarak da 100&#215;100&#8242;e kucultuyoruz.</p>
<p>Goruntuyu buyultmek istiyorsak zaten sorun yok, bir seferde isimizi gorebiliyoruz.</p>
<p>Diyosaniz ki benim server&#8217;da kaynak bol, optimizasyon umrumda degil <span style="font-family: 'courier new';">Image.getScaledInstance()</span> kullanin efendim. Ya da tek seferde kucultup uzerine bi de hafiften blur atin.</p>
<p><span style="font-size: 78%;">Enfes kaynak: <a href="http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html">The Perils of Image.getScaledInstance() &#8211; Chris Campbell</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/goruntuyu-yeniden-boyutlandirma/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Handy Pdf</title>
		<link>http://www.anlak.com/handy-pdf/</link>
		<comments>http://www.anlak.com/handy-pdf/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 20:02:06 +0000</pubDate>
		<dc:creator>bitkidoku</dc:creator>
		
		<guid isPermaLink="false">http://www.anlak.com/?p=97</guid>
		<description><![CDATA[Her zamanki gibi, bir süredir ortalıklarda gözükmüyordum. Ama bakın neyle çıktım piyasaya: Handy Pdf Bu Handy Pdf adlı yazılım direkt benim ihtiyaçlarımdan ortaya çıktı. PSP&#8217;de pdf dosyalarını okumaya çalışma çabamın sonucu. Basitçe Handy Pdf bir pdf dosyasını sayfa sayfa jpeg&#8217;e çeviriyor. Böylece PSP ya da herhangi fotograf gosteren bir cihaza (iPod, fotoğraf makinesi vs.) bu [...]]]></description>
			<content:encoded><![CDATA[<p>Her zamanki gibi, bir süredir ortalıklarda gözükmüyordum. Ama bakın neyle çıktım piyasaya:</p>
<p><a title="Handy Pdf" href="http://www.handypdf.net">Handy Pdf</a></p>
<p>Bu Handy Pdf adlı yazılım direkt benim ihtiyaçlarımdan ortaya çıktı. PSP&#8217;de pdf dosyalarını okumaya çalışma çabamın sonucu.</p>
<p>Basitçe <strong>Handy Pdf</strong> bir pdf dosyasını sayfa sayfa jpeg&#8217;e çeviriyor. Böylece PSP ya da herhangi fotograf gosteren bir cihaza (iPod, fotoğraf makinesi vs.) bu jpeg&#8217;leri yukleyip istediğiniz yerde e-kitap okuyabiliyorsunuz.</p>
<p>Bence çok süper oldu.</p>
<p>Daha da iyi olacak zamanla.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/handy-pdf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Garip bir fenomen: Benford Kanunu</title>
		<link>http://www.anlak.com/garip-bir-fenomen-benford-kanunu/</link>
		<comments>http://www.anlak.com/garip-bir-fenomen-benford-kanunu/#comments</comments>
		<pubDate>Sun, 27 Jul 2008 14:13:01 +0000</pubDate>
		<dc:creator>bitkidoku</dc:creator>
				<category><![CDATA[matematik]]></category>

		<guid isPermaLink="false">http://www.anlak.com/?p=90</guid>
		<description><![CDATA[Gerçek hayattan alınmış sayısal verilerin ilk basamaklarının dağılımının beklenenin aksine düzenli olmadığını söylesem ne yapardınız? Ne yapacaksınız, &#8220;hmmm&#8221; diyip konuyu daha detaylı anlatmamı beklersiniz en fazla. Örneğin Tanzanya&#8217;daki şehirlerin nüfuslarını listelediğimizi düşünün. Benford kanununa göre bu listedeki sayıların ilk basamağının 1 olma olasılığı, diğer rakamlardan bi tanesi olma olasılığından daha büyüktür. Hatta gerçek hayattan alınmış [...]]]></description>
			<content:encoded><![CDATA[<p>Gerçek hayattan alınmış sayısal verilerin ilk basamaklarının dağılımının beklenenin aksine düzenli olmadığını söylesem ne yapardınız? Ne yapacaksınız, &#8220;hmmm&#8221; diyip konuyu daha detaylı anlatmamı beklersiniz en fazla.</p>
<p>Örneğin Tanzanya&#8217;daki şehirlerin nüfuslarını listelediğimizi düşünün. Benford kanununa göre bu listedeki sayıların ilk basamağının 1 olma olasılığı, diğer rakamlardan bi tanesi olma olasılığından daha büyüktür. Hatta gerçek hayattan alınmış verilerin ilk basamağındaki rakamların dağılımı şu şekildedir der:</p>
<table border="0">
<thead>
<tr>
<th>d</th>
<th>p</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>30.1%</td>
</tr>
<tr>
<td>2</td>
<td>17.6%</td>
</tr>
<tr>
<td>3</td>
<td>12.5%</td>
</tr>
<tr>
<td>4</td>
<td>9.7%</td>
</tr>
<tr>
<td>5</td>
<td>7.9%</td>
</tr>
<tr>
<td>6</td>
<td>6.7%</td>
</tr>
<tr>
<td>7</td>
<td>5.8%</td>
</tr>
<tr>
<td>8</td>
<td>5.1%</td>
</tr>
<tr>
<td>9</td>
<td>4.6%</td>
</tr>
</tbody>
</table>
<p>Başka bir şekilde gösterecek olursak, <em>doğal</em> bir veride ilk basamakta rakamların görülme sıklığı şu şekildedir:<br />
<a href="http://www.anlak.com/wp-files/benford_kanunu.png"></a></p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-91 aligncenter" title="benford_kanunu" src="http://www.anlak.com/wp-files/benford_kanunu.png" alt="Benford Kanunu" width="394" height="292" /></p>
<p>Böylesine enteresan bir olayın geçerliliğini bir örnekle inceleyelim. Vikipedi&#8217;deki <a href="http://tr.wikipedia.org/wiki/T%C3%BCrkiye%27nin_g%C3%B6lleri">Türkiye&#8217;deki göller </a>başlığındaki göllerin yüzölçümlerinin ilk basamaklarının görülme sıklığını yukarıda çizdiğimiz grafik gösterelim (mavi: Benford beklenen değeri, kırmızı: Türkiye&#8217;deki göller verisi ):</p>
<p style="text-align: center;"><a href="http://www.anlak.com/wp-files/goller_benford1.png"><img class="alignnone size-full wp-image-92 aligncenter" title="goller_benford1" src="http://www.anlak.com/wp-files/goller_benford1.png" alt="Türkiye\'deki göller Benford kanunu" width="318" height="251" /></a></p>
<p style="text-align: left;">Bir de göllerin yüzölçümüyle ilgili verinin logaritmik trend çizgisini* çizelim ki ilişkiyi daha iyi anlayalım:</p>
<p style="text-align: center;"><a href="http://www.anlak.com/wp-files/goller_benford2.png"><img class="alignnone size-full wp-image-93" title="goller_benford2" src="http://www.anlak.com/wp-files/goller_benford2.png" alt="Türkiye\'deki göller Benford Kanunu trendline" width="318" height="251" /></a></p>
<p style="text-align: left;">Ne acayip di mi? Şimdi aynı işlemi <a title="Turkiye'deki iller" href="http://tr.wikipedia.org/wiki/T%C3%BCrkiye%27deki_iller">Türkiye&#8217;deki iller</a>in nufusu için yapalım:</p>
<p style="text-align: left;"><a href="http://www.anlak.com/wp-files/nufus_benford1.png"></a><a href="http://www.anlak.com/wp-files/nufus_benford2.png"></a></p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-94 aligncenter" title="nufus_benford1" src="http://www.anlak.com/wp-files/nufus_benford1.png" alt="Turkiye iller nufusu Benford Kanunu" width="318" height="251" /></p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-95 aligncenter" title="nufus_benford2" src="http://www.anlak.com/wp-files/nufus_benford2.png" alt="Turkiye iller nufusu Benford Kanunu trendline" width="318" height="251" /></p>
<p style="text-align: left;">Hahah çok eğlenceli. Peki hayatta bunun pratik uygulaması neler olabilir? Basitçe bir veri setinin insan üretimi olup olmadığını anlayabiliriz bu sayede. Vergi kaçıranları saptamak için muhasebe kayıtlarına basit bir analiz yapılıp şüpheli adaylar çıkartılabilir[1] ya da tam tersi vergi kaçırırken daha gerçekçi olsun diye sayıları Benford kanuna uyacak şekilde seçebiliriz. Hatta bir fotoğrafa sonradan müdahele edilip edilmedigini de benzer bir yolla anlayabiliriz.</p>
<p style="text-align: left;">Ek: Memin&#8217;in orjinal fikri olarak, aynı işlemi bilgisayarımda çalışan işlemlerin bellek kullanım değerlerine uyguladım. Sonuç gene şaşmadı. Her zamanki gibi mavi çizgi beklenen değer, kırmızı çizgi gerçek hayattan elde ettiğim veri.</p>
<p style="text-align: left;"><a href="http://www.anlak.com/wp-files/bitkidoku_bellek_benford.png"><img class="aligncenter size-full wp-image-96" title="bitkidoku_bellek_benford" src="http://www.anlak.com/wp-files/bitkidoku_bellek_benford.png" alt="Bellek kullanımı Benford" width="318" height="251" /></a></p>
<p style="text-align: left;">* trend/eğilim çizgisi: Veriye en iyi şekilde uyan çizgi. elle de çizebileceğiniz gibi, Excel benzeri modern hesaplama araçları hatayı en aza indirecek biçimde bu işi sizin için yapar. Sadece bu terim başlı başına bir yazı konusu olabilir, meraklısına anahtar kelime: Linear Regression</p>
<ol>
<li><cite>Mark J. Nigrini (May). &#8220;<a title="http://www.aicpa.org/pubs/jofa/may1999/nigrini.htm" rel="nofollow" href="http://www.aicpa.org/pubs/jofa/may1999/nigrini.htm">I&#8217;ve Got Your Number</a>&#8220;. <em>Journal of Accountancy</em>.</cite></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.anlak.com/garip-bir-fenomen-benford-kanunu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

