<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://sonsuzus.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sonsuzus.github.io/" rel="alternate" type="text/html" /><updated>2026-07-11T16:35:11+00:00</updated><id>https://sonsuzus.github.io/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Go’nun Eşzamanlılık Mimarisi: Goroutine ile Hafif ve Hızlı Servisler</title><link href="https://sonsuzus.github.io/posts/gonun-eszamanlilik-mimarisi-goroutine-ile-hafif-ve-hizli-servisler/" rel="alternate" type="text/html" title="Go’nun Eşzamanlılık Mimarisi: Goroutine ile Hafif ve Hızlı Servisler" /><published>2026-07-11T00:00:00+00:00</published><updated>2026-07-11T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/gonun-eszamanlilik-mimarisi-goroutine-ile-hafif-ve-hizli-servisler</id><content type="html" xml:base="https://sonsuzus.github.io/posts/gonun-eszamanlilik-mimarisi-goroutine-ile-hafif-ve-hizli-servisler/"><![CDATA[<p>Go’da eşzamanlılık, “aynı anda çok iş yapıyormuş gibi” görünen kod yazmaktan daha fazlasıdır; dilin tasarım felsefesine gömülü bir üretkenlik süper gücüdür. Binlerce arka plan görevini, ağ isteğini, kuyruk işini veya zamanlayıcıyı klasik thread maliyetlerine boğulmadan yönetmek istiyorsanız, goroutine’ler tam olarak bu sahneye davul zurna ile girer.
``</p>

<p>Go’nun concurrency yaklaşımını anlamanın ilk adımı şu ayrımı netleştirmektir: <strong>Concurrency</strong> aynı zaman aralığında birden fazla işle ilerleyebilme yeteneğidir; <strong>parallelism</strong> ise gerçekten aynı anda, farklı CPU çekirdeklerinde çalışmaktır. Yani concurrency bir tasarım modeli, parallelism ise donanımın sunduğu fiziksel imkândır.</p>

<p>Basitçe ifade edersek:</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Anlamı</th>
      <th>Go’daki karşılığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Concurrency</td>
      <td>İşleri bağımsız parçalara bölmek</td>
      <td>Goroutine, channel, select</td>
    </tr>
    <tr>
      <td>Parallelism</td>
      <td>İşleri aynı anda CPU’da yürütmek</td>
      <td>Çok çekirdek + scheduler</td>
    </tr>
    <tr>
      <td>Thread</td>
      <td>İşletim sistemi düzeyinde ağır yürütme birimi</td>
      <td>OS thread</td>
    </tr>
    <tr>
      <td>Goroutine</td>
      <td>Go runtime tarafından yönetilen hafif görev</td>
      <td><code class="language-plaintext highlighter-rouge">go func()</code></td>
    </tr>
  </tbody>
</table>

<p>Go runtime içinde ünlü <strong>M:P:G modeli</strong> çalışır. Burada <code class="language-plaintext highlighter-rouge">G</code> goroutine’i, <code class="language-plaintext highlighter-rouge">M</code> işletim sistemi thread’ini, <code class="language-plaintext highlighter-rouge">P</code> ise işlemci bağlamını temsil eder. Kabaca ilişkiyi şöyle düşünebiliriz: $G \rightarrow P \rightarrow M$. Eğer $N$ adet goroutine’iniz ve $P$ adet işlemci bağlamınız varsa, Go scheduler bu goroutine’leri uygun thread’lere dağıtarak verimli çalıştırır. Bu yüzden binlerce goroutine açmak çoğu senaryoda binlerce OS thread açmaktan çok daha ucuzdur.</p>

