
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
 <channel>
   <title>Tahir Özdemir</title>
   <link>http://www.tahirozdemir.com/</link>
   <description>Recent content on Tahir Özdemir</description>
   <generator>Hugo -- gohugo.io</generator>
   <language>tr-tr</language>
   <lastBuildDate>Mon, 19 Aug 2019 08:31:57 +0000</lastBuildDate>
   
       <atom:link href="http://www.tahirozdemir.com/index.xml" rel="self" type="application/rss+xml" />
   
   
     <item>
       <title>Go Uygulamanız İçin Küçük Boyutlu Docker Konteyneri Oluşturma</title>
       <link>http://www.tahirozdemir.com/2019/08/go-uygulamaniz-icin-kucuk-boyutlu-docker-konteyneri-olusturma/</link>
       <pubDate>Mon, 19 Aug 2019 08:31:57 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2019/08/go-uygulamaniz-icin-kucuk-boyutlu-docker-konteyneri-olusturma/</guid>
       <description>&lt;p&gt;Merhabalar sevgili okur. Başlıkta da görüldüğü üzere bu yazıda Go uygulamamızı nasıl küçük boyutlu bir Docker konteyneri içine sıkıştırabileceğimizden bahsedeceğim.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2019/08/68747470733a2f2f63646e2d696d616765732d312e6d656469756d2e636f6d2f6d61782f3630302f312a626e794a39612d4478414b562d714a584b44415a6b512e706e67.png&#34; alt=&#34;&#34;&gt;  Go + Docker = ❤&lt;a href=&#34;https://hackernoon.com/golang-docker-microservices-for-enterprise-model-5c79addfa811&#34;&gt;[*]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Öncelikle bu ihtiyacımın nereden çıktığına bakalım. Geçenlerde GitHub repolarımdaki markdown dosyalarını daha rahat yönetmek için çok çok basit ve bolca &amp;ldquo;sphagetti code&amp;rdquo; içeren bir uygulama yazdım. Siz Go Report Card’ın kod kalitesine A+ verdiğine bakmayın 🙂 Şuradan projeyi inceleyebilirsiniz: &lt;a href=&#34;https://github.com/tahirozdemir34/GoMarkdownPusher&#34;&gt;https://github.com/tahirozdemir34/GoMarkdownPusher&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Temel CRUD operasyonlarını bu uygulama üzerinden yürütebilmekteyim. Amaç, uygulama geliştirmenin çok yabancısı olduğum web tarafında ortaya çalışabilen bir uygulama koymaktı. Bunu yaparken de ihtiyacım olan bir şey yapmak istedim sadece. Sonra da neden Docker image’ini de oluşturmayım dedim. DockerHub’da bulunan image’leri daha önce kullanmış olsam da kendi image’imi hiç oluşturmadığımdan benim için hep elimi kirletmek istediğim bir konuydu. Böyle olunca da kendimi bu konuda buldum. Yeterince arkaplan sunduğumuza göre asıl mevzumuza gelebiliriz.&lt;/p&gt;
&lt;h3 id=&#34;multi-stage-build&#34;&gt;&amp;ldquo;Multi-stage Build&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;Bu kavram, küçük boyutlu konteynerler oluşturabilmemizin arkasındaki sır. Temelde yaptığımız şey uygulamamızı derlemek için bir ara konteyner kullanmak. Benim oluşturduğum &amp;ldquo;Docker&amp;rdquo; dosyası şöyle:&lt;/p&gt;
&lt;script type=&#34;application/javascript&#34; src=&#34;https://gist.github.com/tahirozdemir34/02e667289329a1f639eab053387ec972.js&#34;&gt;&lt;/script&gt;

