<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Ahmet AYGÜN]]></title>
  <link href="http://blog.ahmetaygun.net/atom.xml" rel="self"/>
  <link href="http://blog.ahmetaygun.net/"/>
  <updated>2012-02-17T18:57:13+02:00</updated>
  <id>http://blog.ahmetaygun.net/</id>
  <author>
    <name><![CDATA[Ahmet AYGÜN]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[git ile svn deposu yansılamak]]></title>
    <link href="http://blog.ahmetaygun.net/git-ile-svn-deposu-yansilamak/"/>
    <updated>2012-01-31T00:14:00+02:00</updated>
    <id>http://blog.ahmetaygun.net/git-ile-svn-deposu-yansilamak</id>
    <content type="html"><![CDATA[<p>Git&#8217;in hastasıyız; vcs, deployment vb. her işimize yarıyor sağolsun. Ancak hala svn&#8217;e bağlı kaldığımız yerler oluyor. Benim örneğimde takip ettiğim upstream vcs olarak svn kullanıyor ve çatallayamıyorum, yansılamak için bir çözüm ararken bir başka git magic ile karşılaştım.</p>

<p>Git depomuzu tutacağımız dizine girdikten sonra aşağıdaki adımları uyguluyoruz:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ git init
</span><span class='line'>$ git svn init -T  &lt;svn_depo_adresi>
</span><span class='line'>$ git svn fetch
</span><span class='line'>$ git gc
</span><span class='line'>$ git remote add origin &lt;git_push_adresi>
</span><span class='line'>$ git push origin master</span></code></pre></td></tr></table></div></figure>


<p>Bu adımları tamamladığınızda o an için svn deposunun yansısını almış oluyorsunuz. Daha sonrasında senkronizasyonu sağlamak için ise aşağıdaki adımları tekrarlıyorsunuz:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ git svn rebase
</span><span class='line'>$ git push origin master</span></code></pre></td></tr></table></div></figure>


<p>Senkronizasyon işini takip etmek istemiyorsanız siz de benim gibi bu işi cron ile çözebilirsiniz.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Her zaman nil ile initialize edin]]></title>
    <link href="http://blog.ahmetaygun.net/her-zaman-nil-ile-initialize-edin/"/>
    <updated>2011-12-30T23:00:00+02:00</updated>
    <id>http://blog.ahmetaygun.net/her-zaman-nil-ile-initialize-edin</id>
    <content type="html"><![CDATA[<p>Objective-C ile yazdığınız projelerde dikkat edilmesi gereken hususlardan birisiyle alakalı detaylı bir <a href="http://ryfar.com/post/12591151308/initialize">blog yazısına</a> denk geldim. Birinin işine yarar düşüncesiyle not alayım.</p>

<p>Yazının özeti şöyle:</p>

<blockquote><p>Always initailize your object variables to nil, no matter what, because some day they may be captured by a block and if they contain junk when the block is copied you’re going to crash.</p><footer><strong>Ryan Perry</strong> <cite><a href='http://ryfar.com/post/12591151308/initialize'>Initialize</a></cite></footer></blockquote>


<p>Bu güzel yazı için <a href="https://twitter.com/ryfar">Ryan Perry</a>&#8216;e teşekkür ettik.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Yeni Django geliştiricilerine tavsiyeler]]></title>
    <link href="http://blog.ahmetaygun.net/yeni-django-gelistiricilerine-tavsiyeler/"/>
    <updated>2011-12-27T00:15:00+02:00</updated>
    <id>http://blog.ahmetaygun.net/yeni-django-gelistiricilerine-tavsiyeler</id>
    <content type="html"><![CDATA[<p>Django ile web uygulamaları geliştirmeye başlayanların eski alışkanlıkları sebebiyle yaptıkları bazı hatalar var. Birkaçını zamanında ben de yapmıştım ve ceremesini de çekmiştim. Rama Vadakattu&#8217;nun <a href="http://www.ramavadakattu.com/top-10-tips-to-a-new-django-developer">yazdıklarına</a> küçük birkaç ek ile aşağıda bulabilirsiniz. <a href="http://stackoverflow.com">StackOverflow</a>&#8216;da sürekli güncellenen bir liste de <a href="http://stackoverflow.com/questions/550632/favorite-django-tips-features">mevcut</a>.</p>

<h3>Proje adını import satırına yazmayın</h3>

<p>Varsayalım ki <em>proje3</em> içinde <em>xyz</em> isimli bir uygulamanız var, bu durumda aşağıdaki gibi import etmekten sakının:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">proje3.xyz.models</span> <span class="kn">import</span> <span class="n">Author</span>
</span></code></pre></td></tr></table></div></figure>


<p>Böyle yazdığınızda import ettiğiniz modül isimleri proje adına bağımlı kalır ve uygulamanız tekrar kullanılabiliir olmaz, ayrıca ileride proje adını değiştirmek istediğinizde tekrar adlandırmayı zorlaştırır.</p>

<p>Doğru kullanım:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">xyz.models</span> <span class="kn">import</span> <span class="n">Author</span>
</span></code></pre></td></tr></table></div></figure>


<p>Bu yazım şeklini projeniz python path&#8217;inde olduğu sürece kullanabilirsiniz.</p>

<!-- more -->


<h3>MEDIA_ROOT ve TEMPLATE_DIRS değişkenlerini hardcode etmeyin</h3>

<p>settings.py dosyanızda <em>MEDIA_ROOT</em> ve <em>TEMPLATE_DIRS</em> gibi değişkenlerinizi hardcode etmeyin.</p>

<figure class='code'><figcaption><span>settings.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">TEMPLATE_DIRS</span> <span class="o">=</span> <span class="p">(</span> <span class="s">&quot;/home/html/project/templates&quot;</span><span class="p">,)</span>
</span><span class='line'><span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="s">&quot;/home/html/project/appmedia/&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Bu kullanım projenizi sunucular arasında taşırken ya da geliştirme ortamından üretim ortamına taşırken sorun oluşturabilir, bunun yanında farklı platformlarla çalışırken de sorun çıkaracaktır.</p>

<p>Aşağıdaki şekilde kullanırsanız bu sorunların önüne geçebilirsiniz:</p>

<figure class='code'><figcaption><span>settings.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">DOCUMENT_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">))</span>
</span><span class='line'><span class="n">MEDIA_ROOT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">DOCUMENT_ROOT</span><span class="p">,</span> <span class="s">&#39;appmedia&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">TEMPLATE_DIRS</span> <span class="o">=</span> <span class="p">(</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">DOCUMENT_ROOT</span><span class="p">,</span> <span class="s">&#39;templates&#39;</span><span class="p">),)</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Template içinde statik dosyaları hardcode etmeyin</h3>

<p>Template içinde kullandığınız statik dosyaları (javascript, css, resim vb.) aşağıdaki gibi kullanmayın:</p>

<p>(MEDIA_URL&#8217;in “/appmedia/” olduğunu varsayalım)</p>

<figure class='code'><figcaption><span>template.html</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">type=</span><span class="s">&quot;text/css&quot;</span> <span class="na">href=</span><span class="s">&quot;/appmedia/custom.css&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;/appmedia/custom.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Bu kullanımın sorun teşkil ettiği durumlardan biri de statik dosyaları farklı bir sunucuda ya da serviste barındırmak istediğinizde ortaya çıkıyor. Örneğin statik dosyaları sunarken Amazon S3 kullanmak istediniz ve sunucunuzun adresi cdn.xyz.com, bu durumda websiteniz.com/appmedia altında aranacak olan statik dosyaların her biri için bu tanımlamaları değiştirmeniz gerekecek.</p>

<p>Bu sorunun önüne geçmek için ise {{ MEDIA_URL }} etiketini aşağıdaki şekilde kullanabilirsiniz:</p>

<figure class='code'><figcaption><span>template.html</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">type=</span><span class="s">&quot;text/css&quot;</span> <span class="na">href=</span><span class="s">&quot;{{ MEDIA_URL }}custom.css&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;{{ MEDIA_URL }}custom.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Tek yapmanız gereken MEDIA_URL değişkeninizi “/appmedia/” yerine “http://cdn.xyz.com/” şeklinde yazmak olacaktır.</p>

<h3>Temel işlemleri views içinde yapmayın</h3>

<p>Modelleriniz ile ilgili temel işlemleri (model instance&#8217;a özgü işlemler) views içinde yapmak pek de güzel bir fikir değildir. Çünkü kodu tekrar kullanamadığınız gibi unit testlerini de yazamazsınız.</p>

<p>Bunun yerine models altında yer vermek ya da yardımcı fonksiyonlar tanımlamak daha iyi bir fikirdir. Hatta her model instance üzerinde yapılacak işlemler için o model&#8217;e kendine özgü bir manager yazmak daha da iyidir.</p>

<p>Peki views içinde ne olacak diyorsanız onu da açıklayayım. ORM ile bir nesneyi ya da nesne listesini elde etmek için ya da template içinde kullanılan bir listeyi oluşturmak için kullandığınız işlemleri yazacaksınız.</p>

<h3>Geliştirme ve üretim ortamları için farklı ayar dosyası</h3>

<p>İki ortam arasında uygulama taşırken DEBUG değişkeni gibi ortama özgü değişkenleri değiştirmekten yorulmuş olabilirsiniz. Genel kanı ortama özgü ayar dosyaları oluşturup mantıksal bir sorguya göre ortama uygun dosyayı import etmektir.</p>

<figure class='code'><figcaption><span>settings.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">socket</span>
</span><span class='line'><span class="k">if</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;benimsitem.com&#39;</span><span class="p">:</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'><span class="k">else</span><span class="p">:</span>
</span><span class='line'>    <span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>
</span></code></pre></td></tr></table></div></figure>


<p>Bunun birkaç farklı yöntemi olmasına karşın benim kullandığım aşağıdaki yöntemi yazacağım. Ortam bağımlı değişkenleri her ortam için farklı bir settings dosyası (settings_production.py ve settings_development.py) oluşturup içine yazıyoruz. Daha sonra aşağıdaki şekilde import ediyoruz:</p>

<figure class='code'><figcaption><span>settings.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">socket</span>
</span><span class='line'><span class="k">if</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;benimsitem.com&#39;</span><span class="p">:</span>
</span><span class='line'>    <span class="kn">import</span> <span class="nn">settings_production.py</span>
</span><span class='line'><span class="k">else</span><span class="p">:</span>
</span><span class='line'>    <span class="kn">import</span> <span class="nn">settings_development.py</span>
</span></code></pre></td></tr></table></div></figure>


<h3>3. parti uygulamaların template etiketlerini tek seferde yükleyin</h3>

<p>Başka geliştiriciler tarafından yazılan uygulamaların template etiketlerini aşağıdaki şekilde kullanıyoruz:</p>

<figure class='code'><figcaption><span>template.html</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{% load template_tags %}
</span></code></pre></td></tr></table></div></figure>


<p>Bu satırı etiketleri kullandığımız her template&#8217;e yazmak hem DRY prensibini bozuyor hem de fazla efor gerektiriyor. Bunun yerine aşağıdaki şekilde kullanıldığında tek yerden yönetilebiliyor ve bizi fazla efor sarf etmekten kurtarıyor. Bu kodu uygulama çalışırken yüklenen herhangi bir dosyaya (settings.py, urls.py vb.) yazabilirsiniz.</p>

<figure class='code'><figcaption><span>settings.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">template</span>
</span><span class='line'><span class="n">template</span><span class="o">.</span><span class="n">add_to_builtins</span><span class="p">(</span><span class="s">&#39;project.app.templatetags.custom_tag_module&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Böylece her template&#8217;de {% load %} etiketini kullanmaksızın işlevlerinden faydalanabilirsiniz.</p>

<h3>Bütün URL&#8217;leri urls.py içine yazmayın</h3>

<p>Aşağıdaki urls.py istemediğimiz bir örnek:</p>

<figure class='code'><figcaption><span>urls.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^askalumni/question/$&#39;</span><span class="p">,</span><span class="s">&#39;.....registerInstitution&#39;</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;iregister&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^askalumni/answer/$&#39;</span><span class="p">,</span><span class="s">&#39;someview.....&#39;</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="s">&#39;newmemberurl&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^member/editprofile/$&#39;</span><span class="p">,</span><span class="s">&#39;editProfile&#39;</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;editprofileurl&quot;</span><span class="p">),</span>
</span><span class='line'>    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^member/changepassword/$&#39;</span><span class="p">,</span><span class="s">&#39;changePassword&#39;</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;changepasswordurl&quot;</span><span class="p">),</span>
</span><span class='line'>    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^member/logout/$&#39;</span><span class="p">,</span><span class="s">&#39;memeberlogout&#39;</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;logouturl&quot;</span><span class="p">),</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Bunun yerine her uygulamanın url&#8217;lerini o uygulamaya ait urls.py dosyasına (uygulama/urls.py) yazın ve projenin urls.py&#8217;sinde import edin.</p>

<figure class='code'><figcaption><span>urls.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="p">(</span><span class="s">r&#39;^askalumni/&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="s">&#39;askalumni.urls&#39;</span><span class="p">)),</span>
</span><span class='line'>    <span class="p">(</span><span class="s">r&#39;^member/&#39;</span><span class="p">,</span> <span class="n">include</span><span class="p">(</span><span class="s">&#39;member.urls&#39;</span><span class="p">)),</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>member/urls.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">urlpatterns</span> <span class="o">=</span> <span class="n">patterns</span><span class="p">(</span><span class="s">&#39;member.views&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^editprofile/$&#39;</span><span class="p">,</span><span class="s">&#39;editProfile&#39;</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;editprofileurl&quot;</span><span class="p">),</span>
</span><span class='line'>    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^changepassword/$&#39;</span><span class="p">,</span><span class="s">&#39;changePassword&#39;</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;changepasswordurl&quot;</span><span class="p">),</span>
</span><span class='line'>    <span class="n">url</span><span class="p">(</span><span class="s">r&#39;^logout/$&#39;</span><span class="p">,</span><span class="s">&#39;logout&#39;</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="s">&quot;logouturl&quot;</span><span class="p">),</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h3>URL&#8217;leri tanımlamak için isim verin</h3>

<p>Fark ettiğiniz üzere her bir url için name=… gibi bir isim belirledik. Bu isimlendirme template, view ve modellerde URL&#8217;leri hardcode etmeden kullanmamızı sağlıyor. Bu sayede URL yapısını değiştirmek istediğiniz zaman template, view ve modelleri tekrar düzenlemek zorunda değilsiniz.</p>

<p>İsimlendirmede dikkat edilecek bir husus bu isimlerin tekil (unique) olması gerektiği. Bunu sağlamak için <strong><em><app><url></em></strong> gibi bir şablon kullanabilirsiniz.</p>

<p>Kullanımına göz atmak isterseniz:</p>

<figure class='code'><figcaption><span>views.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="c"># HttpResponseRedirect(&quot;/askalumni/questions/54&quot;)</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.core.urlresolvers</span> <span class="kn">import</span> <span class="n">reverse</span>
</span><span class='line'><span class="n">HttpResponseRedirect</span><span class="p">(</span><span class="n">reverse</span><span class="p">(</span><span class="s">&#39;askquestiondisplay&#39;</span><span class="p">,</span><span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;questionno&#39;</span><span class="p">:</span><span class="n">q</span><span class="o">.</span><span class="n">id</span><span class="p">}))</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>models.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="nd">@models.permalink</span>
</span><span class='line'><span class="k">def</span> <span class="nf">get_absolute_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">(</span><span class="s">&#39;profileurl2&#39;</span><span class="p">,(),{</span><span class="s">&#39;userid&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">id</span><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>template.html</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>{% url askquestiondisplay 345 %}
</span></code></pre></td></tr></table></div></figure>


<h3>Hata ayıklama</h3>

<p>En basit yöntemlerden bir tanesi diğer bir çok djangonaut gibi <a href="https://github.com/django-debug-toolbar/django-debug-toolbar">django debug toolbar</a> kullanmaktır. Bu araç sayesinde kaç sql sorgusu ne kadar sürede çalıştırıldı, template adı, logging, cookie ve session bilgisi gibi bilgilere erişebilirsiniz.</p>

<p>Bir diğer yöntem de <a href="http://docs.python.org/library/pdb.html">pdb</a> kullanmak olabilir. <a href="http://ericholscher.com">Eric Holscher</a> tarafından hazırlanan <a href="http://ericholscher.com/blog/2008/aug/31/using-pdb-python-debugger-django-debugging-series-/">screencast</a>&#8216;e göz atmak isteyebilirsiniz.</p>

<h3>Projenizi zenginleştirin</h3>

<p>Bir uygulamaya ihtiyacınız varsa önce internette arama yapmayı deneyin, büyük ihtimalle sizden önce bir başkasına da lazım olmuştur. Dolayısıyla aynı işi yapan uygulamayı hazır bir şekilde bulmanız mümkündür. Aşağıda en çok kullanılan uygulamalardan oluşan küçük bir liste var.</p>

<ul>
<li><a href="http://pinaxproject.com">Pinax</a> - Bir çok temel uygulamayı içinde bulunduran bir proje.</li>
<li><a href="http://south.aeracode.org">South</a> - Model değişikliklerini kolayca yönetmenizi sağlayan bir proje.</li>
<li><a href="https://github.com/django-extensions/django-extensions">django-command-extensions</a> - manage.py komutlarını genişletmeyi amaçlayan bir proje.</li>
<li><a href="https://github.com/jezdez/django_compressor">django-compressor</a> - JS ve CSS dosyalarınızı sıkıştırarak tek dosya olarak sunmayı sağlayan bir uygulama.</li>
<li><a href="https://github.com/toastdriven/django-tastypie">django-tastypie</a> - Kolayca RESTful API oluşturmanızı sağlayan bir uygulama.</li>
<li><a href="https://github.com/etianen/django-reversion">django-reversion</a> - Modelleriniz üzerinde sürüm kontrol yetenekleri sağlayan bir uygulama.</li>
<li><a href="https://github.com/omab/django-social-auth">django-social-auth</a> - Sosyal ağlarla kullanıcı yetkilendirmesini sağlayan bir uygulama.</li>
</ul>


<h3>virtualenv kullanın</h3>

<p>Projenizi geliştirirken bağımlılıkları yönetmek için sisteminizden izole bir ortam oluşturun. Deployment ve geliştirme aşamasında size bir çok kolaylık sağlayacağı gibi uygulamanızı dağıtmaya karar verirseniz diğer geliştiricilerin de işini kolaylaştıracaktır. Başlangıç için küçük bir yazıyı daha önce <a href="http://blog.ahmetaygun.net/virtualenv-ile-sanal-python-ortamlari/">yazmıştım</a>, göz atabilirsiniz.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[virtualenv ile sanal python ortamları]]></title>
    <link href="http://blog.ahmetaygun.net/virtualenv-ile-sanal-python-ortamlari/"/>
    <updated>2011-12-24T00:32:00+02:00</updated>
    <id>http://blog.ahmetaygun.net/virtualenv-ile-sanal-python-ortamlari</id>
    <content type="html"><![CDATA[<p>Gerek yerel sisteminizde gerekse sunucularınızda birden fazla uygulama bulunduruyorsunuzdur. Çoğunun kendine has bağımlılıkları ya da bazı uygulamaların belirli sürümlerine bağımlılıkları olabilir. Bu gibi durumlarda <a href="http://virtualenv.org">virtualenv</a> yardımınıza yetişiyor ve sisteminizden izole Python ortamları oluşturmanızı sağlıyor.</p>

<p>Bu sayede Python 2.5 ile 2.7 veya 3 kullanan uygulamalarınızı birbirinden farklı ortamlarda çalıştırabilir ve bir takım sorunların önüne geçebilirsiniz. Veya uygulama bağımlılıklarını doğrudan sisteme kurmak yerine sadece çalışılacak ortama kurabilirsiniz.</p>

<!-- more -->


<h4>kurulum</h4>

<p>virtualenv&#8217;i easy_install ya da pip ile kolayca kurabilirsiniz.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ sudo easy_install -U virtualenv
</span><span class='line'>$ sudo pip install -U virtualenv</span></code></pre></td></tr></table></div></figure>


<h4>ortam oluşturma</h4>

<p>Basitçe sanal ortam oluşturmak için:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ virtualenv ortam_adi</span></code></pre></td></tr></table></div></figure>


<p>Bu komutu çalıştırdığınızda ortam taslağını (gerekli betikler, python ve setuptools) <strong><em>ortam_adi</em></strong> dizini altına kopyalar. Bu ortamı kullanırken kurduğunuz python paketlerini <code>ortam_adi/lib/pythonX.X/site-packages</code> dizini altında bulabilirsiniz.</p>

<p>Eğer setuptools yerine distribute kullanmak isterseniz ortamı oluştururken <code>--distribute</code> parametresini kullanabilirsiniz.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ virtualenv --distribute ortam_adi</span></code></pre></td></tr></table></div></figure>


<p>Farklı python sürümü kullanarak ortam oluşturmak için:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ virtualenv -p python2.5 ortam_adi</span></code></pre></td></tr></table></div></figure>


<h4>kullanım</h4>

<p>Yeni ortamımızı başarıyla oluşturduk, biraz da etkin kullanım adımlarına bakalım isterseniz.</p>

<p>Ortamımızı etkinleştirmek için:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ source ortam_adi/bin/activate
</span><span class='line'>(ortam_adi)~$</span></code></pre></td></tr></table></div></figure>


<p>Ortamı etkinleştirdiğinizde komut istemi satırındaki değişikliği fark edeceksiniz. Bu andan itibaren yaptığınız her kurulum o ortama özel olacak ve sisteminizi etkilemeyecek.</p>

<p>Ortamı pasifleştirip sistem öntanımlı ortamına dönmek için:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(ortam_adi)~$ deactivate</span></code></pre></td></tr></table></div></figure>


<p>Paket kurulumu için doğrudan pip&#8217;i ya da easy_install&#8217;u kullanabiliriz.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(ortam_adi)~$ pip install yolk</span></code></pre></td></tr></table></div></figure>


<p>Burada örnek olarak <strong><em>yolk</em></strong> paketini verdim, hem küçük bir paket olduğu için hem de işinize yarayabileceği için fark etmenizi istedim. Yolk ortamınızda kurulu python paketlerini görüntülemenizi sağlayan bir araç.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(ortam_adi)~$ yolk -l</span></code></pre></td></tr></table></div></figure>


<p>Bu listede bazı paketlerin sistemden inherit edildiğini göreceksiniz, eğer ortamı tamamıyla sistemden izole etmek isterseniz ortamı oluşturma esnasında <code>--no-site-packages</code> parametresini kullanabilirsiniz.</p>

<p>Sanal ortamımıza kurduğumuz paketlerin sistemi etkilemediğini denemek isterseniz de:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(ortam_adi)~$ deactivate
</span><span class='line'>$ yolk -l
</span><span class='line'>yolk: command not found</span></code></pre></td></tr></table></div></figure>


<p>pip kullanacaksanız uygulamanız için bir bağımlılık dosyası oluşturup onu da kullanabilirsiniz. Bu özelliği denemek için de requirements.txt isimli bir dosya oluşturup içine birkaç paket yazın ve ardından pip ile yükleyin:</p>

<figure class='code'><figcaption><span>Requirements dosyası </span></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Django
</span><span class='line'>http://www.crummy.com/software/BeautifulSoup/download/3.x/BeautifulSoup-3.0.8.1.tar.gz
</span><span class='line'>-e svn+http://django-tagging.googlecode.com/svn/trunk/@154#egg=django-tagging
</span><span class='line'>-e git://github.com/ahmet/django-cart.git#egg=django-cart</span></code></pre></td></tr></table></div></figure>




<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ pip install -r requirements.txt</span></code></pre></td></tr></table></div></figure>


<h4>ayarlar</h4>

<p>Eğer ortam oluştururken kullandığınız ayarları her seferinde yazmaktan yorulduysanız bir ayar dosyası ile bu işi çözebilirsiniz.</p>

<figure class='code'><figcaption><span>$HOME/.virtualenv/virtualenv.ini </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ini'><span class='line'><span class="k">[virtualenv]</span>
</span><span class='line'><span class="na">distribute</span> <span class="o">=</span> <span class="s">true</span>
</span><span class='line'><span class="na">no-site-packages</span> <span class="o">=</span> <span class="s">true</span>
</span><span class='line'><span class="na">extra-search-dir</span> <span class="o">=</span><span class="s"></span>
</span><span class='line'><span class="s">    /path/to/dists</span>
</span><span class='line'><span class="s">    /path/to/other/dists</span>
</span></code></pre></td></tr></table></div></figure>


<hr />

<p>Şimdilik benden bu kadar, ayarlarınızı detaylandırmak isterseniz <a href="http://virtualenv.org">virtualenv</a> belgelerine bir göz atın derim.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[iPhone'un Home düğmesini kalibre edin]]></title>
    <link href="http://blog.ahmetaygun.net/iphoneun-home-dugmesini-kalibre-edin/"/>
    <updated>2011-12-23T22:54:00+02:00</updated>
    <id>http://blog.ahmetaygun.net/iphoneun-home-dugmesini-kalibre-edin</id>
    <content type="html"><![CDATA[<p><img src="http://blog.ahmetaygun.net/uploads/recalibrate_home_button.jpg" title="Home Button" ></p>

<p>iPhone&#8217;unuzun Home düğmesi zamanla geç tepki vermeye ya da hissizleşmeye başlayabiliyor. Telefon fiziksel bir zarar görmemişse çoğunlukla bunun sebebi yazılım kaynaklı oluyormuş, ben de yeni öğreniyorum.</p>

<p>Bu gibi durumlarda tekrar kalibre etmek oldukça kolay, aşağıdaki adımları uyguladığınızda farkı göreceksiniz.</p>

<ol>
<li>Öntanımlı gelen Apple uygulamalarından birini açın. (Hava durumu, Borsa, Rehber vb.)</li>
<li><strong>Power</strong> düğmesine ”kapatmak için sürükleyin” ibaresini görene kadar basın ve görününce bırakın.</li>
<li>Kapatma ekranı kaybolana kadar <strong>Home</strong> düğmesine basın. Böylece uygulama kapanmaya için zorlanacak.</li>
</ol>


<p>Bu işlemleri tamamladığınızda Home düğmesini kalibre etmiş olacaksınız ve tepkileri normale dönecek.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[MacBook Pro kararan ekran sorunu]]></title>
    <link href="http://blog.ahmetaygun.net/macbook-pro-kararan-ekran-sorunu/"/>
    <updated>2011-11-11T15:10:00+02:00</updated>
    <id>http://blog.ahmetaygun.net/macbook-pro-kararan-ekran-sorunu</id>
    <content type="html"><![CDATA[<p>MacBook Pro kendisinden hiç beklenmeyecek bir başarı gösterip bir süredir
sorun çıkartıyor bana. Bunlardan bir tanesi adeta insanı çileden çıkarıyor.
Durduk yerde (hiçbir işlem ile bağlantısı olmaksızın, evet) ekran kararıyor ve
cihaz çalışmaya devam etmesine karşın hiçbir şekilde görüntü alamıyorsunuz.
Geriye tek çare bilgisayarı kapatıp tekrar açmak kalıyor ve yeniden
başlattığınızda şöyle bir hata raporu sizi karşılıyor.</p>

<p><img src="http://blog.ahmetaygun.net/uploads/kernel_panic.png" width="150" height="150" title="Kernel Panic" ></p>

<p>Bazen tekrar başlatmanıza rağmen siyah bir mesaj kutucuğunda &#8216;lütfen beni
yeniden başlat&#8217; mesajı gösteriyor.</p>

<p>Bir şeyler yazarken, &#8216;kodu yazdım bir çalıştırması kaldı&#8217; derken ya da bir
dosya indirirken başınıza gelebilecek bu <a href="http://www.google.com.tr/%0A?q=NVRM%5B0%2F1%3A0%3A0%5D%3A+Read+Error+0x00000100">hadisenin</a> yaklaşık bir ay öncesine
kadar bir çözümü yoktu. Bir çok insan Apple forumlarında
<a href="https://discussions.apple.com/thread/3114550">tartıştı</a>
<a href="https://discussions.apple.com/thread/3191083">durdu</a>. Hatta bu sorun için
<a href="https://www.facebook.com/applebsod">Facebook sayfası</a> dahi oluşturuldu.</p>

<p>Önceleri <a href="http://codykrieger.com/gfxCardStatus">gfxCardStatus</a> ile sadece
Intel ekran kartını kullanarak çözdüğümüz bu soruna Apple bir çözüm getirdi ve
güncelleme olarak yayınladı. Bu sorundan muzdarip iseniz ve hala güncellemeyi
kurmadıysanız sizi <a href="http://support.apple.com/kb/TS4088">şöyle</a> alalım. Basitçe
Software Update aracını çalıştırarak aşağıda gördüğünüz güncellemeyi de
kurabilirsiniz.</p>

<p><img src="http://blog.ahmetaygun.net/uploads/update.png" width="150" height="150" title="Update" ></p>

<p>Ayrıca belirtelim ki bu sorun (görünen o ki) sadece 2010 ortası üretim tarihli
15&#8221; cihazlarda mevcut.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Daha çekici navigasyon başlıkları]]></title>
    <link href="http://blog.ahmetaygun.net/daha-cekici-navigasyon-basliklari/"/>
    <updated>2011-09-09T00:00:00+03:00</updated>
    <id>http://blog.ahmetaygun.net/daha-cekici-navigasyon-basliklari</id>
    <content type="html"><![CDATA[<p>Bugünkü eğlencemiz <a href="http://blog.ahmetaygun.net/ios-4te-farkli-%0Afontlar-kullanin">bir öncekine</a> çok benziyor. Ancak bu sefer label ya da button gibi sık
kullanılan öğelerle değil hep gözümüzün önünde olsa da pek dikkatimizi
çekmeyen navigasyon çubuğuyla (UINavigationBar) oynayacağız.</p>

<p>UINavigationItem&#8217;ın ayarları native uygulama görünümü istemediğimiz bir çok
uygulama için yetersiz kalıyor. Bu noktada NavigationItem&#8217;ın title
property&#8217;sini bir kenara bırakıp ilgimizi titleView property&#8217;si üzerine
yoğunlaştırıyoruz. titleView property&#8217;sine değer olarak herhangi bir UIView
nesnesi verebiliyorsunuz, bu örnekte UILabel kullanacağım ancak <a href="http://blog.ahmetaygun.net/ios-4te-farkli-fontlar-kullanin">biraz egzersizle</a> farklı
fontlar kullanarak yazı yazabilirsiniz ;)</p>

<p>Değişik renkli başlıkları farklı view controller&#8217;larda kullanabileceğimizi
düşünerek verdiğimiz metni bir label&#8217;ın içine yazıp bize o label&#8217;ı döndüren
bir fonksiyon yazarak başlıyoruz.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">+</span> <span class="p">(</span><span class="n">UILabel</span> <span class="o">*</span><span class="p">)</span> <span class="nl">labelForNavigationItem:</span><span class="p">(</span><span class="n">NSString</span><span class="o">*</span><span class="p">)</span> <span class="n">text</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">UILabel</span> <span class="o">*</span><span class="n">titleView</span> <span class="o">=</span> <span class="p">[[[</span><span class="n">UILabel</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithFrame:</span><span class="n">CGRectMake</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">30</span><span class="p">)]</span> <span class="n">autorelease</span><span class="p">];</span>
</span><span class='line'>  <span class="p">[</span><span class="n">titleView</span> <span class="nl">setFont:</span><span class="p">[</span><span class="n">UIFont</span> <span class="nl">boldSystemFontOfSize:</span><span class="mf">16.0</span><span class="p">]];</span>
</span><span class='line'>  <span class="n">titleView</span><span class="p">.</span><span class="n">backgroundColor</span> <span class="o">=</span> <span class="p">[</span><span class="n">UIColor</span> <span class="n">clearColor</span><span class="p">];</span> <span class="n">titleView</span><span class="p">.</span><span class="n">textAlignment</span> <span class="o">=</span> <span class="n">UITextAlignmentCenter</span><span class="p">;</span>
</span><span class='line'>  <span class="n">titleView</span><span class="p">.</span><span class="n">textColor</span><span class="err"> </span> <span class="o">=</span> <span class="p">[</span><span class="n">UIColor</span> <span class="nl">colorWithRed:</span><span class="mf">.80784314</span> <span class="nl">green:</span><span class="mf">.77647079</span> <span class="nl">blue:</span><span class="mf">.50980392</span> <span class="nl">alpha:</span><span class="mf">1.0</span><span class="p">];</span>
</span><span class='line'>  <span class="n">titleView</span><span class="p">.</span><span class="n">textColor</span> <span class="o">=</span> <span class="p">[</span><span class="n">UIColor</span> <span class="n">whiteColor</span><span class="p">];</span>
</span><span class='line'>  <span class="n">titleView</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">text</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">titleView</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>İlgili view controller&#8217;ın viewDidLoad methodu içinde navigationItem&#8217;ın
titleView property&#8217;sine değer atayarak işimizi bitiriyoruz.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">self</span><span class="p">.</span><span class="n">navigationItem</span><span class="p">.</span><span class="n">titleView</span> <span class="o">=</span> <span class="nl">labelForNavigationItem:</span><span class="s">@&quot;Menu&quot;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>labelForNavigationItem fonksiyonunu zenginleştirmek ve yazınıza görsellik
katmak size kalmış.</p>

<p>UILabel kullandığım bir örnek:</p>

<p><img src="http://blog.ahmetaygun.net/uploads/navbar.png" width="150" height="150" title="Custom NavigationItem title" ></p>

<p>Başka bir uygulamada UILabel yerine UIImageView kullandım, demem o ki diğer
UIView nesnelerine ihtiyacınız olduğunda hiç çekinmeyin bu kodlarda birkaç
değişiklik yaparak sorunsuzca kullanılabiliyor.</p>

<p>Bu yazının puanları da <a href="http://fiveflamesmobile.blogspot.com/2011/05/code-snippet-custom-uinavigationitem.html">Sergio Morales</a>&#8216;e gidiyor.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[iOS 4'te farklı fontlar kullanın]]></title>
    <link href="http://blog.ahmetaygun.net/ios-4te-farkli-fontlar-kullanin/"/>
    <updated>2011-09-04T08:15:00+03:00</updated>
    <id>http://blog.ahmetaygun.net/ios-4te-farkli-fontlar-kullanin</id>
    <content type="html"><![CDATA[<p>iOS platformu için uygulama geliştiriyorsunuz diyelim, tasarımınız gereği
sistemdeki fontlardan başka bir font kullanmanız gerekiyor ya da sadece
değişiklik olsun diye bunu yapmak istiyorsunuz belki de. Benim gibi platformun
teknik detaylarını bilmeyen bir tasarımcı başınıza iş açmış bile olabilir :)</p>

<p>Öncelikle bu çözümün sadece iOS SDK 4 ve üzeri sürümlerde çalışacağını
belirtelim. Eğer bu bir sorun değilse aşağıdaki adımları takip ederek sonuca
ulaşabilirsiniz.</p>

<ol>
<li>Kullanmak istediğiniz font dosyasını (TTF/OTF) XCode&#8217;da projenize ekleyin.</li>
<li>Projenizin info.plist (projeadı-info.plist de olabilir) dosyasına &#8221;<em>Fonts provided by application</em>&#8221; isimli bir anahtar ekleyin.

<ul>
<li>Eğer birden fazla font kullanacaksanız bu anahtarın tipini <em><strong>Array</strong></em> yapmayı unutmayın.</li>
<li>Anahtarın değeri olarak eklediğiniz font dosyasının adını (uzantısıyla birlikte) yazın ve dosyayı kaydedin.</li>
</ul>
</li>
<li>Kodun içinde [UIFont fontWithName:@&#8221;YeniFontunAdı&#8221; size:16] şeklinde kullanabilirsiniz.</li>
<li>Buradaki &#8220;YeniFontunAdı&#8221; eklediğiniz dosyanın adı değil bilgisayarınızdaki görünen adıdır. Örnek vermek gerekirse &#8221;bauhaus_med.ttf&#8221; dosyasını kullanmak istediğinizde &#8221;YeniFontunAdı&#8221; yerine &#8221;Bauhaus Medium&#8221; yazmalısınız. Dikkat edilecek bir husus da bazı fontların birden fazla ismi olmasıdır. Hata yapmamak için fontu bilgisayarınızda açıp kontrol edin.
UILabel, UITextView ve UIButton gibi setFont metodu olan her türden nesne için
kullanabilirsiniz. UIButton ile yapılmışı:</li>
</ol>


<p><img src="http://blog.ahmetaygun.net/uploads/customfontbutton.png" title="'Custom Font in UIButton'" ></p>

<p>İlk üç madde için puanlar <a href="http://blog.beefyapps.com/2010/06%0A/custom-fonts-in-ios-4/">BeefyApps</a>&#8216;e giderken son madde için birkaç puan da <a href="http://shang-liang.com/blog/custom-fonts-in-ios4/">Shang
Liang</a>&#8216;a gidiyor.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mac OS ile Xerox Phaser 3117]]></title>
    <link href="http://blog.ahmetaygun.net/mac-os-ile-xerox-phaser-3117/"/>
    <updated>2011-08-28T07:13:00+03:00</updated>
    <id>http://blog.ahmetaygun.net/mac-os-ile-xerox-phaser-3117</id>
    <content type="html"><![CDATA[<p><img class="right" src="http://blog.ahmetaygun.net/uploads/Xerox-Phaser-31171.png" width="250" height="250" title="'Xerox Phaser 3117'" ></p>

<p>Xerox Phaser 3117&#8217;niz var ve Mac OS için sürücüsü olmadığını
mı fark ettiniz? Zaten Xerox&#8217;un <a href="http://download.support.xe%0Arox.com/pub/drivers/Compatibility_Matrix/other/macosx/en/MacOSX10-6_Matrix.pdf">uyumluluk belgesi</a> de Mac OS X 10.6 ile desteklenmediğini söylüyor.</p>

<p>&#8220;Ee şimdi ne yapacağız?&#8221; diye düşünürken biraz araştırma ile bir çözüm buldum.
Yazıcısına uygun sürücüleri ilk bakışta bulamayan herkesin yolu muhakkak Linux
Foundation&#8217;ın Open Printing çalışma grubunun sitesine düşmüştür, nitekim Mac
kullanmama rağmen benimki hala düşüyor :)</p>

<p><a href="http://www.linuxfoundation.org/collaborate/workgroups/openprint%0Aing/macosx/samsung-gdi">Bu sayfadaki</a> şu paketleri sırasıyla indiriyoruz ve kuruyoruz:
<a href="http://www.openprinting.org/download/printdriver/macosx/samsung-%0Agdi-1.816.2.dmg">samsung-gdi</a> <a href="http://www.openprinting.org/download/printdriver/macosx/foomatic-%0Arip-4.0.6.230.dmg">foomatic-
rip</a> <a href="http://www.openprinting.org/download/printdri%0Aver/macosx/gplgs-8.71.dmg">ghostscript</a></p>

<p>Kurulum işlemleri bittikten sonra <strong>Sistem Seçenekleri > Yazıcı &amp; Fax > Yazıcı
Ekle</strong> yolunu takip ederek karşımıza gelen pencerede arama kutusuna GDI
yazıyoruz ve listenin en üstündeki <strong>Generic GDI Printer Foomatic/gdi</strong>
sürücüsünü seçiyoruz.</p>

<p>Voila! Yazıcınız kullanıma hazır.</p>

<p>Kaynak: <a href="http://vadimk.com/2010/10/11/xerox-%0Aphaser-3117-mac/">Vadim Khukhryansky</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[MacBook'unuzun USB portu çalışmazsa]]></title>
    <link href="http://blog.ahmetaygun.net/macbookunuzun-usb-portu-calismazsa/"/>
    <updated>2011-04-23T22:07:00+03:00</updated>
    <id>http://blog.ahmetaygun.net/macbookunuzun-usb-portu-calismazsa</id>
    <content type="html"><![CDATA[<p>Bir MacBook&#8217;unuz var ve fark ettiniz ki USB portlarından biri veya birkaçı
çalışmayı bırakmış. iPad&#8217;inizi iPhone&#8217;unuzu ya da başka bir cihazınızı
taksanız da hiçbir eylem gerçekleşmiyorsa, cihazınızı şarj edemiyorsanız hemen
bozulduğunu düşünmeyin :)</p>

<p>Zira çok kolay bir çözümü var. EFI ve SMC&#8217;yi sıfırlamanız gerekiyor. Bunun
için bütün açık uygulamaları kapatın çünkü bilgisayarımızı kapatacağız.</p>

<p><strong>Shift+Control+Option+Power</strong> düğmelerine eşzamanlı basın ve <strong>MacBook&#8217;unuzun prize takılı olduğundan emin olun</strong>.<br/>
Bilgisayarınız kapandıktan sonra <strong>Power</strong> düğmesine tekrar basın ve gri ekran
görüntülenmeden önce MacBook reboot edene kadar <strong>Command+Option+R+P</strong>
düğmelerine basın.</p>

<p>Voila!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Akademisyen dediğin..]]></title>
    <link href="http://blog.ahmetaygun.net/akademisyen-dedigin/"/>
    <updated>2010-10-25T02:50:00+03:00</updated>
    <id>http://blog.ahmetaygun.net/akademisyen-dedigin</id>
    <content type="html"><![CDATA[<p><a href="http://cse.iku.edu.tr">Okuldaki</a> son seneme biraz hızlı başladım, 8 ders
alıyorum. Bunlardan &#8220;Olasılık ve İstatistik Teorilerine Giriş&#8221; ve &#8220;Çokluortam
Sıkıştırma ve İşleme&#8221; isimli iki derse birbirleriyle iç içe olmaları sebebiyle
diğerlerinden fazla ilgi gösteriyorum.</p>

<p>Çokluortam Sıkıştırma ve İşleme dersini <a href="http://www.linkedin.com/profile/view?id=36028368">Sıla Ekmekçi
Flierl</a> isimli hocamız
veriyor. Kendisi bu konudaki çalışmalarıyla tanınan oldukça donanımlı ve
tecrübeli biri. Bazen anlattıklarını algılamakta sorunlar yaşasak da araştırıp
altyapımızı geliştirdikçe daha rahat anlaşabildiğimizi görüyorum.</p>

<p>Gelelim konumuza; haftaya sınav var ve çalışmak için kaynağa ihtiyacım var.
Hocamızın ders materyali olarak kullandığı Bernd Girod&#8217;un sunum dosyalarını
bulmam gerekiyordu ve hepimizin yapacağı gibi Google&#8217;a sorayım dedim, pek
ümitli değildim aslında. Google&#8217;da bulamazsam p2p ağlara bakacaktım ancak
birkaç sayfa taradıktan sonra fark ettim ki Stanford&#8217;da Bernd amcanın verdiği
aynı isimli dersin bütün sunum dosyaları erişime açıkmış. Tabii ki hemen
sömürdüm :)</p>

<p>Okulda 5. yılıma girdim ve henüz ders notlarını kolayca paylaşan bir hoca ile
karşılaşmadım. Kimisinin çok ahlaki sebepleri varken (korsan materyal
paylaşımı yapmak istememek gibi) kimisinin sadece &#8220;benim emeğim var, kendi
araştırmam ve notlarım, neden sizinle paylaşayım&#8221; demesi sonucu eski
öğrencilerin birikimlerine yöneldik hep.</p>

<p>Bir eğitmen, bir akademisyen, bir bilimadamı neden üretimini saklar, neden
paylaşıma açık olmaz. Kaybedecek neleri olabilir ki? Ya da kazanacaklarının
yanında daha değerli ne kaybedebilirler? Neden &#8220;özgür&#8221; kılmıyoruz bilgiyi?
Akademisyen ne iş yapar?</p>

<p>Daha bir sürü soru sorulabilir ancak cevaplarını verebileceğimiz günün gelip
gelmeyeceğini merak ediyorum ben. Ya da cevapları da boşverin, bütün
akademisyenlerin ürettiği bir ülke istiyorum. Belki <a href="http://meren.org">Murat
Eren</a> gibi <a href="http://nyucel.blogspot.com/">Necdet Yücel</a> gibi
ya da adını bilmediğim, yazmayı unuttuğum diğer idealist akademisyenlerin
artması lazım, kesinlikle bunu istiyorum.</p>

<p>Birileri &#8220;özgür&#8221; olmayı, &#8220;özgür&#8221; bırakmayı öğretsin. Bunu bazen zorunluluklar
koyarak, bazen kendisi örnek olarak yapsın.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ömrümü yedin Symfony]]></title>
    <link href="http://blog.ahmetaygun.net/omrumu-yedin-symfony/"/>
    <updated>2010-08-23T14:36:18+03:00</updated>
    <id>http://blog.ahmetaygun.net/omrumu-yedin-symfony</id>
    <content type="html"><![CDATA[<p>Artistanbul&#8217;da tekrar çalışmaya başladığım dönemlerde bir müşterimizin sitesi
hazırlanıyordu. Süre olarak çalışmanın ortalarına denk geldiğim için pek
müdahale şansım olmadı ve altyapıda <a href="http://www.symfony-project.org">Symfony</a>
kullanıldı. O gün bugündür, sunucu tarafında herhangi bir yerine müdahale
etmek istediğimizde karşımıza her seferinde birbirinden farklı ve izlenemez
hatalar çıkıyor.</p>

<p>Neyse ki bugünkü izlenebilir bir hataydı ve benden önce birileri çözmüştü :)
Birazcık aramayla öğrendim ki <strong>Fatal error: Class ‘sfInflector’ not found –
Symfony $VER</strong> diye ağlamasının sebebi <em>strtolower</em> işlevinin Türkçe yerelinde
doğru çalışmaması.</p>

<p>Çözüm olarak <em>symfonylibfolder/autoload/sfCoreAutoload.class.php</em> dosyasının
440. satırındaki <code>'sfinflector' =&gt; 'util/sfInflector.class.php',</code> satırını
şununla değiştirin: <code>'sfInflector' =&gt; 'util/sfInflector.class.php',</code></p>

<p>strtolower&#8217;ın nasıl çalışmadığını görmek isteyenler şunu çalıştırabilirler:
<code>&lt;?php echo strtolower('sfInflector'); // sonuç: sfInflector ?&gt;</code></p>

<p>Evet, yıl 2010 oldu hala Türkçe için yerel sorunlarından bahsediyoruz&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Sessiz çalışıyoruz]]></title>
    <link href="http://blog.ahmetaygun.net/sessiz-calisiyoruz/"/>
    <updated>2010-08-15T03:10:00+03:00</updated>
    <id>http://blog.ahmetaygun.net/sessiz-calisiyoruz</id>
    <content type="html"><![CDATA[<p>Pardus&#8217;un 2010 yılı staj programının 2. dönemi 2 Ağustos&#8217;ta başladı. <a href="http://gezegen.pardus.org.tr">Pardus
Gezegeni</a> staj dönemlerinde pek bir sessiz
oluyor ama svn deposundaki hareketlerden UEKAE&#8217;deki ofiste stajını sürdüren
arkadaşların çalıştığını görebiliyoruz. 2. dönem stajını ArtistanbulPR&#8217;da
yapacak talihliler de <a href="http://orcuna.blogspot.com">Orçun</a> ve benim.</p>

<p>Görevimiz Özgürlükİçin&#8217;in Tema bölümünü yenilemek ve büyük pay da Orçun&#8217;a ait.
Kendisi 2 haftadır üzerinde çalışıyor ve <a href="http://blog.ahmetaygun.net/wp-%0Acontent/uploads/2010/08/4889235444_ec9ee8c053_z.jpg">oldukça güzel bir
iş</a> çıkarıyor. Onun işi
tamamlamasıyla beraber Tema bölümüne RESTful bir API ekleyeceğiz. Aslında bu
API&#8217;i Özgürlükİçin 3.0&#8217;ın yapılacak listesine eklemiştim fakat yeni Tema
uygulamamızın Pardus&#8217;un masaüstü hizmetleri ile iletişimini sağlayan
<a href="http://ghns.freedesktop.org/knewstuff/">KNewStuff</a> (eski adıyla
<a href="http://ghns.freedesktop.org/">GHNS</a>) özelliği için yazmamız gerekiyor.</p>

<p>Orçun benden daha sık blog yazdığı için kendisini
<a href="﻿http://bit.ly/orcunablog">şuradan</a> takip edebilirsiniz. Blog yazma konusunda
darısı stajını UEKAE&#8217;deki ofiste yapan arkadaşların başına diyerek
danışmanlarına ve kendilerine taş atarak bitireyim..</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mercurial (hg) deposunu Git deposuna dönüştürün]]></title>
    <link href="http://blog.ahmetaygun.net/mercurial2git/"/>
    <updated>2010-08-02T15:50:00+03:00</updated>
    <id>http://blog.ahmetaygun.net/mercurial2git</id>
    <content type="html"><![CDATA[<p>Bugünlerde bir projemize API yazmak için kolları sıvadık. Öncelikle kaynak
kodları paylaşılan Django projelerinin
<a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">REST</a>ful
API&#8217;lerini nasıl oluşturduklarını incelemeye koyulduk. Bir kısmı wapi benzeri
modüllerle kendilerine özel çözümler üretirken bazıları da küçük django
paketleri ile sorunu kısa yoldan çözmüşler.</p>

<p>Biz de hızlıca API&#8217;i ortaya çıkarabilmek için ikinci seçeneği uygun gördük ve
<a href="http://bitbucket.org/jespern/django-piston/wiki/Home">django-piston</a>
kullanmaya karar verdik. Social coding iyi şey güzel şey fakat işin içine
birbirinden farklı sürüm kontrol sistemleri girince işler çok karışabiliyor.
Projemizi Subversion ile geliştirirken, follow ve invite uygulamalarını Git
ile geliştiriyoruz. Şimdi bir de django-piston&#8217;ın mercurial&#8217;ı çıktı derken
kendisini GitHub&#8217;a taşıyalım dedik.</p>

<p>Biraz araştırma ile prosedürün şöyle işlediğini öğrendik ve sizlerle paylaşmak
istedim.</p>

<ol>
<li>git clone git://repo.or.cz/fast-export.git</li>
<li>mkdir yeni_git_deposu</li>
<li>cd yeni_git_deposu</li>
<li>git init</li>
<li>fast-export_dizini/hg-fast-export.sh -r mercurial_dizini</li>
<li>git repack -a -d -f</li>
<li>git remote add origin git@github.com:kullaniciadi/depoadi.git</li>
<li>git push origin master
8 adımı da tamamladıktan sonra kendinize güzel bir espresso alıp kodlamaya
devam edebilirsiniz ;)</li>
</ol>


<pre><code>git remote add origin git@github.com:ahmet/test.git
</code></pre>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[2010'un ilk stajyerleri mezun oldu]]></title>
    <link href="http://blog.ahmetaygun.net/2010un-ilk-stajyerleri-mezun-oldu/"/>
    <updated>2010-07-23T22:17:00+03:00</updated>
    <id>http://blog.ahmetaygun.net/2010un-ilk-stajyerleri-mezun-oldu</id>
    <content type="html"><![CDATA[<p>Pardus&#8217;un 2010 yılı ilk dönem stajyerlerinden stajını ofisimizde yapan
arkadaşlarımız Engin Manap ve Ufuk Uzun stajlarını başarı ile tamamladılar.
Başarı ile tamamlamak ne demek bilmiyorum ama klasik bir giriş yapmak adetini
bozmak istemedim.</p>

<p>4 hafta boyunca ofisimizde bizlerle birlikte çalıştılar, yeni bir programlama
dili öğrendiler ve o dil ile yazılmış bir framework kullanarak Özgürlükİçin
kullanıcılarının fikirlerini Pardus projesine ulaştırmakla yükümlü Beyin
uygulamasını yenilediler.</p>

<p>Aslında sadece yenilemediler, bir çok eksiğini düzeltip yeni özellikler
eklediler. Bu esnada bol bol eğlenip Pardus ve özgür yazılım üzerine sohbetler
ettik. Ne yalan söyleyeyim benim bir stajyerden beklentilerimi karşılamakla
kalmayıp fazlasını yaparak staj ve stajyerler hakkındaki önyargılarımı
fazlasıyla kırdılar.</p>

<p>Geçtiğimiz günlerde beyin2 adını verdikleri django uygulaması
Özgürlükİçin&#8217;deki selefi ile değiştirildi ve kullanıcılara sunuldu.
Kullanıcılardan gelen tepkilere bakılırsa ortaya çıkan uygulamayı tek beğenen
bizler değiliz :)</p>

<p>Kendi ağızlarından stajlarını UEKAE yerine Artistanbul ofisinde yaptıkları
için kendilerini şanslı hissettiklerini de duyduğumuza göre yazımızın dilekler
kısmına geçebiliriz ;)</p>

<p>UEKAE&#8217;deki Pardus ofisinde ve Artistanbul ofisinde stajını tamamlayan
arkadaşlarımıza kariyerlerinde başarılar diliyor, Pardus ve özgür yazılım dolu
geçirdikleri bu kısa süreli yakınlaşmanın uzun sürmesini istiyoruz.</p>

<p>Önümüzdeki haftalarda Artistanbul ofisinde çalışacak ikinci dönem
stajyerlerinin hangi konu üzerinde çalışacaklarını ve neler yapacaklarını da
yazarım :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Artistanbul ekibinin yeni üyeleri]]></title>
    <link href="http://blog.ahmetaygun.net/artistanbul-ekibinin-yeni-uyeleri/"/>
    <updated>2010-06-22T22:35:00+03:00</updated>
    <id>http://blog.ahmetaygun.net/artistanbul-ekibinin-yeni-uyeleri</id>
    <content type="html"><![CDATA[<p>Artık ofisimizde 2 yeni arkadaşımız var, Engin Manap ve Ufuk Uzun. Kendileri
2010 yılının ilk dönem Pardus Stajerleri.</p>

<p>Benim danışmanlığımda Özgürlükİçin&#8217;e <a href="http://bit.ly/8XXG4m">kağıt kesikleri</a>
arabirimi yazacaklar. Kağıt kesikleri en basit manasıyla dağıtımda bulunan
fakat engelleyici özellikte olmayan küçük ve genellikle kozmetik hatalara
deniyor. Kullanıcılarda kafa karışıklığı yaratan yazım hataları ya da hatalı,
anlaşılabilir olmayan çevirilerden tutun da varlığıyla küçük işlemleri kolayca
halletmeye yarayacak ve kolayca entegre edilebilecek özelliklere kadar her
türlü hata bu sınıfa dahil.</p>

<p>İlk günümüzü Ubuntu&#8217;nun bu işi nasıl yaptığı ve Özgürlükİçin altyapısında
kullandığımız <a href="http://bit.ly/b1LJK8">Django</a> çatısı üzerine sohbet ederek
geçirdik. Planımızı ilk haftanın sonunda ellerimizi kirletip kod yazacak
şekilde yaptık. Tahminlerimize göre 2. haftanın başında deneme yayını ve
sonunda da nihai yayına geçebileceğiz.</p>

<p>Gözünüzü Özgürlükİçin&#8217;den ayırmayın ;)</p>
]]></content>
  </entry>
  
</feed>