<p>Goroutine başlatmak şaşırtıcı derecede kolaydır:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="p">(</span>
    <span class="s">"fmt"</span>
    <span class="s">"time"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">sendEmail</span><span class="p">(</span><span class="n">user</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">time</span><span class="o">.</span><span class="n">Sleep</span><span class="p">(</span><span class="m">500</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Millisecond</span><span class="p">)</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"E-posta gönderildi:"</span><span class="p">,</span> <span class="n">user</span><span class="p">)</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">users</span> <span class="o">:=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">"ada"</span><span class="p">,</span> <span class="s">"linus"</span><span class="p">,</span> <span class="s">"grace"</span><span class="p">}</span>

    <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">user</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">users</span> <span class="p">{</span>
        <span class="k">go</span> <span class="n">sendEmail</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="n">time</span><span class="o">.</span><span class="n">Sleep</span><span class="p">(</span><span class="m">1</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Second</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu örnekte her kullanıcı için ayrı bir goroutine başlatılır. <code class="language-plaintext highlighter-rouge">sendEmail</code> fonksiyonu bloklansa bile ana akış diğer işleri başlatmaya devam eder. Ancak gerçek projelerde <code class="language-plaintext highlighter-rouge">time.Sleep</code> ile beklemek pek yakışıklı değildir; bu, restoranda garsona “yemekler herhalde gelir” deyip göz kararı beklemek gibidir.</p>

<p>Daha kontrollü bir yapı için <code class="language-plaintext highlighter-rouge">channel</code> kullanırız. Channel’lar goroutine’ler arasında güvenli veri aktarımı sağlar. Go’nun meşhur sözü burada devreye girer: <strong>Belleği paylaşarak iletişim kurma; iletişim kurarak belleği paylaş.</strong></p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="p">(</span>
    <span class="s">"context"</span>
    <span class="s">"fmt"</span>
    <span class="s">"time"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">worker</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">jobs</span> <span class="o">&lt;-</span><span class="k">chan</span> <span class="kt">string</span><span class="p">,</span> <span class="n">results</span> <span class="k">chan</span><span class="o">&lt;-</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">{</span>
        <span class="k">select</span> <span class="p">{</span>
        <span class="k">case</span> <span class="o">&lt;-</span><span class="n">ctx</span><span class="o">.</span><span class="n">Done</span><span class="p">()</span><span class="o">:</span>
            <span class="k">return</span>
        <span class="k">case</span> <span class="n">job</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="o">&lt;-</span><span class="n">jobs</span><span class="o">:</span>
            <span class="k">if</span> <span class="o">!</span><span class="n">ok</span> <span class="p">{</span>
                <span class="k">return</span>
            <span class="p">}</span>
            <span class="n">time</span><span class="o">.</span><span class="n">Sleep</span><span class="p">(</span><span class="m">300</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Millisecond</span><span class="p">)</span>
            <span class="n">results</span> <span class="o">&lt;-</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"İş tamamlandı: %s"</span><span class="p">,</span> <span class="n">job</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">ctx</span><span class="p">,</span> <span class="n">cancel</span> <span class="o">:=</span> <span class="n">context</span><span class="o">.</span><span class="n">WithTimeout</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">Background</span><span class="p">(),</span> <span class="m">2</span><span class="o">*</span><span class="n">time</span><span class="o">.</span><span class="n">Second</span><span class="p">)</span>
    <span class="k">defer</span> <span class="n">cancel</span><span class="p">()</span>

    <span class="n">jobs</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="kt">string</span><span class="p">)</span>
    <span class="n">results</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="kt">string</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">i</span> <span class="o">:=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="m">3</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span> <span class="p">{</span>
        <span class="k">go</span> <span class="n">worker</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">jobs</span><span class="p">,</span> <span class="n">results</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="k">go</span> <span class="k">func</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">defer</span> <span class="nb">close</span><span class="p">(</span><span class="n">jobs</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">i</span> <span class="o">:=</span> <span class="m">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="m">5</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span> <span class="p">{</span>
            <span class="n">jobs</span> <span class="o">&lt;-</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"görev-%d"</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">}()</span>

    <span class="k">for</span> <span class="n">i</span> <span class="o">:=</span> <span class="m">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="m">5</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span> <span class="p">{</span>
        <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="o">&lt;-</span><span class="n">results</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada üç worker goroutine’i aynı <code class="language-plaintext highlighter-rouge">jobs</code> kanalından görev alır ve sonuçları <code class="language-plaintext highlighter-rouge">results</code> kanalına gönderir. <code class="language-plaintext highlighter-rouge">context</code> ise servis kapanışı, timeout veya iptal sinyalleri için temiz bir kontrol mekanizması sunar. Bu yapı, e-posta gönderimi, görsel işleme, log toplama veya webhook tüketimi gibi arka plan servislerinde sıkça kullanılır.</p>

<p>Performans açısından bakarsak, goroutine’lerin başlangıç stack’i küçüktür ve ihtiyaç oldukça büyür. Klasik thread’lerde stack maliyeti megabaytlarla ifade edilebilirken, goroutine’lerde başlangıç maliyeti kilobayt seviyesindedir. Teorik olarak toplam bellek tüketimini şöyle düşünebiliriz: $ToplamBellek \approx n \times s$. Burada $n$ görev sayısı, $s$ ise görev başına stack maliyetidir. $s$ küçüldükçe aynı makinede daha fazla eşzamanlı iş yönetebilirsiniz.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tek thread</td>
      <td>Basit akış</td>
      <td>Bloklanınca her şey yavaşlar</td>
    </tr>
    <tr>
      <td>OS thread havuzu</td>
      <td>Paralel çalışma</td>
      <td>Daha yüksek bellek maliyeti</td>
    </tr>
    <tr>
      <td>Goroutine</td>
      <td>Hafif, hızlı, okunabilir</td>
      <td>Yanlış channel kullanımı deadlock doğurabilir</td>
    </tr>
  </tbody>
</table>

<p>Tabii goroutine açmak bedava değildir; sadece ucuzdur. Sonsuz sayıda goroutine başlatmak, mutfağa sınırsız sipariş yollayıp aşçıdan mucize beklemek gibidir. Bu nedenle worker pool, rate limit, context cancellation ve buffer’lı channel gibi tekniklerle sisteminize sınır koymalısınız.</p>

<p>Sonuç olarak Go’nun concurrency mimarisi, basit sözdizimiyle güçlü bir runtime mühendisliğini birleştirir. Goroutine’ler sayesinde arka plan servisleri hem okunabilir hem de yüksek verimli olabilir. Eğer kuyruk tüketen, API çağrılarını paralelleştiren veya binlerce bağlantıyı yöneten bir servis yazıyorsanız, Go size “thread açalım mı?” diye sormaz; zarifçe <code class="language-plaintext highlighter-rouge">go</code> anahtar kelimesini uzatır ve “hadi işi bölelim” der.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="golang" /><category term="concurrency" /><category term="goroutine" /><category term="backend" /><summary type="html"><![CDATA[Go’da eşzamanlılık, “aynı anda çok iş yapıyormuş gibi” görünen kod yazmaktan daha fazlasıdır; dilin tasarım felsefesine gömülü bir üretkenlik süper gücüdür. Binlerce arka plan görevini, ağ isteğini, kuyruk işini veya zamanlayıcıyı klasik thread maliyetlerine boğulmadan yönetmek istiyorsanız, goroutine’ler tam olarak bu sahneye davul zurna ile girer.]]></summary></entry><entry><title type="html">IDE’lerde Çoklu Dil Mimarisi: Tek Çalışma Alanında Backend, Betik ve Önyüz Senfonisi</title><link href="https://sonsuzus.github.io/posts/idelerde-coklu-dil-mimarisi-tek-calisma-alaninda-backend-betik-ve-onyuz-senfonisi/" rel="alternate" type="text/html" title="IDE’lerde Çoklu Dil Mimarisi: Tek Çalışma Alanında Backend, Betik ve Önyüz Senfonisi" /><published>2026-07-11T00:00:00+00:00</published><updated>2026-07-11T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/idelerde-coklu-dil-mimarisi-tek-calisma-alaninda-backend-betik-ve-onyuz-senfonisi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/idelerde-coklu-dil-mimarisi-tek-calisma-alaninda-backend-betik-ve-onyuz-senfonisi/"><![CDATA[<p>Modern bir IDE artık sadece renkli parantez gösteren bir metin editörü değil; adeta küçük bir yazılım işletim sistemi. Aynı çalışma alanında TypeScript ile önyüz geliştirirken, Python betikleriyle otomasyon çalıştırabilir, Go ya da Java servislerini debug edebilir ve tüm bu parçaları tek bir proje akışı gibi yönetebilirsiniz. Çoklu dil mimarisi tam da burada devreye girer: IDE, farklı dillerin araçlarını ortak bir orkestrada buluşturur.
``
Bu mimarinin kalbinde şu fikir vardır: IDE her dili doğrudan kendi içinde yeniden icat etmez; bunun yerine dil sunucuları, hata ayıklama adaptörleri, görev çalıştırıcıları ve eklentilerle konuşur. Yani editör kısmı kullanıcı arayüzüdür, zeka ise çoğunlukla arka plandaki servislerden gelir. Bu ayrım sayesinde aynı ekranda React bileşeni yazarken, arka planda veritabanı migrasyonu hazırlayan bir betik de çalışabilir.</p>

<p>Teorik olarak sistemi şu denklemle düşünebiliriz: $IDE = Editör + LSP + DAP + TaskRunner + Eklenti$. Burada LSP, Language Server Protocol yani dil sunucusu protokolüdür. Kod tamamlama, sembole gitme, hata işaretleme gibi özellikleri sağlar. DAP, Debug Adapter Protocol ile hata ayıklama dünyasını standartlaştırır. TaskRunner ise derleme, test, lint ve deploy gibi komutları yönetir.</p>

<table>
  <thead>
    <tr>
      <th>Bileşen</th>
      <th>Görevi</th>
      <th>Örnek kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>LSP</td>
      <td>Dil zekası sağlar</td>
      <td>TypeScript hatalarını anlık gösterme</td>
    </tr>
    <tr>
      <td>DAP</td>
      <td>Debug sürecini soyutlar</td>
      <td>Python betiğinde breakpoint kullanma</td>
    </tr>
    <tr>
      <td>Task Runner</td>
      <td>Komutları otomatik çalıştırır</td>
      <td>npm test ve pytest zinciri</td>
    </tr>
    <tr>
      <td>Eklenti Sistemi</td>
      <td>IDE davranışını genişletir</td>
      <td>Docker, Git, Kubernetes paneli</td>
    </tr>
  </tbody>
</table>

<p>Çoklu dil çalışma alanında önemli kavramlardan biri bağımlılık grafiğidir. Diyelim ki önyüz projesi API tiplerini otomatik üretilen bir dosyadan alıyor. Bu durumda $frontend \rightarrow generatedTypes \rightarrow backendSchema$ şeklinde bir ilişki oluşur. IDE bu ilişkiyi görevlerle temsil ederse, geliştirici tek tuşla önce şemayı güncelleyip sonra önyüzü başlatabilir.</p>

<div class="language-ts highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">type</span> <span class="nx">Task</span> <span class="o">=</span> <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="kr">string</span><span class="p">;</span> <span class="nl">run</span><span class="p">:</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="nb">Promise</span><span class="o">&lt;</span><span class="k">void</span><span class="o">&gt;</span> <span class="p">};</span>

<span class="kd">const</span> <span class="nx">tasks</span><span class="p">:</span> <span class="nx">Task</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[</span>
  <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">api:generate</span><span class="dl">'</span><span class="p">,</span> <span class="na">run</span><span class="p">:</span> <span class="k">async </span><span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">OpenAPI tipleri üretildi</span><span class="dl">'</span><span class="p">)</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">frontend:lint</span><span class="dl">'</span><span class="p">,</span> <span class="na">run</span><span class="p">:</span> <span class="k">async </span><span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Önyüz kontrol edildi</span><span class="dl">'</span><span class="p">)</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">frontend:dev</span><span class="dl">'</span><span class="p">,</span> <span class="na">run</span><span class="p">:</span> <span class="k">async </span><span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Vite geliştirme sunucusu açıldı</span><span class="dl">'</span><span class="p">)</span> <span class="p">}</span>
<span class="p">];</span>

<span class="k">async</span> <span class="kd">function</span> <span class="nf">runPipeline</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="nx">task</span> <span class="k">of</span> <span class="nx">tasks</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Çalışıyor:</span><span class="dl">'</span><span class="p">,</span> <span class="nx">task</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
    <span class="k">await</span> <span class="nx">task</span><span class="p">.</span><span class="nf">run</span><span class="p">();</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="nf">runPipeline</span><span class="p">();</span>
</code></pre></div></div>

<p>Bu kod basit bir görev hattını temsil eder. Gerçek IDE içinde bu yapı çoğu zaman launch, tasks veya workspace ayarlarıyla tanımlanır. Ama mantık aynıdır: görevler sıraya alınır, çıktılar terminalde toplanır, hata olursa zincir durdurulur ya da kullanıcı uyarılır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tek dil, tek proje</td>
      <td>Basit kurulum</td>
      <td>Büyük sistemlerde yetersiz kalır</td>
    </tr>
    <tr>
      <td>Çoklu dil, ayrı klasörler</td>
      <td>Sorumluluklar netleşir</td>
      <td>Araçlar kopuk çalışabilir</td>
    </tr>
    <tr>
      <td>Çoklu dil, tek workspace</td>
      <td>Entegre deneyim</td>
      <td>Doğru yapılandırma ister</td>
    </tr>
  </tbody>
</table>

<p>Gelişmiş IDE’lerde bu entegrasyonun eğlenceli kısmı otomasyondur. Örneğin dosya kaydedildiğinde formatter çalışır, testler tetiklenir, tip dosyaları yenilenir ve önyüz sıcak yenileme ile güncellenir. Kullanıcı sadece kod yazar; IDE sahne arkasında küçük bir robot ordusu gibi çalışır. Ancak bu robot ordusunun kontrolden çıkmaması için net kurallar gerekir: görev adları anlamlı olmalı, ortam değişkenleri belgelenmeli, her dilin bağımlılık yönetimi izole edilmelidir.</p>

<p>Pratikte iyi bir çoklu dil IDE mimarisi için üç öneri öne çıkar. Birincisi, her teknolojinin kendi doğal aracını kullanın; Python için venv, Node için pnpm veya npm, Java için Maven gibi. İkincisi, ortak akışları IDE görevlerine bağlayın. Üçüncüsü, debug yapılandırmalarını ekip içinde paylaşın. Böylece yeni gelen geliştirici projeyi klonladığında sadece kodu değil, çalışma ritüelini de devralır.</p>

<p>Sonuç olarak çoklu dil mimarisi, IDE’yi pasif bir editörden aktif bir geliştirme merkezine dönüştürür. Arka plandaki otomasyon betikleri, önyüz projeleri ve servisler aynı sahnede buluştuğunda üretkenlik artar. Doğru kurgulanmış bir workspace, geliştiriciye şu hissi verir: Farklı diller konuşan bir ekip var, ama hepsi aynı orkestrada çalıyor.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="IDE" /><category term="LSP" /><category term="çoklu dil mimarisi" /><category term="otomasyon" /><category term="frontend" /><summary type="html"><![CDATA[Modern bir IDE artık sadece renkli parantez gösteren bir metin editörü değil; adeta küçük bir yazılım işletim sistemi. Aynı çalışma alanında TypeScript ile önyüz geliştirirken, Python betikleriyle otomasyon çalıştırabilir, Go ya da Java servislerini debug edebilir ve tüm bu parçaları tek bir proje akışı gibi yönetebilirsiniz. Çoklu dil mimarisi tam da burada devreye girer: IDE, farklı dillerin araçlarını ortak bir orkestrada buluşturur.]]></summary></entry><entry><title type="html">JavaScript ile Tarayıcı Üzerinde Sosyolojik Deneyler</title><link href="https://sonsuzus.github.io/posts/javascript-ile-tarayici-uzerinde-sosyolojik-deneyler/" rel="alternate" type="text/html" title="JavaScript ile Tarayıcı Üzerinde Sosyolojik Deneyler" /><published>2026-07-11T00:00:00+00:00</published><updated>2026-07-11T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/javascript-ile-tarayici-uzerinde-sosyolojik-deneyler</id><content type="html" xml:base="https://sonsuzus.github.io/posts/javascript-ile-tarayici-uzerinde-sosyolojik-deneyler/"><![CDATA[<p>Tarayıcı, sadece butonlara tıkladığımız bir ekran değil; aynı zamanda küçük ölçekli davranış deneyleri yapabileceğimiz harika bir laboratuvardır. JavaScript sayesinde kullanıcıların seçimlerini, tepki sürelerini, dikkat kaymalarını ve karar örüntülerini analiz eden etkileşimli psikoloji ya da zeka testleri tasarlayabiliriz. Elbette burada amaç “insanı çözmek” değil; etik sınırlar içinde, anonim ve öğretici deneyimler üretmektir.
``</p>

<p>Bu tür uygulamaların temelinde üç kavram vardır: <strong>uyaran</strong>, <strong>tepki</strong> ve <strong>ölçüm</strong>. Uyaran; ekranda gösterilen soru, görsel, renk ya da görevdir. Tepki; kullanıcının tıklaması, yazması, sürüklemesi veya beklemesidir. Ölçüm ise bu tepkinin zamana, doğruluğa veya tutarlılığa göre sayısallaştırılmasıdır. Basit bir modelle kullanıcı davranış skoru şöyle düşünülebilir: $S = w_1 x_1 + w_2 x_2 + w_3 x_3$. Burada $x$ değerleri davranış ölçümlerini, $w$ değerleri ise bu ölçümlerin ağırlıklarını temsil eder.</p>

<p>Daha genel biçimde, bir test puanını şu şekilde ifade edebiliriz:</p>

\[S = \sum_{i=1}^{n} w_i x_i\]

<p>Bu formül bize şunu söyler: Her cevap aynı önemde olmak zorunda değildir. Örneğin bir hafıza testinde doğru cevap kadar cevap verme süresi de anlamlı olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Ölçüm Türü</th>
      <th>Ne Anlatır?</th>
      <th>JavaScript ile Nasıl Yakalanır?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tepki süresi</td>
      <td>Karar hızı</td>
      <td><code class="language-plaintext highlighter-rouge">performance.now()</code></td>
    </tr>
    <tr>
      <td>Tıklama seçimi</td>
      <td>Tercih yönelimi</td>
      <td><code class="language-plaintext highlighter-rouge">click</code> event</td>
    </tr>
    <tr>
      <td>Hata sayısı</td>
      <td>Dikkat veya bilgi düzeyi</td>
      <td>Sayaç değişkenleri</td>
    </tr>
    <tr>
      <td>Sıralama davranışı</td>
      <td>Öncelik algısı</td>
      <td>Drag &amp; drop olayları</td>
    </tr>
  </tbody>
</table>

<p>Dinamik DOM manipülasyonu burada sahnenin ışıkçısı gibidir. Kullanıcı bir soruya cevap verdiğinde yeni soru gösterilir, renkler değişir, sonuç ekranı oluşturulur veya zorluk seviyesi artırılır. Böylece sayfa yenilenmeden akıcı bir deney tasarlanır.</p>

<p>Aşağıdaki örnek, basit bir dikkat testi mantığını gösterir. Kullanıcıdan ekranda beliren hedef renge mümkün olduğunca hızlı tıklaması istenir:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">app</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">#app</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">colors</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">red</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">blue</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">green</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">purple</span><span class="dl">'</span><span class="p">];</span>
<span class="kd">let</span> <span class="nx">startTime</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">results</span> <span class="o">=</span> <span class="p">[];</span>

<span class="kd">function</span> <span class="nf">newRound</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">target</span> <span class="o">=</span> <span class="nx">colors</span><span class="p">[</span><span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="nx">colors</span><span class="p">.</span><span class="nx">length</span><span class="p">)];</span>
  <span class="nx">startTime</span> <span class="o">=</span> <span class="nx">performance</span><span class="p">.</span><span class="nf">now</span><span class="p">();</span>

  <span class="nx">app</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`
    &lt;p&gt;Hedef renk: &lt;strong&gt;</span><span class="p">${</span><span class="nx">target</span><span class="p">}</span><span class="s2">&lt;/strong&gt;&lt;/p&gt;
    &lt;div class='grid'&gt;
      </span><span class="p">${</span><span class="nx">colors</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">color</span> <span class="o">=&gt;</span> <span class="s2">`&lt;button class='box' data-color='</span><span class="p">${</span><span class="nx">color</span><span class="p">}</span><span class="s2">' style='background:</span><span class="p">${</span><span class="nx">color</span><span class="p">}</span><span class="s2">'&gt;&lt;/button&gt;`</span><span class="p">).</span><span class="nf">join</span><span class="p">(</span><span class="dl">''</span><span class="p">)}</span><span class="s2">
    &lt;/div&gt;
  `</span><span class="p">;</span>

  <span class="nb">document</span><span class="p">.</span><span class="nf">querySelectorAll</span><span class="p">(</span><span class="dl">'</span><span class="s1">.box</span><span class="dl">'</span><span class="p">).</span><span class="nf">forEach</span><span class="p">(</span><span class="nx">button</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nx">button</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">click</span><span class="dl">'</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
      <span class="kd">const</span> <span class="nx">reaction</span> <span class="o">=</span> <span class="nx">performance</span><span class="p">.</span><span class="nf">now</span><span class="p">()</span> <span class="o">-</span> <span class="nx">startTime</span><span class="p">;</span>
      <span class="kd">const</span> <span class="nx">correct</span> <span class="o">=</span> <span class="nx">button</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">color</span> <span class="o">===</span> <span class="nx">target</span><span class="p">;</span>
      <span class="nx">results</span><span class="p">.</span><span class="nf">push</span><span class="p">({</span> <span class="nx">reaction</span><span class="p">,</span> <span class="nx">correct</span> <span class="p">});</span>
      <span class="nf">showFeedback</span><span class="p">(</span><span class="nx">correct</span><span class="p">,</span> <span class="nx">reaction</span><span class="p">);</span>
    <span class="p">});</span>
  <span class="p">});</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nf">showFeedback</span><span class="p">(</span><span class="nx">correct</span><span class="p">,</span> <span class="nx">reaction</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">app</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`
    &lt;p&gt;</span><span class="p">${</span><span class="nx">correct</span> <span class="p">?</span> <span class="dl">'</span><span class="s1">Doğru!</span><span class="dl">'</span> <span class="p">:</span> <span class="dl">'</span><span class="s1">Yanlış!</span><span class="dl">'</span><span class="p">}</span><span class="s2">&lt;/p&gt;
    &lt;p&gt;Tepki süresi: </span><span class="p">${</span><span class="nb">Math</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="nx">reaction</span><span class="p">)}</span><span class="s2"> ms&lt;/p&gt;
    &lt;button id='next'&gt;Yeni Tur&lt;/button&gt;
  `</span><span class="p">;</span>
  <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">#next</span><span class="dl">'</span><span class="p">).</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">click</span><span class="dl">'</span><span class="p">,</span> <span class="nx">newRound</span><span class="p">);</span>
<span class="p">}</span>

<span class="nf">newRound</span><span class="p">();</span>
</code></pre></div></div>

<p>Bu kodda <code class="language-plaintext highlighter-rouge">performance.now()</code> milisaniye hassasiyetinde zaman ölçer. Kullanıcının doğru renge tıklayıp tıklamadığı <code class="language-plaintext highlighter-rouge">dataset</code> üzerinden kontrol edilir. DOM, her turda yeniden çizilerek testin akışı yönetilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sabit sorular</td>
      <td>Kolay analiz</td>
      <td>Ezberlenebilir</td>
    </tr>
    <tr>
      <td>Rastgele uyaran</td>
      <td>Daha doğal veri</td>
      <td>Karşılaştırma zorlaşır</td>
    </tr>
    <tr>
      <td>Zaman ölçümü</td>
      <td>Hızlı içgörü</td>
      <td>Cihaz farklarından etkilenir</td>
    </tr>
    <tr>
      <td>Kişiselleştirme</td>
      <td>Etkileşim artar</td>
      <td>Gizlilik sorumluluğu doğar</td>
    </tr>
  </tbody>
</table>

<p>Sosyolojik veya psikolojik deneylerde en kritik konu <strong>etik tasarım</strong>dır. Kullanıcıdan açık rıza alınmalı, veriler anonimleştirilmeli ve sonuçlar kesin tanı gibi sunulmamalıdır. “Zekan 142 çıktı” demek yerine “Bu mini testte hızlı örüntü tanıma eğilimi gösterdin” demek çok daha sağlıklıdır.</p>

<p>Sonuç ekranı da davranış analizi kadar önemlidir. Kullanıcıya grafikler, ortalama tepki süresi ve doğru cevap oranı gösterilebilir. Örneğin doğruluk oranı $D = doğru / toplam$ formülüyle hesaplanır. Bu basit oran, anlaşılır bir geri bildirim üretir.</p>

<p>JavaScript ile tarayıcı üzerinde böyle deneyler tasarlamak; DOM, event yönetimi, veri modelleme ve kullanıcı deneyimi bilgisini aynı projede buluşturur. Küçük başlayın: üç soru, bir sayaç ve basit bir skor ekranı yeterli. Sonra rastgeleleştirme, grafikler, localStorage ve erişilebilirlik ekleyerek projenizi gerçek bir interaktif araştırma aracına dönüştürebilirsiniz.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="JavaScript" /><category term="DOM Manipülasyonu" /><category term="Kullanıcı Davranışı" /><category term="Psikoloji Testleri" /><summary type="html"><![CDATA[Tarayıcı, sadece butonlara tıkladığımız bir ekran değil; aynı zamanda küçük ölçekli davranış deneyleri yapabileceğimiz harika bir laboratuvardır. JavaScript sayesinde kullanıcıların seçimlerini, tepki sürelerini, dikkat kaymalarını ve karar örüntülerini analiz eden etkileşimli psikoloji ya da zeka testleri tasarlayabiliriz. Elbette burada amaç “insanı çözmek” değil; etik sınırlar içinde, anonim ve öğretici deneyimler üretmektir.]]></summary></entry><entry><title type="html">PHP ile Topluluk Odaklı Platformların Evrimi</title><link href="https://sonsuzus.github.io/posts/php-ile-topluluk-odakli-platformlarin-evrimi/" rel="alternate" type="text/html" title="PHP ile Topluluk Odaklı Platformların Evrimi" /><published>2026-07-11T00:00:00+00:00</published><updated>2026-07-11T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/php-ile-topluluk-odakli-platformlarin-evrimi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/php-ile-topluluk-odakli-platformlarin-evrimi/"><![CDATA[<p>Bir forum sitesine girdiğinizde gördüğünüz şey birkaç başlık, avatar ve cevap kutusundan ibaret gibi durur. Oysa arka planda PHP, HTTP isteğini yakalar, oturumu kontrol eder, veritabanından konuları çeker, izinleri hesaplar ve size dinamik bir HTML sayfası üretir. Topluluk odaklı platformların evrimi tam da burada başlar: statik sayfalardan, kullanıcı davranışına göre şekillenen yaşayan sistemlere geçiş.
``
PHP’nin forum dünyasındaki popülerliği tesadüf değildir. 2000’lerde phpBB, vBulletin ve SMF gibi yazılımlar, paylaşımlı hostinglerde kolay kurulabildiği için topluluk kültürünü hızla büyüttü. İlk dönemlerde mantık genellikle tek dosyada toplanırdı: <code class="language-plaintext highlighter-rouge">viewtopic.php</code> hem veriyi çeker, hem iş kurallarını uygular, hem de HTML basardı. Bugün ise daha katmanlı bir yaklaşım tercih edilir: yönlendirme, servis, veri erişimi ve şablonlama birbirinden ayrılır.</p>

<p>Dinamik sayfa oluşturmanın temel fikri basittir: kullanıcıdan gelen istek, sunucuda işlenir ve her kullanıcıya bağlama göre farklı bir çıktı döner. Bunu küçük bir formülle düşünebiliriz: $Sayfa = Veri + Yetki + Şablon$. Örneğin aynı konu sayfası, moderatöre silme butonu gösterirken normal üyeye sadece yanıtla butonu gösterebilir.</p>

<table>
  <thead>
    <tr>
      <th>Dönem</th>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Statik HTML</td>
      <td>Her sayfa elle hazırlanır</td>
      <td>Hızlı ve basit</td>
      <td>Etkileşim yok</td>
    </tr>
    <tr>
      <td>Klasik PHP</td>
      <td>PHP içinde HTML ve SQL birlikte</td>
      <td>Kolay geliştirme</td>
      <td>Bakım ve güvenlik zor</td>
    </tr>
    <tr>
      <td>Modern PHP</td>
      <td>MVC, ORM, şablon motoru</td>
      <td>Ölçeklenebilir</td>
      <td>Mimari disiplin ister</td>
    </tr>
  </tbody>
</table>

<p>Bir forumun veritabanı modeli genellikle birkaç ana tablo etrafında döner: kullanıcılar, konular, mesajlar, kategoriler ve roller. Basit ilişki şöyle kurulabilir: bir kullanıcının birçok mesajı vardır, bir konunun birçok mesajı vardır. Matematiksel olarak bunu $User \rightarrow Posts$ ve $Topic \rightarrow Posts$ ilişkileriyle düşünebiliriz. Trafik arttığında sorgu sayısı da önem kazanır; toplam maliyet kabaca $T_{toplam}=T_{sql}+T_{php}+T_{network}$ şeklinde okunabilir.</p>

<p>Güvenli iletişimin kalbi ise hazırlıklı sorgulardır. Kullanıcıdan gelen metni doğrudan SQL cümlesine eklemek, SQL injection davetiyesidir. PDO ile parametre bağlamak, veriyi komut olmaktan çıkarıp yalnızca veri haline getirir.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?php</span>
<span class="nv">$pdo</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">PDO</span><span class="p">(</span>
    <span class="s1">'mysql:host=localhost;dbname=forum;charset=utf8mb4'</span><span class="p">,</span>
    <span class="s1">'forum_user'</span><span class="p">,</span>
    <span class="s1">'secret_password'</span><span class="p">,</span>
    <span class="p">[</span><span class="no">PDO</span><span class="o">::</span><span class="no">ATTR_ERRMODE</span> <span class="o">=&gt;</span> <span class="no">PDO</span><span class="o">::</span><span class="no">ERRMODE_EXCEPTION</span><span class="p">]</span>
<span class="p">);</span>