&lt;p&gt;İlk olarak Go uygulamamızı derleyeceğimiz ara image’i oluşturdum. Bunun için ‘golang:latest’ image’ini temel olarak aldım. Sonra uygulamamda kullandığım iki kütüphaneyi, &lt;a href=&#34;https://github.com/golang/oauth2&#34;&gt;OAuth&lt;/a&gt; ve &lt;a href=&#34;https://github.com/google/go-github&#34;&gt;go-github&lt;/a&gt;, kurdum. Daha sonra ise uygulamanın dosyalarını kopyalayıp derleme işlemini gerçekleştirdim.&lt;/p&gt;
&lt;p&gt;İkinici FROM’dan itibaren ise uygulamanın çalışacağı image’i hazırladım. Temel image olarak Alpine’ı tercih ettim. Kendisi 5mb’cık olup temel Linux kütüphanelerini içeriyor sadece. Eğer uygulamanın çalışacağı ortamı daha da özelleştirmek isterseniz temel image olarak Scratch’i de tercih edebilirsiniz. 14. satırda gördüğünüz &amp;lsquo;--from=0&amp;rsquo; ifadesi ilk image’den dosyaları alacağımı belirtiyor. Orada derleyip hazırladığımız dosyaları yeni image aldım. 15. satırda ise uygulamı başlatıyorum.&lt;/p&gt;
&lt;p&gt;Eğer bu ikinci aşamayı yapmasam ve uygulamamı derlediğim image içerisinde çalıştırmak isteseydim, image’imin boyutu 800 küsür MB olacak iken multi-stage build ile uygulamamı 18.9 MB’a sığdırmış oldum.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2019/08/Screenshot-from-2019-08-06-15-54-33.png#mid&#34; alt=&#34;Uygulama image&amp;rsquo;inin ve base image&amp;rsquo;lerin boyutları&#34;&gt;&lt;/p&gt;
&lt;p&gt;Şimdi tek yapmamız gereken GitHub repomuz ile DockerHub repomuzu ilişkilendirerek otomatik derlemenin tadını çıkarmak. Nasıl mı?&lt;/p&gt;
&lt;h3 id=&#34;bonus-github-reponuzdan-dockerhuba-otomatik-derleme&#34;&gt;Bonus: Github Reponuzdan DockerHub’a Otomatik Derleme&lt;/h3&gt;
&lt;p&gt;Uygulamamızın kaynak dosyalarını ve uygulamayı içerecek image’i oluşturacak Docker dosyamızı Github repomuza yükledikten sonra bir kaç basit adımda bu işlemi gerçekleştirmek mümkün. Öncelikle gidip DockerHub’da yeni bir repo yaratıyoruz. Repo oluşturma esnasında GitHub ikonuna tıklayıp hangi repomuz ile ilişkilendireceğimizi seçmek yeterli.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2019/08/Screenshot-from-2019-08-06-16-46-56.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Eğer daha önce GitHub hesabınızı bağlamadıysanız sizden erişim için izin isteyecektir. Tüm bunları ayarladıktan sonra ilk derlemeyi elle tetikleyebilirsiniz. Bundan sonra GitHub reponuza yaptığınız her ‘push’ işlemi Docker image’inizin tekrar derlenmesini sağlayacaktır. Detaylara inerek bu otomatik derleme işlemini de özelleştirmeniz ve kurallar tanımlamanız mümkün.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2019/08/Screenshot-from-2019-08-06-16-53-56.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Buraya kadar her şey çok güzel. GitHub ve DokcerHub repomuzu ilişkilendirdik. Bundan sonra uygulamamızın en güncel image’i her zaman DockerHub’da bulunacak. Peki sunucuda konteyner içerisinde çalışan uygulamamızı otomatik güncellememizin bir yolu yok mu? Tabii ki var.&lt;/p&gt;
&lt;h3 id=&#34;bonus-2-watchtower-ile-otomatik-konteyner-güncelleme&#34;&gt;Bonus 2: Watchtower ile Otomatik Konteyner Güncelleme&lt;/h3&gt;
&lt;p&gt;Watchtower sizin için konteynerlerinizi takip eden ve otomatik güncelleyen bir uygulama. Kendisi de bir konteyner içerisinde çalışıyor. Tek yapmanız gereken terminalde şu komutu çalıştırmak:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker run -d &lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt;    
  --name watchtower &lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt;    
  -v /var/run/docker.sock:/var/run/docker.sock &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  containrrr/watchtower &lt;span style=&#34;color:#ae81ff&#34;&gt;\ &lt;/span&gt;    
  konteyner_adi_1 konteyner_adi_2 ...
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Watchtower belirli aralıklarla DockerHub’daki image’i kontrol eder. Eğer daha güncel bir sürüm olduğunu fark ederse çalışan konteynerinizi kapatır ve daha önce kullandığınız parametreler ile yeni sürümü barındıran konteyneri ayağa kaldırır. Kaç saniyede bir kontrol edeceğini &amp;ldquo;-i&amp;rdquo; parametresi ile verebilirsiniz. Ya da &amp;ldquo;-s&amp;rdquo; parametresi ile Cron formatında çizelge ayarlayabilirsiniz. Arguman listesini incelerseniz yapılabilecek pek çok ince ayar olduğunu göreceksiniz. Örneğin, bence ‘–label-enable’ ile kullanımı oldukça kullanışlı. Bu sayede sonradan ayağa kaldıracağınız herhangi bir konteyneri&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker run -d --label&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;com.centurylinklabs.watchtower.enable&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true someimage
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;şeklinde çalıştırmanız, o konteynerin Watchtower tarafından takip edilmesi için yeterli oluyor [&lt;a href=&#34;https://containrrr.github.io/watchtower/container-selection/&#34;&gt;**&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;Umarım faydalı bir yazı olmuştur. Her zaman olduğu gibi yararlandığım kaynakları şuraya bırakayım. Konu hakkında daha detaylı bilgiye bu bağlantılardan ulaşabilirsiniz:&lt;/p&gt;
&lt;p&gt;1- &lt;a href=&#34;https://docs.docker.com/develop/develop-images/multistage-build/&#34;&gt;Multi-stage Builds&lt;/a&gt; (Docker dokümanında multi-stage derleme anlatımı)&lt;/p&gt;
&lt;p&gt;2- &lt;a href=&#34;https://docs.docker.com/docker-hub/builds/&#34;&gt;Automated Builds&lt;/a&gt; (Docker dokümanında otomatik derleme anlatımı)&lt;/p&gt;
&lt;p&gt;3- &lt;a href=&#34;https://containrrr.github.io/watchtower/&#34;&gt;Watchtower&lt;/a&gt; (Watchtower dokümantasyonu)&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Python Neden Bu Kadar Yavaş?</title>
       <link>http://www.tahirozdemir.com/2019/01/python-neden-bu-kadar-yavas/</link>
       <pubDate>Wed, 16 Jan 2019 20:31:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2019/01/python-neden-bu-kadar-yavas/</guid>
       <description>&lt;iframe scrolling=no width=&#34;100%&#34; height=&#34;185&#34; frameborder=&#34;0&#34; src=https://anchor.fm/tahir-ozdemir-podcast/embed/episodes/Python-Neden-Bu-Kadar-Yava-edetuc/a-a22ofrj&gt;&lt;/iframe&gt;
&lt;p&gt;Tekrardan merhabalar. Bu yazıda Python&#39;ın neden yavaş olduğu ve bu yavaşlığa rağmen nasıl bu kadar popüler olabildiği üzerine bazı bilgiler paylaşacağım. Python&#39;ın ne kadar yavaş olduğuna dair şüpheleriniz varsa &lt;a href=&#34;https://benchmarksgame-team.pages.debian.net/benchmarksgame/&#34;&gt;The Computer Language Benchmarks Game&lt;/a&gt;‘i ziyaret etmenizi şiddetle öneririm. Sadece Python değil C, C++, Java, Go vb. pek çok dil için karşılaştırmalar mevcut. Farklı testler yapılmış ve sonuçlara göre Python rakiplerine nazaran 2-10 kata kadar yavaş çalışıyor. Bunun temelde 3 sebebi var:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GIL (Global Interpreter Lock)&lt;/li&gt;
&lt;li&gt;Derlenen (compiled) değil &amp;ldquo;yorumlanan&amp;rdquo; (interpreted) bir dil olması&lt;/li&gt;
&lt;li&gt;Dinamik tipli bir dil olması&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Şimdi bu üç sebebin performansa nasıl etki ettiğine bakalım.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2019/01/python-logo-master-v3-TM-flattened.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;gil-global-interpreter-lock&#34;&gt;&lt;strong&gt;GIL (Global Interpreter Lock)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Bildiğimiz üzere CPU&amp;rsquo;lar pek çok çekirdek barındırıyorlar. İşletim sistemleri tüm CPU gücünü kullanabilmek için &amp;ldquo;thread&amp;rdquo; adını verdiğimiz yapıları kullanıyor. Burada bu kavramların detayına girmeyeceğim ama özellikle CPU&amp;rsquo;nun etkin kullanılması gerektiği durumlarda thread&amp;rsquo;ler vasıtasıyla iş yükünü CPU çekirdeklerine dağıtabiliyoruz ya da I/O işlemlerini bekleyerek kaybedilecek zamandan kaçınabiliyoruz.&lt;br&gt;
Eğer daha önce multi-thread çalışacak programlar yazdıysanız &amp;ldquo;lock&amp;rdquo; kavramını biliyorsunuzdur. Bu yapılar birden fazla thread&amp;rsquo;in aynı bellek adresi üzerinde aynı anda değişiklik yapmasını önlemek için kullanılıyor. Python yorumlayıcısı (interpreter) da bu işlem için &amp;ldquo;reference counting&amp;rdquo; dediğimiz bir yöntemden faydalanıyor. Birden fazla thread eğer ortak bir değişkeni kullanıyorsa bu değişkenin erişim kontrolü Global Interpreter Lock ile sağlanıyor. GIL, ne kadar thread olursa olsun herhangi bir zamanda sadece birinin çalışmasına sebep oluyor. Eğer tek çekirdek üzerinde çalışan bir uygulamanız varsa bu madde sizin için bir anlam ifade etmeyecektir.&lt;/p&gt;
&lt;h2 id=&#34;python-yorumlanan-bir-dil&#34;&gt;&lt;strong&gt;&amp;ldquo;Python yorumlanan bir dil&amp;rdquo;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Bu ifadeyi çok sık duyduğunuza eminim. Bu ifadenin doğruluğu-yanlışlığı üzerene yeterince konuşulduğunu düşündüğüm için bu konuya girmiyorum ama dilerseniz &lt;a href=&#34;https://stackoverflow.com/questions/2998215/if-python-is-interpreted-what-are-pyc-files&#34;&gt;şuradaki &lt;/a&gt;tartışmayı inceleyebilirsiniz. Eğer terminali açar ve &amp;ldquo;python script.py&amp;rdquo; yazarsanız Python okuma, ayrıştırma, derleme, yorumlama ve çalıştırma gibi pek çok adım içeren bir işlem yürütmeye başlar. Sizin Python ile yazdığınız kodunuz öncelikle &amp;ldquo;bytecode&amp;rdquo; adını verdiğimiz bir yapıya çevrilir ve aslında &amp;ldquo;yorumlanan&amp;rdquo; şey bu bytecode&amp;rsquo;dur. Java ve C#.NET de benzer şekilde yazdığınız kodu önce bir &amp;ldquo;aracı dile&amp;rdquo; çevirir ve ihtiyaç anında bu dilden makine koduna derleme/dönüştürme işlemi yapılarak istenen kod bloğu çalıştırılır.&lt;/p&gt;
&lt;h3 id=&#34;java-c-ve-pythonın-üçü-de-bir-aracı-dil-bytecode-ve-bir-çeşit-sanal-makine-kullanıyorsa-python-neden-bu-ikisinden-daha-yavaş&#34;&gt;Java, C# ve Python&#39;ın üçü de bir aracı dil (bytecode) ve bir çeşit sanal makine kullanıyorsa, Python neden bu ikisinden daha yavaş?&lt;/h3&gt;
&lt;p&gt;C# ve Java &lt;a href=&#34;https://hacks.mozilla.org/2017/02/a-crash-course-in-just-in-time-jit-compilers/&#34;&gt;JIT-Compiled &lt;/a&gt;(just-in-time) diller ve bir JIT derleyici kullanıyorlar. Öte taraftan AOT (Ahead of Time) derleyiciler kodu çalıştırmadan önce her bir satırın CPU tarafından anlaşılabileceğine ve çalıştırılabileceğine emin oluyorlar. Ama şimdi konumuz onlar değil. JIT yapısı aslında çalışmayı daha hızlı hale getirmiyor zira hala bytecode&amp;rsquo;dan yorumlama/derleme işlemi yapılması gerekmekte. Ancak, JIT çalışma anında optimizasyon yapmaya imkan sağlıyor. İyi bir JIT derleyicisi, çalışma anında hangi kod bloklarının daha sık kullanıldığını tespit edebilir ve bu kod bloklarının daha efektif çalışması için düzenlemeler yapabilir. Bu da demek oluyor ki, sizin uygulamanız aynı işlemi tekrar tekrar yaptığında, JIT o işlemi analiz ederek daha hızlı tamamlanmasını sağlayabilir. Ayrıca Java ve C# statik tipli diller bu da optimizasyon ile ilgilenen yazılımın daha verimli çalışabilmesine olanak sağlıyor. Varsayılan Python yorumlayıcısında ise optimizasyon sağlayan bir JIT mekanizması bulunmuyor. Öte taraftan, başka bir Python yorumlayıcısı olan PyPy JIT yapısına sahip ve varsayılan Python yorumlayıcısına kıyasla daha hızlı olduğu &lt;a href=&#34;https://hackernoon.com/which-is-the-fastest-version-of-python-2ae7c61a6b2b&#34;&gt;yapılan testlerde&lt;/a&gt; ortaya çıkmış.&lt;/p&gt;
&lt;h3 id=&#34;jit-yapısı-bu-tarz-dilleri-hızlandırabiliyorsa-neden-varsayılan-yorumlayıcıda-bu-yapı-yok&#34;&gt;JIT yapısı bu tarz dilleri hızlandırabiliyorsa neden varsayılan yorumlayıcıda bu yapı yok?&lt;/h3&gt;
&lt;p&gt;JIT başlangıç süresini oldukça uzatıyor. PyPy, varsayılan yorumlayıcıya kıyasla 2-3 kat daha yavaş başlıyor. Benzer şekilde Java Virtual Machine&amp;rsquo;in de başlangıç süresi uzun. .Net&amp;rsquo;de başlangıç için gerekli olan işlemler Windows işletim sistemi tarafından halledildiği için etkisi bu kadar hissedilmiyor.&lt;/p&gt;
&lt;p&gt;Eğer uzun süre çalışmasını ön gördüğünüz bir Python kodunuz varsa ve bu kodunuz tekrar tekrar çağrılan bloklar içerecekse, JIT işinize oldukça yarayabilir. Ancak Python&#39;ın varsayılan derleyicisi genel amaçlı bir yazılım. Eğer Python ile tek bir işe yönelik basit CLI uygulamar geliştiriyorsanız her seferinde JIT&amp;rsquo;in ilk çalışma süresini beklemek biraz can sıkıcı olabilir.&lt;/p&gt;
&lt;h2 id=&#34;python-dinamik-tipli-bir-dil&#34;&gt;&lt;strong&gt;&amp;ldquo;Python dinamik tipli bir dil&amp;rdquo;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Statik tipli dillerde bir değişken tanımlarken onun tipini belirtmek zorundasınızdır. Bu dillere örnek olarak C, C++, Java ve C# verilebilir. Dinamik tipli dillerde ise tip kavramı mevcuttur ama bir değişkenin tipi dinamik olarak değişebilir. Bir örnek verelim:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;  
a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Bu kod parçası için Python aynı isimde ve &amp;ldquo;str&amp;rdquo; tipinde ikinci bir değişken yaratır ve ilk &amp;ldquo;a&amp;rdquo; değişkenini bellekten siler. Diğer dillerde bu işlemleri kendiniz halletmeniz gerekirken Python bunu sizin yerinize yapıyor, siz sadece görmüyorsunuz. Aslında Python&#39;ı yavaşlatan şey tiplerin belirtilmemesi değil, Python&#39;ın tasarımının neredeyse her şeyi dinamik yapmaya imkan sağlaması. Örneğin herhangi bir nesnenin bir methodunu çalışma zamanında değiştirebilirsiniz. Bu ve benzeri tasarımsal sebeplerle Python&#39;ı optimize etmek çok zor. Yani kısaca:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tipleri karşılaştırmak ve dönüştürmek maliyetli. Ne zaman bir değişkene erişilse tipi kontrol edilir ve eğer gerekliyse bir takım düzenlemeler yapılır.&lt;/li&gt;
&lt;li&gt;Bu kadar dinamik bir dili optimize etmek oldukça zor. Python&#39;ın rakiplerinden daha yavaş olamasının sebeplerinden biri Python&#39;ın esnekliği ve dinamikliği performansa tercih etmiş olmasıdır.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;bu-kadar-yavaşsa-nasıl-bu-kadar-popüler&#34;&gt;&lt;strong&gt;Bu kadar yavaşsa nasıl bu kadar popüler?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Aslında burada bir ikilemden söz etmek mümkün. Python, kullanımının bu kadar kolay olmasının bedelini yavaş çalışarak ödüyor. Her ne kadar yavaş çalışsa da aynı işi yapan bir yazılımı Python ile geliştirmek genelde daha az zaman, iş gücü ve kod gerektiriyor. Kolay öğrenilebilir olması da programlamaya yeni başlayanları cezbediyor. Ayrıca Python için yazması kadar okuması da kolay diyebiliriz. Az ve kolay okunabilir bir kodun bakımı ve geliştirmesi ise daha az insan gücü ve zaman ile sağlanabiliyor; bu da az kişi ile proje geliştiren ekiplerde oldukça hayati bir rol oynuyor. Bu özellikleri onu nihai ürün için kullanmak istemeseniz bile prototipleme için oldukça kullanışlı bir araç haline geliyor. Öte taraftan Python her ne kadar yavaş bir dil olsa da bir betik dili olmasının verdiği avantajla C ve C++ gibi daha performanslı diller ile geliştirilmiş kütüphaneleri ve uygulamaları çağırmak için kullanılabiliyor. Örneğin en popüler Python paketlerinden birisi olan NumPy, Python&amp;rsquo;da oldukça yavaş gerçekleşen dizi/matris işlemlerini C/C++ ile yazılmış backend&amp;rsquo;de (arka uç) yürüterek ciddi anlamda hız kazandırabiliyor. Tensorflow, Pandas gibi performans ağırlıklı işleri yapmak üzere tasarlanmış diğer pek çok Python paketi de benzer bir yaklaşımı kullanıyor. Bu özellikleri ile Python uzun bir süre daha popülaritesini koruyacak gibi.&lt;/p&gt;
&lt;p&gt;Buraya kadar okuyan herkese teşekkürler. Aşağıda da belirttiğim üzere bu yazıdaki bilgiler Antony Shaw&#39;ın &amp;ldquo;Why is Python so slow?&amp;rdquo; başlıklı yazısından derlendi. Akıcılığı artırmak adına bazı küçük düzenlemeler yaptım ve son paragrafı naçizane ben ekledim. Umarım keyif almışsınızdır.&lt;/p&gt;
&lt;p&gt;Not: Bu yazının aslı &lt;a href=&#34;https://tonybaloney.github.io/&#34;&gt;Antony Shaw&lt;/a&gt;&amp;lsquo;a ait olup, tarafımca izni alınarak Türkçe&amp;rsquo;ye çevrilmiş ve bu adres üzerinden yayınlanmıştır. Kendisine teşekkürü borç bilirim. Yazının aslına &lt;a href=&#34;https://hackernoon.com/why-is-python-so-slow-e5074b6fe55b&#34;&gt;buradan&lt;/a&gt; ulaşabilirsiniz&lt;/p&gt;
&lt;p&gt;Note: The original article was written by &lt;a href=&#34;https://tonybaloney.github.io/&#34;&gt;Antony Shaw&lt;/a&gt;. This translation was made by me with his permission. I thank him for his kindness and this informative article. The orginal article can be rached by clicking &lt;a href=&#34;https://hackernoon.com/why-is-python-so-slow-e5074b6fe55b&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Unified Memory Nedir?</title>
       <link>http://www.tahirozdemir.com/2018/12/unified-memory-nedir/</link>
       <pubDate>Sat, 01 Dec 2018 11:23:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2018/12/unified-memory-nedir/</guid>
       <description>&lt;p&gt;Daha önce &lt;a href=&#34;https://www.tahirozdemir.com/2018/09/cuda-icin-temel-bilgiler/&#34;&gt;CUDA için ufak bir giriş yazısı&lt;/a&gt; yazmış ve bazı temel bilgileri aktarmaya çalışmıştım. Bu yazıda ise bence CUDA’da yazılım geliştirme işini oldukça kolaylaştıran Unified Memory kavramından ve getirdiği kolaylıklardan bahsedeceğim. Tıpkı önceki yazıda olduğu gibi çok detaya inmeden temel noktalardan bahsetmeye çalışacağım. İşin daha da detayına girmek isteyenler yazının içerisindeki ve sonundaki bağlantılardan faydalanabilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/12/Unified-Memory-MultiGPU.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Unified Memory aslında sistemdeki her işlemci tarafından erişilebilen bir bellek adres uzayı. Bu teknoloji sayesinde, yazılan uygulamalar hem CPU hem de GPU üzerinden erişilebilecek veriler oluşturabiliyorlar. Normalde verileri oluşturmak için CPU tarafında &amp;ldquo;malloc()&amp;rdquo; ya da &amp;ldquo;&lt;a href=&#34;https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1gab84100ae1fa1b12eaca660207ef585b&#34;&gt;cudaMallocHost()&lt;/a&gt;&amp;quot;, GPU tarafında ise &amp;ldquo;&lt;a href=&#34;https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1g37d37965bfb4803b6d4e59ff26856356&#34;&gt;cudaMalloc()&lt;/a&gt;&amp;rdquo; fonksiyonlarını kullanıyorduk. Unified Memory’e geçmek için tek yapmamız gereken verilerimizi &amp;ldquo;&lt;a href=&#34;https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1gd228014f19cc0975ebe3e0dd2af6dd1b&#34;&gt;cudaMallocManaged()&lt;/a&gt;&amp;rdquo; fonksiyonuyla oluşturmak.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cudaError_t cudaMallocManaged(void** ptr, size_t size);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bir kod parçası, ister CPU tarafında ister GPU tarafında, bu yöntemle ister oluşturulmuş veriye erişmek istediğinde ilgili bellek sayfaları (memory pages) ilgili belleklere taşınıyor (migration). Ufak bir not: Pascal ve sonraki mimarilerden birine sahip GPU’larda bu işlem donanım seviyesinde desteklenirken, Kepler ve Maxwell mimarilerinde daha kısıtlı bir Unified Memory desteği bulunmuyor.&lt;/p&gt;
&lt;p&gt;Eski mimarilerde cudaMallocManaged() kullanıldığında veriler doğrudan GPU üzerinde oluşturuluyor. Doğal olarak bu verilere ilk olarak CPU üzerinden erişilecekse önce taşınmaları gerekiyor. Bu da demek oluyor ki fazladan bir taşıma işlemi daha gerçekleştiriyoruz. Bir diğer sıkıntı da bu eski mimarilerde &amp;ldquo;page fault&amp;rdquo; mekanizmasının olmaması. Yani elinizde yüzlerce hatta binlerce elemanlı bir diziniz varsa ve bu dizi hali hazırda CPU üzerinde bulunuyorsa, GPU tarafından sadece bir elemanına erişmek isteseniz dahi tüm dizinin GPU belleğine taşınması gerekiyor. &amp;ldquo;Unified Memory&amp;rdquo; kullanmadığımız eski uygulamalarda da bu işlem böyle gerçekleşecekti zaten; Unified Memory’nin buradaki tek katkısı bu taşıma işlemini arka planda otomatik olarak gerçekleştirmesi ve bizim bu işlemle bizzat uğraşmak zorunda olmamamız. Aksi halde &amp;ldquo;&lt;a href=&#34;https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1gc263dbe6574220cc776b45438fc351e8&#34;&gt;cudaMemCpy()&lt;/a&gt;&amp;rdquo; vasıtası ile tüm taşıma işlerini bizim yapmamız gerekirdi.&lt;/p&gt;
&lt;p&gt;Pascal ve sonraki mimarilerde ise Unified Memory asıl gücünü sergileyebiliyor. Az önce bahsettiğim &amp;ldquo;page fault&amp;rdquo; durumu bu mimarilerde mevcut. Siz bir dizinin sadece bir elemanına erişecekseniz, sadece o verinin ait olduğu bellek sayfası ilgili donanımlar arasında taşınıyor. Bellek operasyonlarının asıl darboğazı oluşturduğunu düşünürsek, gereksiz verilerin taşınmasından kurtulmak performans üzerinde gerçekten bir fark yaratıyor. Ayrıca &amp;ldquo;cudaMallocManaged()&amp;rdquo; fonksiyonu bu mimarilerde veriyi doğrudan herhangi bir donanımda oluşturmuyor. İlk erişim hangi donanımdan yapılırsa veri orada oluşturuluyor. Böylece olası bir gereksiz veri taşıma işleminden daha kurtulmuş oluyoruz. Eğer veri üzerinde biraz daha güç sahibi olmak isterseniz &amp;ldquo;&lt;a href=&#34;https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1ge37112fc1ac88d0f6bab7a945e48760a&#34;&gt;cudaMemAdvise()&lt;/a&gt;&amp;rdquo; ve &amp;ldquo;&lt;a href=&#34;https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html#group__CUDART__MEMORY_1ge8dc9199943d421bc8bc7f473df12e42&#34;&gt;cudaPrefetchAsync()&lt;/a&gt;&amp;rdquo; fonksiyonları işinize yarayabilir. Örneğin &amp;ldquo;cudaMemAdvise()&amp;rdquo; ile bir veriyi genellikle okuyacağınızı belirtebilirsiniz. Böylece CUDA sistemi sizin için veriyi düzenleyip sizin veriye daha hızlı ulaşmanızı sağlayabilir. ya da &amp;ldquo;cudaPrefetchAsync&amp;rdquo; ile zaten tamamına erişeceğiniz veriyi doğrudan ilgili donanıma taşıyarak sistemin sürekli &amp;ldquo;page fault&amp;rdquo; üretmesini engelleyebilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/12/unified_memory_oversubscription_hpgmg_perf_no_hints_jan2017.png&#34; alt=&#34;&#34;&gt;&lt;br&gt;
Şekil 1: Veri büyüklüğüne göre uygulama performans grafiği.&lt;/p&gt;
&lt;p&gt;Unified Memory’nin, &amp;ldquo;page falut&amp;rdquo; mekanizması sayesinde, sağladığı bir diğer avantaj ise GPU’nuzun belleğine sığmayan verilerle de işlem yapabilmenizi mümkün kılması. Ancak unutmamak gerekir ki veriniz GPU’nun bellek limitini aştığında her ne kadar işlem yapabilmeye devam etseniz de &amp;ldquo;page fault&amp;quot;tan oluşacak kayıp hala canınızı sıkabilir. Şekil 1’de veri büyüklüğünün P100’ün kapasitesini aştığında oluşan kaybı görebilirsiniz. Öte taraftan Unified Memory olmadan P100’de bu işlemleri gerçekleştiremezdik. Şu halde bir noktaya kadar hala test için kullanılan CPU’dan daha performanslı olduğunu söyleyebiliriz.&lt;/p&gt;
&lt;p&gt;Konu hakkında daha derine inmek isterseniz şu yazıları/makaleleri okuyabilirsiniz:&lt;br&gt;
1- &lt;a href=&#34;https://devblogs.nvidia.com/unified-memory-cuda-beginners/&#34;&gt;Unified Memory for CUDA Beginners&lt;/a&gt; (Benim yazım da ağırlıklı olarak bu bağlantıdaki bilgilerden oluşmakta)&lt;br&gt;
2- &lt;a href=&#34;https://devblogs.nvidia.com/beyond-gpu-memory-limits-unified-memory-pascal/&#34;&gt;Beyond GPU Memory Limits with Unified Memory on Pascal&lt;/a&gt;&lt;br&gt;
3- &lt;a href=&#34;https://devblogs.nvidia.com/maximizing-unified-memory-performance-cuda/&#34;&gt;Maximizing Unified Memory Performance in CUDA&lt;/a&gt;&lt;br&gt;
4- &lt;a href=&#34;https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#um-unified-memory-programming-hd&#34;&gt;CUDA C Proglamlama Rehberi, Unified Memory Başlığı&lt;/a&gt;&lt;br&gt;
5- &lt;a href=&#34;https://www.researchgate.net/publication/281409395_An_Investigation_of_Unified_Memory_Access_Performance_in_CUDA&#34;&gt;An Investigation of Unified Memory Access Performance in CUDA&lt;/a&gt;&lt;br&gt;
6- &lt;a href=&#34;https://hpc.sjtu.edu.cn/ppmm15_uma.pdf&#34;&gt;An Evaluation of Unified Memory Technology on NVIDIA GPUs&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>CUDA İçin Temel Bilgiler</title>
       <link>http://www.tahirozdemir.com/2018/09/cuda-icin-temel-bilgiler/</link>
       <pubDate>Sat, 01 Sep 2018 15:37:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2018/09/cuda-icin-temel-bilgiler/</guid>
       <description>&lt;iframe scrolling=no width=&#34;100%&#34; height=&#34;185&#34; frameborder=&#34;0&#34; src=https://anchor.fm/tahir-ozdemir-podcast/embed/episodes/CUDA-in-Temel-Bilgiler-eeqshc/a-a2bmo47&gt;&lt;/iframe&gt;
&lt;p&gt;Bu yazıda CUDA’ya ve GPU mimarisine göz atacağız. CUDA ile nasıl programlama yapılacağından değil temel kavramlardan bahsedeceğim. Oldukça seyreltilmiş bir yazı okuyacağınızı da belirteyim. Amacım tam bir CUDA rehberinden ziyade bir başlangıç noktası sunmak. Buradaki bazı başlıklar şöyle sıralanabilir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPU mimarisi ve bellek yapısı&lt;/li&gt;
&lt;li&gt;Grid, block ve thread kavramı&lt;/li&gt;
&lt;li&gt;“Compute capability” kavramı&lt;/li&gt;
&lt;li&gt;Örnek bir program akışı&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/09/thumbnail.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;GPU’lar ile CPU’ları ayıran en temel fark sahip oldukları işlem birimlerinin nitelik ve nicelikleri. CPU’lar daha yüksek hıza ve interrupt gibi mekanizmalara sahip işlem birimlerine sahip iken, GPU’lar daha düşük hızlarda ve interrupt gibi yeteneklerden yoksun olsa bile binlerce işlem birimine sahiptir. Daha yakından incelemek ve bu donanımların iç yapısını anlamak için Şekil 1’den yararlanılabilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/09/CPU-2Bvs-2BGPU.png#mid&#34; alt=&#34;&#34;&gt;&lt;br&gt;
Şekil 1: CPU ve GPU iç yapısı [1]&lt;/p&gt;
&lt;p&gt;Bir GPU, Streaming Multiprocessor (SM) dizisidir. SM’ler içerisinde CUDA çekirdekleri barındırır ve çalıştırılacak olan kod bu çekirdekler üzerinde çalıştırılır. Bir GPU’da bulunan SM sayısı ve SM’lerin barındıracağı çekirdek sayısı o GPU’nun mimarisine göre değişiklik gösterir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/09/SM.png#mid&#34; alt=&#34;&#34;&gt;&lt;br&gt;
Şekil 2: Streaming Multiprocessor yapısı [1]&lt;/p&gt;
&lt;p&gt;Programlamak için grid, blok ve thread yapıları kullanılır. Gridler bloklardan; bir blok ise thread’lerden oluşur. Grid, blok ve threadler üzerinde nasıl çalıştırılacağı programlanan kod GPU’ya aktarıldığında SM’ler üzerine dağıtılır ve işletilir.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://3.bp.blogspot.com/-iRE0_MuY-kE/W4qrWnIGDvI/AAAAAAAAAuE/Ihm2mvKvOdwpmkH3hvOnf7wWbywhF_SfACLcBGAs/s400/GBT.png#mid&#34; alt=&#34;&#34;&gt;&lt;br&gt;
Şekil 3: Grid, block ve thread yapısı [1]&lt;/p&gt;
&lt;p&gt;Bir problemin kaç blok ve thread üzerinde çalıştırılacağının hesabı problemin büyüklüğüne ve problemin özelliklerine göre hesaplanmalıdır. Bu bağlamda en yüksek performansı elde etmek için genel bir çözümden ziyade, probleme özel yazılım geliştirilmesi gereklidir. Bu temel mimari farkın yanına GPU’nun bellek birimlerinin ayrıca ele alınması mücbirdir. Birbirinden farklı yeteneklere ve amaçlara sahip bellek birimlerinin kullanımının doğru şekilde planlanması pek çok problemde performans artışına imkan sağlamaktadır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/09/Bellekler.png#mid&#34; alt=&#34;&#34;&gt;&lt;br&gt;
Şekil 4: Bellek hiyerarşisi (Nobile et al. 2014)&lt;/p&gt;
&lt;p&gt;GPU’larda her thread’in kendine ait bir yerel belleği (local memory) bulunur. Ayrıca bir blok içerisinde çalışan tüm thread&amp;rsquo;lerin erişebileceği, o bloğa atanmış bir paylaşımlı bellek (shared memory) ve tüm birimlerin erişebileceği global bellek (global memory) de GPU içerisinde yer alır. Bu belleklere hem okuma hem de yazma yapılabilmektedir. Erişim hızları açısından hızlıdan yavaşa: threadlere ait yerel bellek, bloklara ait paylaşımlı bellek, hepsine ait global bellek şeklinde sıralanabilir. Erişilecek verilerin bu bellekler üzerinde dağıtımı hız açısından ciddi farklar doğurmaktadır. Bu üç bellek dışında sadece okuma yapılabilen (read-only) belleklerde vardır. Bunlar şekilde de görülen constant memory ve texture memory’dir. Farklı amaçlar için özelleşmiş bu bellek tiplerinin hesap işlemlerinde kullanıldığı bir örneğe rastlamadım. Bir problemde algoritmanın nasıl paralelleştirilebileceğinin yanı sıra o problem için bellek yönetiminin nasıl yapılacağının planlanması da nihai performans kazancı için önemlidir.&lt;/p&gt;
&lt;p&gt;CUDA yeteneğine sahip ekran kartları, yeteneklerine göre bir “compute capability” derecesine sahip olurlar. Compute capability değeri kabaca o GPU’nun desteklediği yazılımsal ve donanımsal yeteneklere göre belirlenir. Örneğin derin öğrenme için özel olarak tasarlanan Tensor Core işlem birimleri compute capability’si 7 olan Tesla V100 ve Titan V ekran kartlarında bulunmaktadır. Compute capability sayısal değerini X.Y şeklinde düşünecek olursak X, doğrudan GPU’nun mimarisini gösterir. Örneğin Volta mimarisine sahip kartlarının X değeri 7 iken Pascal mimarisine sahip olanlarınki 6’dır. Y ise aynı mimarideki küçük gelişmelere göre çeşitlilik gösterir. Örneğin Pascal mimarisine sahip olan ve bellek boyutlarında baz sürümden bazı farklara sahip olan Quadro P5000 için bu değer 6.1’dir. [2] Ancak unutulmamalıdır ki minör değerin yüksek olması her kalemde bir iyileşme olduğu anlamına gelmez. Yazılım geliştirilirken üzerinde çalışacağı donanımın özellikleri dikkate alınarak geliştirilmelidir. Daha yüksek işlem kapasitesine sahip bir cihazda gerekli iyileştirmelerin yapılmadığı bir yazılım beklenen performans artışını gösteremeyecektir.&lt;/p&gt;
&lt;p&gt;CUDA-enabled bir GPU’yu programlamak için birden çok seçeneğe sahibiz. Pek çok alternatifin arasında Nvidia’nın kendi çözümü olan ve C/C++ desteği bulunan Cuda Toolkit öne çıkmaktadır. Donanım geliştiricisinin ürünü olması sebebiyle en yüksek verim bu araç ile elde edilmekte ve yenilikler önce ona gelmektedir. CUDA, daha önceden bahsi geçen birimlerden her birimin (grid, blok, thread ve bellek birimleri) yönetimi için kullanılabilir. Yazılan kod CPU tarafından yönetilir ve gerekli fonksiyonlar GPU üzerinde çalıştırılır. Burada en yüksek maliyet verinin host yani ana bilgisayar belleğinden device yani GPU belleğine kopyalanmasıdır.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/09/Ak-25C4-25B1-25C5-259F.png#mid&#34; alt=&#34;&#34;&gt;&lt;br&gt;
Şekil 5: CPU ve GPU’da program akışı [3]&lt;/p&gt;
&lt;p&gt;Şekil 5’de de görüldüğü üzere program CPU üzerinde çalışmaya başlar. GPU ana belleğe doğrudan erişemediği için gerekli veriler GPU’nun belleklerine aktarılır. Daha sonra GPU üzerinde çalıştırılacak fonksiyon (bu fonksiyonlar “kernel” olarak isimlendirilmekte) çağrılır. GPU hesabını yaparken CPU’da farklı komutlar çalıştırılmaya devam edebilir ya da GPU’nun işini bitirmesini bekleyebilir. İşlem sonlandığında, CPU doğrudan GPU belleğine erişemediği için, GPU belleğinde bulunan sonuçlar ana belleğe taşınır ve program akışına devam edilir.&lt;/p&gt;
&lt;p&gt;CUDA’nın da her yazılımda olduğu gibi farklı sürümleri mevcuttur. Nasıl ki daha yüksek performans elde etmek için kullanılan GPU’nun compute capability’si göz önüne alınıyorsa, kullanılan CUDA sürümünün yetenekleri de irdelenmelidir. Örneğin CUDA 8.0 ile birlikte Unified Memory kavramı ortaya çıkmıştır. Bu bellek modeli CPU ile GPU arasında veri taşıma ve bu taşıma işleminin optimize edilmesi yükünü ortadan kaldırır. Ayrıca, bu teknolojiye compute capability’si 6.0 ve üstü olan GPU’larda donanım seviyesinde de destek sunulmaktadır. Bu bağlamda Pascal mimarisine sahip bir cihaz üzerinde Cuda 8.0 ile geliştirilmiş bir yazılımın bellek erişim performansı düşük versiyonlara nazaran oldukça iyi olacağını söyleyebiliriz [4].&lt;/p&gt;
&lt;p&gt;Bunun dışında GPU üzerinde yapılacak bazı işlemleri hızlandıran optimize edilmiş kütüphaneler de bulunmaktadır. Bu kütüphaneler derin öğrenme (cuDNN vb.); lineer cebir ve matematik (cuBLAS, cuRAND vb.); sinyal, görüntü ve video (cuFFT vb.) ve paralel algoritma (Thrust, NCLL vb.) gibi temel başlıklar altında toplanabilir [5]. Temel işlemler için özelleşmiş ve optimize edilmiş bu kütüphaneler doğru noktalarda kullanıldığında hem geliştirme süresini kısaltmakta hem de performans kazancı sağlamaktadır.&lt;/p&gt;
&lt;p&gt;[1] &lt;a href=&#34;https://docs.nvidia.com/cuda/cuda-c-programming-guide&#34;&gt;https://docs.nvidia.com/cuda/cuda-c-programming-guide&lt;/a&gt;&lt;br&gt;
[2] &lt;a href=&#34;https://developer.nvidia.com/cuda-gpus&#34;&gt;https://developer.nvidia.com/cuda-gpus&lt;/a&gt;&lt;br&gt;
[3] Luong, Thé Van. (2016). Parallel Metaheuristics on GPU. 10.13140/RG.2.1.4017.5127.&lt;br&gt;
[4] &lt;a href=&#34;https://devblogs.nvidia.com/unified-memory-cuda-beginners/&#34;&gt;https://devblogs.nvidia.com/unified-memory-cuda-beginners/&lt;/a&gt;&lt;br&gt;
[5] &lt;a href=&#34;https://developer.nvidia.com/gpu-accelerated-libraries&#34;&gt;https://developer.nvidia.com/gpu-accelerated-libraries&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Spotify&#39;ın Müzik Öneri Sistemi Nasıl Çalışıyor?</title>
       <link>http://www.tahirozdemir.com/2018/07/spotifyin-muzik-oneri-sistemi-nasil-calisiyor/</link>
       <pubDate>Sat, 14 Jul 2018 09:50:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2018/07/spotifyin-muzik-oneri-sistemi-nasil-calisiyor/</guid>
       <description>&lt;iframe scrolling=no width=&#34;100%&#34; height=&#34;185&#34; frameborder=&#34;0&#34; src=https://anchor.fm/tahir-ozdemir-podcast/embed/episodes/Spotifyn-Mzik-neri-Sistemi-Nasl-alyor-edaoai/a-a21suio&gt;&lt;/iframe&gt;
&lt;p&gt;Spotify, 100 milyondan fazla kullanıcısının her birisi için her hafta 30 şarkılık yeni bir &amp;ldquo;Haftalık Keşfet&amp;rdquo; listesi hazırlıyor. Binlerce şarkı içerisinden sizin listenizde olmayan ama hoşunuza gidebileceğini düşündüğü bu şarkıları nasıl seçiyor peki? Bir algoritma nasıl oluyor da sizin müzik zevkinizi sizden daha iyi bilebiliyor?&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/07/spotify.jpg#mid#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Şimdi bir adım geriye çekilip diğer müzik uygulamaları bu işin altından nasıl kalkmış bir bakalım. &lt;strong&gt;Songza&lt;/strong&gt;, 2000’lerde ortaya çıkmış bir uygulama ve en ilkel tavsiye yöntemini uygulamakta. Songza’da, bir grup “müzik uzmanı” bir araya gelerek, kullanıcılar için listeler oluşturmakta. &lt;strong&gt;Beat Music&lt;/strong&gt; de aynı yöntemi kullanan başka bir uygulama olarak karşımıza çıkmakta. Müziğin “uzmanları” tarafından gelen tavsiyeler belki arkadaş çevrenizden gelenlerden daha başarılı olabilir ama milyonlarca kullanıcı için kalıplaştırılmış bir kaç seçenek sunmak çok da yenilikçi bir yöntem değil.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/07/all_apps.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Öte taraftan &lt;strong&gt;Pandora&lt;/strong&gt; adlı uygulama, biraz daha otomatize bir yaklaşım denedi. Bir grup müzik uzmanı, listeler oluşturmak yerine şarkıları etiketlediler. Sistemdeki tüm şarkılar bir kez etiketlendiğinde, geriye kullanıcının listesinde olan şarkılar ile aynı etikete sahip diğer şarkıları bulup ona önermek kalıyordu. Sorun şu ki sahnede hala kendini “müzik uzmanı” olarak tanımlayan insanlar vardı ve tüm iş gücü elle yapılıyordu.&lt;/p&gt;
&lt;p&gt;Yaklaşık aynı zamanlarda, &lt;strong&gt;MIT Media Lab&lt;/strong&gt;‘dan bir kaç uzman &lt;strong&gt;The Echo Nest&lt;/strong&gt; adında bir şirket kurdular. Bu şirket müziğin “sesini” ve sözlerini analiz eden algoritmalar geliştirdi. Böylece bir müziği etiketlemeyi, özel listeler oluşturmayı ve analizi otomatize eden araçlara sahip olduk.&lt;/p&gt;
&lt;p&gt;Bunların dışında pek çok öneri sisteminin temelini oluşturan ve &lt;strong&gt;Last.fm&lt;/strong&gt; tarafından da kullanılan “&lt;strong&gt;collaborative filtering&lt;/strong&gt;” tekniği var. Fakat buna birazdan değineceğim.&lt;/p&gt;
&lt;p&gt;Peki tüm bu yaklaşımlar arasından Spotify hangisini kullanıyor? Spotfy’ın bu kadar güçlü bir öneri sistemine sahip olmasının arkasında sadece bir tane algoritma olduğunu düşünmek büyük bir hata olur. Bunun yerine üç farklı yaklaşımın iş birliği söz konusu.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Collaborative Filtering yaklaşımı: Sizin ve diğer kullanıcıların davranışlarının analizi&lt;/li&gt;
&lt;li&gt;Natural Language Processing (NLP) (Doğal Dil İşleme) yaklaşımı: metin analizi&lt;/li&gt;
&lt;li&gt;Ses analizi yaklaşımı: doğrudan müziğin kendisinin analizi&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Birinci Yaklaşım: Collaborative Filtering&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pek çok öneri sisteminin temelini oluşturan bu yapıya çeşitli uygulamalarda denk gelmek mümkün. En bilinen örneklerden birisi &lt;strong&gt;Netflix&lt;/strong&gt;. Bir film ya da dizi için verdiğiniz yıldızlar sizin zevkinize sahip diğer kullanıcıları bulmak ve o kullanıcıların oyladığı ama sizin izlemediğiniz içerikleri size önermek için kullanılıyor. Basit değil mi?&lt;br&gt;
Netflix’in aksine Spotify kullanıcılarından dinledikleri müzikleri oylamalarını istemiyor. Onun yerine sizin dinleme verilerinizi takip ediyor. Bir müziği kaç kez dinlediğiniz, kendi listelerinize ekleyip eklemediğiniz ya da dinledikten sonra sanatçının sayfasına gidip gitmediğiniz, sizin o parça için verdiğiniz “yıldız” oluyor aslında. Peki algoritmik olarak bu öneri sistemi nasıl çalışıyor?&lt;br&gt;
Algoritma kabaca kullanıcılardan beğendiği şarkılarda yüksek oranda kesişim gösterenlere bakıyor. Daha sonra bir kullanıcının bu kesişim dışında kalan şarkılarını diğer kullanıcılara öneriyor. Kısaca fark kümelerini karşılıklı olarak diğer kullanıcılara öneriyor diyebiliriz. Peki milyonlarca şarkı ve kullanıcı için bu “kesişim kümeleri” nasıl oluşturuluyor? Cevap: &lt;strong&gt;Python&lt;/strong&gt; kütüphaneleri ile gerçekleştirilen &lt;strong&gt;matris hesapları&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/07/user_song_matrix.png#mid&#34; alt=&#34;&#34;&gt;&lt;br&gt;
Kaynak: &lt;a href=&#34;https://www.slideshare.net/MrChrisJohnson/from-idea-to-execution-spotifys-discover-weekly/31-1_0_0_0_1&#34;&gt;From Idea to Execution: Spotify’s Discover Weekly&lt;/a&gt;, by Chris Johnson, ex-Spotify&lt;/p&gt;
&lt;p&gt;Spotify veri tabanını düşününce şekilde görülen matrisin ne kadar devasa olduğunu tahmin edebilirsiniz. Her bir satır yaklaşık olarak &lt;strong&gt;140 milyon Spotify kullanıcısından&lt;/strong&gt; birini temsil ederken her bir sütun da &lt;strong&gt;30 milyon şarkıdan&lt;/strong&gt; birini temsil etmekte. Detayına girmeyeceğim ama bu matris üzerinde yapılan işlemler ile hem kullanıcıları hem de şarkıları birer vektör (lise matematiğinden hatırlayacaksınızdır) olarak temsil edebiliyoruz. Daha sonra bu vektörlere bakarak bir birine benzeyen kullanıcıları ve şarkıları bulmamız mümkün.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;İkinci Yaklaşım: Natural Language Processing (NLP) (Doğal Dil İşleme)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;NLP bilgisayarın doğal dilleri anlayabilmek için yürüttüğü bir işlem. Bugün neredeyse hepimizin akıllı telefonlarında bulunan Text-To-Speech özelliği bu teknikten yararlanan uygulamalardan bir tanesi. Siri gibi dijital asistanların da köşe taşı bu teknolojidir diyebiliriz. Peki Spotify bunu nasıl kullanıyor?&lt;/p&gt;
&lt;p&gt;Spotify tüm internette dolaşan “&lt;strong&gt;web crawler&lt;/strong&gt;“lara sahip. Bu “gezginler” müzik üzerine yazılmış makaleleri tarayarak insanların hangi müziklerden hoşlandığını anlamaya çalışıyor. Dergilerdeki albüm değerlendirme köşelerini bilirsiniz. Bu gezginler sizin için internetteki tüm bu değerlendirmeleri okuyarak “iyi” müzikleri bulmaya çalışıyorlar. Bir albümden ya da şarkıdan bahsedilirken kullanılan kelimeler ve sıfatlar bu eserleri sınıflandırmakta kullanılabiliyor. Ayrıca şarkı sözleri de incelenebilmekte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Üçüncü Yaklaşım: Ham Ses Modelleri&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Haftalık keşfetinizden daha önce hiç duymadığınız bir gruptan şarkı dinliyorsunuz. Sayfalarına baktığınızda dinlediğiniz şarkının daha dün yayınlanmış olduğunu ve grubun da ilk şarkısı olduğunu görüyorsunuz. Peki bu nasıl oldu? Daha önce bahsi geçen iki yaklaşım bu şarkıyı size sunamaz çünkü henüz hakkında ne bir yazı yazıldı ne de yeterli kullanıcı verisi oluştu. İşte üçüncü yaklaşımımız tam olarak burada devreye giriyor. “İyi de bu müzikler nasıl analiz ediliyor?” diye sorarsanız, karşımıza yeni bir kavram olarak &lt;strong&gt;Convolutional Neural Networks (CNN)&lt;/strong&gt; çıkmakta. Görüntü tanıma gibi teknolojilerinde de kullanılan bir yöntem kendisi. Detaylarına girmeyeceğim ama kabaca pek çok katmandan oluşan ve bu katmanların da verinin farklı özellikleri üzerinde işlem yaparak o veriyi tanımlamaya çalıştığı yapılar olarak düşünebiliriz. Örneğin yüz tanıma için kullandığımızda bir katman gözleri tanımlarken bir diğeri çene yapısını tanımlamakla görevli olabilir. Tüm bu veriler işlendiğinde birbirine benzer insanları bulabilen bir sistem üretebiliriz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/07/sound_analyze.png#mid&#34; alt=&#34;&#34;&gt;&lt;br&gt;
Kaynak: &lt;a href=&#34;http://docs.echonest.com.s3-website-us-east-1.amazonaws.com/_static/AnalyzeDocumentation.pdf&#34;&gt;Tristan Jehan &amp;amp; David DesRoches, The Echo Nest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Spotify ise CNN’leri kullanarak bir şarkının temposunu, ses şiddet seviyesini veya kullanılan perdeyi tanımlayabilmekte. Bu verilere bakarak da yeni eklenen şarkının daha önceden sisteme eklenmiş hangi şarkılar ile benzerlik gösterdiğini tespit edebiliyor. Böylece yeni eklenen bir şarkı, kendisini beğenebilecek bir kitleye ilk haftasında ulaşabiliyor.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2018/07/backend.png#mid&#34; alt=&#34;&#34;&gt;&lt;br&gt;
Kaynak: &lt;a href=&#34;http://blog.galvanize.com/spotify-discover-weekly-data-science/&#34;&gt;Ever Wonder How Spotify Discover Weekly Works? Data Science&lt;/a&gt;, via Galvanize.&lt;/p&gt;
&lt;p&gt;Böylece “Haftalık Keşfet” listemizin sırrını biraz da olsa çözmüş oluyoruz. Tahmin edilebileceği gibi tüm bu yöntemlerin çalışabilmesi için arka planda çok güçlü bir sistemin çalışması gerekmekte. Böyle bir işin altından kalkmak herkesin harcı değil. Şöyle bir dönüp baktığımızda neden Spotify’ın en popüler müzik uygulaması olduğunu görmek zor olmasa gerek.&lt;/p&gt;
&lt;p&gt;Umarım okurken keyif almışsınızdır. Bir sonraki yazıda görüşmek üzere.&lt;/p&gt;
&lt;p&gt;Not: Bu yazının aslı &lt;a href=&#34;http://sophiaciocca.com/&#34;&gt;Sophia Ciocca&lt;/a&gt;‘ya ait olup, tarafımca izni alınarak Türkçe’ye çevrilmiş ve bu adres üzerinden yayınlanmıştır. Kendisine teşekkürü borç bilirim. Yazının aslına &lt;a href=&#34;https://medium.com/s/story/spotifys-discover-weekly-how-machine-learning-finds-your-new-music-19a41ab76efe&#34;&gt;buradan&lt;/a&gt; ulaşabilirsiniz.&lt;/p&gt;
&lt;p&gt;Note: The original article was written by &lt;a href=&#34;http://sophiaciocca.com/&#34;&gt;Sophia Ciocca&lt;/a&gt;. This translation was made by me with her permission. I thank her for her kindness and this inspiring article. The orginal article can be rached by clicking &lt;a href=&#34;https://medium.com/s/story/spotifys-discover-weekly-how-machine-learning-finds-your-new-music-19a41ab76efe&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Unity İpuçları</title>
       <link>http://www.tahirozdemir.com/2017/07/unity-ipuclari/</link>
       <pubDate>Sun, 02 Jul 2017 11:34:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2017/07/unity-ipuclari/</guid>
       <description>&lt;p&gt;&lt;img src=&#34;../../../uploads/2017/07/unity.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bu yazıda, işinize yarayabilecek bir kaç Unity ipucu göstermeyi düşünüyorum. Basit bir tane ile başlayalım…&lt;/p&gt;
&lt;p&gt;1- Bir klasörü tüm alt klasörleri ile beraber açmak için ALT + Sol Tık kombinasyonunu kullanın. Aynı kısayolu hiyerarşide de kullanıp bir objenin tüm “child” objelerine bakabilirsiniz.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Hold down ALT while expanding and collapsing folders to include subfolders! &lt;a href=&#34;https://twitter.com/hashtag/UnityTips?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#UnityTips&lt;/a&gt; &lt;a href=&#34;https://twitter.com/unity3d?ref_src=twsrc%5Etfw&#34;&gt;@Unity3D&lt;/a&gt; &lt;a href=&#34;https://t.co/FhS4H9ORDm&#34;&gt;pic.twitter.com/FhS4H9ORDm&lt;/a&gt;&lt;/p&gt;&amp;mdash; Ryan Miller - Not at PAX or GDC! (@RyanThinker) &lt;a href=&#34;https://twitter.com/RyanThinker/status/877146090352635904?ref_src=twsrc%5Etfw&#34;&gt;June 20, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;2- Çarpışma modeli için mesh collider kullanmaktan olabildiğince kaçının. Detaylı çarpışma modelleri ile en gerçekçi deneyimi elde etseniz de sahneniz kalabalıklaştıkça işlem yükü çok artacaktır. Eğer tek bir basit collider sizin ihtiyacınızı karşılamıyorsa, ana objenize bir kaç boş obje ekleyip çarpışma olaylarını onlar üzerinden yönetebilirsiniz.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;&lt;a href=&#34;https://twitter.com/unity3d?ref_src=twsrc%5Etfw&#34;&gt;@unity3d&lt;/a&gt; Carefully choose what collider you&amp;#39;ll use, it will affect your performance! &lt;a href=&#34;https://twitter.com/hashtag/unitytips?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#unitytips&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/unity3d?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#unity3d&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/gamedev?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#gamedev&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/indiedev?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#indiedev&lt;/a&gt; &lt;a href=&#34;https://t.co/wjSekzn2EB&#34;&gt;pic.twitter.com/wjSekzn2EB&lt;/a&gt;&lt;/p&gt;&amp;mdash; Alexander Ameye (@alexanderameye) &lt;a href=&#34;https://twitter.com/alexanderameye/status/864865224880533504?ref_src=twsrc%5Etfw&#34;&gt;May 17, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;3- Biraz matematik ve özenle hazırlanmış görseller, performans açısından harikalar yaratan sonuçlar doğurabilir. Oyununuz 3 boyutlu olsa bile yer yer ikinci boyuttan yardım almaktan korkmayın.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Playing with &lt;a href=&#34;https://twitter.com/hashtag/pixelart?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#pixelart&lt;/a&gt; in &lt;a href=&#34;https://twitter.com/hashtag/unity?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#unity&lt;/a&gt; &lt;a href=&#34;https://t.co/JPFgTbc5K7&#34;&gt;pic.twitter.com/JPFgTbc5K7&lt;/a&gt;&lt;/p&gt;&amp;mdash; Britt Brady (@Britt_t_Brady) &lt;a href=&#34;https://twitter.com/Britt_t_Brady/status/804947515237810176?ref_src=twsrc%5Etfw&#34;&gt;December 3, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;Live2D EuclidをUNITYで見てみたら凄いことになってる。&lt;br&gt;なんかもっといい方法が思い付きそうで思い付かない。 &lt;a href=&#34;https://t.co/wcdaLibwGy&#34;&gt;pic.twitter.com/wcdaLibwGy&lt;/a&gt;&lt;/p&gt;&amp;mdash; rukusu20XX (@rukusu2012) &lt;a href=&#34;https://twitter.com/rukusu2012/status/857935959572201472?ref_src=twsrc%5Etfw&#34;&gt;April 28, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;4- Eğer legolar ile aranız iyiyse &lt;a href=&#34;http://ephtracy.github.io/index.html?page=mv_main&#34;&gt;MagicaVoxel&lt;/a&gt; ile harika modeller yaratabilirsiniz. Birim küpler ile modelleme yapmanıza olanak sağlayan programdan Unity’e çıktı almak da oldukça kolay.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Another little animation scene for fun! &lt;a href=&#34;https://twitter.com/hashtag/madewithunity?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#madewithunity&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/MagicaVoxel?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#MagicaVoxel&lt;/a&gt; &lt;a href=&#34;https://t.co/9MrDiI5BA3&#34;&gt;pic.twitter.com/9MrDiI5BA3&lt;/a&gt;&lt;/p&gt;&amp;mdash; Sir_carma (@Sir_carma) &lt;a href=&#34;https://twitter.com/Sir_carma/status/785070463924011008?ref_src=twsrc%5Etfw&#34;&gt;October 9, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;5- Yazdığınız koda yapacağınız bir satırlık bir eklenti, kodunuzun editör penceresinde de çalışmasını sağlayacaktır. Detaylı bilgi için &lt;a href=&#34;https://docs.unity3d.com/ScriptReference/ExecuteInEditMode.html&#34;&gt;buraya tıklayın&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Here&amp;#39;s a &lt;a href=&#34;https://twitter.com/hashtag/unitytips?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#unitytips&lt;/a&gt; for &lt;a href=&#34;https://twitter.com/hashtag/screenshotsaturday?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#screenshotsaturday&lt;/a&gt; ExecuteInEditMode will run your script in edit mode &lt;a href=&#34;https://twitter.com/hashtag/unity3d?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#unity3d&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/unitydev?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#unitydev&lt;/a&gt; &lt;a href=&#34;https://t.co/dNwD2yCuSE&#34;&gt;pic.twitter.com/dNwD2yCuSE&lt;/a&gt;&lt;/p&gt;&amp;mdash; The Knights of Unity (@KnightsOfUnity) &lt;a href=&#34;https://twitter.com/KnightsOfUnity/status/774746351204610049?ref_src=twsrc%5Etfw&#34;&gt;September 10, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;6- Eğer belirli objeleri sürekli seçiyorsanız, bu seçiminizi kaydedebilir ve sonradan seçiminize tek tıkla erişebilirsiniz.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Save and load selections of Gameobjects in &lt;a href=&#34;https://twitter.com/unity3d?ref_src=twsrc%5Etfw&#34;&gt;@unity3d&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/unitytips?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#unitytips&lt;/a&gt; &lt;a href=&#34;https://t.co/J5qCkxFZU6&#34;&gt;pic.twitter.com/J5qCkxFZU6&lt;/a&gt;&lt;/p&gt;&amp;mdash; Mark Sweeney (@MarkSweeney) &lt;a href=&#34;https://twitter.com/MarkSweeney/status/765580941976711168?ref_src=twsrc%5Etfw&#34;&gt;August 16, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;7- Bir enum için switch-case yazacaksanız, MonoDevelop sizin için işleri biraz kolaylaştırabilir. VisualStudio için ise switch satırını tamamladıktan sonra, ALT + Enter kombinasyonu ile açılan menüden ya da ampul ikonundan bu işlemi gerçekleştirmeniz mümkün.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Using a switch on an enum? Just right-click in MonoDevelop and let it create the switch labels for you. &lt;a href=&#34;https://twitter.com/hashtag/unitytips?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#unitytips&lt;/a&gt; &lt;a href=&#34;https://t.co/2iR1SuLgHs&#34;&gt;pic.twitter.com/2iR1SuLgHs&lt;/a&gt;&lt;/p&gt;&amp;mdash; Lukas Steinmetz (@drspoik) &lt;a href=&#34;https://twitter.com/drspoik/status/760395329745383424?ref_src=twsrc%5Etfw&#34;&gt;August 2, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;8- Karakteriniz için birden fazla “idle” animasyonunuz varsa aralarında geçiş yapmak için Blend Tree aracını kullanabilirsiniz. Ayrıntılı bilgi için &lt;a href=&#34;https://docs.unity3d.com/Manual/class-BlendTree.html&#34;&gt;buraya tıklayın&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Use blend trees to shuffle between idle animations!&lt;br&gt;(GIF from &lt;a href=&#34;https://twitter.com/Gladiabots?ref_src=twsrc%5Etfw&#34;&gt;@Gladiabots&lt;/a&gt;)&lt;a href=&#34;https://twitter.com/hashtag/UnityTips?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#UnityTips&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/Unity3D?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#Unity3D&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/GameDev?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#GameDev&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/IndieGame?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#IndieGame&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/MadeWithUnity?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#MadeWithUnity&lt;/a&gt; &lt;a href=&#34;https://t.co/1c1rVMJH4p&#34;&gt;pic.twitter.com/1c1rVMJH4p&lt;/a&gt;&lt;/p&gt;&amp;mdash; Sébastien Dubois (@GFX47) &lt;a href=&#34;https://twitter.com/GFX47/status/864421865103740928?ref_src=twsrc%5Etfw&#34;&gt;May 16, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;9- Kodlarınıza “TODO”lar eklemek kendinize hatırlatıcılar oluşturmanın bir yolu elbette; fakat bu ufak araç sayesinde editör arayüzüne de notlar bırakabilirsiniz. İndirmek için &lt;a href=&#34;https://github.com/charblar/stickies&#34;&gt;GitHub sayfası&lt;/a&gt;nı ziyaret edin.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Simple but useful: place ‘post-it’ notes on scenes to remind yourself of ideas or to leave comments to other designers &lt;a href=&#34;https://twitter.com/hashtag/unitytips?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#unitytips&lt;/a&gt; &lt;a href=&#34;https://t.co/UHI9uEJG7i&#34;&gt;pic.twitter.com/UHI9uEJG7i&lt;/a&gt;&lt;/p&gt;&amp;mdash; carles tm (@jaketa) &lt;a href=&#34;https://twitter.com/jaketa/status/864413157363789824?ref_src=twsrc%5Etfw&#34;&gt;May 16, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;10- Sadece geliştirme sürecinde ihtiyaç duyduğunuz objeleri “EditorOnly” olarak etiketleyin. Build aldığınızda o objeler çıkarılacaktır. Böylece, kendiniz için bölümü geçmeye yarayan ya da karakterinizin canını dolduran butonlar oluşturup hile yapabilirsiniz.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Use ‘EditorOnly’ Tag for your Debug/Editor Objects and they will be remove automatically in your Build &lt;a href=&#34;https://twitter.com/hashtag/UnityTips?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#UnityTips&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/GameDev?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#GameDev&lt;/a&gt; &lt;a href=&#34;https://twitter.com/hashtag/IndieDev?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#IndieDev&lt;/a&gt; &lt;a href=&#34;https://t.co/HqeFu0SZVX&#34;&gt;pic.twitter.com/HqeFu0SZVX&lt;/a&gt;&lt;/p&gt;&amp;mdash; NIC😋PLV (@nicoplv) &lt;a href=&#34;https://twitter.com/nicoplv/status/867000960622759938?ref_src=twsrc%5Etfw&#34;&gt;May 23, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;

&lt;p&gt;Belki ileride yeni bir derleme hazırlayabilirim. O zamana kadar, eğer Twitter kullanıcısı iseniz, &lt;a href=&#34;https://twitter.com/search?q=%23unitytips&amp;amp;src=tyah&#34;&gt;#unitytips&lt;/a&gt; etiketini arada bir kontrol etmeyi unutmayın.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Bağımsız Oyun Geliştiricisi Olmak</title>
       <link>http://www.tahirozdemir.com/2017/06/bagimsiz-oyun-gelistiricisi-olmak/</link>
       <pubDate>Thu, 29 Jun 2017 15:24:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2017/06/bagimsiz-oyun-gelistiricisi-olmak/</guid>
       <description>&lt;p&gt;Upuzun bir aradan sonra merhaba. Yaz geldi ve takip ettiğim oyun/yazılım geliştirme platformlarında bir projeye başlama hevesinde olan pek çok arkadaş görüyorum. Fakat edindiğim izlenim, pek çok kişinin henüz “bağımsız geliştirici/oyun” kavramının ne olduğunu dahi bilmeden bu işe giriştiği yönünde. Aklım erdiğince, bu konudaki pek de engin olmayan bilgilerimi paylaşmak niyetindeyim.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2017/06/development.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Öncelikle bağımsız geliştiricinin ve oyunun tanımını yaparak başlayalım. Bağımsız geliştirici tek bir kişi olabileceği gibi, genelde az sayıda kişinin bir araya gelerek oluşturduğu bir ekip de olabilir. Burada temel unsur bu kişi veya ekibin dışarıdan maddi bir destek almamış olmasıdır. Bu maddi destek bir dağıtıcı ya da bir “melek yatırımcı” olabilir. Buradaki temel unsur, birileri bir şeyler üretmeniz için size para vermeye başladığında, ürününüz üzerinde doğrudan söz hakkına sahip olmasıdır. Bu durum bağımsızlığınızı ortadan kaldırır. Bağımsız oyunlar da -doğal olarak- bu kişi ya da ekipten çıkmış oyunlardır. Buradan çıkarabileceğimiz ilk sonuç, tam şu anda bir bağımsız geliştirici olmaya karar verebileceğiniz. Peki gerçekten o kadar kolay mı?&lt;/p&gt;
&lt;p&gt;Buna karar veren kişilerin yaptığı ilk şey, bulduğu ilk platforma “Nasıl X gibi bir oyun yapabilirim?” ya da “X gibi bir oyun yapmak için ekip topluyorum” yazmak oluyor. Doğal olarak işi az çok bilen kişilerce paylanıyorlar. Çünkü oyun geliştirmek aslında içerisinde pek çok farklı disiplini barındıran, oldukça uzun ve yorucu bir süreç. O “X gibi bir oyunu” yapmadan önce öğrenilmesi gereken o kadar fazla alan var ki, kimileri de işin gerçek boyutunu görünce vazgeçiyor. Eğer vazgeçmeyenlerden iseniz okumaya devam.&lt;/p&gt;
&lt;p&gt;Peki, hiç bir alanda bilginiz ve/veya tecrübeniz yoksa ne yapacaksınız? Her gün “aklımda bir oyun fikri var ekip topluyorum” ilanı görmekten sıkıldım açıkçası. Unutmayın, herkesin iyi kötü bir oyun fikri var zaten. Kimse daha önce hiç bir şey yapmamış biri ile çalışmak istemez. Yapmanız gereken, önce ilgili dallardan birinde kendinizi bir seviyeye kadar geliştirmek. Bu yazılım da olabilir, grafik de, hatta bölüm tasarımı, sistem tasarımı gibi çok daha ince hesaplanması gereken konular bile olabilir. Önemli olan bir fikrim vardan fazlasını diyebilmeniz. Ayrıca mutlaka ama mutlaka o hayalinizdeki oyunu yapmaya başlamadan önce ortaya bazı ürünler koyun. Bir Pong kopyası yapmak dahi hiç bir şey yapmamaktan iyidir. Kendinize bir portföy ve CV hazırlayın. Bir kaç tane berbat oyun yapın. Bunlar menüsünden müziğine kadar tam oyunlar olsun ki size bir şeyler katabilsin. Ekip toplarken de bu önceki işlerinizi mutlaka gösterin. Bu, hem karşı tarafın size saygı duymasına hem de güvenmesine olanak sağlar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2017/06/Pong.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Diyelim ki pek çok konu hakkında genel bilgileri edindiniz, en az bir alanda da kendinizi geliştirdiniz. Hatta, bir kaç tane oyun geliştirip kullanmak istediğiniz oyun motorunu ya da kütüphanesini seçtiniz ve artık aklınızdaki “O” oyunu yapmaya başlayacaksınız. Vermeniz gereken ilk karar, bu geliştirme sürecini tek başınıza mı yoksa bir ekiple beraber mi sürdüreceğiniz. Her ikisinin de kendine göre artıları ve eksileri var şüphesiz. Tek başınıza olduğunuzda hesap vermeniz gereken tek kişi yine sizsiniz ama bir ekibin üyesi olduğunuz anda -o ekibin lideri olsanız dahi- diğer üyelere karşı bir sorumluluğunuz oluyor. Öte yandan, oyun gibi çok karmaşık bir yazılımın tek bir kişi tarafından geliştirilmesi müthiş bir iş yükü. Her alanda bilgi sahibi olsanız ve hiç uyumadan çalışıyor olsanız dahi, alanında uzmanlaşmış ve birbiri ile anlaşabilen iki ayrı kişi sizden daha iyi ürünler ortaya koyacaktır. Gözlemlediğim kadarı ile bir grafiker ve bir yazılımcıdan oluşan ekipler çok yaygın. Bana sorarsanız bu kadro da eksik. Günümüzde bir ürün satmanın en önemli kısmı o ürünün reklamını yapmak. Hem oyunun internet sitesini geliştirecek, sosyal medya sayfalarını yönetecek hem de uygun platformlarda oyunun tanıtım kampanyasını yönetecek üçüncü bir kişinin önemli olduğu kanaatindeyim. Öte yandan bütçenin ve insan gücü bulmaktaki sıkıntıların farkında olduğumdan, bu adımın ileri bir zamana ertelenebileceğini düşünüyorum. Müzikler için ise freelancer müzisyenler ile tek seferlik anlaşmalar yapılabilir. Eğer ekip toplayarak bu işi yapacaksanız, öncesinde mutlaka projeyi kendiniz bir noktaya kadar ilerletin. Ekip üyesi toplamak için açacağınız ilanlarda, projede o ana kadar neler yaptığınızı gösteren ufak bir video hem daha tecrübeli kişilerin projenize ilgi duymasına hem de bu ekip üyesi arama sürecinin kısalmasına olanak sağlayacaktır. Ayrıca size mükemmel gelen fikriniz, uygulamada o kadar da hoşunuza gitmeyebilir ve yol yakınken yeni projelere yönelebilirsiniz.&lt;/p&gt;
&lt;p&gt;Ufak bir de tavsiye vermek istiyorum. Oyununuzun geliştirme süreci boyunca mutlaka bir “geliştirici günlüğü” tutun ve bunu paylaşın. Her gün yazın demiyorum kesinlikle; haftalık ya da aylık düzenli yazabileceğiniz gibi, oyuna önemli bir yenilik eklediğinizde de bu günlükleri yayınlayabilirsiniz. Yapılan geliştirmelerin bir kaç ekran görüntüsü hatta videosunu ekleyebilir, bir sonraki hedefinizden bahsedebilirsiniz. Bu, hem sizin kendi oyununuza karşı olan ilgi ve hevesinizi canlı tutacak hem de oyun çıkana kadar az ya da çok bir kitleye ulaşmasına olanak sağlayacaktır. Şu iki örneğe bakabilirsiniz:&lt;/p&gt;
&lt;p&gt;1 – &lt;a href=&#34;http://www.hellblade.com/blog/&#34;&gt;Hellblade Developer Blog&lt;/a&gt;&lt;br&gt;
2 – &lt;a href=&#34;https://www.youtube.com/playlist?list=PLRIWtICgwaX1XtrjChFm9iCxLe1Hlg6s-&#34;&gt;Equilinox Video Game Devlog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ayrıca bir bağımsız geliştiricinin nasıl yaşadığını öğrenmek isterseniz şu oynatma listesine de mutlaka göz atın derim: &lt;a href=&#34;https://www.youtube.com/playlist?list=PLRIWtICgwaX1gcSZ8qj8Q473tz7PsNmpR&#34;&gt;Indie Game Devlogs: Behind-the-Scenes ThinMatrix&lt;/a&gt;. Bu konuda daha profesyonel bir iş arıyorsanız da &lt;a href=&#34;http://www.imdb.com/title/tt1942884/&#34;&gt;Indie Game: The Movie &lt;/a&gt;filmini şiddetle öneriyorum.&lt;/p&gt;
&lt;p&gt;Son olarak değinmek istediğim bir nokta daha var. Takip ettiğim hemen her platformda gördüğüm bir sıkıntı: ekip lideri olma isteği. Herkes bir şeyler gerçekleştirmek için ekip toplamaya çabalıyor ama kimse bu konu hakkında tecrübe sahibi değil. Eğer böyle bir niyetiniz varsa en azından şu iki makaleyi okumanızı öneririm:&lt;/p&gt;
&lt;p&gt;1 – &lt;a href=&#34;https://gamedevelopment.tutsplus.com/articles/working-remotely-managing-an-independent-game-development-team--gamedev-13320&#34;&gt;Managing an Independent Game Development Team&lt;/a&gt;&lt;br&gt;
2 – &lt;a href=&#34;https://www.nyfa.edu/student-resources/forming-solid-indie-game-development-team/&#34;&gt;How to Form a Solid Indie Game Development Team&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu yazıdaki her bir başlık derinlemesine incelenmeye müsait. “Hangi oyun motoru veya kütüphanesinin seçilmeliyim?” sorusu dahi aslında başlı başına bir tartışma konusu olarak ele alınabilir. Elimden geldiğince çok konuya değinmeye çalıştım. Doğal olarak hepsini yüzeysel geçmiş oldum ve konudan konuya atladım ama umarım faydalı olmuştur. Bir sonraki yazıda görüşmek üzere.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Django ile Basit Bir Site Yapalım</title>
       <link>http://www.tahirozdemir.com/2017/01/django-ile-basit-bir-site-yapalim/</link>
       <pubDate>Wed, 25 Jan 2017 21:13:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2017/01/django-ile-basit-bir-site-yapalim/</guid>
       <description>&lt;p&gt;&lt;a href=&#34;https://www.djangoproject.com/&#34;&gt;Django&lt;/a&gt;, tamamen ücretsiz ve açık kaynak bir &lt;a href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt; web frameworküdür. Geliştirme sürecini oldukça hızlandırmasıyla öne çıkmaktadır. &amp;gt;Django’yu sisteminize kurmanız için tek yapmanız gereken, Python yüklü bir sistemde komut satırına şu kodu girmek:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install Django
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Şimdi Django ile basit bir web uygulamasının nasıl geliştirildiğine bakalım. Öncelikle konsolu açıyoruz ve “cd” komutu ile projeyi oluşturmak istediğimiz dizine geçiyoruz. Örnek olarak masaüstüne helloapp adında bir klasör oluşturalım ve “cd Desktop/helloapp” ile o klasöre geçelim. Akabinde şu kod ile ilk projemizi başlatıyoruz:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;django-admin startproject helloapp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bu komutun sonunda yer alan “helloapp” bizim oluşturacağımız projenin adı oluyor. Şuna benzer bir klasör yapımız olacak:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;helloapp
├─helloapp
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bu ağaca baktığınızda içeride oluşturulmuş olan manage.py adında bir dosya ve “helloapp” adında bir klasör göreceksiniz. Bu, sizin proje ayarlarınızı (setting.py) ve projenizdeki “rotaları” (urls.py) içeren ana proje klasörünüz. Şimdi ayarlarla biraz oynayalım. Herhangi bir editörle (not defteri dahi olur) settings.py’ı açalım ve INSTALLED_APPS kısmını bulalım. Şöyle bir şeye benzemeli:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;INSTALLED_APPS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.admin&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.auth&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.contenttypes&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.sessions&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.messages&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.staticfiles&amp;#39;&lt;/span&gt;
]
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Django, “app”ler üzerinden çalışır. Bir app, kendi başına işletilebilen kod birimlerinden meydana gelir ve bir websitesinin göstermekten tutun da kullanıcı yetkilerinin yönetilmesine kadar pek çok şeyi yapabilir. Django projenizi ilk oluşturduğunuzda, bir takım appler ön tanımlı olarak gelir. Bu liste, şimdilik o ön tanımlı gelenlerden oluşuyor. Programcı, kendi yarattığı her appi kullanabilmek için bu listeye eklemek zorundadır. Şimdi nasıl yeni bir app yaratacağımıza bakalım.&lt;/p&gt;
&lt;p&gt;Django’da her app MTV (Model, View, Template) yapısına sahiptir. Kısaca bahsetmek gerekirse, bir app verileri “model”den alır, “view” bu veriyi işler ve bir “template”i işlenmiş veri ile birlikte ekranda gösterir. Kafanız karıştıysa korkmayın ve okumaya devam edin. İlgili kısımlara geldiğimizde daha iyi anlayacağınızı düşünüyorum.&lt;/p&gt;
&lt;p&gt;Yeni bir app yaratmak için komut satırında helloapp klasöründe iken şu komutu giriyoruz&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python manage.py startapp firstapp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Artık “firstapp” adında bir uygulamamız var. Proje ağacımız şöyle olmalı:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;helloapp
├── helloapp
│        ├── __init__.py
│        ├── settings.py
│        ├── urls.py
│        └── wsgi.py
├── firstapp
│        ├── __init__.py
│        ├── admin.py
│        ├── apps.py
│        ├── migrations
│        ├── models.py
│        ├── tests.py
│        └── views.py
└── manage.py
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Oluşturduğumuz yeni uygulamanın Django tarafından tanınması için settings.py içerisinde bulunan uygulamalar listemize ekliyoruz:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;INSTALLED_APPS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.admin&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.auth&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.contenttypes&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.sessions&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.messages&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;django.contrib.staticfiles&amp;#39;&lt;/span&gt;,
         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;firstapp&amp;#39;&lt;/span&gt;
]
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Tebrikler. İlk uygulamanızı oluşturdunuz. Bunun ardından isterseniz her şeyin yolunda gittiğinden emin olmak için serverı çalışır hale getirelim. Konsola şu komutu giriyoruz:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python manage.py runserver
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Şöyle bir çıktı almalıyız:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Performing system checks...
until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run &#39;python manage.py migrate&#39; to apply them.
January 26, 2017 - 00:00:02
Django version 1.10.5, using settings &#39;helloapp.settings&#39;
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Eğer biraz dikkatli bakarsanız yapmamız gereken “migration”lar olduğunu söyleyen bir uyarı aldığımızı görebilirsiniz. Şimdilik bu uyarıyı görmezden gelebiliriz. Konsolu açık bırakıp web tarayıcımızı açıyoruz ve adres satırına 127.0.0.1:8000 yazıp, ilgili sayfayı açıyoruz. Eğer şu ana kadar bir hata yapmadıysanız şuna benzer bir sayfanın sizi karşılaması lazım:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2017/01/djangovarsayilan.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Şimdi bu yeni oluşturduğumuz uygulama ile biraz oynayalım. “firstapp” klasöründeki views.py dosyasını açıyoruz ve içini şöyle değiştiriyoruz:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.shortcuts &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; render
&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.http &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; HttpResponse
&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;index&lt;/span&gt;(request):
    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; HttpResponse(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;h2&amp;gt;HEY!&amp;lt;/h2&amp;gt;&amp;#34;&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Sonrasında firstapp klasörü içerisinde bir urls.py dosyası oluşturuyoruz. Bunun için diğer dosyalardan bir tanesini kopyalayıp adını değiştirebilirsiniz. urls.py dosyasının içeriğini de şu hale getiriyoruz:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.conf.urls &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; url
&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; . &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; views

urlpatterns &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
    url(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^$&amp;#39;&lt;/span&gt;, views&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;index, name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;index&amp;#39;&lt;/span&gt;),
]
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Adres satırında bulunan ifade, urlpatterns içinde aranacak ve bulunduğunda views içerisindeki ilgili kod çağrılacak. Burada aranacak tek eşleşme ^$. ^ sembolü bir stringin başlangıcını temsil ederken $ ise sonunu göstermekte. Bizim yazdığımız r’^$’ ifadesi boş olacak ve bu url anasayfamız gibi çalışacak. Sorun şu ki, bu urls.py dosyası bizim yazdığımız firstapp’e ait ve bizim asıl uygulamamız olan helloapp’den ona bir bağlantı yok. Şimdi bu bağlantıyı kuralım. Bunun için helloapp klasöründe bulunan urls.py’ı açıyoruz ve içeriğini şöyle güncelliyoruz:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.conf.urls &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; url,include
&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.contrib &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; admin 
urlpatterns &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [ 
    url(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^admin/&amp;#39;&lt;/span&gt;, admin&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;site&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;urls), 
    url(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^firstapp/&amp;#39;&lt;/span&gt;, include(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;firstapp.urls&amp;#39;&lt;/span&gt;)), 
]
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Eğer komut satırında serverımız hala çalışıyorsa, tarayıcımızın adres satırına “127.0.0.1:8000/firstapp” yazarak oluşturduğumuz siteye ulaşabiliriz. Şöyle görünmeli:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2017/01/hey.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Eğer bu firstappi sitemizin ana sayfası yapmak istersek tek yapmamız gereken, helloappin urls.py dosyasını şu şekilde güncellemek:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.conf.urls &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; url,include
&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.contrib &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; admin
urlpatterns &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
    url(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^admin/&amp;#39;&lt;/span&gt;, admin&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;site&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;urls),
    url(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^$&amp;#39;&lt;/span&gt;, include(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;firstapp.urls&amp;#39;&lt;/span&gt;)),
]
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Mantığı anladığınızı düşünüyorum. Şimdi bir adım daha öteye gidelim. firstapp klasörü içerisine “templates” adında bir klasör oluşturalım. Ardından da index.html ve about.html adındaki şu iki html dosyasını oluşturalım:&lt;/p&gt;
&lt;p&gt;index.html:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- firstapp/templates/index.html --&amp;gt;&lt;/span&gt;

&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&amp;gt;
        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;HEY!!&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;
    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;Django Öğreniyorum.&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
  &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/about/&amp;#34;&lt;/span&gt;&amp;gt;Hakkımda&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;about.html:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- firstapp/templates/about.html --&amp;gt;&lt;/span&gt;

&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;meta&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;charset&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&amp;gt;
        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;HEY!&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;&amp;gt;
    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;
    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
        &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;Hakkımda Sayfama Hoşgeldin!&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;
    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;
    Hakkımda ıvır zıvır bilgiler.
    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;p&lt;/span&gt;&amp;gt;
    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;href&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&amp;gt;Ana sayfaya dön&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;a&lt;/span&gt;&amp;gt;
    &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;
&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Sonrasında firstappin views.py dosyasını şu şekilde güncelleyelim:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.shortcuts &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; render
&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.views.generic &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; TemplateView

&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;HomePageView&lt;/span&gt;(TemplateView):
    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(self, request, &lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;kwargs):
        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; render(request, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;index.html&amp;#39;&lt;/span&gt;, context&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;None)

&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AboutPageView&lt;/span&gt;(TemplateView):
    template_name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;about.html&amp;#34;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Burada ilk kısımda index.html sayfasını göstermek için bir get fonksiyonu yazdık ve index.html dosyasını bir Django fonksiyonu olan render fonksiyonuna parametre olarak yolladık. İkinci kısımda ise aynı işi yapmak için yine Django’ya ait olan TemplateView’in template_name parametresine atama yaptık. Her iki method da bir html dosyasını kullanıcıya göstermek için kullanılabilir. Geriye ana uygulamamız olan helloappin urls.py dosyasını değiştirmek kaldı. Şu şekilde güncelleyelim:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; django.conf.urls &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; url
&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; firstapp &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; views
urlpatterns &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
    url(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^$&amp;#39;&lt;/span&gt;, views&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;HomePageView&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;as_view()),
    url(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;^about/$&amp;#39;&lt;/span&gt;, views&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;AboutPageView&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;as_view()),
]
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Bu değişiklikten sonra firstappin urls.py dosyası ile olan bağımız tekrar koptu doğal olarak ama artık tüm olayı helloappin urls.py üzerinden kontrol ettiğimiz için bir sorun olamayacak. Zaten ikinci satırda yer alan import işlemi bizim firstappin viewsine ulaşmamızı sağlıyor ve biz de doğrudan ilgili kod bloklarını helloappin urls.py’ından çağırabiliyoruz. Böylece farklı programlama senaryolarını da görmüş olduk. Yaptığımız değişiklikleri şimdiye kadar dikkatli bir şekilde takip ettiyseniz yaptığımız şey aslında tarayıcının adres satırında yazan bağlantıya göre yazdığımız kodlardan ilgili kısımları çağırmak. Eğer şu ana kadar sorun yoksa 127.0.0.1:8000’i tarayıcımızdan açtığımızda (tabi konsoldan serverimizi çalışır hale getiriyoruz) şu sayfanın bizi karşılaması lazım:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2017/01/anasayga.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Hakkımda butonu ise şu sayfaya yönlendirmeli:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2017/01/hakkimda.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Oldukça uzun bir yazı oldu ama artık Django üzerinde çalışan bir siteye sahibiz. Tabi ki yapabileceklerimiz bunlarla sınırlı değil. &lt;a href=&#34;http://tahirozdemir34.pythonanywhere.com/&#34;&gt;Buraya&lt;/a&gt; tıklayarak Django ile oluşturduğum basit blog sitesini inceleyebilirsiniz (tabi hala aktifse) Ayrıca, &lt;a href=&#34;https://github.com/tahirozdemir34/FirstDjangoWebSite&#34;&gt;GitHub&lt;/a&gt; hesabımda yer alan proje halini indirebilirsiniz. &lt;a href=&#34;https://pythonprogramming.net/django-web-development-with-python-intro/&#34;&gt;PythonProgramming.net&lt;/a&gt; üzerindeki dersleri takip ederek yaptığımı da belirteyim. Bir sonraki yazıda görüşmek üzere.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Özgür Bir Oyun Motoru: Godot</title>
       <link>http://www.tahirozdemir.com/2016/09/acik-kaynak-bir-oyun-motoru-godot/</link>
       <pubDate>Fri, 23 Sep 2016 18:03:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/09/acik-kaynak-bir-oyun-motoru-godot/</guid>
       <description>&lt;p&gt;Gerek bireysel gerekse de ufak çaplı gruplar olsun, bağımsız oyun geliştiricisi olmak isteyen herkes, kendilerine bir geliştirme ortamı arıyor. Pek çoğu şu 3 popüler seçenekten biri ile yoluna devam ediyor: Unity, Unreal Engine, Game Maker. Bu yazıda, bu üçü dışında seçebileceğiniz yeni bir oyun motorunu tanıtacağım.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/09/Godot_-2528game_engine-2529_logo.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://godotengine.org/&#34;&gt;Godot&lt;/a&gt;, açık kaynak kodlu ve MIT lisansına sahip bir oyun motoru.&lt;/strong&gt; Bu noktada “Nedir bu MIT lisansı?” sorusu akla gelebilir. MIT, uygun bir referans vermeniz halinde, yazılımı istediğiniz gibi kullanma, kopyalama, değişiklik yapma ve hatta satma iznini veren bir açık kaynak yazılım lisansı. Eğer motora eklemek istediğiniz bir özellik varsa, tek yapmanız gereken, GitHub üzerinden C++ ile yazılmış kaynak dosyasını indirmek, ilgili değişikleri yapmak ve derlemek. Sonrasında isterseniz, bu özelliği toplulukla paylaşabilir ya da paraya dönüştürebilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/09/godot_3.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Unity ve Unreal Engine gibi programlardan ayrıldığı bir diğer nokta ise, **yaptığınız satış sonrası sizden herhangi bir yüzde talep etmemesi.**Oyununuzun ne kadar sattığı ya da sizin ne kadar kâr elde ettiğiniz önemli değil. Derseniz ki ben çok kazandım maddi olarak destek olmak istiyorum, &lt;strong&gt;bağış sayfasından katkıda bulunmanız her zaman için mümkün.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Biraz da motorun teknik özelliklerine bakalım. Godot, &lt;strong&gt;hem iki hem de üç boyutlu&lt;/strong&gt; oyunlar geliştirmenize olanak sağlayan bir yazılım. İki boyutlu oyunlar için, &lt;strong&gt;dâhili bir fizik motoru sunuyor.&lt;/strong&gt; Box2D gibi açık kaynak kodlu ve yine C++ ile geliştirilmiş hazır bir fizik motoru yerine, neden kendileri yeni bir tane daha yazmışlar bilmiyorum ama kendi yaptığım testlerde gayet güzel çalıştığını söyleyebilirim. Üç boyutlu oyunlar için ise, popüler modelleme programları olan, &lt;strong&gt;3DS Max, Maya ve Blender’a tam destek veriyor.&lt;/strong&gt; Fizik tabanlı render desteğinin, 2016 sonlarına doğru geleceği söylense dahi**, HDR, köşe yumuşatma gibi temel fonksiyonlara sahip.** Ayrıca hem iki hem de üç boyut için dâhili bir de **animasyon sistemi var.** Bir oyun objesinin hemen hemen her özelliğini kontrol etmenize olanak sağlayan bu sistem, oldukça güzel hazırlanmış. **İki boyutlu görselleriniz için “iskeletleme” özelliği dahi sunuyor.**&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/09/godot_5.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Godot’un geliştiricileri, &lt;strong&gt;GDScript&lt;/strong&gt; adında kendi ürettikleri, &lt;strong&gt;Python benzeri bir betik dili&lt;/strong&gt; sunuyorlar bize. Öğrenmesi ve kullanması oldukça rahat bir dil olduğunu söyleyebilirim. Kendi iddiaları, bir saatten daha kısa bir sürede, bu dile alışılabileceği yönünde. Ayrıca, GDScript’i kullanmak için harici bir derleyici kullanmanıza gerek yok. Tıpkı Game Maker’da olduğu gibi, &lt;strong&gt;kod yazma işi de motorun kendi ara yüzüne gömülü. Metin tamamlama, kelime bulma, değiştirme, parametre önerme gibi kodlama sürecini hızlandıracak temel özelliklere sahip.&lt;/strong&gt; Ayrıca, şu an geliştirilmekte olan &lt;strong&gt;2.2 sürümüyle birlikte, C# desteğinin&lt;/strong&gt; ekleneceğini de belirteyim.&lt;/p&gt;
&lt;p&gt;Godot, hem çalışma hem de çıktı verme olarak, pek çok platformu destekliyor. &lt;strong&gt;Windows, OS X ve Linux&lt;/strong&gt; üzerinde çalışabilen program, &lt;strong&gt;iOS, Android, Windows, OS X, Linux ve HTML 5 için çıktı verebilmekte.&lt;/strong&gt; Ayrıca, motorun kendisi &lt;strong&gt;20 megabayt&lt;/strong&gt; gibi oldukça ufak boyuta sahip. Yani, hemen şuan indirip denememek için hiçbir sebebiniz yok. Son olarak, &lt;strong&gt;kalabalık sayılabilecek bir topluluğu olduğunu&lt;/strong&gt; da belirteyim. Sorduğum soruya iki dakika içerisinde yanıt alabilmek, Godot benzeri ufak motorlar için sık rastlanır bir durum değil.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/09/godot_2.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Tüm bu özelliklerin yanında, &lt;strong&gt;eklenti mağazası, performans test aracı&lt;/strong&gt; gibi bahsetmediğim daha pek çok irili ufaklı özelliği bulunan &lt;strong&gt;Godot, şuan 2.1 sürümünde.&lt;/strong&gt; Gün geçtikçe yeni özellikler eklenmeye ve var olanlar da geliştirilmeye devam ediyor. Eğer siz de yeni bir oyun motoru denemek istiyorsanız, &lt;strong&gt;Godot’a bakmadan geçmeyin derim.&lt;/strong&gt; Gerek topluluğu, gerekse de kendi sitesi üzerinden ulaşabileceğiniz dokümantasyonları sayesinde, kısa sürede kendi uygulamalarınızı geliştirmeye başlayabilirsiniz.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Inkscape ile Vektör Çizim Dersleri</title>
       <link>http://www.tahirozdemir.com/2016/09/inkscape-ile-vektor-cizim-dersleri/</link>
       <pubDate>Thu, 22 Sep 2016 15:04:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/09/inkscape-ile-vektor-cizim-dersleri/</guid>
       <description>&lt;p&gt;Daha önce “&lt;a href=&#34;https://www.tahirozdemir.com/2016/06/blender-ile-modelleme-dersleri/&#34;&gt;Blender ile Modelleme Dersleri&lt;/a&gt;” başlıklı bir yazıyla, 3 boyutlu modelleme öğrenilebilecek 2 kaynak paylaşmıştım. Şimdi ise vektör çizim için bir kaynak paylaşacağım: &lt;a href=&#34;http://www.2dgameartguru.com/&#34;&gt;2DGameArtGuru&lt;/a&gt;. Adından anlaşılacağı üzere logo tasarımı vb. konulardan ziyade, oyunlarda kullanılabilecek görseller oluşturmaya yönelik bir site. Hemen aşağıdaki örneği, bu sitedeki dersleri takip ederek yaptım.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/09/drawing.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bu da bir oyunda nasıl göründüğü (&lt;a href=&#34;https://www.tahirozdemir.com/2016/09/acik-kaynak-bir-oyun-motoru-godot/&#34;&gt;Godot&lt;/a&gt; ile hazırlandı)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-jZF38s_-bcs/V-PnlR6nneI/AAAAAAAAAZI/1-q0IlXoapERAN5bH_l9DIaus3qcsXHEQCLcB/s320/ezgif.com-video-to-gif%2B%25281%2529.gif#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Site üzerinden dersleri takip etmenin biraz sıkıntılı olduğunu belirtmeliyim. Bir dersin devamını bulmak ya da belirli bir konuda ders aramak oldukça zahmetli. Sitenin yazarı &lt;a href=&#34;https://www.youtube.com/channel/UCVMhFCCmrMisICIoyTIXsKw&#34;&gt;Chris Hildenbrand&lt;/a&gt; da fark etmiş olacak ki dersleri &lt;a href=&#34;https://2d-game-art-tutorials.zeef.com/chris.hildenbrand&#34;&gt;Zeef&lt;/a&gt; üzerinde gruplandırıp, ulaşılması kolay bir hale getirmiş. Ayrıca, Turret Defence’da kullanmak için harici temin ettiğim, dolayısıyla işlevleriyle pek de alakalı olmayan yetenek logolarını da kendi yaptığım şu logolarla değiştirdim:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/09/g4620.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Eğer bu logoları kendi ürünlerinizde kullanmak isterseniz, yazının sonundaki bağlantı üzerinden .svg uzantılı düzenlenebilir dosyaya ulaşabilirsiniz. CC BY 4.0 kapsamında isim belirttiğiniz takdirde, istediğiniz gibi değişiklik yapma, yeniden yayınlama ve kullanma hakkına sahipsiniz. İlk örneğin de indirme bağlantısını vermek isterdim ama her dersin sonunda bir de satın alma bağlantısı bulunduğundan ve lisans hakkında herhangi bir bilgilendirme olmadığından; her ne kadar kendim çizmiş olsam dahi paylaşmayı içime sindiremiyorum. Verdiğim bağlantıları tekrardan paylaşarak bu yazıyı da tamamlayayım.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2D Game Art Guru: &lt;a href=&#34;http://www.2dgameartguru.com/&#34;&gt;http://www.2dgameartguru.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Derslerin Gruplandırılımış hali: &lt;a href=&#34;https://2d-game-art-tutorials.zeef.com/chris.hildenbrand&#34;&gt;https://2d-game-art-tutorials.zeef.com/chris.hildenbrand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chris Hildenbrand Youtube: &lt;a href=&#34;https://www.youtube.com/channel/UCVMhFCCmrMisICIoyTIXsKw&#34;&gt;https://www.youtube.com/channel/UCVMhFCCmrMisICIoyTIXsKw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Yetenek logoları: &lt;a href=&#34;https://drive.google.com/file/d/0B01T_59j7QNeaXFwNV9KNGczZVE/view&#34;&gt;https://drive.google.com/file/d/0B01T_59j7QNeaXFwNV9KNGczZVE/view&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Inkscape: &lt;a href=&#34;https://inkscape.org/en/&#34;&gt;https://inkscape.org/en/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
     </item>
   
     <item>
       <title>Unity Geliştirici Günlüğü #5</title>
       <link>http://www.tahirozdemir.com/2016/08/unity-gelistirici-gunlugu-5/</link>
       <pubDate>Mon, 15 Aug 2016 11:37:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/08/unity-gelistirici-gunlugu-5/</guid>
       <description>&lt;p&gt;Daha önceki geliştirici günlüklerinde Unity ile ilk yaptığım oyunun geliştirme aşamalarını yazmıştım. Şimdi ise o ilk oyunun bana açtığı kapıdan bahsedeceğim.&lt;/p&gt;
&lt;p&gt;SlideMe üzerinde yayınladıktan sonra çeşitli mecralarda oyunu paylaştım ve ağırlıklı olarak olumlu geri dönüşler alınca, Unity’nin kendi forumunda da paylaşmaya karar verdim. Tabi ki hiç kimse yorum yazma zahmetinde dahi bulunmadı. Aradan 1-2 gün geçtikten sonra Unity forumunu tekrar ziyaret ettiğimde bir iş teklifi geldiğini gördüm. PleXtech adında yeni kurulmuş bir ekip, Lapse adında gelecek temalı bir “turret defence” oyunu üzerinde çalışıyormuş ve programcı eksikleri varmış. Benim 2 haftada bu oyunu yapmamdan etkilenmişler ve “bizimle çalışmak ister misin?” diye mesaj atmışlar. İşte bu beklenmedik bir olaydı. Takip eden gün boyunca “acaba girsem yapabilir miyim?” sorusuna cevap arayarak geçirdim ve en sonunda “ne kaybederim ki?” deyip, kabul ettiğimi belirten bir mail attım kendilerine. O günden beri tam 3 hafta geçmiş. 3 hafta boyunca çok ciddi emek harcadım. Şu an hala geliştirme aşamasında olduğu için ekran görüntüsü paylaşamıyorum ama yakında bir alpha sürüm çıkarmayı düşünüyorlar (neden 3. çoğul şahıs kullandığıma birazdan değineceğim).&lt;/p&gt;
&lt;p&gt;Oyunun bir “turret defence” olduğunu söylemiştim. Kendi türündeki diğer oyunlardan farklı olarak, oyuncu dilediği taretleri birinci kişi bakış açısıyla kontrol edebiliyor. İşte bu “FPS” sistemini, taretlerin yapay zekalarını ve bunların yanında daha pek çok irili ufaklı sistemi bendeniz yazdı. 3 hafta boyunca, yaklaşık 100 saat civarında mesai harcadım bu projeye. Bu süreçte bu işlerin bir ekiple beraber nasıl yapıldığını, “home office” çalışmanın artıları ve eksilerini, sizin dilinizi konuşmaya hatta sizinle aynı zaman dilinde dahi olmayan insanlarla (ki tek Türk bendim ekipte) nasıl iş yapılabileceğini az buçuk deneyimlemiş oldum (belki bir ara bu konular hakkında da yazsam iyi olur).&lt;/p&gt;
&lt;p&gt;Dün itibari ile bu ekipten ayrılmış bulunmaktayım. Kendimce, hayli geçerli sebeplerim var ama dile getirmenin uygun olmayacağı kanısındayım. Bana bu iş teklifini yapan Rhys Campbell’e de saygılarımı ve iyi dileklerimi bir kez daha ileterek, bu yazının da sonuna geleyim. Projenin Trello sayfasını incelemek isteyenler şu bağlantıyı kullanabilirler: &lt;a href=&#34;https://trello.com/b/NZlWW3xw/lapse&#34;&gt;https://trello.com/b/NZlWW3xw/lapse&lt;/a&gt; Umarım bekledikleri başarıya ulaşabilirler.&lt;/p&gt;
&lt;p&gt;Bir de ufak bir kilometre taşı: bugün itibari ile Turret Defence 300 indirmeye ulaştı. Belki bir takım geliştirmeler yapıp Google Play’e ekleyebilirim.&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Turret Defence Yayınlandı</title>
       <link>http://www.tahirozdemir.com/2016/07/turret-defence-yayinlandi/</link>
       <pubDate>Mon, 18 Jul 2016 18:58:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/07/turret-defence-yayinlandi/</guid>
       <description>&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/07/Untitled-1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Bir süredir geliştirmekte olduğum Turret Defence, bugün SlideMe üzerinden yayınlandı. Dün bir geliştirici hesabı açıp uygulamamı yollamıştım. Dürüst olmak gerekirse kabul etmeyeceklerine kesin gözüyle bakıyordum ama aldığım onay maili beni çok sevindirdi. Doğal olarak hemen klavyemin başına oturup, geliştirmeye başladığım ilk andan itibaren yaptığım gibi, bloga yazmak istedim. Şuan ne indirme sayısı ne de alacağı yorumlar benim için önemli. Önemli olan oyunun bir platformda kendine yer bulabilmesiydi ve bu gerçekleşti. Eğer indirip denemek istersen aşağıdaki görselden oyunun SlideMe sayfasına ulaşabilirsin.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://slideme.org/application/turret-defence&#34;&gt;&lt;img src=&#34;../../../uploads/2016/07/slideme.png#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Unity Geliştirici Günlüğü #4</title>
       <link>http://www.tahirozdemir.com/2016/07/unity-gelistirici-gunlugu-4/</link>
       <pubDate>Fri, 15 Jul 2016 16:17:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/07/unity-gelistirici-gunlugu-4/</guid>
       <description>&lt;p&gt;Bitti. Baya baya bitti. Yetenek sistemi tamam. Bir önceki günlükte bahsettiğim iki yeni yeteneğin birini, kısa süreliğine kalkan vereni, ekledim. Son yetenek olarak da mermi hasarını artırmak yerine tüm küpleri patlatan bir yetenek hazırladım. Görselde hepsinin altında “FREE” yazsa da bu sadece ilk açılan için geçerli. Her açtığın yetenek için bir sonrakinin bedeli 150 “coin” artmakta. Önce hangisini açacağın sana kalmış. Aynı anda en fazla iki yetenek seçebilirsin.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/07/skillMenu.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ayrıca, ilk yeteneklerin algoritmalarını da elden geçirirken fark ettiğim önemli “bug”ları düzelttim. Hangi yeteneklerin açıldığını, kaç “coin”in olduğunu kaydedecek sistemi de oluşturdum. Böylece oyunu yeniden açtığında kaldığın yerden devam edebilirsin.&lt;/p&gt;
&lt;p&gt;Son WebGL buildini almadan önce butonların altındaki “textbox”ları kapattığımdan görünmese de sol yetenek butonu için “Q”, sağ yetenek butonu için “E” tuşlarını kullanabilirsin. Ana platform Android olduğu için WebGL buildleri öncesi hep açıyordum “textbox”ları ama bu sefer açmayı unutmuşum. İnternet hızım, kaplumbağaların hızıyla yarıştığı için bütün oyunu tekrar yüklemek oldukça sıkıntılı benim açımdan. Ayrıca yüklediğim sitede bu sıralar sorunlar var, 5-6 denemeden sonra anca yükleyebildim. Şöyle görünmesi lazımdı:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/07/ingame.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Yaklaşık 15 günlük bir projeyi, böylece tamamlamış oluyorum. Belki bundan sonra ufak tefek bir iki düzenleme daha yaparım. Android cihazlarda dönme hızının çok yavaş olduğundan şikayetçi olanlar var, hız çarpanını artırabilirim. Bu süreçte oldukça değerli bilgiler edindim. Unity motorunu bir seviyeye kadar öğrenmiş oldum. Keyifli bir iki haftaydı benim için. Başka bir yazıda/projede görüşünceye kadar, sayonara.&lt;/p&gt;
&lt;p&gt;Tarayıcı üzerinden oynamak için &lt;a href=&#34;http://www.cheesegames.net/games/507/index.php?gameDataId=507&#34;&gt;TIKLA&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Unity Geliştirici Günlüğü #3</title>
       <link>http://www.tahirozdemir.com/2016/07/unity-gelistirici-gunlugu-3/</link>
       <pubDate>Sun, 10 Jul 2016 17:09:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/07/unity-gelistirici-gunlugu-3/</guid>
       <description>&lt;p&gt;Bu günün çözülen en önemli sıkıntısı, mobil platformda olan dokunmatik sorunuydu. Biraz eğreti olsa da bir çözüm ürettim diyebiliriz sanırım. Ayrıca şu ana kadar fark etmediğim bir sorun olan butonların “hitbox”larının aşırı büyük olmasını da hallettim gibi duruyor. Oyunda tutulan ve oyuncunun başarı ölçütü olan süreyi de nihayet doğru hesaplayabiliyorum. Daha önce nasıl fark edemediğimi anlamadığım, script tarafındaki ufak bir bug, sebep oluyormuş bu soruna. Bu hata gidermelerin dışında biraz da yeniliklerden bahsedelim&lt;/p&gt;
&lt;p&gt;*Yetenek sisteminin temellerini attım. Şimdilik iki yeteneğimiz var. Bunlardan ilki atış sıklığınızı bir süreliğine azaltırken, diğeri düşmanlarınızın hızını kısa süreliğine azaltmakta. Bilgisayar sürümünde kolaylık olması için “Q” ve “E” tuşları ile aktif edilebiliyor. Şimdilik aklımda eklenebilecek iki yetenek daha var. Birisi mermilerinizin verdiği hasarı arttırırken diğeri ise kalkan oluşturarak hasar almanızı önleyecek. Kullanılan yeteneklerin tazelenme süresini de ekrana yazdırarak oyuncuya kolaylık sağladım. Önceden de söylediğim gibi, yeteneklerin belirli seviyelerden sonra, yetenek puanları ile açılmasını istiyorum. Şimdilik bunun sistemini nasıl oturtacağım hakkında kafamda net bir tablo yok. Bir sonraki güncelleme, eğer olursa, bu olacak ve aklıma yeni fikirler gelmezse, oyun büyük oranda final haline yaklaşmış olacak.&lt;/p&gt;
&lt;p&gt;*2 yeni düşman tipi eklendi. Normal küplerden farklı renklere sahipler. Yeşil küpler vurulduğunda 10 yerine 20 puan veriyor. Kırmızı küpleri vurduğunuzda puan alamazken, eğer size çarparlarsa 20 puanınızı da beraberlerinde götürüyorlar.&lt;/p&gt;
&lt;p&gt;*Ufak bir yenilik; oyunun ana menüsünde bazı değişiklikler yaptım. En tepedeki sloganvari yazıyı kaldırıp, bir puan tablosu koydum ki hangi küp kaç puan veriyor, oyuncu oyuna başlamadan bilsin. Ayrıca “referanslar” kısmı da ekledim ve dışarıdan aldığım materyalleri bu kısımda belirttim. Oyunun parlaklığını da bir miktar artırdım.&lt;/p&gt;
&lt;p&gt;Sonlara doğru yaklaşırken ayarlanması gereken en önemli noktalardan biri de oyunun zorluk dengesi olacak. O kadar fazla değişken var ki düşünmem gereken… Umarım altından kalkabilirim.&lt;/p&gt;
&lt;p&gt;Bir önceki günlükte paylaşmış olduğum bağlantıyı güncelledim. Böylece eğer isterseniz oyunun şu anki sürümünü test edebilirsiniz. Ben yine de buraya bir bağlantı ekliyeyim: &lt;a href=&#34;http://www.cheesegames.net/games/490/index.php?gameDataId=490&#34;&gt;TIKLA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Edit (15.07.2016): Son sürümü denemek için &lt;a href=&#34;http://www.cheesegames.net/games/507/index.php?gameDataId=507&#34;&gt;TIKLA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ola ki siz bu yazıyı okuduğunuz da CheeseGames çok çok uzaklardaysa, (kendimi reklam almış gibi hissediyorum her defasında) oynanış videosu izleyebilirsiniz:&lt;/p&gt;

&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/_prme_3PWXg&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;YouTube Video&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;

</description>
     </item>
   
     <item>
       <title>Unity Geliştirici Günlüğü #2</title>
       <link>http://www.tahirozdemir.com/2016/07/unity-gelistirici-gunlugu-2/</link>
       <pubDate>Thu, 07 Jul 2016 16:28:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/07/unity-gelistirici-gunlugu-2/</guid>
       <description>&lt;p&gt;Öncelikle herkese iyi bayramlar. İlk günlükte projeye tekrar ne zaman dönerim bilmem diyordum ama aradan geçen 4 gün sonrası kendimi tekrar Unity’nin başında buldum. Umarım bu istek devam eder. Geçen yazının sonunda “farkında olduğum sıkıntılar” kısmı vardı hatırlarsanız. Bugün biraz onlarla uğraşayım dedim. Aslında Unity’i ilk açtığımda amacım, kafamdaki yetenek sistemi için biraz giriş yapmaktı lakin nasıl olduğunun farkına varamadan, kendimi oyunu Android için düzenlerken buldum. Neler yaptığıma şöyle bir göz atalım.&lt;/p&gt;
&lt;p&gt;Bugünün çözülmüş sıkıntısı, mermilerin zor fark edilmesi oldu. Kendimce ikinci bir obje daha oluşturup bunu parlak bir materyal ile kaplamayı ve asıl merminin “child” objesi yapmayı düşündüm. Fakat ileride oyunu mobil platforma geçirmeyi düşündüğüm için ekstra bir obje eklemenin doğurabileceği performans sıkıntılarından korkarak araştırmaya koyuldum ve Unity’nin &lt;strong&gt;“Trail Renderer”&lt;/strong&gt; adında bir bileşeni olduğunu öğrendim. Üstelik tam da istediğim işi yapıyordu. Ayarları ile biraz oynayarak istediğim şekle sokabildim.&lt;/p&gt;
&lt;p&gt;Android için dokunmatik ekran ile kamerayı yönlendirmeyi sağladım. Fakat geliştirilmesi gerek. Küçük hareketlerde sıkıntı çıkarıyor. Kodun şimdiki halini paylaşayım. Zaten oldukça basit.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; ScrollTouchID = -&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; 

&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Update(){

  &lt;span style=&#34;color:#66d9ef&#34;&gt;foreach&lt;/span&gt;(Touch T &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; Input.touches) {
  
    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (T.phase == TouchPhase.Began) {                                    
    
      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (ScrollTouchID == -&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) {
   
        ScrollTouchID = T.fingerId;    
        ScrollTouchOrigin = T.position;    
       }
    }

    &lt;span style=&#34;color:#75715e&#34;&gt;//Dokunma bitince değişkeni eski haline getiriyoruz.
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ((T.phase == TouchPhase.Ended) || (T.phase == TouchPhase.Canceled)) {                                    
               
      ScrollTouchID = -&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;    
    }

    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (T.phase == TouchPhase.Moved) {
                 
    &lt;span style=&#34;color:#75715e&#34;&gt;//Eğer parmak hareket ederse, x eksenindeki hareketini 
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//döndüreceğim cismin &amp;#34;z&amp;#34; açısına ekliyorum
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//Sizin uzayınız için döndürme ekseni farklı olabilir.
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//İstenirse ufak düzenlemelerle kameranın pozisyonu, uzaklığı gibi 
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//ayarların dokunmatik ekran ile yapılması sağlanabilir.
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (T.fingerId == ScrollTouchID) {
        &lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; turz = turret.transform.rotation.z;
        turret.transform.Rotate (&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Vector3(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, turz + T.deltaPosition.x));
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ayrıca oyun bittikten sonra tekrar oynamak için bir buton da ekledim. Tıklandığında bütün oyun sahasını temizleyip, puan ve zamanı ilk haline getiriyor. Aklınızda olsun, eğer bir buton ile bir scriptteki fonksiyonu çağırmak istiyorsanız, fonksiyonun “public” olduğundan ve scriptin hali hazırda bir objeye ekli olduğundan emin olun. Sonra tek yapmanız gereken “Button” bileşinin “On Click()” kısmını düzenlemek&lt;/p&gt;
&lt;p&gt;Bu süreçte bulduğum bir siteden bahsederek bu günü de tamamlayayım. Geliştirmekte olduğunuz projelerin WebGl buildlerini yükleyebileceğiniz &lt;a href=&#34;http://cheesegames.net/&#34;&gt;CheeseGames.net&lt;/a&gt; adında bir site mevcut. Şu an için oldukça çiğ durduğunu kabul ediyorum. Fakat doğru reklamı yapmayı başarabilirse ve daha güzel bir arayüze geçerse, başarılı bir girişim olabilir. Siz de isterseniz oyununuzun test sürüşlerini bu site üzerinden yapabilirsiniz.&lt;/p&gt;
&lt;p&gt;Oyunun şu anki halini de yine CheeseGames üzerinden deneyebilirsiniz: &lt;a href=&#34;http://www.cheesegames.net/games/490/index.php?gameDataId=490&#34;&gt;TIKLA &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Edit(15.07.2016): Son sürümü denemek için &lt;a href=&#34;http://www.cheesegames.net/games/507/index.php?gameDataId=507&#34;&gt;TIKLA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yeni çıkan sorunlar ve yeni fikirler:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mermiler nadiren aynı hizada oluşmuyor.&lt;/li&gt;
&lt;li&gt;Dokunmatik sıkıntılı çalışıyor.&lt;/li&gt;
&lt;li&gt;Tekrar başlatılan oyunda bulutlar oluşmaya devam etmiyor. Halletmesi çok kolay 🙂&lt;/li&gt;
&lt;li&gt;Küpler çeşitlendirilebilir. Daha çok puan veren, vurulmaması gereken, zaman bonusu veren gibi çeşitler türetilebilir.&lt;/li&gt;
&lt;/ul&gt;
</description>
     </item>
   
     <item>
       <title>Unity Geliştirici Günlüğü #1</title>
       <link>http://www.tahirozdemir.com/2016/07/unity-gelistirici-gunlugu-1/</link>
       <pubDate>Sat, 02 Jul 2016 16:55:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/07/unity-gelistirici-gunlugu-1/</guid>
       <description>&lt;p&gt;3 gün önce kendime bir iyilik yaptım ve Unity öğrenmeye başladım. Programlama konusunda halihazırda tecrübem bulunduğundan, Unity’e başlamadan önce 4-5 gün kadar Blender dersleri izleyerek az da olsa modelleme öğrendim. Gerçi, yaptığım hiç bir örnek bir oyunda kullanılmaya müsait değildi. Çünkü dersler, sizi oyun yapmanız için değil, kaliteli renderlar almanız için eğitiyor. Fakat arayüze ve kısa yollara alışmam konusunda çok yardımları dokundu. Bir de, önceki yazıda göreceğiniz havluyu çevremdekilere gösterdiğimde duyduğum “E sen şimdi havlunun fotoğrafını niye çektin ki?” cümlesinin verdiği keyif paha biçilemez 🙂 Sözün özü, eğer bir oyun için modelleme yapacaksanız izleyeceğiniz dersleri ona göre seçin.&lt;/p&gt;
&lt;p&gt;Şimdi ilk çalışmamın ekran görüntüsünü ve indirme bağlantısını vereyim.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/07/things.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;İleriki sürümler de elbette zaman harcar bunları da geliştiririm. Umarım&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/07/t1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://drive.google.com/file/d/0B01T_59j7QNeMmtyZHBwdWxwMEU/view&#34;&gt;İndirmek İçin Tıkla&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Video&lt;/p&gt;

&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;https://www.youtube.com/embed/oi6GrvqPsD4&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allowfullscreen title=&#34;YouTube Video&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;Görmüş olduğunuz proje, birazdan vereceğim referanslar hariç tamamen benim tarafımdan oluşturulmuştur. Hepsi el emeği göz nuru ^^&lt;/p&gt;
&lt;p&gt;Referanslar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple Particle Pack: &lt;a href=&#34;https://www.assetstore.unity3d.com/en/#!/content/3045&#34;&gt;https://www.assetstore.unity3d.com/en/#!/content/3045&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Farland Skies: &lt;a href=&#34;https://www.assetstore.unity3d.com/en/#!/content/60004&#34;&gt;https://www.assetstore.unity3d.com/en/#!/content/60004&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Müzik: Unity Tanks Tutorial&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Şimdilik farkında olduğum sıkıntılar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mermileri takip etmesi zor.&lt;/li&gt;
&lt;li&gt;106 saniyeden fazla dayanmak imkansız (rekorum ^^ ). Zorluk dengelenmeli.&lt;/li&gt;
&lt;li&gt;Tekrar oynamak için oyuncuya sebep sunmuyor. Aslında bu genel olarak tüm oyun geliştiricilerin sıkıntısı. Ufak bir rekabet unsuru genelde çözüm oluyor. Belki karakter gelişimi gibi bir sistem ekleyebilirim. Mesela, öldürülen belirli sayıda düşman için oyuncu yetenek puanı kazanabilir. Bu puanları da atış etme sıklığını arttırmak için kullanabilir. Veyahut zamanı yavaşlatmak gibi tek kullanımlık özellikler eklenebilir&lt;/li&gt;
&lt;li&gt;Ve belki de en önemlisi cafcaflı isim. Zira kimse adı “turret oyunu” olan bir şeyi oynamak istemez ^^&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bitirmeden ekliyeyim, Unity övüldüğü kadar iyi bir motor değil. Bir kaç kez aç-kapa düzelsin tarzında sorunla karşılaştım. Bu tarz bir sorunla yarım saat uğraşıp sonra da tek yapmam gerekenin programı açıp kapatmak olduğunu fark edince, ciddi anlamda moralim bozuldu. Neyse ki Unity hala geliştirilmeye devam eden bir motor ve diğer hiç bir motorun sahip olmadığı kadar geniş bir topluluğa sahip. Ayrıca ben de Unity’i eleştirebilecek bir konumda değilim 🙂 Şimdilik burada gelişmeye devam, belki sonra bir ortam değişikliğine giderim.&lt;/p&gt;
&lt;p&gt;Projeye tekrar ne zaman dönerim bilinmez ama ara ara bu tarz günlük yazmak istiyorum. Hem aklımdaki fikirleri derli toplu bir yerde tutmuş hem de iyi kötü yaptığım işleri bir araya toplamış oluyorum. Günlüğün sonraki sayfasına kadar kendine iyi bak ^^&lt;/p&gt;
&lt;p&gt;Edit(15.07.2016): Son sürümü denemek için &lt;a href=&#34;http://www.cheesegames.net/games/507/index.php?gameDataId=507&#34;&gt;TIKLA&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Blender ile Modelleme Dersleri</title>
       <link>http://www.tahirozdemir.com/2016/06/blender-ile-modelleme-dersleri/</link>
       <pubDate>Sun, 26 Jun 2016 15:48:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/06/blender-ile-modelleme-dersleri/</guid>
       <description>&lt;p&gt;Eğer modelleme öğrenmek istiyorsan ve nereden başlayacağın hakkında kafan karışıksa vereceğim şu iki kanala göz atmanda yarar var. Baştan söyleyeyim her iki kanal da İngilizce.&lt;/p&gt;
&lt;p&gt;İlk kanalımız tutor4u : &lt;a href=&#34;https://www.youtube.com/channel/UCJspWFXSL1guQPdFqh4lFjQ&#34;&gt;https://www.youtube.com/playlist?list=PLzmyR17f55-LVbgnzhS4Xl9zJ3dSCdYW3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Diğer kanala nazaran, giriş seviyesinde derslere sahip ve dersi anlatan kişi konuya çok hakim. Eğer daha önce internetten bir eğitim izlediysen fark etmişsindir ki dersin büyük bir bölümü değer denemekle geçer. Anlatım ise ‘e’ ve ‘ı’ gibi pek çok sesli harfle doludur. Bu arkadaş verdiği değerleri önceden denediği için bu açıdan bir zaman kaybı yaşamıyorsunuz. Ayrıca öyle sanıyorum ki videoyu bir kaç defa çekip, en içine sineni Youtube’a yüklüyor. Yoksa bu kadar akıcı bir şekilde takılmadan anlatmak mümkün değil. Sözün özü, ilk durağınızın burası olmasını öneririm. Tek eksisi çok az video olması ama dediğim gibi başlangıç için bence mükemmel bir kanal. Şuraya da benim bu kanalın videoları ile yaptığım çalışmaları iliştireyim.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/06/bear.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/06/chain.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/06/clock.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/06/ezgif.com-crop.gif#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/06/cloth.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/06/ring.png#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;Gelelim diğer kanalımız olan BlenderGuru’ya: &lt;a href=&#34;https://www.youtube.com/user/AndrewPPrice/videos&#34;&gt;https://www.youtube.com/user/AndrewPPrice/videos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bu kanal çok daha ileri seviyede. Sadece modelleme dersleri dışında, bu işte ilerlemek isteyenler için işin püf noktaları üzerine de videolar bulunduruyor. Işıklandırma, renkler, foto-gerçekçilik gibi karmaşık konularda da videolar bulabileceğiniz kanal, oldukça kaliteli hazırlanmış içeriklere sahip. Bu kanaldan izleyerek hazırladığım bir çalışmayı da hemen aşağıda görebilirsiniz.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../../uploads/2016/06/towel.png#mid#mid&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>C&#43;&#43; ile Kare Sayma Algoritması</title>
       <link>http://www.tahirozdemir.com/2016/05/c-ile-kare-sayma-algoritmasi/</link>
       <pubDate>Thu, 26 May 2016 12:45:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/05/c-ile-kare-sayma-algoritmasi/</guid>
       <description>&lt;p&gt;Bir proje ödevini daha bitirmiş bulunmaktayım ve kodları paylaşacağım. Başlık tuhaf gelebilir. Fakat daha doğru nasıl ifade edilir bilmiyorum. Öncelikle ödevin ne olduğundan bahsedeyim. Proje raporunda yaptığım tanımı doğrudan buraya aktarıyorum.&lt;/p&gt;
&lt;p&gt;Hazırlanılan projede, verilen nokta koordinatlarına göre, noktalar dikey veya düşey çizgiler ile birleştirilmekte; son koordinat bilgisi de alındıktan sonra oluşan karelerin büyüklükleri de göz önüne alınarak kaç adet oldukları bilgisi kullanıcıya verilmektedir. Kaç nokta olacağı, kaç çizgi çizileceği ve koordinat bilgileri “input.txt” dosyası ile kullanıcıdan alınıp işlemler yapıldıktan sonra, sonuçlar “output.txt” dosyasına yazılmaktadır. Kare sayılarının yanında verilen koordinatlar doğrultusunda oluşan şekli de yazdırarak kullanıcıya tam bir geri dönüş sağlanmaktadır.&lt;/p&gt;
&lt;p&gt;“Dots and Boxes” adlı oyunun sadece kare sayma kısmı gibi düşünebilirsiniz. Örnek bir girdi ve çıktı dosyası görüntüsü paylaşırsam daha iyi anlaşılacaktır galiba.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://2.bp.blogspot.com/-fvKXM8vgPRo/V0bqSnXJUtI/AAAAAAAAANQ/8iYKt8u11bQj9ZV8a5p5aH5Zk8xusF_-wCLcB/s1600/input.PNG&#34;&gt;&lt;img src=&#34;https://2.bp.blogspot.com/-fvKXM8vgPRo/V0bqSnXJUtI/AAAAAAAAANQ/8iYKt8u11bQj9ZV8a5p5aH5Zk8xusF_-wCLcB/s320/input.PNG#float&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://3.bp.blogspot.com/-Ux3PHlJkRiY/V0bqSgEs9QI/AAAAAAAAANM/ZZRhfL-P8ZYTA-5lJb_l_896wTIP6TefwCLcB/s1600/output.PNG&#34;&gt;&lt;img src=&#34;https://3.bp.blogspot.com/-Ux3PHlJkRiY/V0bqSgEs9QI/AAAAAAAAANM/ZZRhfL-P8ZYTA-5lJb_l_896wTIP6TefwCLcB/s320/output.PNG#float&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Önemli Not:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yatay çizgi koordinatlarında 1. sayı satır numarası, 2. sayı sütün numarasını temsil ederken; dikey çizgiler için tam tersi geçerli. Koordinat ‘H’ ile başlıyorsa bu yatay olacağı anlamına gelir. Noktaya gidilir ve sağındaki nokta ile birleştirilen yatay bir çizgi çizilir. ‘V’ ile başlıyorsa ilgili nokta ile altındaki nokta dik bir çizgi ile birleştirilir. Asıl kritik nokta tüm büyüklükteki kareler için çalışabilecek bir sayma algoritması oluşturmak. Artık kodu ve akış diagramlarını paylaşıp burada bitireyim.&lt;/p&gt;
&lt;p&gt;Kaynak kod: &lt;a href=&#34;https://drive.google.com/file/d/0B01T_59j7QNeNGJWQVE4UVFqa28/view?usp=sharing&#34;&gt;https://drive.google.com/file/d/0B01T_59j7QNeNGJWQVE4UVFqa28/view?usp=sharing&lt;/a&gt;&lt;br&gt;
Akış Diagramları: &lt;a href=&#34;https://goo.gl/photos/8YBj1fUrvUZVEsi17&#34;&gt;https://goo.gl/photos/8YBj1fUrvUZVEsi17&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Sanal Makine ile Windows Üzerinde Mac OS X Yosemite Çalıştırmak</title>
       <link>http://www.tahirozdemir.com/2016/05/sanal-makine-ile-windows-uzerinde-mac-os-x-yosemite-calistirmak/</link>
       <pubDate>Mon, 23 May 2016 19:01:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/05/sanal-makine-ile-windows-uzerinde-mac-os-x-yosemite-calistirmak/</guid>
       <description>&lt;p&gt;Normal şartlarda Mac OS deneyimi yaşamak için Apple markalı bir ürüne sahip olmalısınız. Apple, Intel işlemcileri kullanmaya başladıktan sonra bu cümlenin son kelimesi “olmalıydınız” halini aldı. Artık PC’ler üzerinde de Mac işletim sistemleri çalışabiliyor. Hatta bu cihazların “Hacintosh” gibi gayet karizmatik bir de isimleri var. Ayrıca, bu işlem için illaki Mac sisteminizin korsan olmasına gerek yok. Parasını verip almış olduğunuz bir işletim sistemiyle de bu “Hacintosh”lardan bir tane yaratabilirsiniz. İşte bu yaratma işlemi için başlıkta göreceğiniz olay mükemmel bir pratik. Herhangi bir veri kaybı olmadan kendi PC’niz üzerinde Mac çalıştırmayı deneyebilir, sonuçtan memnun kalırsanız gerçek bir kurulum yapabilir ya da bir Apple cihaz edinmek isteyebilirsiniz. Zorlama giriş yazımızdan sonra bu işlemin nasıl yapılacağına geçelim.&lt;/p&gt;
&lt;p&gt;Not: Bu rehber Virtualbox Üzerine, OS X Yosemite kurulumunun adımlarını içermektedir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Hazırlık&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Her şeyden önce kullandığınız Windows sürümünün 64-bit olduğundan emin olun. Çünkü Yosemite 64-bit’lik bir işletim sistemi. Bunun dışında en az 4GB RAM ve çift çekirdekli bir Intel(*) işlemciye ihtiyacınız var. Eğer sisteminiz bu yeterlilikleri sağlıyor ise devam edebiliriz. AMD işlemcilerle ve Haswell mimarisine sahip Intel işlemciler ile de bu kurulumu gerçekleştirmek mümkün fakat onlar için bazı ek ayarlamalar yapmak gerekmekte.&lt;/p&gt;
&lt;p&gt;İhtiyacımız olan Virtualbox programını şu adresten indirebilirsiniz: &lt;a href=&#34;https://www.virtualbox.org/&#34;&gt;Virtualbox&lt;/a&gt;&lt;br&gt;
Daha sonra OS X Yosemite’in bizim kullanacağımız kırılmış versiyonu olan “Yosemite Zone” un iso dosyasını edinmelisiniz. Google’da yapacağınız ufak bir arama ile bulabilirsiniz. Maalesef , sanal makine kurulumu için korsan versiyonu kullanmak zorundayız.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Sanal Bir Makine Oluşturmak&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Daha önce sanal bir makine oluşturmuş olanlar sonraki adıma geçebilir. İlk adım için anlatacak bir şey yok. Sol üstten “Yeni” butonuna bastıktan sonra. Açılan pencerede “Türü” kısmına Mac OS X’i seçiyoruz. “Sürüm” için de Mac OS X (64-bit)’i seçiyoruz. “Ad” kısmına canınız ne isterse yazın. İleri dediğimizde bizi bellek ekranı karşılıyor. Düz bir mantıkla “ne kadar ekmek o kadar köfte” prensibine sahip Virtualbox. Ben 4GB ayırdım, size de en az 2GB ayırmanızı öneririm. Sonraki adımda bu sanal makinemize bir de depolama birimi vereceğiz. Bu yazıyı yazdığım tarih itibari ile varsayılan değerleri kullandım. Ekran görüntülerinden bakarak kontrol edebilirsiniz. Disk boyutu olarak 20GB seçtim bu da size kalmış ama bu noktada çok büyük alanlar ayırmanın anlamı yok.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://4.bp.blogspot.com/-pP88-ZDR0-I/V0NLrm9YIdI/AAAAAAAAAMg/jmjjkfV5gxwp7dUvdioSyCVrLh1HEkcBwCLcB/s1600/1.PNG&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-pP88-ZDR0-I/V0NLrm9YIdI/AAAAAAAAAMg/jmjjkfV5gxwp7dUvdioSyCVrLh1HEkcBwCLcB/s320/1.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://4.bp.blogspot.com/-rGl0_LS84gI/V0NLsO3GX1I/AAAAAAAAAMo/gIwj1y4saNQbR-rySCvhvgyiaQXzZx4bACKgB/s1600/2.PNG&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-rGl0_LS84gI/V0NLsO3GX1I/AAAAAAAAAMo/gIwj1y4saNQbR-rySCvhvgyiaQXzZx4bACKgB/s320/2.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://4.bp.blogspot.com/-TuPUzXMNDto/V0NLsD3GHGI/AAAAAAAAAMk/q4EFwWgJCRc-RGxhzp9cwM4oRkhGQ1VdwCKgB/s1600/3.PNG&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-TuPUzXMNDto/V0NLsD3GHGI/AAAAAAAAAMk/q4EFwWgJCRc-RGxhzp9cwM4oRkhGQ1VdwCKgB/s320/3.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://4.bp.blogspot.com/-Gxvs4Y-vsCU/V0NLsWrM1UI/AAAAAAAAAMs/-1vAk1KQxSYpNmaX3YpJ1dvbsrwwBgHowCKgB/s1600/4.PNG&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-Gxvs4Y-vsCU/V0NLsWrM1UI/AAAAAAAAAMs/-1vAk1KQxSYpNmaX3YpJ1dvbsrwwBgHowCKgB/s320/4.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://2.bp.blogspot.com/-_8B9I3VRqbA/V0NLs4A7rFI/AAAAAAAAAM0/Oly3W0ZRfEkKzcAjyuBtvRUOh4GKIuMlACKgB/s1600/5.PNG&#34;&gt;&lt;img src=&#34;https://2.bp.blogspot.com/-_8B9I3VRqbA/V0NLs4A7rFI/AAAAAAAAAM0/Oly3W0ZRfEkKzcAjyuBtvRUOh4GKIuMlACKgB/s320/5.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;https://4.bp.blogspot.com/-C1FR4UQhZDI/V0NLsySQukI/AAAAAAAAAMw/UhgZr-Dfj8IK6hqn1M1GbSJigXIhOlKFwCKgB/s1600/6.PNG&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-C1FR4UQhZDI/V0NLsySQukI/AAAAAAAAAMw/UhgZr-Dfj8IK6hqn1M1GbSJigXIhOlKFwCKgB/s320/6.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Kuruluma Geçmeden Son Ayarlar&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sanal makinemizi oluşturduk ama işimiz daha bitmedi. Sol taraftaki listeden oluşturduğumuz sanal makineye tıklıyor ve ayarlar diyoruz. “Sistem” menüsünün altındaki gösterdiğim “EFI etkinleştir” ayarını seçimini kaldırıyoruz. Mac’in kendine özgü bir EFI’si var. Bu adım önemli.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://1.bp.blogspot.com/-EMyWy9H3KFc/V0NLtOBTKeI/AAAAAAAAAM4/R5CJsmYJti4dMoVzET8qFRG_IClQdONfwCKgB/s1600/7.PNG&#34;&gt;&lt;img src=&#34;https://1.bp.blogspot.com/-EMyWy9H3KFc/V0NLtOBTKeI/AAAAAAAAAM4/R5CJsmYJti4dMoVzET8qFRG_IClQdONfwCKgB/s320/7.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Daha sonra “Depolama” menüsü altından gösterdiğim ayarları yaparak daha önce edindiğimiz “Yosemite-Zone.iso” dosyasını makinemize yerleştiriyoruz. Böylece makine başladığından doğrudan kuruluma geçecek.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://4.bp.blogspot.com/-teWvhYckI6E/V0NLta-KsDI/AAAAAAAAAM8/P3_pCHb4jT0BYL-tJsQPyYa5zC6geqNBwCKgB/s1600/8.PNG&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-teWvhYckI6E/V0NLta-KsDI/AAAAAAAAAM8/P3_pCHb4jT0BYL-tJsQPyYa5zC6geqNBwCKgB/s320/8.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. OS X Yosemite Kurulum&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cihazımızı çalıştırdıktan sonra kurulumu başlatmak için bir kez enter tuşuna basıyoruz. Sisteminizin gücüne göre 30 saniye ile 15 dakika arasında kurulum başlayacaktır. Dil ayarlarımızı yaptıktan ve kullanıcı sözleşmemizi kabul ettikten sonra sıra geldi diskimizi Mac için uygun hale getirmeye. Bundan sonraki kısımlar için kendi kullandığım kaynaktaki görsellerden yararlanacağım. Fotoğrafta görünen “Disk Aracı” nı açıyoruz. Soldaki kısmın en tepesinde bizim sanal makinemizin diski var. Onu seçip sağ bölmeden “Sil” menüsüne geliyoruz. Hiç bir değişiklik yapmadan (isterseniz isim verebilirsiniz) sağ alttan “Sil” butonuna basıp işlemimizi tamamlıyoruz. Korkmayın sizin verileriniz herhangi bir zarara uğramaz. Daha sonra kurulum için diskimizi seçip sağ alttan özelleştir diyoruz. Açılan pencereden “Drivers” altındaki Install Audio Drivers ve Install Network Drivers’ın; “Graphics” altındaki Graphics Enabler=YES’in seçimlerini kaldırıyoruz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://2.bp.blogspot.com/-p3HKq07YeJk/VLm4QSOd2iI/AAAAAAAAF-A/AFk2ZqKQKMc/s1600/Screenshot_13.png&#34;&gt;&lt;img src=&#34;https://2.bp.blogspot.com/-p3HKq07YeJk/VLm4QSOd2iI/AAAAAAAAF-A/AFk2ZqKQKMc/s1600/Screenshot_13.png#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://4.bp.blogspot.com/-r2LOwERyVLw/VLm4s6yxi2I/AAAAAAAAF-I/YMkuSmjFiZk/s1600/Screenshot_14.png&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-r2LOwERyVLw/VLm4s6yxi2I/AAAAAAAAF-I/YMkuSmjFiZk/s1600/Screenshot_14.png#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href=&#34;http://4.bp.blogspot.com/-eZtwTgThoDk/VLm5CIGaV5I/AAAAAAAAF-Q/xpI0NnPtPy4/s1600/Screenshot_17.png&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-eZtwTgThoDk/VLm5CIGaV5I/AAAAAAAAF-Q/xpI0NnPtPy4/s1600/Screenshot_17.png#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Önemli Not:&lt;/strong&gt; Bu seçimleri kaldırmamızın sebebi kurulumu sanal makine üzerine yapıyor olmamız. Normal Kurulum için bu adımı atlayabilirsiniz.&lt;/p&gt;
&lt;p&gt;Bu işlemleri tamamladıktan sonra geriye “Yükle”ye tıklayıp beklemek kalıyor.&lt;/p&gt;
&lt;p&gt;Bütün işlem bittikten sonra kalıbı çıkarmayı unutmayın. Bunun için sağ alt kısımdaki CD simgesine sağ tıklayıp yanında ✓ olan kalıba tıklamanız yeterli.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2 Dakika Kaldı” deyip ilerlemiyorsa:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bu benim de başıma gelen bir durum ve pek çok kişi de bu sorundan muzdarip. Neyse ki üstesinden gelmesi çok kolay.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diski seçtiğimiz ekranda “&lt;strong&gt;-s -v -x&lt;/strong&gt;” yazıyoruz. Biraz bekledikten sonra “bash” e ulaşmış olacaksınız.&lt;/li&gt;
&lt;li&gt;İlk olarak “&lt;strong&gt;/sbin/fsck -fy&lt;/strong&gt;” komutunu giriyoruz. İşlem bittikten sonra “&lt;strong&gt;/sbin/mount -uw&lt;/strong&gt; “.&lt;/li&gt;
&lt;li&gt;Bu da bittikten sonra konumumuzu şu kod ile değiştiriyoruz “&lt;strong&gt;cd /.OSInstallSandboxPath/Scripts/&lt;/strong&gt;” ve konumdaki içeriği görmek için “ls” komutunu çalıştırıyoruz.&lt;/li&gt;
&lt;li&gt;Listede “&lt;strong&gt;Hackintosh.Zone.Post-Script.xxxxxx&lt;/strong&gt;” dosyasını arıyoruz. Herkes için dosyanın son kısmı farklı olur.&lt;/li&gt;
&lt;li&gt;Sonra tekrar konum değiştirerek oraya giriyoruz “&lt;strong&gt;cd Hackintosh.Zone.Post-Script.sizeözelkısım&lt;/strong&gt;“.&lt;/li&gt;
&lt;li&gt;Sonra da “&lt;strong&gt;./postinstall&lt;/strong&gt;” komutunu çalıştırıyoruz. Bu işlemde bittikten sonra “&lt;strong&gt;exit&lt;/strong&gt;” yazarak çıkıyoruz. Kısa bir süre içinde giriş ekranını görmeniz lazım.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kaynak: &lt;a href=&#34;http://www.macbreaker.com/2015/01/virtualbox-yosemite-zone.html&#34;&gt;http://www.macbreaker.com/2015/01/virtualbox-yosemite-zone.html&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Gönüllü Çeviri Yapmak: Transifex</title>
       <link>http://www.tahirozdemir.com/2016/03/gonullu-ceviri-yapmak-transifex/</link>
       <pubDate>Sun, 27 Mar 2016 11:16:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/03/gonullu-ceviri-yapmak-transifex/</guid>
       <description>&lt;p&gt;Bir yazılımı kendi dilinde kullanmak, bir ayrıcalık değil temel haktır. Gelgelelim, bir oyunun ya da programın tüm diller için destek vermesini beklemek bir noktada hayalcilik olur. Bunun için gerekli maddi kaynağı sağlamak bir yana, çeviriyi yapacak insanı bulmak dahi zaman zaman imkansız hale gelebiliyor. Transifex ise gönüllü çevirmenleri ve yazılımlarına dil desteği eklemek isteyen insanları buluşturan bir platform olarak, bu noktadaki açığı kapatmak adına ortaya çıkıyor.&lt;/p&gt;
&lt;p&gt;Süreç oldukça basit aslında. Bir üyelik alıp kendine uygun bir projeye başvuruyorsun. Proje yöneticisi kabul ettiği takdirde dosyalara erişim hakkın oluyor. Çevirmek istediğin dosyayı seçtikten sonra açılan sayfada, uygun bir şekilde bölünmüş satırları görüyorsun. İstediğin satırı seçip ilgili kutucuğa çevirini yazdıktan sonra “kaydet” butonuna tıklaman yeterli. Transifex’in kendi arayüzü benim çok hoşuma gidiyor açıkçası. Fakat dilersen dosyayı indirip kendi metin düzenleme aracını kullanman da mümkün. Hepsi bu kadar. Hatırlatmakta fayda var, proje sahibinin seni reddetmesi gibi bir durum her zaman için ihtimaller dahilinde.&lt;/p&gt;
&lt;p&gt;Şu sıralar katılımın en geniş olduğu proje Fire Watch adlı oyunun çevirisi. Benim de aralarında bulunduğum, 95 kişilik kalabalık bir ekip tarafından çevirilen projeye alımlar hala devam ediyor diye biliyorum. Eğer bu işe bir yerden başlamak istiyorsan seni de bekleriz. Çeviri yaparak, yabancı dilini geliştirirken, kendi diline de yeni yapımlar kazandırabilirsin.&lt;/p&gt;
&lt;p&gt;Bağlantılar:&lt;br&gt;
Transifex Ana Sayfa: &lt;a href=&#34;http://www.transifex.com/&#34;&gt;www.transifex.com&lt;/a&gt;&lt;br&gt;
Fire Watch Proje Sayfası: &lt;a href=&#34;http://www.transifex.com/firewatch/firewatch-localization/&#34;&gt;www.transifex.com/firewatch/firewatch-localization/&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Stygian: Reign of The Old Ones</title>
       <link>http://www.tahirozdemir.com/2016/03/stygian-reign-of-the-old-ones/</link>
       <pubDate>Tue, 22 Mar 2016 18:23:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/03/stygian-reign-of-the-old-ones/</guid>
       <description>&lt;p&gt;&lt;a href=&#34;https://4.bp.blogspot.com/-yQdV00LIA28/VvF4g5Y_SaI/AAAAAAAAAHE/WHTxChdP01sfyexVL0qgpGW7l-MjTWQYg/s1600/yaz%25C4%25B1%2Bkapak.jpg&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-yQdV00LIA28/VvF4g5Y_SaI/AAAAAAAAAHE/WHTxChdP01sfyexVL0qgpGW7l-MjTWQYg/s320/yaz%25C4%25B1%2Bkapak.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Her sene onlarca yeni oyun piyasaya çıkmakta ve ben sadece çok az bir kısmı için heyecan duymaktayım. Hele ki konu bağımsız yapımlar olunca, beklemeye değecek daha da az oyun kalıyor. Hadi biraz daha zorlayım ve bağımsız yerli yapımlara indireyim çıtayı. No:70 ve Mount &amp;amp; Blade: Bannerlord bu noktada en çok beklediğim yapımlar. Bannerlord için son yayınlanan oynanış görüntülerinden sonra sabırsızlığım biraz daha arttı. Şayet izlemediysen en kısa zamanda izlemeni şiddetle tavsiye ederim sevgili okur. Dur yahu nereye gidiyorsun, bari yazıyı bitirseydim. Hah devam edeyim o zaman…&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://3.bp.blogspot.com/-IJh9sYf0Sfc/VvF4vy8yROI/AAAAAAAAAHM/p68-d3cmixA4HuoxIsYyfjQ9GRwgjkTDw/s1600/Stygian.jpg&#34;&gt;&lt;img src=&#34;https://3.bp.blogspot.com/-IJh9sYf0Sfc/VvF4vy8yROI/AAAAAAAAAHM/p68-d3cmixA4HuoxIsYyfjQ9GRwgjkTDw/s320/Stygian.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;İşte böyle bir anda çıkageldi şu oyun karşıma. El çizimi grafikler, sıra tabanlı stratejik dövüş sistemi, rol yapma ögeleri derken bir anda kendi çıtasını aşıp en çok beklediğim oyunlar arasında yerini almayı başardı. Kısaca bahsetmek gerekirse, Stygian, H.P. Lovecraft’ın Cthulu mitosunda etkilenmiş hatta etkilenmekle kalmayıp tüm hikayeyi, karakterleri ve mekanikleri bu mitos üzerine kurmuş yerli bir oyun. Dürüst olayım, bu mitos ile çok yakın bir alakam yok. Tecrübe ettiğim tek örnek Call of Cthulu adlı güzide oyundur. Karanlık ve gergin atmosferi ile sizi sürekli olarak diken üstünde tutan bu yapım, doğal olarak Cthulu mitosuna olan ilgimin de artmasına sebep olmuştu. Mamafih, tüketecek başka kaynağım yoktu. Elbette okunacak kitaplar vardı ama zaten sırada bekleyen onlarca kitabım varken bu mitosu araya sıkıştırmaya çalışmak, hem Lovecraft’a hem de benim kitaplarıma ayıp olurdu. Şimdi ise böyle bir oyunun geliştirilmekte olduğunu duyunca, ne kadar sevindiğimi ve heyecanlandığımı anlamışsınızdır. Sitesindeki özellikler kısmını okurken cidden ağzımın suyu akıyor. Burada üzerinde durmak istediğim bir özellik var: akıl sağlığının oyuna etkisi. Her karakterin kendi kişiliğine özgü bir akıl sağlığı sistemi var. Bir rasyonalist, mitos yaratıkları üzerinde araştırma yaparak akıl sağlığı kazanabiliyor iken; yaratıcıya inanan kimseler, kayıp bir ruhu Tanrı’nın yoluna sevk edince akıl sağlığı kazanabilmekte. Ruhsal durumumuzun ise doğrudan doğruya konuşma seçeneklerine bir etkisi olacağı söyleniyor. Akıl sağlığımız bize engel olabileceği gibi bize destekte olabilicekmiş. Yapımcı “Bazen çılgın bir dünyada, çılgın biri olmak işe yarar” demekte. Diğer bir dikkatimi çeken nokta ise bu evrende büyü yapmanın sandığımız kadar eğlenceli olmadığı. Çoğu zaman feda etmemiz gereken şeyler olacak. Akıl sağlığımız, canımız ve hatta ruhumuz. Oyun boyunca çaban dünyayı kurtarmak olamayacak, o savaş çoktan kaybedildi. Ölüme mahkum bu dünyada, ya kurtuluş için kendi amaçlarını takip edeceksin ya da intikam için mücadele edeceksin. Hala oyuna karşı bir merakın yok ise şu görsele bir bakıver:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://1.bp.blogspot.com/-JH_L9Ss-hcg/VvF7bjeXBMI/AAAAAAAAAHc/NJFOqKvDBZYjUpNCr3_-HYQNgwGgNGrdw/s1600/ourbeautifuldoom.jpg&#34;&gt;&lt;img src=&#34;https://1.bp.blogspot.com/-JH_L9Ss-hcg/VvF7bjeXBMI/AAAAAAAAAHc/NJFOqKvDBZYjUpNCr3_-HYQNgwGgNGrdw/s320/ourbeautifuldoom.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ekipten de bahsedip, oyunu beklemeye devam edeceğim köşeme çekileyim bari. Oyunun kendi sitesinden birebir çeviri yaparsak, yapımcılar kendilerini şöyle tanımlıyor “Lovercraft’ın eserlerini okurken Planescape: Torment, ilk Fallout’lar ve Heroes of Might and Magic oynayarak büyümüş bir ekip”. Cultic Games, İstanbul’da bulunan stüdyoda, bağımsız bir oyun için kalabalık sayılabilecek bir gurup çalışkan insan. Umarım emekleri boşa çıkmaz ve hak ettikleri ilgiyi görebilirler.&lt;/p&gt;
&lt;p&gt;Bağlantılar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geliştirici Sitesi: &lt;a href=&#34;http://www.stygianthegame.com/&#34;&gt;http://www.stygianthegame.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Facebook: &lt;a href=&#34;https://www.facebook.com/stygianthegame&#34;&gt;https://www.facebook.com/stygianthegame&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Twitter: &lt;a href=&#34;https://twitter.com/stygianthegame&#34;&gt;https://twitter.com/stygianthegame&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
     </item>
   
     <item>
       <title>Sıralama ve Arama Algoritmaları</title>
       <link>http://www.tahirozdemir.com/2016/03/siralama-ve-arama-algoritmalari/</link>
       <pubDate>Sat, 19 Mar 2016 22:22:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/03/siralama-ve-arama-algoritmalari/</guid>
       <description>&lt;p&gt;Bu haftaki ödevim için epeyce uğraştıktan sonra dedim ki blogda da paylaşayım, belki birinin işine yarar. Programın amacı “unique” olarak rastgele elemanlardan oluşmuş bir diziye 3 farklı sıralama (Buble, Insertion, Selection) ve arama (Linear, Binary, Interpolation) algoritmasi uygulayarak hangisinin daha hızlı sonuç verdiğini görmek.&lt;/p&gt;
&lt;p&gt;Ekran Görüntüleri:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://2.bp.blogspot.com/-Mjv6cr-x6y4/Vu3Qwkb52HI/AAAAAAAAAGw/p49S6Co7OmEAqHCI0A3hm79BN6ZM_uIGA/s1600/lab21.PNG&#34;&gt;&lt;img src=&#34;https://2.bp.blogspot.com/-Mjv6cr-x6y4/Vu3Qwkb52HI/AAAAAAAAAGw/p49S6Co7OmEAqHCI0A3hm79BN6ZM_uIGA/s320/lab21.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://4.bp.blogspot.com/-S8qXo2lM4h0/Vu3QwvOUJ7I/AAAAAAAAAG0/4CZMT6rLJi846hM_apbGM_sUrTSp0zu4g/s1600/lab22.PNG&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-S8qXo2lM4h0/Vu3QwvOUJ7I/AAAAAAAAAG0/4CZMT6rLJi846hM_apbGM_sUrTSp0zu4g/s320/lab22.PNG#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kaynak Kod (C++): &lt;a href=&#34;https://drive.google.com/file/d/0B01T_59j7QNeekdJX3lCTFFzRE0/view?usp=sharing&#34;&gt;https://drive.google.com/file/d/0B01T_59j7QNeekdJX3lCTFFzRE0/view?usp=sharing&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>C# Blackjack</title>
       <link>http://www.tahirozdemir.com/2016/01/c-blackjack/</link>
       <pubDate>Sun, 10 Jan 2016 11:13:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2016/01/c-blackjack/</guid>
       <description>&lt;p&gt;Programlamaya giriş ödevi için C# ile yazmış olduğum Blackjack oyununun proje dosyası.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://2.bp.blogspot.com/-dkW0VJmqXZA/VpI76Bd-WtI/AAAAAAAAAFw/bNki-CozYFI/s1600/Ro6B7R.png&#34;&gt;&lt;img src=&#34;https://2.bp.blogspot.com/-dkW0VJmqXZA/VpI76Bd-WtI/AAAAAAAAAFw/bNki-CozYFI/s320/Ro6B7R.png#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://2.bp.blogspot.com/-Py2QVOTn52w/VpI75hsR3FI/AAAAAAAAAFs/s1p5clkaop8/s1600/pBY9Za.png&#34;&gt;&lt;img src=&#34;https://2.bp.blogspot.com/-Py2QVOTn52w/VpI75hsR3FI/AAAAAAAAAFs/s1p5clkaop8/s320/pBY9Za.png#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;İçerdiği algoritmalar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bir dizideki elemanları (kartları) karıştırmak.&lt;/li&gt;
&lt;li&gt;MessageBox üzerinden alınan cevaba göre işlem yapmak.&lt;/li&gt;
&lt;li&gt;Resource’a eklenen fotoğrafları çağırmak.&lt;/li&gt;
&lt;li&gt;Bir pencereden diğer penceredeki objeyi manipüle etmek.&lt;br&gt;
… ve daha fazlası.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;https://drive.google.com/file/d/0B01T_59j7QNeYUdWaS1ZSVNQWU0/view?usp=sharing&#34;&gt;Proje dosyasını indirmek için buraya tıklayınız.&lt;/a&gt;&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>VLC Player ile Twitch Yayınlarını İzlemek</title>
       <link>http://www.tahirozdemir.com/2014/09/vlc-player-ile-twitch-yayinlarini-izlemek/</link>
       <pubDate>Sun, 14 Sep 2014 21:48:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2014/09/vlc-player-ile-twitch-yayinlarini-izlemek/</guid>
       <description>&lt;p&gt;&lt;a href=&#34;http://2.bp.blogspot.com/-vyzriaxCA1k/VBYMZxuq6VI/AAAAAAAAADQ/lUoTwoxGhnA/s1600/Ads%C4%B1z2.jpg&#34;&gt;&lt;img src=&#34;https://2.bp.blogspot.com/-vyzriaxCA1k/VBYMZxuq6VI/AAAAAAAAADQ/lUoTwoxGhnA/s1600/Ads%C4%B1z2.jpg&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Selam, umarım keyfiniz yerindedir. Başlıkta da gördüğünüz gibi bu yazıda Twitch yayınlarını VLC Player üzerinden nasıl izleyebileceğinizi anlatacağım.&lt;/p&gt;
&lt;p&gt;İsterseniz öncelikle neden Twitch’in kendi oynatıcısı yerine VLC Player’ı tercih ettiğimi anlatıyım. Ben oldukça eski bir notebooka sahibim. Flash performansı zaten düşük olan bu notebookta, Twtich gibi ağır bir oynatıcıya sahip bir sistem üzerinden yayınları izlemek tam bir işkence haline geliyor. Zaten izleyeceğim pek çok videoyu önceden indiriyorum ki bir sorun yaşamayım. Eğer siz de benimki kadar eski bir bilgisayar sahibiyseniz, kesinlikle yayınları VLC Player üzerinden izlemenizi öneririm. Gelelim ikinci sebebe. Hepimizin malumu üzere Twitch zaten sorunlu bir platformdu. Amazon’un satın almasıyla birlikte bu sorunlar daha da arttı. Bu sorunları bir nebze de olsa bertaraf etmek için yine bu yönteme başvurabilirsiniz. Sebeplerimizden bahsettiğimize göre bu işi nasıl yapacağımıza geçelim.&lt;/p&gt;
&lt;p&gt;Öncelikle tabiki VLC Player’ı edinmeliyiz: &lt;a href=&#34;http://www.videolan.org/vlc/&#34;&gt;www.videolan.org/vlc/&lt;/a&gt;&lt;br&gt;
Ardından ihtiyacımız olan eklentiyi (livestreamer.exe): &lt;a href=&#34;http://github.com/chrippa/livestreamer/releases&#34;&gt;github.com/chrippa/livestreamer/releases&lt;/a&gt; (Yeşil butona tıklayarak 🙂&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://4.bp.blogspot.com/-FINOeXSfuvg/VBYDbUyEgLI/AAAAAAAAACg/v-tz_551-To/s1600/Ads%C4%B1z.jpg&#34;&gt;&lt;img src=&#34;https://4.bp.blogspot.com/-FINOeXSfuvg/VBYDbUyEgLI/AAAAAAAAACg/v-tz_551-To/s1600/Ads%C4%B1z.jpg&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Her iki programı da indirip kurduktan sonra şimdi işin en cafcaflı kısmına geliyoruz. Livestreamer.exe kurulduktan sonra ilgili yerdeki “tik”i kaldırmadıysanız karşınıza bir notdefteri ve “#” ile başlayan satırlar çıkacak. Eğer “tik”i kaldırdıysanız dosyaya ulaşmak için Windows 7’de başlat menüsünün arama kısmına %appdata% yazıp entera basıyoruz. Açılan klasörde “livestreamer” klasörünü buluyoruz ve onun içindeki “livestreamerrc” adlı dosyayı not defteri ile açıyoruz. Şimdi bu notdefteri içinde… ehm… ııı. yok böyle olmayacak resim atıyorum…&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://2.bp.blogspot.com/-tOMWjLBQYPQ/VBYF0Z4Q5gI/AAAAAAAAACs/YC3U8oa_oHY/s1600/Ads%C4%B1z3.jpg&#34;&gt;&lt;img src=&#34;https://2.bp.blogspot.com/-tOMWjLBQYPQ/VBYF0Z4Q5gI/AAAAAAAAACs/YC3U8oa_oHY/s1600/Ads%C4%B1z3.jpg&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ok ile göstermiş olduğum satırın başındaki #’i kaldırıyoruz. Tabi 32 bit işletim sistemi kullanıyorsanız ve yükleme sırasında değişiklik yapmadıysanız. Eğer işletim sisteminiz 64 bit ise bir üstteki satırın başındaki # i kaldırın. Yok derseniz ben farklı bir yere yükledim, tırnaklar arasındaki yolu yüklediğiniz yol ile değiştirin ve kaydedin.&lt;/p&gt;
&lt;p&gt;Gelelim yayınları nasıl açacağımıza. Bunun için BaşlatTuşu + R kombinasyonu ile “çalıştırı” açıyoruz (başlat menüsünden de “çalıştır”ı açabilirsiniz). Ardından satıra şunu yazıyoruz: livestreamer.exe twitch.com/yayıncıadı kalite. Örneğin:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://1.bp.blogspot.com/-EvhXeXYlMm4/VBYIhaXQrCI/AAAAAAAAAC4/DeD5vUn_DR8/s1600/Ads%C4%B1z4.jpg&#34;&gt;&lt;img src=&#34;https://1.bp.blogspot.com/-EvhXeXYlMm4/VBYIhaXQrCI/AAAAAAAAAC4/DeD5vUn_DR8/s1600/Ads%C4%B1z4.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;“Kalite” kısmını biraz açmam gerekiyor. Bu kısma “audio” yazarsanız yayının sadece sesini dinleyebilirsiniz. “Bunu neden yapıyım?” sorusu aklınıza geliyorsa şöyle bir senaryo yazabiliriz. Diyelim ki AKK’yi doldurdunuz ve internetiniz çok yavaşladı. Bu da yetmezmiş gibi interneti komşularınızla paylaşıyorsunuz. Yayında dönen geyiği de merak ediyorsunuz. Hemen kaliteyi audio olarak ayarlayıp en azından muhabbeti dinleyebiliyoruz. Ben mi? Yok canım ben fiber internet kullanıyorum…&lt;/p&gt;
&lt;h2 id=&#34;bunların-dışında-source-kalitesi-için-best-mobil-kalite-için-worst-yazıyoruz-diğer-kalite-değerleri-için-herhangi-bir-değişiklik-yok&#34;&gt;Bunların dışında “source” kalitesi için “best”, mobil kalite için “worst” yazıyoruz. Diğer kalite değerleri için herhangi bir değişiklik yok.&lt;/h2&gt;
&lt;p&gt;Bundan sonraki kısımda ek olarak yayınlar için kısayol oluşturmayı anlatacağım. Bunun için öncelikle not defterini açıyoruz ve içine şunu kopyala-yapıştır yapıyoruz:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@echo

cd C:Program FilesLivestreamer

livestreamer.exe www.twitch.tv/yayıncıadı kalite

@echo off
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Daha sonra Dosya-&amp;gt; Farklı Kaydet dedikten sonra kayıt türünü “tüm dosyalar” olarak seçip isminin sonuna “.bat” ekliyoruz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://1.bp.blogspot.com/-40My11fCjbI/VBYMZ_cC6qI/AAAAAAAAADE/2Hdc8U5vuvY/s1600/Ads%C4%B1z5.jpg&#34;&gt;&lt;img src=&#34;https://1.bp.blogspot.com/-40My11fCjbI/VBYMZ_cC6qI/AAAAAAAAADE/2Hdc8U5vuvY/s1600/Ads%C4%B1z5.jpg#mid&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Burada önemli nokta ikinci satırdaki yolun bizim livestreamer’ı yüklediğimiz yol ile aynı olması. 64 bit işletim sistemi ve yükleme sırasında seçilen farklı yükleme yerleri hakkında söylediklerimi hatırlıyorsunuzdur…&lt;/p&gt;
</description>
     </item>
   
     <item>
       <title>Elementary OS: Hız ve Zerafet Birarada</title>
       <link>http://www.tahirozdemir.com/2014/07/elementary-os-hiz-ve-zerafet-birarada/</link>
       <pubDate>Wed, 30 Jul 2014 12:47:00 +0000</pubDate>
       
       <guid>http://www.tahirozdemir.com/2014/07/elementary-os-hiz-ve-zerafet-birarada/</guid>
       <description>&lt;p&gt;Yanlış hatırlamıyorsam şayet ilk kullandığım Linux dağıtımı Ubuntu idi. Pc.net promosyon olarak dağıtmıştı. O zamandan beri (yaklaşık 6 sene olmuş) pek çok farklı Linux deneyimim oldu. Çok uzun bir zaman Pardus kullandım ama takip edenler bilir 2-3 sene öncesinden başlayan ayrışma süreciyle beraber bende Pardus’u ve onunla beraber Linux’u bıraktım. Ta ki geçen haftaya kadar…&lt;/p&gt;
&lt;p&gt;Elime oldukça eski bir laptop geçti. Performans açısından hayli zayıftı ve beraberinde yüklü gelen Windows 7 64bit işletim sistemi, makineyi çok zorluyordu. Dolayısıyla bana tekrar Linux’un yolları göründü. İşte bu sırada karşıma çıktı Elementary OS. Yazının bundan sonraki kısmı bu dağıtımla geçirdiğim bir haftalık macerayı anlatacak.&lt;/p&gt;
&lt;p&gt;Öncelikle şunu söyleyim, Elementary OS çok yeni bir dağıtım. Beta sürecinden çıkalı çok uzun bir zaman olmadı. Dolayısıyla pek çok eksiği gediği mevcut. İndirecek arkadaşlar bunu göze alsın. Bende öyle çok ahım şahım sorunlar çıkarmadı sağ olsun ama belirtmekte yarar var. İndirmek demişken sourgeforge.com adresinde hem 32 bit hem de 64 bit’lik sürümler mevcut. İsteyen arkadaşlar ilgili adresten edinebilirler. Ne diyorduk… Hah daha çok yeni diyorduk… Bunun bizim için en büyük etkisi Türkçe desteği üzerinde olmuş. Daha ilk anda gözünüze çarpan eksiklikler mevcut. Bir de bu eksiklerin en temel komutlarda (kopyala-yapıştır vb.) dahi olması biraz sıkıntı yaratabilir. Ancak genel olarak Türkçe kaynak sıkıntısı da olduğu için sorun yaşadığınız zaman İngilizce kaynaklara muhtaçsınız. Henüz yeni bir sistem olduğu için bu konuda fazla kızmıyor ama hafiften de olsa kulağını çekmeyi ihmal etmiyoruz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://lh5.googleusercontent.com/-EIcjXBNOq20/U9jpQIG4jeI/AAAAAAAAABk/cKlyrTmmous/s640/blogger-image-700745280.jpg&#34;&gt;&lt;img src=&#34;https://lh5.googleusercontent.com/-EIcjXBNOq20/U9jpQIG4jeI/AAAAAAAAABk/cKlyrTmmous/s320/blogger-image-700745280.jpg&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gelelim en büyük artısına. Bu zamana kadar çok farklı dağıtım kullandım ama bunun kadar hızlı ve hafif olanını ilk defa görüyorum. Daha ilk kurduğunuz andan fark ettiriyor kendini. Benim o eski laptopu bile adeta bir küheylana çevirdi. İlk kurulumda az sayıda program barındırması elbette bunda bir etmen. Beraberinde her bir iş için sadece bir tane program geliyor. Herkesin kullanmadığı programlar da çıkarılınca, oldukça sade bir içerik karşılıyor bizi. Bu kadar az programla gelince kurulumdan sonra ilk ziyaret edeceğimiz yer “uygulama merkezi” oluyor haliyle. Hemen bir video oynatıcı ve internet tarayıcı indirmenizi öneririm. Bu sayede hem kodek problemini ortadan kaldırmış hem de beraberinde gelen o tuhaf tarayıcıdan kurtulmuş olursunuz ( nedense bir türlü sevemedim dahili tarayıcıyı ).&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://lh6.googleusercontent.com/-cWiF9eTW6Rs/U9jpRtRrjkI/AAAAAAAAABs/wB1UYo5Qifw/s640/blogger-image--150666874.jpg&#34;&gt;&lt;img src=&#34;https://lh6.googleusercontent.com/-cWiF9eTW6Rs/U9jpRtRrjkI/AAAAAAAAABs/wB1UYo5Qifw/s320/blogger-image--150666874.jpg&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Elementary OS, dahili “rıhtım” ile birlikte Mac OS benzeri bir görünüm yakalamış. Sadece masaüstünde değil, dosya yöneticisinde de aynı durumu görmek mümkün. Oldukça sade tasarlanmış arayüzü ile benim beğenimi kazanmayı başardı. Bu konuda daha fazla söylenecek bir şey olduğunu düşünmüyorum. Mac OS ile gösterdiği benzerlik ve sade tasarım mükemmel olmuş.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://lh5.googleusercontent.com/-MVv_AxaxJfA/U9jpOkHmVVI/AAAAAAAAABc/VjsRPbOfqnA/s640/blogger-image-1050066149.jpg&#34;&gt;&lt;img src=&#34;https://lh5.googleusercontent.com/-MVv_AxaxJfA/U9jpOkHmVVI/AAAAAAAAABc/VjsRPbOfqnA/s320/blogger-image-1050066149.jpg&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bir işletim sistemi hakkında daha fazla ne denir bilmiyorum. Eğer merak ettiğiniz bir nokta var ise yorumlardan sorabilirsiniz. Son olarak geliştiricilerin şu anda yeni bir sürüm üzerinde çalıştığını belirterek yazıya noktayı koyuyorum.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bir Bakışta&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Artıkar: Şık tasarımı. Oldukça hafif. Gereksiz programlar yok…&lt;/p&gt;
&lt;p&gt;Eksiker: …ama gerekli programlar da yok. Türkçe çevirisi eksik. Çok yeni bir dağıtım.&lt;/p&gt;
</description>
     </item>
   
 </channel>
</rss>