<span class="nv">$title</span> <span class="o">=</span> <span class="nb">trim</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'title'</span><span class="p">]</span> <span class="o">??</span> <span class="s1">''</span><span class="p">);</span>
<span class="nv">$userId</span> <span class="o">=</span> <span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'user_id'</span><span class="p">]</span> <span class="o">??</span> <span class="kc">null</span><span class="p">;</span>

<span class="k">if</span> <span class="p">(</span><span class="nv">$title</span> <span class="o">===</span> <span class="s1">''</span> <span class="o">||</span> <span class="o">!</span><span class="nv">$userId</span><span class="p">)</span> <span class="p">{</span>
    <span class="nb">http_response_code</span><span class="p">(</span><span class="mi">400</span><span class="p">);</span>
    <span class="k">exit</span><span class="p">(</span><span class="s1">'Geçersiz istek'</span><span class="p">);</span>
<span class="p">}</span>

<span class="nv">$stmt</span> <span class="o">=</span> <span class="nv">$pdo</span><span class="o">-&gt;</span><span class="nf">prepare</span><span class="p">(</span>
    <span class="s1">'INSERT INTO topics (user_id, title, created_at) VALUES (:user_id, :title, NOW())'</span>
<span class="p">);</span>
<span class="nv">$stmt</span><span class="o">-&gt;</span><span class="nf">execute</span><span class="p">([</span>
    <span class="s1">'user_id'</span> <span class="o">=&gt;</span> <span class="nv">$userId</span><span class="p">,</span>
    <span class="s1">'title'</span> <span class="o">=&gt;</span> <span class="nv">$title</span>
<span class="p">]);</span>
</code></pre></div></div>

<p>Bu kodun görevi yeni bir konu başlığı eklemektir. Dikkat ederseniz <code class="language-plaintext highlighter-rouge">$title</code> doğrudan SQL içine gömülmez; <code class="language-plaintext highlighter-rouge">:title</code> parametresine bağlanır. Böylece kullanıcı başlığa garip karakterler yazsa bile sorgunun yapısı bozulmaz.</p>

<table>
  <thead>
    <tr>
      <th>Tehdit</th>
      <th>Kötü Uygulama</th>
      <th>Güvenli Yaklaşım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>SQL Injection</td>
      <td>String birleştirme</td>
      <td>Prepared statement</td>
    </tr>
    <tr>
      <td>XSS</td>
      <td>Ham HTML basmak</td>
      <td><code class="language-plaintext highlighter-rouge">htmlspecialchars</code> kullanmak</td>
    </tr>
    <tr>
      <td>CSRF</td>
      <td>Formsuz doğrulama</td>
      <td>CSRF token kontrolü</td>
    </tr>
    <tr>
      <td>Yetki aşımı</td>
      <td>Sadece arayüzü gizlemek</td>
      <td>Sunucu tarafı rol kontrolü</td>
    </tr>
  </tbody>
</table>

<p>Dinamik sayfa üretirken güvenlik sadece veritabanı ile bitmez. Mesaj içeriğini ekrana basarken HTML kaçışlama gerekir. Aksi halde biri konuya zararlı JavaScript yazabilir. Basit çıktı örneği:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;p&gt;</span><span class="cp">&lt;?=</span> <span class="nb">htmlspecialchars</span><span class="p">(</span><span class="nv">$post</span><span class="p">[</span><span class="s1">'body'</span><span class="p">],</span> <span class="no">ENT_QUOTES</span><span class="p">,</span> <span class="s1">'UTF-8'</span><span class="p">)</span> <span class="cp">?&gt;</span><span class="nt">&lt;/p&gt;</span>
</code></pre></div></div>

<p>Ayrıca forumlar sosyal sistemlerdir; teknik tasarım topluluk davranışını etkiler. Bildirimler, rozetler, beğeniler ve moderasyon kuyrukları sadece özellik değil, katılım mekanizmasıdır. Ancak her yeni özellik yeni veri ilişkileri ve yeni güvenlik kontrolleri demektir.</p>

<p>Modern PHP ekosisteminde Laravel veya Symfony gibi çatılar, yönlendirme, ORM, middleware ve CSRF koruması sunarak bu yükü azaltır. Yine de temeli anlamak önemlidir: istek gelir, kimlik doğrulanır, yetki kontrol edilir, güvenli sorgu çalışır, veri temizlenir ve şablona aktarılır. Kısacası iyi bir topluluk platformu, yalnızca konuşma alanı değil; veritabanı, güvenlik ve kullanıcı deneyiminin dengeli bir orkestrasıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="PHP" /><category term="Forum Mimarisi" /><category term="Veritabanı Güvenliği" /><summary type="html"><![CDATA[Bir forum sitesine girdiğinizde gördüğünüz şey birkaç başlık, avatar ve cevap kutusundan ibaret gibi durur. Oysa arka planda PHP, HTTP isteğini yakalar, oturumu kontrol eder, veritabanından konuları çeker, izinleri hesaplar ve size dinamik bir HTML sayfası üretir. Topluluk odaklı platformların evrimi tam da burada başlar: statik sayfalardan, kullanıcı davranışına göre şekillenen yaşayan sistemlere geçiş.]]></summary></entry><entry><title type="html">SQL ile Felsefi Metinlerde Veri Madenciliği</title><link href="https://sonsuzus.github.io/posts/sql-ile-felsefi-metinlerde-veri-madenciligi/" rel="alternate" type="text/html" title="SQL ile Felsefi Metinlerde Veri Madenciliği" /><published>2026-07-11T00:00:00+00:00</published><updated>2026-07-11T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/sql-ile-felsefi-metinlerde-veri-madenciligi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/sql-ile-felsefi-metinlerde-veri-madenciligi/"><![CDATA[<p>Felsefi metinler bazen bir veritabanı gibi davranır: kavramlar tablolar, alıntılar ilişkiler, kelimeler de satırlar gibidir. Platon’dan Kant’a, İbn Sînâ’dan Nietzsche’ye uzanan devasa bir külliyatı SQL ile sorguladığınızda yalnızca kaç kez akıl kelimesi geçtiğini değil, hangi kökten gelen kelimelerin hangi düşünürlerde birlikte yoğunlaştığını da görebilirsiniz.</p>

<p>Bu işin teorik temeli üç katmandan oluşur: ilişkisel model, dilsel ön işleme ve semantik yakınlık. İlişkisel modelde her metin; yazar, eser, bölüm, cümle ve token gibi parçalara ayrılır. Dilsel ön işlemede kelimeler küçük harfe çevrilir, noktalama temizlenir, kök veya lemma bulunur. Semantik yakınlıkta ise kelimelerin aynı bağlamlarda görünme sıklığı ölçülür. Basit fikir şudur: İki kavram benzer cümlelerde sık görünüyorsa anlam uzayında birbirine yakındır.
``</p>

<p>Matematiksel olarak birlikte görünme oranını şöyle düşünebiliriz: $P(a,b)=\frac{count(a,b)}{N}$, burada $count(a,b)$ iki kelimenin aynı pencere içinde kaç kez geçtiğini, $N$ ise toplam pencere sayısını gösterir. Daha kullanışlı bir ölçü olan PMI ise $PMI(a,b)=\log\frac{P(a,b)}{P(a)P(b)}$ formülüyle beklenenden güçlü ilişkileri yakalar. Örneğin töz ve nitelik sıradan sıklıkta görünse bile birlikte görünmeleri beklenenden fazlaysa felsefi açıdan anlamlı bir bağ oluşur.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Ne Ölçer?</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kelime sıklığı</td>
      <td>Bir terimin kaç kez geçtiği</td>
      <td>Hızlı ve basit</td>
      <td>Bağlamı kaçırır</td>
    </tr>
    <tr>
      <td>Kök analizi</td>
      <td>Aynı kökten türeyen biçimler</td>
      <td>Etimolojik iz sürer</td>
      <td>Hatalı kök eşleşebilir</td>
    </tr>
    <tr>
      <td>Birlikte görünme</td>
      <td>Kavramların yakınlığı</td>
      <td>Semantik ağ kurar</td>
      <td>Uzun metinlerde gürültü üretir</td>
    </tr>
    <tr>
      <td>PMI</td>
      <td>Beklenmedik güçlü bağlar</td>
      <td>Derin ilişkileri gösterir</td>
      <td>Nadir kelimeleri abartabilir</td>
    </tr>
  </tbody>
</table>

<p>Örnek bir şema şöyle tasarlanabilir: <code class="language-plaintext highlighter-rouge">authors</code>, <code class="language-plaintext highlighter-rouge">works</code>, <code class="language-plaintext highlighter-rouge">sentences</code>, <code class="language-plaintext highlighter-rouge">tokens</code>, <code class="language-plaintext highlighter-rouge">roots</code> ve <code class="language-plaintext highlighter-rouge">co_occurrences</code>. Token tablosu her kelimeyi satır olarak tutar; root tablosu ise etimolojik veya morfolojik kökeni saklar. Böylece hem metinsel hem de tarihsel sorgular yazabiliriz.</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- Aynı kökten gelen kelimelerin filozoflara göre dağılımı</span>
<span class="k">SELECT</span>
  <span class="n">a</span><span class="p">.</span><span class="n">name</span> <span class="k">AS</span> <span class="n">philosopher</span><span class="p">,</span>
  <span class="n">r</span><span class="p">.</span><span class="n">root_text</span> <span class="k">AS</span> <span class="n">root</span><span class="p">,</span>
  <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">AS</span> <span class="n">usage_count</span>
<span class="k">FROM</span> <span class="n">tokens</span> <span class="n">t</span>
<span class="k">JOIN</span> <span class="n">sentences</span> <span class="n">s</span> <span class="k">ON</span> <span class="n">s</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="n">t</span><span class="p">.</span><span class="n">sentence_id</span>
<span class="k">JOIN</span> <span class="n">works</span> <span class="n">w</span> <span class="k">ON</span> <span class="n">w</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="n">s</span><span class="p">.</span><span class="n">work_id</span>
<span class="k">JOIN</span> <span class="n">authors</span> <span class="n">a</span> <span class="k">ON</span> <span class="n">a</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">author_id</span>
<span class="k">JOIN</span> <span class="n">roots</span> <span class="n">r</span> <span class="k">ON</span> <span class="n">r</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="n">t</span><span class="p">.</span><span class="n">root_id</span>
<span class="k">WHERE</span> <span class="n">r</span><span class="p">.</span><span class="n">root_text</span> <span class="k">IN</span> <span class="p">(</span><span class="s1">'logos'</span><span class="p">,</span> <span class="s1">'ratio'</span><span class="p">,</span> <span class="s1">'nous'</span><span class="p">)</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">a</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">r</span><span class="p">.</span><span class="n">root_text</span>
<span class="k">ORDER</span> <span class="k">BY</span> <span class="n">usage_count</span> <span class="k">DESC</span><span class="p">;</span>
</code></pre></div></div>

<p>Bu sorgu, farklı dillerde akıl, söz, düzen veya ilke anlamlarına yaklaşan kökleri filozof bazında karşılaştırır. Elbette burada felsefi yorum SQL’den çıkmaz; SQL yalnızca izleri görünür kılar. Yorum, araştırmacının tarihsel ve kavramsal bilgisinde başlar.</p>

<p>Daha heyecanlı kısım semantik ağdır. Cümle içinde beş kelimelik bir pencere düşünelim. Eğer özgürlük ile zorunluluk aynı pencerede sık görülüyorsa aralarında kenar oluşur. Aşağıdaki sorgu bu ilişkiyi kabaca çıkarır:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- Aynı cümlede geçen kavram çiftlerini bulma</span>
<span class="k">SELECT</span>
  <span class="n">t1</span><span class="p">.</span><span class="n">lemma</span> <span class="k">AS</span> <span class="n">concept_a</span><span class="p">,</span>
  <span class="n">t2</span><span class="p">.</span><span class="n">lemma</span> <span class="k">AS</span> <span class="n">concept_b</span><span class="p">,</span>
  <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">AS</span> <span class="n">co_count</span>
<span class="k">FROM</span> <span class="n">tokens</span> <span class="n">t1</span>
<span class="k">JOIN</span> <span class="n">tokens</span> <span class="n">t2</span>
  <span class="k">ON</span> <span class="n">t1</span><span class="p">.</span><span class="n">sentence_id</span> <span class="o">=</span> <span class="n">t2</span><span class="p">.</span><span class="n">sentence_id</span>
 <span class="k">AND</span> <span class="n">t1</span><span class="p">.</span><span class="k">position</span> <span class="o">&lt;</span> <span class="n">t2</span><span class="p">.</span><span class="k">position</span>
 <span class="k">AND</span> <span class="k">ABS</span><span class="p">(</span><span class="n">t1</span><span class="p">.</span><span class="k">position</span> <span class="o">-</span> <span class="n">t2</span><span class="p">.</span><span class="k">position</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">5</span>
<span class="k">WHERE</span> <span class="n">t1</span><span class="p">.</span><span class="n">pos</span> <span class="k">IN</span> <span class="p">(</span><span class="s1">'NOUN'</span><span class="p">,</span> <span class="s1">'ADJ'</span><span class="p">)</span>
  <span class="k">AND</span> <span class="n">t2</span><span class="p">.</span><span class="n">pos</span> <span class="k">IN</span> <span class="p">(</span><span class="s1">'NOUN'</span><span class="p">,</span> <span class="s1">'ADJ'</span><span class="p">)</span>
  <span class="k">AND</span> <span class="n">t1</span><span class="p">.</span><span class="n">lemma</span> <span class="o">&lt;&gt;</span> <span class="n">t2</span><span class="p">.</span><span class="n">lemma</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">t1</span><span class="p">.</span><span class="n">lemma</span><span class="p">,</span> <span class="n">t2</span><span class="p">.</span><span class="n">lemma</span>
<span class="k">HAVING</span> <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">10</span>
<span class="k">ORDER</span> <span class="k">BY</span> <span class="n">co_count</span> <span class="k">DESC</span><span class="p">;</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">position</code> kelimenin cümledeki sırasıdır. <code class="language-plaintext highlighter-rouge">ABS</code> ile pencere sınırı belirlenir. Böylece bütün metni torbaya atmak yerine yakın bağlamı dikkate alırız. Bu, Aristoteles’te form-madde çiftini, Spinoza’da töz-kip ilişkisini, Kant’ta deneyim-akıl gerilimini daha görünür hâle getirebilir.</p>

<p>Performans için indeksler şarttır. Devasa metinlerde <code class="language-plaintext highlighter-rouge">sentence_id</code>, <code class="language-plaintext highlighter-rouge">lemma</code>, <code class="language-plaintext highlighter-rouge">root_id</code> ve <code class="language-plaintext highlighter-rouge">position</code> alanlarına indeks eklemek sorgu süresini dramatik biçimde azaltır. Ayrıca sık kullanılan sonuçlar materialized view olarak saklanabilir.</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">CREATE</span> <span class="k">INDEX</span> <span class="n">idx_tokens_sentence_position</span>
<span class="k">ON</span> <span class="n">tokens</span><span class="p">(</span><span class="n">sentence_id</span><span class="p">,</span> <span class="k">position</span><span class="p">);</span>

<span class="k">CREATE</span> <span class="n">MATERIALIZED</span> <span class="k">VIEW</span> <span class="n">concept_edges</span> <span class="k">AS</span>
<span class="k">SELECT</span> <span class="n">t1</span><span class="p">.</span><span class="n">lemma</span> <span class="k">AS</span> <span class="k">source</span><span class="p">,</span> <span class="n">t2</span><span class="p">.</span><span class="n">lemma</span> <span class="k">AS</span> <span class="n">target</span><span class="p">,</span> <span class="k">COUNT</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">AS</span> <span class="n">weight</span>
<span class="k">FROM</span> <span class="n">tokens</span> <span class="n">t1</span>
<span class="k">JOIN</span> <span class="n">tokens</span> <span class="n">t2</span> <span class="k">ON</span> <span class="n">t1</span><span class="p">.</span><span class="n">sentence_id</span> <span class="o">=</span> <span class="n">t2</span><span class="p">.</span><span class="n">sentence_id</span>
<span class="k">WHERE</span> <span class="n">t1</span><span class="p">.</span><span class="k">position</span> <span class="o">&lt;</span> <span class="n">t2</span><span class="p">.</span><span class="k">position</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">t1</span><span class="p">.</span><span class="n">lemma</span><span class="p">,</span> <span class="n">t2</span><span class="p">.</span><span class="n">lemma</span><span class="p">;</span>
</code></pre></div></div>

<p>Sonuçta SQL, felsefeyi otomatikleştiren sihirli bir değnek değildir; daha çok karanlık bir arşivde güçlü bir el feneridir. Hangi kavramların hangi köklerden beslendiğini, hangi eserlerde yoğunlaştığını ve hangi semantik komşularla gezdiğini gösterir. Filozoflar argüman kurar, SQL ise bu argümanların metin içindeki ayak izlerini sabırla sayar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="SQL" /><category term="Veri Madenciliği" /><category term="Doğal Dil İşleme" /><summary type="html"><![CDATA[Felsefi metinler bazen bir veritabanı gibi davranır: kavramlar tablolar, alıntılar ilişkiler, kelimeler de satırlar gibidir. Platon’dan Kant’a, İbn Sînâ’dan Nietzsche’ye uzanan devasa bir külliyatı SQL ile sorguladığınızda yalnızca kaç kez akıl kelimesi geçtiğini değil, hangi kökten gelen kelimelerin hangi düşünürlerde birlikte yoğunlaştığını da görebilirsiniz. Bu işin teorik temeli üç katmandan oluşur: ilişkisel model, dilsel ön işleme ve semantik yakınlık. İlişkisel modelde her metin; yazar, eser, bölüm, cümle ve token gibi parçalara ayrılır. Dilsel ön işlemede kelimeler küçük harfe çevrilir, noktalama temizlenir, kök veya lemma bulunur. Semantik yakınlıkta ise kelimelerin aynı bağlamlarda görünme sıklığı ölçülür. Basit fikir şudur: İki kavram benzer cümlelerde sık görünüyorsa anlam uzayında birbirine yakındır.]]></summary></entry><entry><title type="html">Turing Testi ve Yapay Zekanın Psikolojisi: Kod Ne Zaman İnsan Gibi Konuşur?</title><link href="https://sonsuzus.github.io/posts/turing-testi-ve-yapay-zekanin-psikolojisi-kod-ne-zaman-insan-gibi-konusur/" rel="alternate" type="text/html" title="Turing Testi ve Yapay Zekanın Psikolojisi: Kod Ne Zaman İnsan Gibi Konuşur?" /><published>2026-07-11T00:00:00+00:00</published><updated>2026-07-11T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/turing-testi-ve-yapay-zekanin-psikolojisi-kod-ne-zaman-insan-gibi-konusur</id><content type="html" xml:base="https://sonsuzus.github.io/posts/turing-testi-ve-yapay-zekanin-psikolojisi-kod-ne-zaman-insan-gibi-konusur/"><![CDATA[<p>Bir sohbet botu size doğru cevabı verdiğinde etkilenirsiniz; ama size duraksayarak, şaka yaparak, konuyu hafifçe yanlış anlayıp sonra toparlayarak cevap verdiğinde ona neredeyse kişilik atfedersiniz. Turing Testi tam da bu bulanık bölgede yaşar: Mesele yalnızca kodun mantıklı çıktı üretmesi değil, insan bilişini, dil alışkanlıklarını ve sohbetin sosyal ritmini ne kadar inandırıcı taklit edebildiğidir.
``</p>

<p>Alan Turing’in 1950’de önerdiği ünlü “taklit oyunu”, bir makinenin düşünüp düşünmediğini doğrudan sormak yerine daha pratik bir soru sorar: Bir insan değerlendirici, yazılı sohbet üzerinden makineyi insandan ayırt edemezse, makine zeki davranış sergiliyor sayılabilir mi? Bu yaklaşım zekâyı içsel bir özden çok gözlemlenebilir davranış üzerinden ele alır. Yani test, beynin içinde ne olduğunu değil, konuşmanın karşı tarafta nasıl bir izlenim bıraktığını ölçer.</p>

<p>Burada psikoloji devreye girer. İnsan iletişimi yalnızca bilgi aktarımı değildir; niyet, bağlam, bellek, duygu tonu ve beklenti yönetimi içerir. Bir kullanıcı “Bugün berbat geçti” dediğinde iyi bir sistem sadece “Üzgünüm” dememeli; cümlenin duygusal ağırlığını, devam sorusu ihtiyacını ve fazla mekanik görünmeme riskini de hesaba katmalıdır. Bu yüzden modern yapay zekâ sistemlerinde dil modeli kadar “sohbet dinamiği modeli” de önemlidir.</p>

<table>
  <tbody>
    <tr>
      <td>Basitçe ifade edersek, bir cevap üretme sistemi şu olasılığı büyütmeye çalışır: $P(cevap</td>
      <td>bağlam)$. Ancak Turing benzeri inandırıcılık için hedef biraz daha karmaşıktır: $S = αT + βD + γB$. Burada $T$ tutarlılığı, $D$ duygusal uygunluğu, $B$ bağlama bağlılığı temsil eder. Katsayılar, sistemin hangi özelliğe daha çok önem vereceğini belirler.</td>
    </tr>
  </tbody>
</table>

<table>
  <thead>
    <tr>
      <th>Boyut</th>
      <th>Mantıksal Bot</th>
      <th>İnsan Benzeri Bot</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Cevap amacı</td>
      <td>Doğru bilgi vermek</td>
      <td>Doğru ve sosyal olarak uygun tepki vermek</td>
    </tr>
    <tr>
      <td>Hata davranışı</td>
      <td>Hatasını gizler veya tekrarlar</td>
      <td>Belirsizliği kabul eder, düzeltme ister</td>
    </tr>
    <tr>
      <td>Dil yapısı</td>
      <td>Düz ve kalıplı</td>
      <td>Vurgu, bağlaç, küçük sapmalar içerir</td>
    </tr>
    <tr>
      <td>Bellek kullanımı</td>
      <td>Son mesaja odaklanır</td>
      <td>Önceki niyetleri ve ilişki tonunu taşır</td>
    </tr>
  </tbody>
</table>

<p>Böyle sistemler geliştirmek için önce konuşmayı parçalara ayırmak gerekir. Niyet tanıma, duygu analizi, bağlam takibi ve cevap üretimi ayrı katmanlar gibi düşünülebilir. Aşağıdaki küçük Python örneği, oyuncak seviyesinde bir sohbet değerlendiricisi kurar. Amaç, cevabın yalnızca anahtar kelimeye değil, duygu tonuna da tepki vermesidir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MiniTuringBot</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">memory</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">def</span> <span class="nf">detect_emotion</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
        <span class="n">sad_words</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="s">kötü</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">berbat</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">üzgün</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">yoruldum</span><span class="sh">'</span><span class="p">]</span>
        <span class="n">happy_words</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="s">harika</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">güzel</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sevindim</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">başardım</span><span class="sh">'</span><span class="p">]</span>
        <span class="k">if</span> <span class="nf">any</span><span class="p">(</span><span class="n">word</span> <span class="ow">in</span> <span class="n">text</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">sad_words</span><span class="p">):</span>
            <span class="k">return</span> <span class="sh">'</span><span class="s">sad</span><span class="sh">'</span>
        <span class="k">if</span> <span class="nf">any</span><span class="p">(</span><span class="n">word</span> <span class="ow">in</span> <span class="n">text</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">happy_words</span><span class="p">):</span>
            <span class="k">return</span> <span class="sh">'</span><span class="s">happy</span><span class="sh">'</span>
        <span class="k">return</span> <span class="sh">'</span><span class="s">neutral</span><span class="sh">'</span>

    <span class="k">def</span> <span class="nf">reply</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">user_text</span><span class="p">):</span>
        <span class="n">emotion</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">detect_emotion</span><span class="p">(</span><span class="n">user_text</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">memory</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">user_text</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">emotion</span> <span class="o">==</span> <span class="sh">'</span><span class="s">sad</span><span class="sh">'</span><span class="p">:</span>
            <span class="k">return</span> <span class="sh">'</span><span class="s">Bunu yaşaman zor olmalı. İstersen ne olduğunu birlikte açabiliriz.</span><span class="sh">'</span>
        <span class="k">if</span> <span class="n">emotion</span> <span class="o">==</span> <span class="sh">'</span><span class="s">happy</span><span class="sh">'</span><span class="p">:</span>
            <span class="k">return</span> <span class="sh">'</span><span class="s">Bu güzel haber! Sence bunu mümkün kılan en önemli şey neydi?</span><span class="sh">'</span>
        <span class="k">return</span> <span class="sh">'</span><span class="s">Anladım. Biraz daha detay verirsen daha iyi takip edebilirim.</span><span class="sh">'</span>

<span class="n">bot</span> <span class="o">=</span> <span class="nc">MiniTuringBot</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="n">bot</span><span class="p">.</span><span class="nf">reply</span><span class="p">(</span><span class="sh">'</span><span class="s">Bugün gerçekten berbat geçti</span><span class="sh">'</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu kod “zeki” değildir; fakat önemli bir fikri gösterir: İnsan benzeri sohbet, tek seferlik cevaplardan değil, durum değerlendirmesinden oluşur. Gerçek sistemlerde bu yapı büyük dil modelleri, vektör veritabanları, kullanıcı profilleri ve güvenlik filtreleriyle genişletilir. Yine de temel soru değişmez: Cevap, karşıdaki kişinin zihinsel durumuna uygun mu?</p>

<table>
  <thead>
    <tr>
      <th>Değerlendirme Kriteri</th>
      <th>Örnek Soru</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tutarlılık</td>
      <td>Bot önceki cevabıyla çelişiyor mu?</td>
      <td>Güven kaybı</td>
    </tr>
    <tr>
      <td>Doğallık</td>
      <td>Cümleler fazla kusursuz mu?</td>
      <td>Robotik izlenim</td>
    </tr>
    <tr>
      <td>Empati</td>
      <td>Duyguya uygun tepki var mı?</td>
      <td>Soğuk iletişim</td>
    </tr>
    <tr>
      <td>Şeffaflık</td>
      <td>Bilmediğini söyleyebiliyor mu?</td>
      <td>Halüsinasyon</td>
    </tr>
  </tbody>
</table>

<p>Turing Testi’nin en eğlenceli tarafı, bizi “zeka nedir?” sorusundan “zeki görünmek ne demektir?” sorusuna taşır. Bu ikisi aynı şey değildir. Bir sistem insanı kandırabilir ama gerçekten anlamıyor olabilir; yine de pratik yazılım geliştirmede kullanıcı deneyimi açısından bu inandırıcılık değerlidir. Özellikle eğitim, müşteri desteği, terapi destek araçları ve oyun karakterlerinde dilin psikolojik dokusu kritik hale gelir.</p>

<p>Sonuç olarak Turing Testi, yapay zekâ geliştiricilerine hâlâ güçlü bir pusula sunar. Daha iyi modeller kurmak istiyorsanız sadece algoritmaya değil, insanın konuşurken yaptığı küçük bilişsel numaralara da bakın: ima, tereddüt, bağlam, duygu ve hatırlama. Çünkü bazen bir botu inandırıcı yapan şey en doğru cevabı vermesi değil, doğru anda “hmm, bunu biraz açalım” diyebilmesidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="turing-testi" /><category term="yapay-zeka" /><category term="doğal-dil-işleme" /><summary type="html"><![CDATA[Bir sohbet botu size doğru cevabı verdiğinde etkilenirsiniz; ama size duraksayarak, şaka yaparak, konuyu hafifçe yanlış anlayıp sonra toparlayarak cevap verdiğinde ona neredeyse kişilik atfedersiniz. Turing Testi tam da bu bulanık bölgede yaşar: Mesele yalnızca kodun mantıklı çıktı üretmesi değil, insan bilişini, dil alışkanlıklarını ve sohbetin sosyal ritmini ne kadar inandırıcı taklit edebildiğidir.]]></summary></entry><entry><title type="html">Zekâ Oyunları İçin Algoritma Optimizasyonu: Labirentten Rubik Küpüne Big O Macerası</title><link href="https://sonsuzus.github.io/posts/zeka-oyunlari-icin-algoritma-optimizasyonu-labirentten-rubik-kupune-big-o-macerasi/" rel="alternate" type="text/html" title="Zekâ Oyunları İçin Algoritma Optimizasyonu: Labirentten Rubik Küpüne Big O Macerası" /><published>2026-07-11T00:00:00+00:00</published><updated>2026-07-11T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/zeka-oyunlari-icin-algoritma-optimizasyonu-labirentten-rubik-kupune-big-o-macerasi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/zeka-oyunlari-icin-algoritma-optimizasyonu-labirentten-rubik-kupune-big-o-macerasi/"><![CDATA[<p>Zekâ oyunları, bilgisayara sadece çözüm buldurduğumuz oyuncaklar değil; algoritmaların kas geliştirdiği küçük spor salonlarıdır. Bir labirent çözücü ya da Rubik Küp algoritması yazarken asıl soru şudur: Çözümü bulabilir miyiz? Evet. Peki çözümü makul sürede ve belleği yakmadan bulabilir miyiz? İşte eğlence burada başlar.
``
Bir problemde olası durum sayısı büyüdükçe kaba kuvvet yaklaşımı hızla kontrolden çıkar. Labirentte her kavşakta ortalama $b$ seçenek varsa ve çözüm derinliği $d$ ise, saf arama için yaklaşık karmaşıklık $O(b^d)$ olur. Rubik Küp tarafında durum uzayı yaklaşık $4.3 \times 10^{19}$ olduğu için her hamleyi denemek, evrendeki çay molalarını tüketebilir.</p>

<p>Temel fikir, arama ağacını küçültmektir. Bunun için üç ana silahımız var: daha iyi veri yapısı, daha iyi sezgisel fonksiyon ve tekrarları engelleyen bellek yönetimi.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th style="text-align: right">Zaman Karmaşıklığı</th>
      <th style="text-align: right">Uzay Karmaşıklığı</th>
      <th>Ne Zaman Güzel?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>DFS</td>
      <td style="text-align: right">$O(b^d)$</td>
      <td style="text-align: right">$O(d)$</td>
      <td>Bellek azsa, çözüm derinliği belirsizse</td>
    </tr>
    <tr>
      <td>BFS</td>
      <td style="text-align: right">$O(b^d)$</td>
      <td style="text-align: right">$O(b^d)$</td>
      <td>En kısa yol kesin lazımsa</td>
    </tr>
    <tr>
      <td>A*</td>
      <td style="text-align: right">$O(b^d)$, pratikte daha iyi</td>
      <td style="text-align: right">$O(b^d)$</td>
      <td>İyi sezgisel varsa</td>
    </tr>
    <tr>
      <td>IDA*</td>
      <td style="text-align: right">$O(b^d)$</td>
      <td style="text-align: right">$O(d)$</td>
      <td>Rubik gibi dev durum uzaylarında</td>
    </tr>
  </tbody>
</table>

<p>Labirent için A* genellikle yıldız oyuncudur. Çünkü hedefe olan Manhattan mesafesi gibi basit bir sezgisel, algoritmanın boş koridorlarda kaybolmasını engeller. A* şu puanı kullanır: $f(n)=g(n)+h(n)$. Burada $g(n)$ başlangıçtan gelinen maliyet, $h(n)$ ise hedefe tahmini uzaklıktır. Eğer $h(n)$ asla gerçek maliyeti aşmıyorsa, yani kabul edilebilir ise, A* en kısa yolu bulur.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">heapq</span> <span class="kn">import</span> <span class="n">heappush</span><span class="p">,</span> <span class="n">heappop</span>

<span class="k">def</span> <span class="nf">astar</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">goal</span><span class="p">,</span> <span class="n">neighbors</span><span class="p">,</span> <span class="n">heuristic</span><span class="p">):</span>
    <span class="n">pq</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="nf">heappush</span><span class="p">(</span><span class="n">pq</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">start</span><span class="p">))</span>
    <span class="n">cost</span> <span class="o">=</span> <span class="p">{</span><span class="n">start</span><span class="p">:</span> <span class="mi">0</span><span class="p">}</span>
    <span class="n">parent</span> <span class="o">=</span> <span class="p">{</span><span class="n">start</span><span class="p">:</span> <span class="bp">None</span><span class="p">}</span>

    <span class="k">while</span> <span class="n">pq</span><span class="p">:</span>
        <span class="n">_</span><span class="p">,</span> <span class="n">node</span> <span class="o">=</span> <span class="nf">heappop</span><span class="p">(</span><span class="n">pq</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">node</span> <span class="o">==</span> <span class="n">goal</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">parent</span>

        <span class="k">for</span> <span class="n">nxt</span><span class="p">,</span> <span class="n">step_cost</span> <span class="ow">in</span> <span class="nf">neighbors</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
            <span class="n">new_cost</span> <span class="o">=</span> <span class="n">cost</span><span class="p">[</span><span class="n">node</span><span class="p">]</span> <span class="o">+</span> <span class="n">step_cost</span>
            <span class="k">if</span> <span class="n">nxt</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">cost</span> <span class="ow">or</span> <span class="n">new_cost</span> <span class="o">&lt;</span> <span class="n">cost</span><span class="p">[</span><span class="n">nxt</span><span class="p">]:</span>
                <span class="n">cost</span><span class="p">[</span><span class="n">nxt</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_cost</span>
                <span class="n">priority</span> <span class="o">=</span> <span class="n">new_cost</span> <span class="o">+</span> <span class="nf">heuristic</span><span class="p">(</span><span class="n">nxt</span><span class="p">,</span> <span class="n">goal</span><span class="p">)</span>
                <span class="nf">heappush</span><span class="p">(</span><span class="n">pq</span><span class="p">,</span> <span class="p">(</span><span class="n">priority</span><span class="p">,</span> <span class="n">nxt</span><span class="p">))</span>
                <span class="n">parent</span><span class="p">[</span><span class="n">nxt</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span>
    <span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>

<table>
  <tbody>
    <tr>
      <td>Bu kodda öncelik kuyruğu, en umut verici düğümü öne alır. Böylece algoritma her yeri eşit merakla gezmez; hedefe doğru kibarca burnunu uzatır. Labirentte <code class="language-plaintext highlighter-rouge">neighbors</code> fonksiyonu geçilebilir hücreleri döndürür, <code class="language-plaintext highlighter-rouge">heuristic</code> ise örneğin $</td>
      <td>x_1-x_2</td>
      <td>+</td>
      <td>y_1-y_2</td>
      <td>$ hesaplar.</td>
    </tr>
  </tbody>
</table>

<p>Rubik Küp tarafında mesele daha serttir. Her durumda 18 temel hamle düşünürsek dallanma faktörü yüksektir. Burada IDA* öne çıkar: A* mantığını derinlik sınırıyla birleştirir, ancak devasa öncelik kuyruğu tutmaz. Özellikle desen veritabanları, yani pattern database, sezgisel değeri önceden hesaplayarak büyük hız kazandırır. Bunun bedeli bellektir; klasik takas: zaman mı, RAM mi?</p>

<table>
  <thead>
    <tr>
      <th>Dil</th>
      <th>Güçlü Yanı</th>
      <th>Zayıf Yanı</th>
      <th>Uygun Kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Python</td>
      <td>Hızlı prototipleme</td>
      <td>Yorumlayıcı maliyeti</td>
      <td>Heuristik deneme, eğitim</td>
    </tr>
    <tr>
      <td>C++</td>
      <td>Çok hızlı, bellek kontrolü</td>
      <td>Geliştirmesi daha zahmetli</td>
      <td>Yarışma, üretim çözücü</td>
    </tr>
    <tr>
      <td>Rust</td>
      <td>Güvenli bellek, yüksek hız</td>
      <td>Öğrenme eğrisi</td>
      <td>Güvenilir performans kodu</td>
    </tr>
    <tr>
      <td>JavaScript</td>
      <td>Görselleştirme kolay</td>
      <td>CPU yoğun işte sınırlı</td>
      <td>Web tabanlı labirent demo</td>
    </tr>
  </tbody>
</table>

<p>Optimizasyonda dil seçimi kadar temsil biçimi de önemlidir. Labirenti karakter matrisi yerine bitset ile saklamak belleği azaltır. Rubik Küp için yüz renklerini uzun dizilerde tutmak yerine permütasyon ve yönelim dizileri kullanmak hem hızlı karşılaştırma hem de daha küçük hash üretir. Ziyaret edilen durumları <code class="language-plaintext highlighter-rouge">set</code> içinde tutmak tekrarları keser; fakat uzay karmaşıklığını artırır. Bu yüzden IDA* gibi yöntemler bazen bilinçli olarak daha az hatırlar, daha çok tekrar hesaplar.</p>

<p>Pratik reçete şöyle: Önce doğru algoritmayı seç, sonra sezgisel fonksiyonu iyileştir, ardından profil çıkar. Çünkü tahminle optimizasyon yapmak, gözleri kapalı labirent çözmeye benzer. Labirentte A<em>, Rubik Küpünde IDA</em> ve desen veritabanları çoğu zaman iyi başlangıçtır. Big O bize haritanın ölçeğini verir; gerçek performansı ise veri yapıları, önbellek davranışı ve dilin çalışma modeli belirler. Kısacası hızlı çözücü yazmak, sadece kodlamak değil, arama uzayını ikna sanatıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="algoritma" /><category term="big-o" /><category term="yapay-zeka" /><category term="optimizasyon" /><summary type="html"><![CDATA[Zekâ oyunları, bilgisayara sadece çözüm buldurduğumuz oyuncaklar değil; algoritmaların kas geliştirdiği küçük spor salonlarıdır. Bir labirent çözücü ya da Rubik Küp algoritması yazarken asıl soru şudur: Çözümü bulabilir miyiz? Evet. Peki çözümü makul sürede ve belleği yakmadan bulabilir miyiz? İşte eğlence burada başlar.]]></summary></entry><entry><title type="html">C++ Sınıf Mirasları: Kodun Aile Ağacı</title><link href="https://sonsuzus.github.io/posts/c-sinif-miraslari-kodun-aile-agaci/" rel="alternate" type="text/html" title="C++ Sınıf Mirasları: Kodun Aile Ağacı" /><published>2026-07-10T00:00:00+00:00</published><updated>2026-07-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/c-sinif-miraslari-kodun-aile-agaci</id><content type="html" xml:base="https://sonsuzus.github.io/posts/c-sinif-miraslari-kodun-aile-agaci/"><![CDATA[<p>C++’ta sınıf mirası, bir sınıfın başka bir sınıftan özellik ve davranış devralmasını sağlayan güçlü bir nesne yönelimli programlama mekanizmasıdır. Kısaca: “Zaten yazdığım kodu neden tekrar yazayım?” sorusuna C++’ın verdiği cevaptır. Bir oyun düşün: tüm karakterlerin adı, canı ve hareket etme davranışı var; ama büyücü ayrıca büyü yapıyor, savaşçı kılıç sallıyor. İşte miras, bu ortak ve özel tarafları düzenli biçimde ayırmamıza yardım eder.
<!-- more --></p>

<p>Mirasın temelinde <strong>is-a</strong> ilişkisi vardır. Yani “Büyücü bir Karakterdir” diyebiliyorsak, <code class="language-plaintext highlighter-rouge">Wizard</code> sınıfı <code class="language-plaintext highlighter-rouge">Character</code> sınıfından türeyebilir. Matematiksel olarak bunu kümeler gibi düşünebiliriz: <code class="language-plaintext highlighter-rouge">Wizard \subset Character</code> değil, daha doğru ifadeyle <code class="language-plaintext highlighter-rouge">Wizard</code> nesneleri <code class="language-plaintext highlighter-rouge">Character</code> arayüzünü de taşır. Bir taban sınıfın özellik kümesi $B$, türetilmiş sınıfın eklediği özellikler $E$ ise, türetilmiş sınıfın toplam yeteneği yaklaşık olarak $D = B \cup E$ şeklinde düşünülebilir.</p>

<h2 id="temel-miras-söz-dizimi">Temel Miras Söz Dizimi</h2>

<p>C++’ta miras şu şekilde tanımlanır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Character</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">string</span> <span class="n">name</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">health</span><span class="p">;</span>

    <span class="kt">void</span> <span class="n">move</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">name</span> <span class="o">&lt;&lt;</span> <span class="s">" hareket ediyor."</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">class</span> <span class="nc">Wizard</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Character</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">void</span> <span class="n">castSpell</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">name</span> <span class="o">&lt;&lt;</span> <span class="s">" büyü yapıyor!"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">Wizard</code>, <code class="language-plaintext highlighter-rouge">Character</code> sınıfından <strong>public miras</strong> alır. Bu sayede <code class="language-plaintext highlighter-rouge">Wizard</code> nesnesi hem <code class="language-plaintext highlighter-rouge">name</code>, <code class="language-plaintext highlighter-rouge">health</code>, <code class="language-plaintext highlighter-rouge">move()</code> üyelerine hem de kendi <code class="language-plaintext highlighter-rouge">castSpell()</code> fonksiyonuna sahip olur.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Wizard</span> <span class="n">merlin</span><span class="p">;</span>
    <span class="n">merlin</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"Merlin"</span><span class="p">;</span>
    <span class="n">merlin</span><span class="p">.</span><span class="n">health</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
    <span class="n">merlin</span><span class="p">.</span><span class="n">move</span><span class="p">();</span>
    <span class="n">merlin</span><span class="p">.</span><span class="n">castSpell</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu kodda <code class="language-plaintext highlighter-rouge">move()</code> fonksiyonu <code class="language-plaintext highlighter-rouge">Wizard</code> içinde yazılmadığı halde çalışır; çünkü taban sınıftan devralınmıştır. Bu, mirasın en pratik tarafıdır: ortak davranışları merkezileştirmek.</p>

<h2 id="public-protected-ve-private-miras">Public, Protected ve Private Miras</h2>

<p>C++’ta miras türü, taban sınıftaki erişim seviyelerinin türetilmiş sınıfa nasıl aktarılacağını belirler.</p>

<table>
  <thead>
    <tr>
      <th>Miras Türü</th>
      <th>Taban <code class="language-plaintext highlighter-rouge">public</code> üyeler</th>
      <th>Taban <code class="language-plaintext highlighter-rouge">protected</code> üyeler</th>
      <th>Ne zaman kullanılır?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">public</code></td>
      <td><code class="language-plaintext highlighter-rouge">public</code> kalır</td>
      <td><code class="language-plaintext highlighter-rouge">protected</code> kalır</td>
      <td>Gerçek “is-a” ilişkisi varsa</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">protected</code></td>
      <td><code class="language-plaintext highlighter-rouge">protected</code> olur</td>
      <td><code class="language-plaintext highlighter-rouge">protected</code> kalır</td>
      <td>Dışarıya arayüz kapatılmak istenirse</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">private</code></td>
      <td><code class="language-plaintext highlighter-rouge">private</code> olur</td>
      <td><code class="language-plaintext highlighter-rouge">private</code> olur</td>
      <td>Uygulama detayı olarak devralma gerektiğinde</td>
    </tr>
  </tbody>
</table>

<p>Günlük kullanımda en sık <code class="language-plaintext highlighter-rouge">public</code> miras tercih edilir. Çünkü nesne yönelimli tasarımda türetilmiş sınıfın taban sınıf yerine geçebilmesi beklenir. Buna <strong>Liskov Yerine Geçme Prensibi</strong> denir: Eğer <code class="language-plaintext highlighter-rouge">Wizard</code> bir <code class="language-plaintext highlighter-rouge">Character</code> ise, <code class="language-plaintext highlighter-rouge">Character*</code> bekleyen bir fonksiyona <code class="language-plaintext highlighter-rouge">Wizard*</code> gönderebilmeliyiz.</p>

<h2 id="protected-aile-sırrı">Protected: Aile Sırrı</h2>

<p><code class="language-plaintext highlighter-rouge">private</code> üyeler sadece sınıfın kendisi tarafından erişilebilir. Ancak bazen türetilmiş sınıfların da bazı verilere erişmesi gerekir. Bu durumda <code class="language-plaintext highlighter-rouge">protected</code> kullanılır.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Character</span> <span class="p">{</span>
<span class="nl">protected:</span>
    <span class="kt">int</span> <span class="n">health</span><span class="p">;</span>

<span class="nl">public:</span>
    <span class="n">Character</span><span class="p">(</span><span class="kt">int</span> <span class="n">h</span><span class="p">)</span> <span class="o">:</span> <span class="n">health</span><span class="p">(</span><span class="n">h</span><span class="p">)</span> <span class="p">{}</span>

    <span class="kt">void</span> <span class="nf">showHealth</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Can: "</span> <span class="o">&lt;&lt;</span> <span class="n">health</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">class</span> <span class="nc">Warrior</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Character</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">Warrior</span><span class="p">()</span> <span class="o">:</span> <span class="n">Character</span><span class="p">(</span><span class="mi">150</span><span class="p">)</span> <span class="p">{}</span>

    <span class="kt">void</span> <span class="nf">takeDamage</span><span class="p">(</span><span class="kt">int</span> <span class="n">amount</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">health</span> <span class="o">-=</span> <span class="n">amount</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">health</code>, dış dünyaya kapalıdır ama <code class="language-plaintext highlighter-rouge">Warrior</code> tarafından erişilebilir. Bu, kapsüllemeyi tamamen bozmadan esneklik sağlar.</p>

<h2 id="fonksiyon-ezme-ve-sanal-fonksiyonlar">Fonksiyon Ezme ve Sanal Fonksiyonlar</h2>

<p>Mirasın asıl yıldızı <strong>polimorfizm</strong> ile parlar. Taban sınıftaki bir davranışı türetilmiş sınıfta farklılaştırmak için <code class="language-plaintext highlighter-rouge">virtual</code> kullanılır.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Character</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="k">virtual</span> <span class="kt">void</span> <span class="n">attack</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Karakter saldırıyor."</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">class</span> <span class="nc">Archer</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Character</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">void</span> <span class="n">attack</span><span class="p">()</span> <span class="k">override</span> <span class="p">{</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Okçu ok fırlatıyor!"</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">virtual</code>, çalışma zamanında doğru fonksiyonun seçilmesini sağlar. Bu mekanizma dinamik bağlama olarak bilinir. Basitçe maliyetini şöyle düşünebiliriz: normal fonksiyon çağrısı $O(1)$ iken sanal çağrı da pratikte $O(1)$ kabul edilir, fakat küçük bir yönlendirme maliyeti vardır.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Amaç</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Miras</td>
      <td>Ortak kodu paylaşmak</td>
      <td><code class="language-plaintext highlighter-rouge">Wizard : public Character</code></td>
    </tr>
    <tr>
      <td>Ezme</td>
      <td>Davranışı özelleştirmek</td>
      <td><code class="language-plaintext highlighter-rouge">attack() override</code></td>
    </tr>
    <tr>
      <td>Polimorfizm</td>
      <td>Aynı arayüzle farklı davranış</td>
      <td><code class="language-plaintext highlighter-rouge">Character* c = new Archer()</code></td>
    </tr>
    <tr>
      <td>Kapsülleme</td>
      <td>Veriyi kontrollü saklamak</td>
      <td><code class="language-plaintext highlighter-rouge">private</code>, <code class="language-plaintext highlighter-rouge">protected</code></td>
    </tr>
  </tbody>
</table>

<h2 id="yapıcı-ve-yıkıcı-fonksiyonlara-dikkat">Yapıcı ve Yıkıcı Fonksiyonlara Dikkat</h2>

<p>Türetilmiş sınıf oluşturulurken önce taban sınıfın yapıcısı, sonra türetilmiş sınıfın yapıcısı çalışır. Yıkımda ise sıra tersinedir. Eğer taban sınıf üzerinden türetilmiş nesneleri sileceksen, yıkıcı fonksiyon <code class="language-plaintext highlighter-rouge">virtual</code> olmalıdır.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Character</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="k">virtual</span> <span class="o">~</span><span class="n">Character</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Character yok edildi."</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Aksi halde bellek sızıntısı veya eksik temizlik gibi tatsız sürprizlerle karşılaşabilirsin.</p>

<h2 id="ne-zaman-miras-kullanılmalı">Ne Zaman Miras Kullanılmalı?</h2>

<p>Miras her derde deva değildir. Eğer ilişki “bir şeydir” değil de “bir şeye sahiptir” şeklindeyse, kompozisyon daha iyi olabilir. Örneğin <code class="language-plaintext highlighter-rouge">Car</code> sınıfı <code class="language-plaintext highlighter-rouge">Engine</code> sınıfından miras almamalı; onun yerine bir <code class="language-plaintext highlighter-rouge">Engine</code> nesnesine sahip olmalıdır.</p>

<p>Sonuç olarak C++ sınıf mirası, doğru kullanıldığında kod tekrarını azaltır, tasarımı anlaşılır kılar ve polimorfizmle güçlü mimariler kurmanı sağlar. Ama unutma: Miras aile bağı gibidir; doğru akrabayı seçersen huzur, yanlış akrabayı seçersen sonsuz refactoring getirir!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="oop" /><category term="miras" /><category term="nesne yönelimli programlama" /><summary type="html"><![CDATA[C++’ta sınıf mirası, bir sınıfın başka bir sınıftan özellik ve davranış devralmasını sağlayan güçlü bir nesne yönelimli programlama mekanizmasıdır. Kısaca: “Zaten yazdığım kodu neden tekrar yazayım?” sorusuna C++’ın verdiği cevaptır. Bir oyun düşün: tüm karakterlerin adı, canı ve hareket etme davranışı var; ama büyücü ayrıca büyü yapıyor, savaşçı kılıç sallıyor. İşte miras, bu ortak ve özel tarafları düzenli biçimde ayırmamıza yardım eder.]]></summary></entry><entry><title type="html">C++ ve Oyun Motorlarının Kalbi: İşaretçilerle Belleği Dizginlemek</title><link href="https://sonsuzus.github.io/posts/c-ve-oyun-motorlarinin-kalbi-isaretcilerle-bellegi-dizginlemek/" rel="alternate" type="text/html" title="C++ ve Oyun Motorlarının Kalbi: İşaretçilerle Belleği Dizginlemek" /><published>2026-07-10T00:00:00+00:00</published><updated>2026-07-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/c-ve-oyun-motorlarinin-kalbi-isaretcilerle-bellegi-dizginlemek</id><content type="html" xml:base="https://sonsuzus.github.io/posts/c-ve-oyun-motorlarinin-kalbi-isaretcilerle-bellegi-dizginlemek/"><![CDATA[<p>Bir oyun motorunu devasa bir lunapark gibi düşünün: fizik simülasyonu hız trenidir, render sistemi ışıklı dönme dolaptır, yapay zekâ ise pamuk şeker kuyruğunda karar vermeye çalışan NPC’dir. Bu lunaparkın elektriği ise bellektir. C++ burada sahneye çıkar; çünkü işaretçiler, düşük seviyeli bellek kontrolü ve veri yerleşimi sayesinde üç boyutlu dünyaların milisaniyeler içinde hesaplanmasını sağlar.</p>

<p>``</p>

<h2 id="neden-c-hâlâ-oyun-motorlarında-bu-kadar-güçlü">Neden C++ hâlâ oyun motorlarında bu kadar güçlü?</h2>

<p>Modern oyun motorlarında her karede binlerce nesnenin konumu güncellenir, çarpışmalar çözülür, animasyonlar karıştırılır ve GPU’ya veri gönderilir. 60 FPS hedefinde bir karenin süresi yaklaşık $16.67ms$’dir. Eğer fizik, render ve oyun mantığı bu küçük zaman penceresine sığmazsa oyuncu takılma hisseder.</p>

<p>C++’ın avantajı, geliştiriciye belleğin nerede, ne zaman ve nasıl kullanılacağını söyleme şansı vermesidir. İşaretçiler sayesinde veriye doğrudan erişebilir, nesneleri kopyalamadan aktarabilir ve donanım önbelleğini daha verimli kullanabiliriz.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ham işaretçi <code class="language-plaintext highlighter-rouge">T*</code></td>
      <td>Çok hızlı, doğrudan erişim</td>
      <td>Dangling pointer, bellek sızıntısı</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::unique_ptr</code></td>
      <td>Tek sahiplik, otomatik temizlik</td>
      <td>Kopyalanamaz, tasarım dikkat ister</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::shared_ptr</code></td>
      <td>Paylaşımlı sahiplik</td>
      <td>Referans sayımı maliyeti</td>
    </tr>
    <tr>
      <td>Nesne havuzu</td>
      <td>Parçalanmayı azaltır</td>
      <td>Yönetim kodu karmaşıklaşır</td>
    </tr>
  </tbody>
</table>

<h2 id="fizik-motorunun-arkasındaki-basit-matematik">Fizik motorunun arkasındaki basit matematik</h2>

<p>Bir fizik motoru temelde şu soruyu her karede tekrar sorar: “Nesneler şimdi nerede olmalı?” En basit hareket güncellemesi şu formülle yapılabilir: $x_{t+dt} = x_t + v_t \cdot dt$. Burada $x$ konum, $v$ hız, $dt$ ise kareler arası zamandır.</p>

<p>Çarpışma tarafında iş daha eğlenceli hale gelir. Bin nesnenin birbirine çarpıp çarpmadığını saf yöntemle kontrol edersek karmaşıklık $O(n^2)$ olur. Yani 1000 nesne için yaklaşık 1 milyon karşılaştırma! Bu yüzden oyun motorları broad phase ve narrow phase gibi aşamalar kullanır.</p>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Amaç</th>
      <th>Örnek Teknik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Broad Phase</td>
      <td>Olası çarpışmaları hızlı elemek</td>
      <td>Spatial Grid, BVH, Octree</td>
    </tr>
    <tr>
      <td>Narrow Phase</td>
      <td>Gerçek temas hesaplamak</td>
      <td>SAT, GJK, Raycast</td>
    </tr>
    <tr>
      <td>Solver</td>
      <td>Tepki kuvvetini üretmek</td>
      <td>Impulse Resolution</td>
    </tr>
  </tbody>
</table>

<h2 id="i̇şaretçiler-neden-performans-için-kritik">İşaretçiler neden performans için kritik?</h2>

<p>Oyun motorlarında en büyük düşmanlardan biri gereksiz kopyalamadır. Büyük bir <code class="language-plaintext highlighter-rouge">RigidBody</code> nesnesini her fonksiyona değer olarak göndermek pahalıdır. Bunun yerine işaretçi veya referans kullanılır. Böylece nesne bellekte tek yerde durur, sistemler aynı veriye erişir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">Vec3</span> <span class="p">{</span>
    <span class="kt">float</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">RigidBody</span> <span class="p">{</span>
    <span class="n">Vec3</span> <span class="n">position</span><span class="p">;</span>
    <span class="n">Vec3</span> <span class="n">velocity</span><span class="p">;</span>
    <span class="kt">float</span> <span class="n">mass</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="nf">integrate</span><span class="p">(</span><span class="n">RigidBody</span><span class="o">*</span> <span class="n">body</span><span class="p">,</span> <span class="kt">float</span> <span class="n">dt</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">body</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>

    <span class="n">body</span><span class="o">-&gt;</span><span class="n">position</span><span class="p">.</span><span class="n">x</span> <span class="o">+=</span> <span class="n">body</span><span class="o">-&gt;</span><span class="n">velocity</span><span class="p">.</span><span class="n">x</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span>
    <span class="n">body</span><span class="o">-&gt;</span><span class="n">position</span><span class="p">.</span><span class="n">y</span> <span class="o">+=</span> <span class="n">body</span><span class="o">-&gt;</span><span class="n">velocity</span><span class="p">.</span><span class="n">y</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span>
    <span class="n">body</span><span class="o">-&gt;</span><span class="n">position</span><span class="p">.</span><span class="n">z</span> <span class="o">+=</span> <span class="n">body</span><span class="o">-&gt;</span><span class="n">velocity</span><span class="p">.</span><span class="n">z</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu kodda <code class="language-plaintext highlighter-rouge">RigidBody* body</code>, fizik nesnesinin adresini taşır. Fonksiyon nesneyi kopyalamaz; doğrudan orijinal veriyi günceller. Bu, özellikle binlerce gövdeyi her kare güncelleyen fizik sistemlerinde ciddi fark yaratır.</p>

<h2 id="bellek-havuzları-motorun-gizli-turbo-modu">Bellek havuzları: Motorun gizli turbo modu</h2>

<p>Bir sahnede sürekli mermi, parçacık, düşman veya geçici temas noktası oluşturup yok etmek klasik <code class="language-plaintext highlighter-rouge">new/delete</code> ile maliyetli olabilir. Çünkü işletim sisteminden sık sık bellek istemek yavaştır ve bellek parçalanmasına yol açar. Çözüm: önceden büyük bir blok ayırmak ve nesneleri bu bloktan dağıtmak.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">BodyPool</span> <span class="p">{</span>
    <span class="n">RigidBody</span> <span class="n">bodies</span><span class="p">[</span><span class="mi">1024</span><span class="p">];</span>
    <span class="kt">bool</span> <span class="n">used</span><span class="p">[</span><span class="mi">1024</span><span class="p">]</span> <span class="o">=</span> <span class="p">{};</span>

<span class="k">public</span><span class="o">:</span>
    <span class="n">RigidBody</span><span class="o">*</span> <span class="nf">create</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">1024</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">used</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="p">{</span>
                <span class="n">used</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
                <span class="k">return</span> <span class="o">&amp;</span><span class="n">bodies</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="nb">nullptr</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="nf">destroy</span><span class="p">(</span><span class="n">RigidBody</span><span class="o">*</span> <span class="n">body</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">index</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="n">body</span> <span class="o">-</span> <span class="n">bodies</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">index</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="mi">1024</span><span class="p">)</span> <span class="n">used</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Bu yapı, nesneleri bitişik bellekte tuttuğu için CPU önbelleğine dosttur. Yani işlemci “bir sonraki veriyi” tahmin edip daha hızlı erişebilir. Karmaşık sahnelerde bu fark, teoriden çıkıp FPS grafiğinde görünür hale gelir.</p>

<h2 id="sonuç-güç-büyük-sorumluluk-da-büyük">Sonuç: Güç büyük, sorumluluk da büyük</h2>

<p>C++ ile oyun motoru geliştirmek, spor araba kullanmaya benzer: inanılmaz hızlanır ama virajı yanlış alırsanız bariyerle tanışırsınız. İşaretçiler, bellek havuzları, RAII ve veri odaklı tasarım birlikte kullanıldığında fizik motorları daha hızlı, üç boyutlu dünyalar daha akıcı hale gelir. Kısacası C++ hâlâ oyun motorlarının kalbinde atıyorsa sebebi nostalji değil; belleğe yakın durmanın verdiği ham güçtür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="C++" /><category term="Oyun Motoru" /><category term="Bellek Yönetimi" /><category term="Fizik Motoru" /><summary type="html"><![CDATA[Bir oyun motorunu devasa bir lunapark gibi düşünün: fizik simülasyonu hız trenidir, render sistemi ışıklı dönme dolaptır, yapay zekâ ise pamuk şeker kuyruğunda karar vermeye çalışan NPC’dir. Bu lunaparkın elektriği ise bellektir. C++ burada sahneye çıkar; çünkü işaretçiler, düşük seviyeli bellek kontrolü ve veri yerleşimi sayesinde üç boyutlu dünyaların milisaniyeler içinde hesaplanmasını sağlar.]]></summary></entry><entry><title type="html">Python ile Asal Sayıları Bulan Programlar (12-14 Yaş İçin)</title><link href="https://sonsuzus.github.io/posts/python-ile-asal-saylar-bulan-programlar-12-14-yas-icin/" rel="alternate" type="text/html" title="Python ile Asal Sayıları Bulan Programlar (12-14 Yaş İçin)" /><published>2026-07-10T00:00:00+00:00</published><updated>2026-07-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/python-ile-asal-saylar-bulan-programlar-12-14-yas-icin</id><content type="html" xml:base="https://sonsuzus.github.io/posts/python-ile-asal-saylar-bulan-programlar-12-14-yas-icin/"><![CDATA[<p>Bu yazıda Python kullanarak <strong>asal sayıları bulan programlar</strong> yazacağız. Konu, 12-14 yaş seviyesine uygun olacak şekilde basit örneklerle anlatılmıştır.</p>

<h2 id="asal-sayı-nedir">Asal Sayı Nedir?</h2>

<p><strong>Asal sayı</strong>, sadece <strong>1’e</strong> ve <strong>kendisine</strong> tam bölünebilen 1’den büyük doğal sayıdır.</p>

<p>Örnek asal sayılar:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2, 3, 5, 7, 11, 13, 17, 19, 23
</code></pre></div></div>

<p>Asal olmayan sayılara <strong>asal olmayan sayı</strong> veya <strong>bileşik sayı</strong> denir.</p>

<p>Örneğin:</p>

<ul>
  <li>4 asal değildir çünkü 1, 2 ve 4’e bölünür.</li>
  <li>9 asal değildir çünkü 1, 3 ve 9’a bölünür.</li>
  <li>10 asal değildir çünkü 1, 2, 5 ve 10’a bölünür.</li>
</ul>

<blockquote>
  <p>Önemli bilgi: <strong>1 asal sayı değildir.</strong></p>
</blockquote>

<hr />

<h2 id="1-bir-sayının-asal-olup-olmadığını-bulma">1. Bir Sayının Asal Olup Olmadığını Bulma</h2>

<p>İlk olarak kullanıcıdan bir sayı alalım ve bu sayının asal olup olmadığını kontrol edelim.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sayi</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Bir sayı giriniz: </span><span class="sh">"</span><span class="p">))</span>

<span class="n">asal_mi</span> <span class="o">=</span> <span class="bp">True</span>

<span class="k">if</span> <span class="n">sayi</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
    <span class="n">asal_mi</span> <span class="o">=</span> <span class="bp">False</span>
<span class="k">else</span><span class="p">:</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">sayi</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">asal_mi</span> <span class="o">=</span> <span class="bp">False</span>
            <span class="k">break</span>

<span class="k">if</span> <span class="n">asal_mi</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="sh">"</span><span class="s">asal sayıdır.</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="sh">"</span><span class="s">asal sayı değildir.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="program-nasıl-çalışır">Program Nasıl Çalışır?</h3>

<p>Bu programda şu adımlar gerçekleşir:</p>

<ol>
  <li>Kullanıcıdan bir sayı alınır.</li>
  <li>Başlangıçta sayının asal olduğu varsayılır.</li>
  <li>Eğer sayı 1 veya daha küçükse asal değildir.</li>
  <li>Sayı, 2’den başlayarak kendisinden bir önceki sayıya kadar bölünmeye çalışılır.</li>
  <li>Eğer tam bölünürse asal değildir.</li>
  <li>Hiçbir sayıya tam bölünmezse asaldır.</li>
</ol>

<h3 id="örnek-çalışma">Örnek Çalışma</h3>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Bir sayı giriniz: 7
7 asal sayıdır.
</code></pre></div></div>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Bir sayı giriniz: 12
12 asal sayı değildir.
</code></pre></div></div>

<hr />

<h2 id="2-daha-kolay-anlamak-i̇çin-bölme-kontrolü">2. Daha Kolay Anlamak İçin Bölme Kontrolü</h2>

<p>Python’da <code class="language-plaintext highlighter-rouge">%</code> işareti <strong>mod alma</strong> anlamına gelir. Yani bölme işleminden kalan sayıyı verir.</p>

<p>Örnek:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">print</span><span class="p">(</span><span class="mi">10</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span>  <span class="c1"># 0
</span><span class="nf">print</span><span class="p">(</span><span class="mi">10</span> <span class="o">%</span> <span class="mi">3</span><span class="p">)</span>  <span class="c1"># 1
</span><span class="nf">print</span><span class="p">(</span><span class="mi">15</span> <span class="o">%</span> <span class="mi">5</span><span class="p">)</span>  <span class="c1"># 0
</span></code></pre></div></div>

<p>Eğer bir sayının başka bir sayıya bölümünden kalan <strong>0</strong> ise, bu sayı tam bölünür.</p>

<p>Örneğin:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">12</span> <span class="o">%</span> <span class="mi">3</span> <span class="o">==</span> <span class="mi">0</span>
</code></pre></div></div>

<p>Bu ifade doğrudur çünkü 12, 3’e tam bölünür.</p>

<hr />

<h2 id="3-fonksiyon-kullanarak-asal-sayı-kontrolü">3. Fonksiyon Kullanarak Asal Sayı Kontrolü</h2>

<p>Şimdi aynı işlemi bir <strong>fonksiyon</strong> ile yapalım.</p>

<p>Fonksiyonlar, aynı kodu tekrar tekrar yazmamızı engeller.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">sayi</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">sayi</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>

    <span class="k">return</span> <span class="bp">True</span>

<span class="n">numara</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Bir sayı giriniz: </span><span class="sh">"</span><span class="p">))</span>

<span class="k">if</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">numara</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">numara</span><span class="p">,</span> <span class="sh">"</span><span class="s">asal sayıdır.</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">numara</span><span class="p">,</span> <span class="sh">"</span><span class="s">asal sayı değildir.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="fonksiyon-ne-i̇şe-yarar">Fonksiyon Ne İşe Yarar?</h3>

<p>Bu bölümde <code class="language-plaintext highlighter-rouge">asal_mi</code> adında bir fonksiyon yazdık.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
</code></pre></div></div>

<p>Bu fonksiyon içine bir sayı gönderiyoruz. Fonksiyon bize <code class="language-plaintext highlighter-rouge">True</code> veya <code class="language-plaintext highlighter-rouge">False</code> döndürüyor.</p>

<table>
  <thead>
    <tr>
      <th>Sonuç</th>
      <th>Anlamı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">True</code></td>
      <td>Sayı asaldır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">False</code></td>
      <td>Sayı asal değildir</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="4-1den-ne-kadar-olan-asal-sayıları-bulma">4. 1’den N’e Kadar Olan Asal Sayıları Bulma</h2>

<p>Şimdi kullanıcıdan bir üst sınır alalım. Örneğin kullanıcı 50 girerse, 1’den 50’ye kadar olan asal sayıları ekrana yazdıralım.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">sayi</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">sayi</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>

    <span class="k">return</span> <span class="bp">True</span>

<span class="n">ust_sinir</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Üst sınırı giriniz: </span><span class="sh">"</span><span class="p">))</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Asal sayılar:</span><span class="sh">"</span><span class="p">)</span>

<span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">ust_sinir</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
        <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="örnek-çalışma-1">Örnek Çalışma</h3>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Üst sınırı giriniz: 20
Asal sayılar:
2
3
5
7
11
13
17
19
</code></pre></div></div>

<p>Bu program 1’den başlayıp kullanıcının girdiği sayıya kadar tüm sayıları kontrol eder.</p>

<hr />

<h2 id="5-asal-sayıları-liste-i̇çinde-saklama">5. Asal Sayıları Liste İçinde Saklama</h2>

<p>Bazen asal sayıları sadece ekrana yazdırmak yerine bir listede saklamak isteyebiliriz.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">sayi</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">sayi</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>

    <span class="k">return</span> <span class="bp">True</span>

<span class="n">ust_sinir</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Üst sınırı giriniz: </span><span class="sh">"</span><span class="p">))</span>
<span class="n">asal_sayilar</span> <span class="o">=</span> <span class="p">[]</span>

<span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">ust_sinir</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
        <span class="n">asal_sayilar</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Asal sayılar:</span><span class="sh">"</span><span class="p">,</span> <span class="n">asal_sayilar</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Toplam asal sayı adedi:</span><span class="sh">"</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">asal_sayilar</span><span class="p">))</span>
</code></pre></div></div>

<h3 id="örnek-çalışma-2">Örnek Çalışma</h3>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Üst sınırı giriniz: 30
Asal sayılar: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
Toplam asal sayı adedi: 10
</code></pre></div></div>

<p>Burada iki yeni şey kullandık:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">append()</code> listeye yeni eleman ekler.</li>
  <li><code class="language-plaintext highlighter-rouge">len()</code> listenin kaç elemanlı olduğunu verir.</li>
</ul>

<hr />

<h2 id="6-daha-hızlı-asal-sayı-kontrolü">6. Daha Hızlı Asal Sayı Kontrolü</h2>

<p>Bir sayının asal olup olmadığını anlamak için her zaman 2’den sayının kendisine kadar kontrol yapmamıza gerek yoktur.</p>

<p>Örneğin 36 sayısını düşünelim:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1 x 36
2 x 18
3 x 12
4 x 9
6 x 6
9 x 4
12 x 3
18 x 2
36 x 1
</code></pre></div></div>

<p>Gördüğün gibi çarpanlar bir noktadan sonra tekrar etmeye başlıyor. Bu yüzden bir sayının kareköküne kadar kontrol etmek yeterlidir.</p>

<p>Basitçe söylemek gerekirse:</p>

<blockquote>
  <p>Bir sayı asal değilse, en az bir böleni karekökünden küçük veya ona eşittir.</p>
</blockquote>

<p>Python’da karekök almak için <code class="language-plaintext highlighter-rouge">** 0.5</code> kullanabiliriz.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">sayi</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="nf">int</span><span class="p">(</span><span class="n">sayi</span> <span class="o">**</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>

    <span class="k">return</span> <span class="bp">True</span>

<span class="n">sayi</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Bir sayı giriniz: </span><span class="sh">"</span><span class="p">))</span>

<span class="k">if</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="sh">"</span><span class="s">asal sayıdır.</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="sh">"</span><span class="s">asal sayı değildir.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="neden-daha-hızlı">Neden Daha Hızlı?</h3>

<p>Diyelim ki sayı 100 olsun.</p>

<p>İlk yöntemde 2’den 99’a kadar kontrol yapılır.</p>

<p>Daha hızlı yöntemde ise sadece 2’den 10’a kadar kontrol yapılır çünkü:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>100'ün karekökü = 10
</code></pre></div></div>

<p>Bu yöntem büyük sayılarda daha hızlı çalışır.</p>

<hr />

<h2 id="7-belirli-bir-aralıktaki-asal-sayıları-bulma">7. Belirli Bir Aralıktaki Asal Sayıları Bulma</h2>

<p>Şimdi kullanıcıdan başlangıç ve bitiş değerleri alalım. Bu iki sayı arasındaki asal sayıları bulalım.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">sayi</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="nf">int</span><span class="p">(</span><span class="n">sayi</span> <span class="o">**</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>

    <span class="k">return</span> <span class="bp">True</span>

<span class="n">baslangic</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Başlangıç sayısını giriniz: </span><span class="sh">"</span><span class="p">))</span>
<span class="n">bitis</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Bitiş sayısını giriniz: </span><span class="sh">"</span><span class="p">))</span>

<span class="nf">print</span><span class="p">(</span><span class="n">baslangic</span><span class="p">,</span> <span class="sh">"</span><span class="s">ile</span><span class="sh">"</span><span class="p">,</span> <span class="n">bitis</span><span class="p">,</span> <span class="sh">"</span><span class="s">arasındaki asal sayılar:</span><span class="sh">"</span><span class="p">)</span>

<span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">baslangic</span><span class="p">,</span> <span class="n">bitis</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
        <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="örnek-çalışma-3">Örnek Çalışma</h3>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Başlangıç sayısını giriniz: 10
Bitiş sayısını giriniz: 50
10 ile 50 arasındaki asal sayılar:
11
13
17
19
23
29
31
37
41
43
47
</code></pre></div></div>

<hr />

<h2 id="8-i̇lk-n-tane-asal-sayıyı-bulma">8. İlk N Tane Asal Sayıyı Bulma</h2>

<p>Bu kez kullanıcı kaç tane asal sayı görmek istediğini girsin.</p>

<p>Örneğin kullanıcı 10 girerse, ilk 10 asal sayıyı yazdıralım.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">sayi</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="nf">int</span><span class="p">(</span><span class="n">sayi</span> <span class="o">**</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>

    <span class="k">return</span> <span class="bp">True</span>

<span class="n">adet</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Kaç tane asal sayı yazdırılsın? </span><span class="sh">"</span><span class="p">))</span>
<span class="n">bulunan</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">sayi</span> <span class="o">=</span> <span class="mi">2</span>

<span class="k">while</span> <span class="n">bulunan</span> <span class="o">&lt;</span> <span class="n">adet</span><span class="p">:</span>
    <span class="k">if</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
        <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span>
        <span class="n">bulunan</span> <span class="o">+=</span> <span class="mi">1</span>

    <span class="n">sayi</span> <span class="o">+=</span> <span class="mi">1</span>
</code></pre></div></div>

<h3 id="bu-programda-ne-öğrendik">Bu Programda Ne Öğrendik?</h3>

<p>Bu programda <code class="language-plaintext highlighter-rouge">while</code> döngüsü kullandık.</p>

<p><code class="language-plaintext highlighter-rouge">while</code> döngüsü, bir koşul doğru olduğu sürece çalışır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">while</span> <span class="n">bulunan</span> <span class="o">&lt;</span> <span class="n">adet</span><span class="p">:</span>
</code></pre></div></div>

<p>Bu satırın anlamı şudur:</p>

<blockquote>
  <p>Bulunan asal sayı miktarı, istenen adetten küçük olduğu sürece devam et.</p>
</blockquote>

<hr />

<h2 id="9-mini-proje-asal-sayı-menüsü">9. Mini Proje: Asal Sayı Menüsü</h2>

<p>Şimdi öğrendiklerimizi küçük bir programa dönüştürelim. Kullanıcı menüden seçim yapsın.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">sayi</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="nf">int</span><span class="p">(</span><span class="n">sayi</span> <span class="o">**</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>

    <span class="k">return</span> <span class="bp">True</span>

<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="se">\n</span><span class="s">--- Asal Sayı Programı ---</span><span class="sh">"</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">1 - Bir sayının asal olup olmadığını kontrol et</span><span class="sh">"</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">2 - 1</span><span class="sh">'</span><span class="s">den N</span><span class="sh">'</span><span class="s">e kadar asal sayıları yazdır</span><span class="sh">"</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">3 - Belirli aralıktaki asal sayıları yazdır</span><span class="sh">"</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">4 - Çıkış</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">secim</span> <span class="o">=</span> <span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Seçiminiz: </span><span class="sh">"</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">secim</span> <span class="o">==</span> <span class="sh">"</span><span class="s">1</span><span class="sh">"</span><span class="p">:</span>
        <span class="n">sayi</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Sayı giriniz: </span><span class="sh">"</span><span class="p">))</span>
        <span class="k">if</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
            <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="sh">"</span><span class="s">asal sayıdır.</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="sh">"</span><span class="s">asal sayı değildir.</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">elif</span> <span class="n">secim</span> <span class="o">==</span> <span class="sh">"</span><span class="s">2</span><span class="sh">"</span><span class="p">:</span>
        <span class="n">ust_sinir</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Üst sınır giriniz: </span><span class="sh">"</span><span class="p">))</span>
        <span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">ust_sinir</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
            <span class="k">if</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
                <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span>

    <span class="k">elif</span> <span class="n">secim</span> <span class="o">==</span> <span class="sh">"</span><span class="s">3</span><span class="sh">"</span><span class="p">:</span>
        <span class="n">baslangic</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Başlangıç sayısı: </span><span class="sh">"</span><span class="p">))</span>
        <span class="n">bitis</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Bitiş sayısı: </span><span class="sh">"</span><span class="p">))</span>
        <span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">baslangic</span><span class="p">,</span> <span class="n">bitis</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
            <span class="k">if</span> <span class="nf">asal_mi</span><span class="p">(</span><span class="n">sayi</span><span class="p">):</span>
                <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span>

    <span class="k">elif</span> <span class="n">secim</span> <span class="o">==</span> <span class="sh">"</span><span class="s">4</span><span class="sh">"</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Programdan çıkılıyor...</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">break</span>

    <span class="k">else</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Hatalı seçim yaptınız.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu mini proje ile şunları kullanmış olduk:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">if-elif-else</code></li>
  <li><code class="language-plaintext highlighter-rouge">for</code> döngüsü</li>
  <li><code class="language-plaintext highlighter-rouge">while</code> döngüsü</li>
  <li>fonksiyonlar</li>
  <li>listeler ve sayılarla işlem yapma</li>
</ul>

<hr />

<h2 id="sık-yapılan-hatalar">Sık Yapılan Hatalar</h2>

<h3 id="1-1-sayısını-asal-kabul-etmek">1. 1 Sayısını Asal Kabul Etmek</h3>

<p>Yanlış:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">sayi</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Asal</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Doğru:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">sayi</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Asal değil</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="2-break-kullanmayı-unutmak">2. <code class="language-plaintext highlighter-rouge">break</code> Kullanmayı Unutmak</h3>

<p>Bir sayı asal değilse, bölen bulunduğu anda döngüyü durdurabiliriz.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
    <span class="n">asal_mi</span> <span class="o">=</span> <span class="bp">False</span>
    <span class="k">break</span>
</code></pre></div></div>

<p>Bu programı daha hızlı yapar.</p>

<h3 id="3-girilen-değeri-sayıya-çevirmemek">3. Girilen Değeri Sayıya Çevirmemek</h3>

<p><code class="language-plaintext highlighter-rouge">input()</code> her zaman metin yani string döndürür. Matematik işlemleri için <code class="language-plaintext highlighter-rouge">int()</code> kullanmalıyız.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sayi</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Sayı giriniz: </span><span class="sh">"</span><span class="p">))</span>
</code></pre></div></div>

<hr />

<h2 id="alıştırmalar">Alıştırmalar</h2>

<p>Aşağıdaki alıştırmaları yaparak konuyu daha iyi öğrenebilirsin:</p>

<ol>
  <li>Kullanıcıdan 5 sayı alıp hangilerinin asal olduğunu yazdıran program yaz.</li>
  <li>1 ile 100 arasındaki asal sayıları bir listeye ekle ve listeyi yazdır.</li>
  <li>Kullanıcının girdiği iki sayı arasındaki asal sayıların toplamını bulan program yaz.</li>
  <li>İlk 20 asal sayıyı ekrana yazdır.</li>
  <li>Asal sayıları yan yana yazdıran bir program yaz.</li>
</ol>

<p>Örnek yan yana yazdırma:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="sh">"</span><span class="s"> </span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<hr />

<h2 id="sonuç">Sonuç</h2>

<p>Bu yazıda Python ile asal sayıları bulmayı öğrendik. Önce bir sayının asal olup olmadığını kontrol ettik, sonra belirli aralıklardaki asal sayıları bulduk ve en sonunda menülü küçük bir program yaptık.</p>

<p>Asal sayı programları, algoritma mantığını geliştirmek için çok güzel örneklerdir. Çünkü bu programlarda döngüler, koşullar, fonksiyonlar ve listeler birlikte kullanılır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="Python" /><category term="Asal Sayılar" /><category term="Başlangıç Seviyesi" /><category term="Algoritma" /><summary type="html"><![CDATA[Bu yazıda Python kullanarak asal sayıları bulan programlar yazacağız. Konu, 12-14 yaş seviyesine uygun olacak şekilde basit örneklerle anlatılmıştır. Asal Sayı Nedir? Asal sayı, sadece 1’e ve kendisine tam bölünebilen 1’den büyük doğal sayıdır. Örnek asal sayılar:]]></summary></entry></feed>