<?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://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-23T12:05:42+00:00</updated><id>https://program.sonsuz.us/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">Black-Scholes Modeli: Opsiyon Fiyatlamasının Matematiksel ve Algoritmik Temelleri</title><link href="https://program.sonsuz.us/posts/black-scholes-modeli-opsiyon-fiyatlamasinin-matematiksel-ve-algoritmik-temelleri/" rel="alternate" type="text/html" title="Black-Scholes Modeli: Opsiyon Fiyatlamasının Matematiksel ve Algoritmik Temelleri" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/black-scholes-modeli-opsiyon-fiyatlamasinin-matematiksel-ve-algoritmik-temelleri</id><content type="html" xml:base="https://program.sonsuz.us/posts/black-scholes-modeli-opsiyon-fiyatlamasinin-matematiksel-ve-algoritmik-temelleri/"><![CDATA[<p>Bir opsiyonun “adil” fiyatı nasıl belirlenir? Black-Scholes modeli, bu soruyu rastgele fiyat hareketlerini matematiksel bir çerçeveye oturtarak yanıtlar. Model kusursuz bir piyasa kristal küresi değildir; ancak risk, zaman ve belirsizlik arasındaki ilişkiyi anlamak için finansal matematiğin en güçlü başlangıç noktalarından biridir.
``</p>

<h2 id="opsiyon-nedir">Opsiyon nedir?</h2>

<p>Opsiyon, sahibine belirli bir varlığı gelecekte belirli bir kullanım fiyatından alma veya satma hakkı verir. <strong>Call opsiyonu</strong> alma, <strong>put opsiyonu</strong> ise satma hakkıdır. Buradaki kritik kelime “hak”tır: Opsiyon sahibi işlemi gerçekleştirmek zorunda değildir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Call opsiyonu</th>
      <th>Put opsiyonu</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sağladığı hak</td>
      <td>Varlığı satın alma</td>
      <td>Varlığı satma</td>
    </tr>
    <tr>
      <td>Değer kazandığı durum</td>
      <td>Fiyat yükseldiğinde</td>
      <td>Fiyat düştüğünde</td>
    </tr>
    <tr>
      <td>Vade sonu getirisi</td>
      <td>$\max(S_T-K,0)$</td>
      <td>$\max(K-S_T,0)$</td>
    </tr>
    <tr>
      <td>Temel beklenti</td>
      <td>Yükseliş</td>
      <td>Düşüş</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/black-scholes-modeli-65.svg" alt="black-scholes-modeli-65" /></p>

<p>Burada $S_T$ vade sonundaki varlık fiyatını, $K$ ise kullanım fiyatını gösterir.</p>

<h2 id="modelin-teorik-zemini">Modelin teorik zemini</h2>

<p>Black-Scholes, varlık fiyatının geometrik Brown hareketi izlediğini varsayar:</p>

\[dS_t = \mu S_t\,dt + \sigma S_t\,dW_t\]

<p>Bu denklemde $\mu$ beklenen getiri oranı, $\sigma$ volatilite ve $dW_t$ rastgele şoku temsil eder. Geometrik yapı sayesinde fiyatın negatif olması engellenir. Model ayrıca işlem maliyeti bulunmadığını, risksiz faiz oranının sabit olduğunu, varlığın sürekli alınıp satılabildiğini ve piyasanın arbitraja izin vermediğini kabul eder.</p>

<p>Asıl matematiksel sihir, opsiyon ile temel varlıktan oluşturulan <strong>delta-nötr portföyde</strong> gerçekleşir. Portföy çok kısa bir süre için fiyat hareketlerine karşı dengelenirse rastgelelik ortadan kaldırılabilir. Risksiz hale gelen portföy, arbitraj olmaması nedeniyle risksiz faiz oranıyla büyümelidir. Bu fikir şu kısmi diferansiyel denklemi doğurur:</p>

\[\frac{\partial V}{\partial t}+\frac{1}{2}\sigma^2S^2\frac{\partial^2V}{\partial S^2}+rS\frac{\partial V}{\partial S}-rV=0\]

<p>Avrupa tipi, temettüsüz bir call opsiyonunun kapalı form çözümü şöyledir:</p>

\[C=S_0N(d_1)-Ke^{-rT}N(d_2)\]

\[d_1=\frac{\ln(S_0/K)+(r+\sigma^2/2)T}{\sigma\sqrt{T}}, \qquad d_2=d_1-\sigma\sqrt{T}\]

<p>$N(x)$ standart normal dağılımın kümülatif dağılım fonksiyonudur. $S_0$ bugünkü fiyatı, $T$ vadeye kalan süreyi ve $r$ sürekli bileşik risksiz faiz oranını belirtir.</p>

<h2 id="algoritmik-uygulama">Algoritmik uygulama</h2>

<p>Formülü Python ile doğrudan hesaplayabiliriz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">math</span> <span class="kn">import</span> <span class="n">log</span><span class="p">,</span> <span class="n">sqrt</span><span class="p">,</span> <span class="n">exp</span><span class="p">,</span> <span class="n">erf</span>

<span class="k">def</span> <span class="nf">normal_cdf</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="c1"># Standart normal dağılımın kümülatif olasılığını hesaplar.
</span>    <span class="k">return</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="nf">erf</span><span class="p">(</span><span class="n">x</span> <span class="o">/</span> <span class="nf">sqrt</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)))</span>

<span class="k">def</span> <span class="nf">black_scholes_call</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">K</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">sigma</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">T</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="n">S</span> <span class="o">-</span> <span class="n">K</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">sigma</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="n">S</span> <span class="o">-</span> <span class="n">K</span> <span class="o">*</span> <span class="nf">exp</span><span class="p">(</span><span class="o">-</span><span class="n">r</span> <span class="o">*</span> <span class="n">T</span><span class="p">),</span> <span class="mf">0.0</span><span class="p">)</span>

    <span class="n">d1</span> <span class="o">=</span> <span class="p">(</span><span class="nf">log</span><span class="p">(</span><span class="n">S</span> <span class="o">/</span> <span class="n">K</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">r</span> <span class="o">+</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">sigma</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="n">T</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">sigma</span> <span class="o">*</span> <span class="nf">sqrt</span><span class="p">(</span><span class="n">T</span><span class="p">))</span>
    <span class="n">d2</span> <span class="o">=</span> <span class="n">d1</span> <span class="o">-</span> <span class="n">sigma</span> <span class="o">*</span> <span class="nf">sqrt</span><span class="p">(</span><span class="n">T</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">S</span> <span class="o">*</span> <span class="nf">normal_cdf</span><span class="p">(</span><span class="n">d1</span><span class="p">)</span> <span class="o">-</span> <span class="n">K</span> <span class="o">*</span> <span class="nf">exp</span><span class="p">(</span><span class="o">-</span><span class="n">r</span> <span class="o">*</span> <span class="n">T</span><span class="p">)</span> <span class="o">*</span> <span class="nf">normal_cdf</span><span class="p">(</span><span class="n">d2</span><span class="p">)</span>

<span class="n">fiyat</span> <span class="o">=</span> <span class="nf">black_scholes_call</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.04</span><span class="p">,</span> <span class="mf">0.25</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Call fiyatı: </span><span class="si">{</span><span class="n">fiyat</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Fonksiyon önce vade ve volatilite gibi sınır durumlarını denetler; ardından $d_1$ ve $d_2$ değerlerini hesaplayarak teorik call fiyatını üretir. Gerçek uygulamalarda temettü, piyasa spread’i ve veri kalitesi de hesaba katılmalıdır.</p>

<h2 id="parametreler-fiyatı-nasıl-etkiler">Parametreler fiyatı nasıl etkiler?</h2>

<table>
  <thead>
    <tr>
      <th>Değişim</th>
      <th style="text-align: right">Call üzerindeki genel etki</th>
      <th>Gerekçe</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$S_0$ artar</td>
      <td style="text-align: right">Artar</td>
      <td>Satın alma hakkı değerlenir</td>
    </tr>
    <tr>
      <td>$K$ artar</td>
      <td style="text-align: right">Azalır</td>
      <td>Kullanım pahalılaşır</td>
    </tr>
    <tr>
      <td>$\sigma$ artar</td>
      <td style="text-align: right">Artar</td>
      <td>Büyük kazanç olasılığı yükselir</td>
    </tr>
    <tr>
      <td>$T$ artar</td>
      <td style="text-align: right">Genellikle artar</td>
      <td>Olumlu hareket için süre çoğalır</td>
    </tr>
    <tr>
      <td>$r$ artar</td>
      <td style="text-align: right">Genellikle artar</td>
      <td>Kullanım fiyatının bugünkü değeri düşer</td>
    </tr>
  </tbody>
</table>

<p>Modelin en tartışmalı girdisi volatilitedir. Piyasa fiyatından tersine hesaplanan <strong>örtük volatilite</strong>, yatırımcıların gelecekteki belirsizlik beklentisini yansıtır. Gerçekte volatilite sabit değildir; ayrıca fiyatlarda sıçramalar ve kalın kuyruklar görülebilir. Bu yüzden Black-Scholes nihai gerçek değil, güçlü bir referans modelidir: Mantığı öğrenildiğinde binom ağaçları, Monte Carlo simülasyonu ve stokastik volatilite modelleri çok daha anlaşılır hale gelir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="black-scholes" /><category term="opsiyon" /><category term="finansal matematik" /><category term="python" /><category term="algoritma" /><category term="türev ürünler" /><summary type="html"><![CDATA[Bir opsiyonun “adil” fiyatı nasıl belirlenir? Black-Scholes modeli, bu soruyu rastgele fiyat hareketlerini matematiksel bir çerçeveye oturtarak yanıtlar. Model kusursuz bir piyasa kristal küresi değildir; ancak risk, zaman ve belirsizlik arasındaki ilişkiyi anlamak için finansal matematiğin en güçlü başlangıç noktalarından biridir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/black-scholes-modeli-65.png" /><media:content medium="image" url="https://program.sonsuz.us/img/black-scholes-modeli-65.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ Nesne Dilimlenmesi: Kopyalama Sırasında Kaybolan Kimlik</title><link href="https://program.sonsuz.us/posts/c-nesne-dilimlenmesi-kopyalama-sirasinda-kaybolan-kimlik/" rel="alternate" type="text/html" title="C++ Nesne Dilimlenmesi: Kopyalama Sırasında Kaybolan Kimlik" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-nesne-dilimlenmesi-kopyalama-sirasinda-kaybolan-kimlik</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-nesne-dilimlenmesi-kopyalama-sirasinda-kaybolan-kimlik/"><![CDATA[<p>C++’ta kalıtım kullanırken türetilmiş bir nesneyi temel sınıf türündeki değişkene değer olarak atamak ilk bakışta zararsız görünebilir. Kod derlenir, program çalışır ve çoğu zaman hata mesajı da alınmaz. Fakat bu işlem sırasında nesnenin yalnızca temel sınıfa ait bölümü kopyalanır; türetilmiş sınıfın eklediği veriler ve davranış kimliği kaybolur. İşte bu sessiz bilgi kaybına <strong>nesne dilimlenmesi</strong>, yani <em>object slicing</em> denir.</p>

<p>``</p>

<h2 id="nesne-neden-dilimlenir">Nesne neden “dilimlenir”?</h2>

<p>Bir türetilmiş sınıf nesnesini kavramsal olarak iki parçalı düşünebiliriz:</p>

\[Türetilmiş\ Nesne = Temel\ Bölüm + Türetilmiş\ Bölüm\]

<p>Temel sınıf türünde değer saklayan bir değişkenin kapasitesi ise yalnızca temel bölüme uygundur. Dolayısıyla aşağıdaki atamada <code class="language-plaintext highlighter-rouge">Calisan</code> nesnesinin <code class="language-plaintext highlighter-rouge">Yazilimci</code> sınıfına özgü kısmı hedef nesneye sığmaz. C++ bu kısmı hata vermeden dışarıda bırakır.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">Calisan</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">ad</span><span class="p">;</span>

    <span class="k">virtual</span> <span class="kt">void</span> <span class="n">tanit</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ad</span> <span class="o">&lt;&lt;</span> <span class="s">": Calisan</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">class</span> <span class="nc">Yazilimci</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Calisan</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">dil</span><span class="p">;</span>

    <span class="kt">void</span> <span class="n">tanit</span><span class="p">()</span> <span class="k">const</span> <span class="k">override</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ad</span> <span class="o">&lt;&lt;</span> <span class="s">": "</span> <span class="o">&lt;&lt;</span> <span class="n">dil</span> <span class="o">&lt;&lt;</span> <span class="s">" gelistiricisi</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Yazilimci</span> <span class="n">y</span><span class="p">;</span>
    <span class="n">y</span><span class="p">.</span><span class="n">ad</span> <span class="o">=</span> <span class="s">"Ada"</span><span class="p">;</span>
    <span class="n">y</span><span class="p">.</span><span class="n">dil</span> <span class="o">=</span> <span class="s">"C++"</span><span class="p">;</span>

    <span class="n">Calisan</span> <span class="n">c</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span> <span class="c1">// Nesne dilimlenir</span>
    <span class="n">c</span><span class="p">.</span><span class="n">tanit</span><span class="p">();</span>     <span class="c1">// Ada: Calisan</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">tanit()</code> sanal olmasına rağmen sonuç değişmez. Çünkü <code class="language-plaintext highlighter-rouge">c</code>, artık bağımsız ve gerçek bir <code class="language-plaintext highlighter-rouge">Calisan</code> nesnesidir. İçinde <code class="language-plaintext highlighter-rouge">Yazilimci</code> kimliği bulunmadığından sanal fonksiyon mekanizmasının çağırabileceği türetilmiş davranış da kalmamıştır. <code class="language-plaintext highlighter-rouge">virtual</code>, dilimlenmeyi önlemez; yalnızca nesneye referans veya işaretçi üzerinden erişildiğinde dinamik türü kullanır.</p>

<table>
  <thead>
    <tr>
      <th>Aktarım biçimi</th>
      <th style="text-align: right">Kopyalama var mı?</th>
      <th style="text-align: right">Türetilmiş bilgi korunur mu?</th>
      <th style="text-align: right">Polimorfizm çalışır mı?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Calisan c = y</code></td>
      <td style="text-align: right">Evet</td>
      <td style="text-align: right">Hayır</td>
      <td style="text-align: right">Hayır</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Calisan&amp; c = y</code></td>
      <td style="text-align: right">Hayır</td>
      <td style="text-align: right">Evet</td>
      <td style="text-align: right">Evet</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">Calisan* c = &amp;y</code></td>
      <td style="text-align: right">Hayır</td>
      <td style="text-align: right">Evet</td>
      <td style="text-align: right">Evet</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">unique_ptr&lt;Calisan&gt;</code></td>
      <td style="text-align: right">Nesnenin kendisi kopyalanmaz</td>
      <td style="text-align: right">Evet</td>
      <td style="text-align: right">Evet</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/c-nesne-dilimlenmesi-46.svg" alt="c-nesne-dilimlenmesi-46" /></p>

<h2 id="fonksiyon-parametrelerindeki-gizli-tuzak">Fonksiyon parametrelerindeki gizli tuzak</h2>

<p>Dilimlenme yalnızca açık atamalarda oluşmaz. Temel sınıfı değer olarak kabul eden fonksiyonlar da aynı soruna yol açar:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">bilgiYaz</span><span class="p">(</span><span class="n">Calisan</span> <span class="n">calisan</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Değer ile alınıyor</span>
    <span class="n">calisan</span><span class="p">.</span><span class="n">tanit</span><span class="p">();</span>
<span class="p">}</span>

<span class="n">Yazilimci</span> <span class="n">y</span><span class="p">;</span>
<span class="n">bilgiYaz</span><span class="p">(</span><span class="n">y</span><span class="p">);</span> <span class="c1">// Parametre oluşturulurken dilimlenir</span>
</code></pre></div></div>

<p>Çözüm, parametreyi çoğunlukla sabit referansla almaktır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">bilgiYaz</span><span class="p">(</span><span class="k">const</span> <span class="n">Calisan</span><span class="o">&amp;</span> <span class="n">calisan</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">calisan</span><span class="p">.</span><span class="n">tanit</span><span class="p">();</span> <span class="c1">// Gerçek türe göre çağrı yapılır</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu yöntem hem türetilmiş kimliği korur hem de gereksiz nesne kopyasını engeller. Fonksiyon nesneyi değiştirmeyecekse <code class="language-plaintext highlighter-rouge">const</code> kullanılması niyeti açıkça belirtir.</p>

<h2 id="koleksiyonlarda-doğru-tür-seçimi">Koleksiyonlarda doğru tür seçimi</h2>

<p><code class="language-plaintext highlighter-rouge">std::vector&lt;Calisan&gt;</code> içine <code class="language-plaintext highlighter-rouge">Yazilimci</code> eklemek de nesneyi dilimler. Farklı türetilmiş türleri aynı koleksiyonda polimorfik olarak saklamak için akıllı işaretçiler kullanılabilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;memory&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o">&lt;</span><span class="n">Calisan</span><span class="o">&gt;&gt;</span> <span class="n">ekip</span><span class="p">;</span>
<span class="n">ekip</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o">&lt;</span><span class="n">Yazilimci</span><span class="o">&gt;</span><span class="p">());</span>

<span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span><span class="o">&amp;</span> <span class="n">kisi</span> <span class="o">:</span> <span class="n">ekip</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">kisi</span><span class="o">-&gt;</span><span class="n">tanit</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada vektör nesnelerin kendilerini değil, temel sınıf türündeki sahiplik işaretçilerini saklar. Gerçek nesneler türetilmiş türleriyle yaşamaya devam eder. Temel sınıf üzerinden silme yapılacağı için yıkıcının da sanal olması gerekir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">virtual</span> <span class="o">~</span><span class="n">Calisan</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
</code></pre></div></div>

<p>Özetle, değer semantiği bilinçli bir temel sınıf kopyası istendiğinde uygundur; polimorfik davranış istendiğinde ise referanslar, işaretçiler ve akıllı işaretçiler tercih edilmelidir. Derleyicinin sessiz kalması işlemin zararsız olduğu anlamına gelmez: Nesnenin yalnızca üst dilimini servis edip geri kalanını mutfakta unutmuş olabilirsiniz.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="nesne yönelimli programlama" /><category term="object slicing" /><category term="kalıtım" /><category term="polimorfizm" /><category term="referanslar" /><summary type="html"><![CDATA[C++’ta kalıtım kullanırken türetilmiş bir nesneyi temel sınıf türündeki değişkene değer olarak atamak ilk bakışta zararsız görünebilir. Kod derlenir, program çalışır ve çoğu zaman hata mesajı da alınmaz. Fakat bu işlem sırasında nesnenin yalnızca temel sınıfa ait bölümü kopyalanır; türetilmiş sınıfın eklediği veriler ve davranış kimliği kaybolur. İşte bu sessiz bilgi kaybına nesne dilimlenmesi, yani object slicing denir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-nesne-dilimlenmesi-46.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-nesne-dilimlenmesi-46.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++’ta Manuel Kaynak Yönetimi: Exception Gelince Sızıntı Başlar</title><link href="https://program.sonsuz.us/posts/cta-manuel-kaynak-yonetimi-exception-gelince-sizinti-baslar/" rel="alternate" type="text/html" title="C++’ta Manuel Kaynak Yönetimi: Exception Gelince Sızıntı Başlar" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/cta-manuel-kaynak-yonetimi-exception-gelince-sizinti-baslar</id><content type="html" xml:base="https://program.sonsuz.us/posts/cta-manuel-kaynak-yonetimi-exception-gelince-sizinti-baslar/"><![CDATA[<p>C++ geliştirirken <code class="language-plaintext highlighter-rouge">new</code> ile bellek ayırıp işimiz bitince <code class="language-plaintext highlighter-rouge">delete</code> çağırmak ilk bakışta oldukça düzenli görünür. Fakat kodun ortasında bir istisna fırlatıldığında kontrol akışı planladığımız yolu izlemez. Temizlik satırına ulaşılamaz ve ayrılan kaynak sahipsiz kalır. Program çalışmaya devam etse bile bellekte küçük bir hayalet dolaşmaya başlar.</p>

<p>``</p>

<h2 id="sorun-yalnızca-delete-unutmak-değildir">Sorun yalnızca <code class="language-plaintext highlighter-rouge">delete</code> unutmak değildir</h2>

<p>Manuel kaynak yönetiminde genellikle kaynağın yaşam süresini zihnimizde takip ederiz: kaynağı edin, kullan ve serbest bırak. İdeal akış şöyle düşünülebilir:</p>

\[T_{yaşam} = T_{serbest\ bırakma} - T_{edinme}\]

<p>Ancak bir exception oluştuğunda fonksiyon normal dönüş noktasına ulaşmaz. C++ çalışma zamanı stack unwinding işlemini başlatır; yani çağrı yığınındaki yerel nesneler geriye doğru yok edilir. Ham işaretçinin kendisi yok olur fakat işaret ettiği dinamik nesne otomatik olarak silinmez.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdexcept&gt;</span><span class="cp">
</span>
<span class="kt">void</span> <span class="nf">veriyiIsle</span><span class="p">()</span> <span class="p">{</span>
    <span class="kt">int</span><span class="o">*</span> <span class="n">sayilar</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="p">[</span><span class="mi">1000</span><span class="p">];</span>

    <span class="n">sayilar</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="p">(</span><span class="s">"Dosya okunamadı"</span><span class="p">);</span>

    <span class="k">delete</span><span class="p">[]</span> <span class="n">sayilar</span><span class="p">;</span> <span class="c1">// Bu satıra hiçbir zaman ulaşılamaz.</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Buradaki sızıntının matematiksel özeti basittir:</p>

\[Ayrılan\ Kaynaklar - Serbest\ Bırakılan\ Kaynaklar &gt; 0\]

<p>Fonksiyon her çağrıldığında yeni bir blok ayrılır. Hata tekrarlanırsa kayıp miktarı birikir. Tek çağrıdaki sızıntı $M$ bayt ve hatalı çağrı sayısı $n$ ise toplam kayıp yaklaşık $n \times M$ olur.</p>

<h2 id="try-catch-ile-temizlik-yeterli-mi"><code class="language-plaintext highlighter-rouge">try-catch</code> ile temizlik yeterli mi?</h2>

<p>Kaynağı <code class="language-plaintext highlighter-rouge">catch</code> bloğunda temizlemek mümkündür, fakat çözüm hızla kırılganlaşır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">veriyiIsle</span><span class="p">()</span> <span class="p">{</span>
    <span class="kt">int</span><span class="o">*</span> <span class="n">sayilar</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="p">[</span><span class="mi">1000</span><span class="p">];</span>

    <span class="k">try</span> <span class="p">{</span>
        <span class="n">riskliIslem</span><span class="p">(</span><span class="n">sayilar</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">catch</span> <span class="p">(...)</span> <span class="p">{</span>
        <span class="k">delete</span><span class="p">[]</span> <span class="n">sayilar</span><span class="p">;</span>
        <span class="k">throw</span><span class="p">;</span> <span class="c1">// Orijinal exception yeniden gönderilir.</span>
    <span class="p">}</span>

    <span class="k">delete</span><span class="p">[]</span> <span class="n">sayilar</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu kod sızıntıyı önleyebilir; ancak hem normal hem de hatalı yol için aynı temizlik işlemi yazılmıştır. Fonksiyona dosya tanıtıcısı, kilit veya ikinci bir bellek bloğu eklendiğinde olası çıkış yolları çoğalır. Ayrıca yanlış sırada temizlik yapmak ya da bir kaynağı iki kez serbest bırakmak mümkündür.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th style="text-align: right">Exception güvenliği</th>
      <th style="text-align: right">Bakım maliyeti</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ham işaretçi ve manuel <code class="language-plaintext highlighter-rouge">delete</code></td>
      <td style="text-align: right">Düşük</td>
      <td style="text-align: right">Yüksek</td>
      <td>Sızıntı, çift silme</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">try-catch</code> ile manuel temizlik</td>
      <td style="text-align: right">Orta</td>
      <td style="text-align: right">Yüksek</td>
      <td>Tekrarlı ve kırılgan kod</td>
    </tr>
    <tr>
      <td>RAII nesnesi</td>
      <td style="text-align: right">Yüksek</td>
      <td style="text-align: right">Düşük</td>
      <td>Sahiplik daha nettir</td>
    </tr>
    <tr>
      <td>Akıllı işaretçi</td>
      <td style="text-align: right">Yüksek</td>
      <td style="text-align: right">Düşük</td>
      <td>Yanlış işaretçi türü seçimi</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/cta-manuel-kaynak-67.svg" alt="cta-manuel-kaynak-67" /></p>

<h2 id="güvenli-çözüm-raii">Güvenli çözüm: RAII</h2>

<p>RAII, kaynağın yaşam süresini bir nesnenin yaşam süresine bağlar. Kullanıcı manuel olarak yıkıcı çağırmaz; kapsam sona erdiğinde yıkıcı dil tarafından otomatik çağrılır. Exception oluşması da bu davranışı bozmaz.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;memory&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdexcept&gt;</span><span class="cp">
</span>
<span class="kt">void</span> <span class="nf">veriyiIsle</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">auto</span> <span class="n">sayilar</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">[]</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
    <span class="n">sayilar</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>

    <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">runtime_error</span><span class="p">(</span><span class="s">"İşlem başarısız"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">std::unique_ptr</code>, dizinin tek sahibidir. Stack unwinding sırasında <code class="language-plaintext highlighter-rouge">sayilar</code> nesnesinin yıkıcısı çalışır ve dinamik dizi serbest bırakılır. Açık bir <code class="language-plaintext highlighter-rouge">delete[]</code> satırına ihtiyaç kalmaz.</p>

<p>Çoğu durumda dinamik dizi için daha doğal seçenek <code class="language-plaintext highlighter-rouge">std::vector</code> kullanmaktır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
</span>
<span class="kt">void</span> <span class="nf">veriyiIsle</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">sayilar</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
    <span class="n">sayilar</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="n">riskliIslem</span><span class="p">(</span><span class="n">sayilar</span><span class="p">.</span><span class="n">data</span><span class="p">());</span>
<span class="p">}</span>
</code></pre></div></div>

<p>RAII yalnızca bellek için değildir. Dosyalar, mutex kilitleri, soketler ve veritabanı bağlantıları da aynı ilkeyle kapsüllenebilir. Temel kural şudur: Kaynağı edinen nesne, onu bırakmaktan da sorumlu olmalıdır. Böylece exception geldiğinde temizlik bir dilek değil, kapsam mekanizmasının garantisi olur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="raii" /><category term="exception" /><category term="bellek yönetimi" /><category term="akıllı işaretçiler" /><summary type="html"><![CDATA[C++ geliştirirken new ile bellek ayırıp işimiz bitince delete çağırmak ilk bakışta oldukça düzenli görünür. Fakat kodun ortasında bir istisna fırlatıldığında kontrol akışı planladığımız yolu izlemez. Temizlik satırına ulaşılamaz ve ayrılan kaynak sahipsiz kalır. Program çalışmaya devam etse bile bellekte küçük bir hayalet dolaşmaya başlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/cta-manuel-kaynak-67.png" /><media:content medium="image" url="https://program.sonsuz.us/img/cta-manuel-kaynak-67.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Finansal Dolandırıcılık Tespiti: Makine Öğrenmesi Şüpheli İşlemleri Nasıl Yakalar?</title><link href="https://program.sonsuz.us/posts/finansal-dolandiricilik-tespiti-makine-ogrenmesi-supheli-islemleri-nasil-yakalar/" rel="alternate" type="text/html" title="Finansal Dolandırıcılık Tespiti: Makine Öğrenmesi Şüpheli İşlemleri Nasıl Yakalar?" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/finansal-dolandiricilik-tespiti-makine-ogrenmesi-supheli-islemleri-nasil-yakalar</id><content type="html" xml:base="https://program.sonsuz.us/posts/finansal-dolandiricilik-tespiti-makine-ogrenmesi-supheli-islemleri-nasil-yakalar/"><![CDATA[<p>Kredi kartınızla gece yarısı başka bir ülkede yüksek tutarlı alışveriş yapıldığını düşünün. Bankanın saniyeler içinde işlemi durdurup size bildirim göndermesi sihir değil; geçmiş işlemlerden davranış kalıpları öğrenen makine öğrenmesi sistemlerinin eseridir. Ancak bu sistemlerin görevi yalnızca “garip” işlemleri bulmak değil, gerçek müşterileri gereksiz yere rahatsız etmeden dolandırıcılığı mümkün olduğunca erken yakalamaktır.</p>

<p><img src="/img/finansal-dolandiricilik-tespiti-12.svg" alt="finansal-dolandiricilik-tespiti-12" /></p>

<p>``</p>

<h2 id="problem-neden-zordur">Problem neden zordur?</h2>

<p>Finansal dolandırıcılık tespiti, klasik bir <strong>ikili sınıflandırma</strong> problemine benzer. Her işlem için model iki olasılıktan birini tahmin eder:</p>

<ul>
  <li>$y=0$: Normal işlem</li>
  <li>$y=1$: Dolandırıcılık</li>
</ul>

<p>Model; tutar, saat, konum, cihaz, iş yeri kategorisi ve müşterinin geçmiş davranışları gibi özellikleri kullanarak $P(y=1\vert x)$ olasılığını hesaplar. Bu olasılık belirlenen eşikten yüksekse işlem incelemeye gönderilir veya geçici olarak durdurulur.</p>

<p>Asıl sorun, veri kümesinin son derece dengesiz olmasıdır. Bir milyon işlem içinde yalnızca bin dolandırıcılık bulunabilir. Her işleme “normal” diyen tembel bir model, %99,9 doğruluk elde eder; fakat tek bir suçluyu bile yakalayamaz. Yani yüksek <strong>accuracy</strong>, burada tek başına etkileyici görünen ama pek işe yaramayan bir vitrindir.</p>

<table>
  <thead>
    <tr>
      <th>Metrik</th>
      <th>Cevapladığı soru</th>
      <th>Finansal anlamı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Precision</td>
      <td>Alarm verilen işlemlerin kaçı gerçekten şüpheli?</td>
      <td>Gereksiz müşteri engellemelerini azaltır</td>
    </tr>
    <tr>
      <td>Recall</td>
      <td>Dolandırıcılıkların kaçı yakalandı?</td>
      <td>Finansal kaybı azaltır</td>
    </tr>
    <tr>
      <td>F1 skoru</td>
      <td>Precision ve recall dengeli mi?</td>
      <td>Genel karşılaştırma sağlar</td>
    </tr>
    <tr>
      <td>ROC-AUC</td>
      <td>Model sınıfları ne kadar iyi ayırıyor?</td>
      <td>Eşik bağımsız değerlendirme sunar</td>
    </tr>
  </tbody>
</table>

<p>Precision ve recall arasındaki denge şu formülle özetlenebilir:</p>

\[F1 = 2 \times \frac{Precision \times Recall}{Precision + Recall}\]

<h2 id="model-neye-bakar">Model neye bakar?</h2>

<p>Ham işlem verileri çoğu zaman yeterli değildir. Etkili sistemler, davranışı temsil eden yeni özellikler üretir. Örneğin müşterinin son bir saatte yaptığı işlem sayısı, mevcut tutarın ortalama harcamaya oranı veya ardışık işlemler arasındaki coğrafi mesafe hesaplanabilir.</p>

<table>
  <thead>
    <tr>
      <th>Normal davranış</th>
      <th>Şüpheli davranış</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Düzenli saatlerde alışveriş</td>
      <td>Alışılmadık saatte yüksek harcama</td>
    </tr>
    <tr>
      <td>Sık kullanılan cihaz</td>
      <td>İlk kez görülen cihaz</td>
    </tr>
    <tr>
      <td>Yakın şehirlerde işlemler</td>
      <td>Dakikalar içinde farklı ülkeler</td>
    </tr>
    <tr>
      <td>Ortalama tutara yakın ödeme</td>
      <td>Ortalamanın çok üzerinde ödeme</td>
    </tr>
  </tbody>
</table>

<p>Örneğin İstanbul’da yapılan bir işlemin beş dakika ardından Tokyo’da fiziksel kart kullanılması, “imkânsız seyahat” sinyalidir. Yine de tek bir sinyal kesin suç kanıtı değildir. Müşteri VPN kullanıyor, seyahat ediyor veya alışılmadık ama tamamen meşru bir alışveriş yapıyor olabilir.</p>

<h2 id="hangi-algoritmalar-kullanılır">Hangi algoritmalar kullanılır?</h2>

<p>Lojistik regresyon açıklanabilir ve hızlı bir başlangıç modelidir. Karar ağaçları, Random Forest ve özellikle XGBoost gibi yöntemler karmaşık ilişkileri daha iyi yakalayabilir. Etiketlenmiş dolandırıcılık örneklerinin az olduğu durumlarda Isolation Forest veya Autoencoder gibi <strong>anomali tespiti</strong> yöntemleri devreye girer.</p>

<p>Aşağıdaki örnek, dengesiz sınıflara ağırlık vererek basit bir model eğitir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">RandomForestClassifier</span>
<span class="kn">from</span> <span class="n">sklearn.metrics</span> <span class="kn">import</span> <span class="n">classification_report</span>

<span class="c1"># Az görülen dolandırıcılık sınıfına otomatik olarak daha fazla önem verir.
</span><span class="n">model</span> <span class="o">=</span> <span class="nc">RandomForestClassifier</span><span class="p">(</span>
    <span class="n">n_estimators</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span>
    <span class="n">class_weight</span><span class="o">=</span><span class="sh">'</span><span class="s">balanced</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span>
<span class="p">)</span>

<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">)</span>
<span class="n">predictions</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">classification_report</span><span class="p">(</span><span class="n">y_test</span><span class="p">,</span> <span class="n">predictions</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">class_weight='balanced'</code>, azınlık sınıfındaki hataların model açısından daha maliyetli olmasını sağlar. Alternatif olarak SMOTE ile sentetik örnek üretilebilir; ancak zaman sıralı finans verilerinde veri sızıntısını önlemek için eğitim ve test ayrımı kronolojik yapılmalıdır.</p>

<h2 id="gerçek-sistemlerde-karar-nasıl-verilir">Gerçek sistemlerde karar nasıl verilir?</h2>

<p>Üretim ortamında model genellikle tek başına karar vermez. Model skoru, kural motoru ve risk politikaları birlikte çalışır. Düşük riskli işlem onaylanabilir, orta riskli işlem için ek doğrulama istenebilir, yüksek riskli işlem ise engellenip uzman incelemesine gönderilebilir.</p>

<p>Dolandırıcıların davranışları sürekli değiştiği için model de düzenli olarak izlenmeli ve yeniden eğitilmelidir. Buna <strong>concept drift</strong> denir. Başarılı bir sistem yalnızca geçmiş suçları ezberlemez; yeni saldırı biçimlerine uyum sağlar, yanlış alarmları kontrol eder ve kararlarının nedenini açıklayabilir. Kısacası makine öğrenmesi dijital bir dedektiftir; fakat iyi veri, doğru metrikler ve insan denetimi olmadan büyüteci ters tutabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="makine öğrenmesi" /><category term="finans" /><category term="dolandırıcılık tespiti" /><category term="veri bilimi" /><category term="anomali tespiti" /><category term="python" /><summary type="html"><![CDATA[Kredi kartınızla gece yarısı başka bir ülkede yüksek tutarlı alışveriş yapıldığını düşünün. Bankanın saniyeler içinde işlemi durdurup size bildirim göndermesi sihir değil; geçmiş işlemlerden davranış kalıpları öğrenen makine öğrenmesi sistemlerinin eseridir. Ancak bu sistemlerin görevi yalnızca “garip” işlemleri bulmak değil, gerçek müşterileri gereksiz yere rahatsız etmeden dolandırıcılığı mümkün olduğunca erken yakalamaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/finansal-dolandiricilik-tespiti-12.png" /><media:content medium="image" url="https://program.sonsuz.us/img/finansal-dolandiricilik-tespiti-12.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kamera-Robot Kalibrasyon Hataları El-Göz Koordinasyonunu Nasıl Bozar?</title><link href="https://program.sonsuz.us/posts/kamera-robot-kalibrasyon-hatalari-el-goz-koordinasyonunu-nasil-bozar/" rel="alternate" type="text/html" title="Kamera-Robot Kalibrasyon Hataları El-Göz Koordinasyonunu Nasıl Bozar?" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kamera-robot-kalibrasyon-hatalari-el-goz-koordinasyonunu-nasil-bozar</id><content type="html" xml:base="https://program.sonsuz.us/posts/kamera-robot-kalibrasyon-hatalari-el-goz-koordinasyonunu-nasil-bozar/"><![CDATA[<p>Bir robotun kamerayla gördüğü parçayı doğru noktadan yakalaması, iki farklı dünyanın aynı koordinat dilini konuşmasına bağlıdır. Kamera-robot kalibrasyonundaki birkaç milimetrelik kayma veya küçük bir açı hatası, robot kolunun hedefi ıskalamasına, parçaya eğri yaklaşmasına, hatta pahalı bir çarpışmaya yol açabilir. Kısacası kamera doğru görse ve robot kusursuz hareket etse bile aralarındaki tercüman hatalıysa el-göz koordinasyonu bozulur.
``</p>

<h2 id="el-göz-kalibrasyonu-neyi-çözer">El-göz kalibrasyonu neyi çözer?</h2>

<p>El-göz kalibrasyonunun amacı kamera koordinat sistemi ile robotun uç efektörü veya tabanı arasındaki dönüşümü bulmaktır. Kamera robotun bileğine takılıysa <strong>eye-in-hand</strong>, çalışma alanını dışarıdan izliyorsa <strong>eye-to-hand</strong> düzeni kullanılır.</p>

<p>Bir rijit dönüşüm, dönme matrisi $R$ ve öteleme vektörü $t$ ile ifade edilir:</p>

\[T = \begin{bmatrix} R &amp; t \\ 0 &amp; 1 \end{bmatrix}\]

<p>Klasik hand-eye problemi çoğunlukla şu denklem üzerinden çözülür:</p>

\[A_i X = X B_i\]

<p>Burada $A_i$ robotun iki poz arasındaki hareketini, $B_i$ kameranın aynı pozlar arasındaki hareketini, $X$ ise aranan kamera-robot dönüşümünü temsil eder. Ölçümler gürültülü olduğundan eşitlik pratikte tam sağlanmaz; algoritma en uygun $X$ dönüşümünü tahmin eder.</p>

<table>
  <thead>
    <tr>
      <th>Hata türü</th>
      <th>Görülen belirti</th>
      <th>Muhtemel kaynak</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Öteleme hatası</td>
      <td>Tüm hedeflerde benzer yönlü kaçırma</td>
      <td>Yanlış TCP veya ölçüm</td>
    </tr>
    <tr>
      <td>Dönme hatası</td>
      <td>Uzak hedeflerde büyüyen sapma</td>
      <td>Yetersiz poz çeşitliliği</td>
    </tr>
    <tr>
      <td>Kamera iç kalibrasyon hatası</td>
      <td>Görüntü kenarlarında bozulma</td>
      <td>Lens distorsiyonu</td>
    </tr>
    <tr>
      <td>Zamanlama hatası</td>
      <td>Hareket sırasında değişken sonuç</td>
      <td>Kamera-robot senkronizasyonu</td>
    </tr>
  </tbody>
</table>

<h2 id="küçük-açı-büyük-sorun">Küçük açı, büyük sorun</h2>

<p>Dönüş hataları özellikle sinsidir. Yaklaşık $theta$ radyanlık açısal hata, kameradan $d$ uzaklıktaki bir hedefte şu büyüklükte konum sapması oluşturabilir:</p>

\[e_p \approx d \cdot theta\]

<p>Örneğin $theta = 0.5° \approx 0.0087$ radyan ve $d = 1$ metre ise sapma yaklaşık $8.7$ milimetredir. Hassas montaj yapan bir robot için bu değer oldukça büyüktür. Üstelik TCP yanlış tanımlanmışsa hata, robot bileğini döndürdükçe yön değiştiren dairesel bir davranış gösterebilir.</p>

<p>Aşağıdaki Python kodu, küçük açı yaklaşımıyla uzaklığa bağlı yanal hatayı hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">math</span>

<span class="k">def</span> <span class="nf">lateral_error</span><span class="p">(</span><span class="n">distance_m</span><span class="p">,</span> <span class="n">angle_deg</span><span class="p">):</span>
    <span class="c1"># Dereceyi radyana çevirip yaklaşık yanal sapmayı bulur.
</span>    <span class="n">angle_rad</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">radians</span><span class="p">(</span><span class="n">angle_deg</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">distance_m</span> <span class="o">*</span> <span class="n">angle_rad</span>

<span class="k">for</span> <span class="n">distance</span> <span class="ow">in</span> <span class="p">[</span><span class="mf">0.25</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">]:</span>
    <span class="n">error_m</span> <span class="o">=</span> <span class="nf">lateral_error</span><span class="p">(</span><span class="n">distance</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">distance</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="s"> m -&gt; </span><span class="si">{</span><span class="n">error_m</span> <span class="o">*</span> <span class="mi">1000</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="s"> mm</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu basit hesap, kalibrasyon raporunda küçük görünen açısal artıkların neden çalışma alanının uzak bölgelerinde ciddi sonuçlar doğurduğunu gösterir.</p>

<h2 id="kalibrasyon-neden-kötü-çıkar">Kalibrasyon neden kötü çıkar?</h2>

<p>En yaygın nedenlerden biri, örnek pozların birbirine fazla benzemesidir. Robot yalnızca doğrusal hareket ettirilirse sistem bazı dönüş bileşenlerini yeterince gözlemleyemez. Farklı eksenlerde dönüşler, çeşitli mesafeler ve çalışma hacmini kapsayan pozlar kullanılmalıdır. Bulanık görüntü, hatalı kalibrasyon deseni ölçüsü, gevşek kamera bağlantısı ve otomatik odak değişimi de sonucu bozar.</p>

<p>Yalnızca düşük yeniden izdüşüm hatasına güvenmek de tehlikelidir. Kamera iç kalibrasyonu başarılı görünürken kamera-robot dönüşümü yanlış olabilir. Bu nedenle doğrulama, eğitimde kullanılmamış pozlarla yapılmalıdır.</p>

<h2 id="sağlam-doğrulama-stratejisi">Sağlam doğrulama stratejisi</h2>

<p>Robotu bilinen kontrol noktalarına yönlendirin ve konum hatasını her eksen için ölçün. Ardından farklı bilek açılarını, yakın-uzak hedefleri ve görüntü merkezinden kenarlara doğru noktaları test edin. Hata mesafeyle büyüyorsa dönme; yaklaşık sabit kalıyorsa öteleme problemi düşünülmelidir.</p>

<p>Son olarak medyan hata kadar maksimum hatayı da raporlayın. Ortalama değer güzel görünürken tek bir uç poz üretim hattını durdurabilir. İyi el-göz koordinasyonu, yalnızca bir kalibrasyon matrisi hesaplamak değil; mekanik sağlamlık, zaman senkronizasyonu, çeşitli örnekleme ve bağımsız doğrulamayı birlikte yönetmektir.</p>

<p><img src="/img/kamera-robot-kalibrasyon-39.svg" alt="kamera-robot-kalibrasyon-39" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="kalibrasyon" /><category term="bilgisayarlı görü" /><category term="el-göz koordinasyonu" /><category term="python" /><category term="otomasyon" /><summary type="html"><![CDATA[Bir robotun kamerayla gördüğü parçayı doğru noktadan yakalaması, iki farklı dünyanın aynı koordinat dilini konuşmasına bağlıdır. Kamera-robot kalibrasyonundaki birkaç milimetrelik kayma veya küçük bir açı hatası, robot kolunun hedefi ıskalamasına, parçaya eğri yaklaşmasına, hatta pahalı bir çarpışmaya yol açabilir. Kısacası kamera doğru görse ve robot kusursuz hareket etse bile aralarındaki tercüman hatalıysa el-göz koordinasyonu bozulur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kamera-robot-kalibrasyon-39.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kamera-robot-kalibrasyon-39.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">MMORPG Sunucu Mimarisi: Binlerce Oyuncu Tek Dünyada Nasıl Buluşuyor?</title><link href="https://program.sonsuz.us/posts/mmorpg-sunucu-mimarisi-binlerce-oyuncu-tek-dunyada-nasil-bulusuyor/" rel="alternate" type="text/html" title="MMORPG Sunucu Mimarisi: Binlerce Oyuncu Tek Dünyada Nasıl Buluşuyor?" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/mmorpg-sunucu-mimarisi-binlerce-oyuncu-tek-dunyada-nasil-bulusuyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/mmorpg-sunucu-mimarisi-binlerce-oyuncu-tek-dunyada-nasil-bulusuyor/"><![CDATA[<p>Bir MMORPG dünyasına bağlanıp kalabalık bir şehre girdiğinizde yüzlerce oyuncuyu koşarken, ticaret yaparken ve devasa yaratıklarla savaşırken görebilirsiniz. Ekrandaki bu canlılığın arkasında ise tek bir süper bilgisayar değil; görevleri paylaşan, birbirleriyle sürekli haberleşen ve arızalara karşı hazırlıklı çalışan dağıtık sunucular bulunur.</p>

<p><img src="/img/mmorpg-sunucu-mimarisi-78.svg" alt="mmorpg-sunucu-mimarisi-78" /></p>

<p>``</p>
<h2 id="tek-sunucu-neden-yetmez">Tek Sunucu Neden Yetmez?</h2>

<p>Her oyuncu hareket, yetenek kullanımı, envanter yönetimi ve sohbet gibi olaylar üretir. Oyuncu başına saniyede ortalama $r$ mesaj, eşzamanlı oyuncu sayısı da $N$ ise sistemin karşılaması gereken yaklaşık mesaj yükü şöyledir:</p>

\[M = N \times r\]

<p>Örneğin 10.000 oyuncunun saniyede 15 mesaj ürettiği bir dünyada sunucular saniyede yaklaşık 150.000 mesajı işlemelidir. Üstelik bazı hareketler çevredeki diğer oyunculara da gönderilir. Her veriyi herkese yayınlamak maliyeti hızla $O(N^2)$ seviyesine taşıyabileceğinden MMORPG mimarileri dünyayı mantıksal parçalara ayırır.</p>

<h2 id="sunucu-katmanları">Sunucu Katmanları</h2>

<p>Oyuncu genellikle doğrudan oyun dünyasının merkezine bağlanmaz. İstek, uzmanlaşmış servislerden oluşan bir yolculuk yapar.</p>

<table>
  <thead>
    <tr>
      <th>Bileşen</th>
      <th>Temel görev</th>
      <th>Örnek veri</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gateway</td>
      <td>Bağlantıyı kabul eder ve yönlendirir</td>
      <td>Oturum, paket, IP</td>
    </tr>
    <tr>
      <td>Kimlik servisi</td>
      <td>Hesabı doğrular</td>
      <td>Token, karakter listesi</td>
    </tr>
    <tr>
      <td>World server</td>
      <td>Dünya kurallarını yönetir</td>
      <td>Saat, hava, global etkinlik</td>
    </tr>
    <tr>
      <td>Zone server</td>
      <td>Belirli bir bölgeyi simüle eder</td>
      <td>Oyuncu, NPC, savaş</td>
    </tr>
    <tr>
      <td>Veritabanı</td>
      <td>Kalıcı veriyi saklar</td>
      <td>Envanter, görev, ekonomi</td>
    </tr>
    <tr>
      <td>Chat servisi</td>
      <td>Mesajlaşmayı yönetir</td>
      <td>Kanal ve özel mesaj</td>
    </tr>
  </tbody>
</table>

<p>Bu ayrım sayesinde sohbet sistemindeki yoğunluk savaş hesaplamalarını durdurmaz. Ayrıca her servis bağımsız biçimde ölçeklenebilir.</p>

<h2 id="shard-zone-ve-instance-farkı">Shard, Zone ve Instance Farkı</h2>

<p><strong>Shard</strong>, aynı oyunun ayrı bir kopyasıdır; oyuncular bunu genellikle “sunucu seçimi” olarak görür. <strong>Zone</strong>, tek dünyanın coğrafi bölümlere ayrılmasıdır. <strong>Instance</strong> ise zindan gibi belirli bir grup için geçici oluşturulan özel alandır.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Shard</td>
      <td>Güçlü izolasyon</td>
      <td>Oyuncu topluluğunu böler</td>
    </tr>
    <tr>
      <td>Zone</td>
      <td>Kesintisiz dünya hissi</td>
      <td>Sınır geçişleri karmaşıktır</td>
    </tr>
    <tr>
      <td>Instance</td>
      <td>Talebe göre kolay ölçeklenir</td>
      <td>Ortak dünya hissini azaltabilir</td>
    </tr>
  </tbody>
</table>

<p>Bir karakter bölge sınırını geçtiğinde eski zone sunucusu karakter durumunu yeni sunucuya aktarır. Bu <strong>handoff</strong> işlemi sırasında iki sunucunun kısa süreli koordinasyon kurması gerekir; aksi hâlde karakter kopyalanabilir veya kaybolabilir.</p>

<h2 id="interest-management-herkesi-herkese-gösterme">Interest Management: Herkesi Herkese Gösterme</h2>

<p>Bir oyuncunun kıtanın diğer ucundaki hareketleri bilmesine gerek yoktur. Sunucu, dünyayı hücrelere böler ve yalnızca görüş alanındaki nesneleri gönderir. Görüş yarıçapı $d$ olan bir oyuncu için ilgi alanı kabaca $A = \pi d^2$ olur.</p>

<p>Basitleştirilmiş bir yayın mantığı şöyle yazılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">broadcast_movement</span><span class="p">(</span><span class="n">player</span><span class="p">,</span> <span class="n">spatial_grid</span><span class="p">):</span>
    <span class="n">nearby</span> <span class="o">=</span> <span class="n">spatial_grid</span><span class="p">.</span><span class="nf">query</span><span class="p">(</span><span class="n">player</span><span class="p">.</span><span class="n">position</span><span class="p">,</span> <span class="n">radius</span><span class="o">=</span><span class="mi">80</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">entity</span> <span class="ow">in</span> <span class="n">nearby</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">entity</span><span class="p">.</span><span class="nb">id</span> <span class="o">!=</span> <span class="n">player</span><span class="p">.</span><span class="nb">id</span><span class="p">:</span>
            <span class="n">entity</span><span class="p">.</span><span class="n">connection</span><span class="p">.</span><span class="nf">send</span><span class="p">({</span>
                <span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">movement</span><span class="sh">"</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">player_id</span><span class="sh">"</span><span class="p">:</span> <span class="n">player</span><span class="p">.</span><span class="nb">id</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="n">player</span><span class="p">.</span><span class="n">position</span>
            <span class="p">})</span>
</code></pre></div></div>

<p>Bu kod, hareket paketini yalnızca yakındaki varlıklara göndererek bant genişliği ve işlemci tüketimini azaltır. Gerçek sistemlerde grid, quadtree veya spatial hashing kullanılabilir.</p>

<h2 id="sunucu-otoritesi-ve-tutarlılık">Sunucu Otoritesi ve Tutarlılık</h2>

<p>İstemciye tamamen güvenilirse oyuncu “Ben ışınlandım ve boss’u tek vuruşta yendim” diyebilir. Bu nedenle çoğu MMORPG <strong>server-authoritative</strong> çalışır: İstemci niyeti bildirir, sonucu sunucu hesaplar. İstemci gecikmeyi gizlemek için tahmin yapabilir; ancak son söz sunucudadır.</p>

<p>Tüm veriler aynı tutarlılık seviyesine ihtiyaç duymaz. Hasar ve eşya transferi güçlü tutarlılık isterken oyuncunun birkaç santimetrelik konumu eventual consistency ile yönetilebilir. Kritik ekonomi işlemlerinde idempotency anahtarları ve veritabanı transaction’ları, aynı satın alma paketinin iki kez işlenmesini önler.</p>

<h2 id="gecikme-tick-ve-dayanıklılık">Gecikme, Tick ve Dayanıklılık</h2>

<p>Zone sunucuları dünyayı belirli aralıklarla günceller. Tick hızı $f$ ise bir tick süresi yaklaşık $T = 1/f$ saniyedir. 20 Hz çalışan bir sistem dünyayı her 50 milisaniyede bir hesaplar.</p>

<p>Sunucu çökmesine karşı karakter durumu periyodik kaydedilir; kritik olaylar mesaj kuyruğuna veya event log’a yazılır. Load balancer yeni bağlantıları sağlıklı sunuculara gönderirken izleme araçları CPU, gecikme ve paket kaybını takip eder. Sonuçta kesintisiz görünen fantastik dünya; bölümlendirme, ilgi alanı filtreleme, otoriter simülasyon ve dikkatli veri yönetiminin birlikte yaptığı oldukça gerçek bir mühendislik büyüsüdür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="mmorpg" /><category term="sunucu-mimarisi" /><category term="dağıtık-sistemler" /><category term="oyun-programlama" /><category term="ağ-programlama" /><category term="ölçeklenebilirlik" /><summary type="html"><![CDATA[Bir MMORPG dünyasına bağlanıp kalabalık bir şehre girdiğinizde yüzlerce oyuncuyu koşarken, ticaret yaparken ve devasa yaratıklarla savaşırken görebilirsiniz. Ekrandaki bu canlılığın arkasında ise tek bir süper bilgisayar değil; görevleri paylaşan, birbirleriyle sürekli haberleşen ve arızalara karşı hazırlıklı çalışan dağıtık sunucular bulunur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/mmorpg-sunucu-mimarisi-78.png" /><media:content medium="image" url="https://program.sonsuz.us/img/mmorpg-sunucu-mimarisi-78.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Order Book Algoritmaları: Alış ve Satış Emirlerinden Piyasanın Yapısını Okumak</title><link href="https://program.sonsuz.us/posts/order-book-algoritmalari-alis-ve-satis-emirlerinden-piyasanin-yapisini-okumak/" rel="alternate" type="text/html" title="Order Book Algoritmaları: Alış ve Satış Emirlerinden Piyasanın Yapısını Okumak" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/order-book-algoritmalari-alis-ve-satis-emirlerinden-piyasanin-yapisini-okumak</id><content type="html" xml:base="https://program.sonsuz.us/posts/order-book-algoritmalari-alis-ve-satis-emirlerinden-piyasanin-yapisini-okumak/"><![CDATA[<p><img src="/img/order-book-algoritmalari-36.svg" alt="order-book-algoritmalari-36" /></p>

<p>Bir finansal piyasayı yalnızca son işlem fiyatından izlemek, futbol maçını sadece skor tabelasından takip etmeye benzer. Order book, yani emir defteri ise sahanın tamamını gösterir: Hangi fiyatlarda alıcılar bekliyor, satıcılar nerede yoğunlaşıyor ve likidite hangi tarafta inceliyor? Doğru algoritmalarla bu hareketli tabloyu inceleyerek piyasanın kısa vadeli yapısı hakkında değerli ipuçları çıkarabiliriz.</p>

<p>``</p>

<h2 id="emir-defterinin-temel-mantığı">Emir defterinin temel mantığı</h2>

<p>Emir defteri, gerçekleşmeyi bekleyen limit alış ve satış emirlerinin fiyat seviyelerine göre sıralanmış hâlidir. En yüksek alış fiyatına <strong>best bid</strong>, en düşük satış fiyatına ise <strong>best ask</strong> denir. Bu iki fiyat arasındaki fark spread olarak tanımlanır:</p>

\[S = P_{ask} - P_{bid}\]

<p>Spread küçüldükçe piyasanın genellikle daha likit olduğu düşünülür. Ancak tek başına spread yeterli değildir. En iyi fiyat seviyesinde yalnızca birkaç birim emir varsa büyük bir piyasa emri fiyatı hızla kaydırabilir.</p>

<p>Çoğu borsada eşleştirme motoru <strong>fiyat-zaman önceliği</strong> kullanır. Daha iyi fiyat önceliklidir; aynı fiyattaki emirler arasında önce giren emir önce gerçekleşir. Piyasa emirleri ise beklemez, defterdeki uygun limit emirlerini tüketir.</p>

<table>
  <thead>
    <tr>
      <th>Gösterge</th>
      <th>Ne anlatır?</th>
      <th>Olası yorum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dar spread</td>
      <td>Alış ve satış fiyatları yakın</td>
      <td>Yüksek likidite</td>
    </tr>
    <tr>
      <td>Derin bid tarafı</td>
      <td>Alış emirleri yoğun</td>
      <td>Kısa vadeli destek ihtimali</td>
    </tr>
    <tr>
      <td>İnce ask tarafı</td>
      <td>Satış likiditesi düşük</td>
      <td>Yukarı hareket kolaylaşabilir</td>
    </tr>
    <tr>
      <td>Hızlı emir iptali</td>
      <td>Likidite kalıcı değil</td>
      <td>Manipülasyon riski olabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="dengesizlik-ve-mikro-fiyat">Dengesizlik ve mikro fiyat</h2>

<p>Defter analizinin popüler ölçülerinden biri <strong>order book imbalance</strong> değeridir. En iyi seviyedeki alış miktarı $B$, satış miktarı $A$ olsun:</p>

\[I = \frac{B-A}{B+A}\]

<p>$I$ değeri $1$ seviyesine yaklaştığında alış tarafı, $-1$ seviyesine yaklaştığında satış tarafı daha ağırdır. Sıfıra yakın değerler dengeli bir görünüm sunar. Bununla birlikte büyük alış miktarı kesin yükseliş anlamına gelmez; emir gerçekleşmeden iptal edilebilir.</p>

<p>Bir başka ölçü olan mikro fiyat, orta noktayı mevcut miktarlarla ağırlıklandırır:</p>

\[P_{micro} = \frac{P_{ask}B + P_{bid}A}{A+B}\]

<p>Mikro fiyat orta fiyattan yukarıdaysa alış baskısının, aşağıdaysa satış baskısının daha güçlü olduğu düşünülebilir.</p>

<h2 id="python-ile-basit-analiz">Python ile basit analiz</h2>

<p>Aşağıdaki fonksiyon, en iyi alış ve satış seviyelerinden spread, orta fiyat, dengesizlik ve mikro fiyat hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">book_metrics</span><span class="p">(</span><span class="n">bids</span><span class="p">,</span> <span class="n">asks</span><span class="p">):</span>
    <span class="c1"># Her eleman: (fiyat, miktar)
</span>    <span class="n">best_bid</span><span class="p">,</span> <span class="n">bid_qty</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">bids</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
    <span class="n">best_ask</span><span class="p">,</span> <span class="n">ask_qty</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">asks</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>

    <span class="n">spread</span> <span class="o">=</span> <span class="n">best_ask</span> <span class="o">-</span> <span class="n">best_bid</span>
    <span class="n">midpoint</span> <span class="o">=</span> <span class="p">(</span><span class="n">best_bid</span> <span class="o">+</span> <span class="n">best_ask</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
    <span class="n">total_qty</span> <span class="o">=</span> <span class="n">bid_qty</span> <span class="o">+</span> <span class="n">ask_qty</span>

    <span class="n">imbalance</span> <span class="o">=</span> <span class="p">(</span><span class="n">bid_qty</span> <span class="o">-</span> <span class="n">ask_qty</span><span class="p">)</span> <span class="o">/</span> <span class="n">total_qty</span>
    <span class="n">microprice</span> <span class="o">=</span> <span class="p">(</span>
        <span class="n">best_ask</span> <span class="o">*</span> <span class="n">bid_qty</span> <span class="o">+</span> <span class="n">best_bid</span> <span class="o">*</span> <span class="n">ask_qty</span>
    <span class="p">)</span> <span class="o">/</span> <span class="n">total_qty</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">spread</span><span class="sh">'</span><span class="p">:</span> <span class="n">spread</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">midpoint</span><span class="sh">'</span><span class="p">:</span> <span class="n">midpoint</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">imbalance</span><span class="sh">'</span><span class="p">:</span> <span class="n">imbalance</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">microprice</span><span class="sh">'</span><span class="p">:</span> <span class="n">microprice</span>
    <span class="p">}</span>

<span class="n">bids</span> <span class="o">=</span> <span class="p">[(</span><span class="mf">99.90</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span> <span class="p">(</span><span class="mf">99.80</span><span class="p">,</span> <span class="mi">25</span><span class="p">)]</span>
<span class="n">asks</span> <span class="o">=</span> <span class="p">[(</span><span class="mf">100.00</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="p">(</span><span class="mf">100.10</span><span class="p">,</span> <span class="mi">18</span><span class="p">)]</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">book_metrics</span><span class="p">(</span><span class="n">bids</span><span class="p">,</span> <span class="n">asks</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu örnek yalnızca ilk seviyeyi inceler. Gerçek sistemlerde ilk 5, 10 veya 20 fiyat seviyesi ağırlıklı olarak değerlendirilir. Yakın seviyelere daha fazla önem vermek için $w_i=e^{-\lambda i}$ gibi azalan bir ağırlık kullanılabilir.</p>

<h2 id="gürültü-spoofing-ve-doğru-yorum">Gürültü, spoofing ve doğru yorum</h2>

<p>Order book bir niyet tablosudur; gerçekleşmiş işlemlerin kaydı değildir. Büyük bir emir güçlü destek gibi görünürken aniden iptal edilebilir. <strong>Spoofing</strong>, yatırımcıları yanıltmak amacıyla büyük emir gösterip bunları gerçekleşmeden kaldırma davranışıdır. Bu nedenle algoritma; emir ekleme, iptal ve gerçekleşme hızlarını birlikte izlemelidir.</p>

<p>Sağlam bir yaklaşım, order book verisini işlem hacmi, order flow imbalance ve fiyat değişimiyle birleştirir. Ayrıca sonuçlar farklı piyasa koşullarında geriye dönük test edilmelidir. Emir defteri geleceği söyleyen kristal küre değildir; fakat doğru ölçümlerle piyasanın kısa vadeli baskısını gösteren oldukça hassas bir radar olabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="order book" /><category term="algoritmik işlem" /><category term="piyasa mikro yapısı" /><category term="python" /><category term="finans" /><category term="veri analizi" /><summary type="html"><![CDATA[Bir finansal piyasayı yalnızca son işlem fiyatından izlemek, futbol maçını sadece skor tabelasından takip etmeye benzer. Order book, yani emir defteri ise sahanın tamamını gösterir: Hangi fiyatlarda alıcılar bekliyor, satıcılar nerede yoğunlaşıyor ve likidite hangi tarafta inceliyor? Doğru algoritmalarla bu hareketli tabloyu inceleyerek piyasanın kısa vadeli yapısı hakkında değerli ipuçları çıkarabiliriz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/order-book-algoritmalari-36.png" /><media:content medium="image" url="https://program.sonsuz.us/img/order-book-algoritmalari-36.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Oyun Seni İzliyor: Dynamic Difficulty Adjustment Nasıl Çalışır?</title><link href="https://program.sonsuz.us/posts/oyun-seni-izliyor-dynamic-difficulty-adjustment-nasil-calisir/" rel="alternate" type="text/html" title="Oyun Seni İzliyor: Dynamic Difficulty Adjustment Nasıl Çalışır?" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/oyun-seni-izliyor-dynamic-difficulty-adjustment-nasil-calisir</id><content type="html" xml:base="https://program.sonsuz.us/posts/oyun-seni-izliyor-dynamic-difficulty-adjustment-nasil-calisir/"><![CDATA[<p>Bir bölümde art arda yenildiğinizde düşmanların gizlice yavaşladığını veya oyunu rahatça geçtiğinizde rakiplerin birden akıllandığını düşündünüz mü? Bu değişim her zaman hayal gücünüzün ürünü değildir. Dynamic Difficulty Adjustment, yani Dinamik Zorluk Ayarlama (DDA), oyuncunun performansını izleyip oyunun zorluk seviyesini gerçek zamanlı olarak değiştiren bir tasarım yaklaşımıdır.</p>

<p><img src="/img/oyun-seni-izliyor-79.svg" alt="oyun-seni-izliyor-79" /></p>

<p>``</p>

<h2 id="dda-neden-kullanılır">DDA neden kullanılır?</h2>

<p>Geleneksel oyunlarda oyuncu başlangıçta kolay, normal veya zor gibi sabit bir seviye seçer. Ancak bir oyuncunun nişan alma becerisi iyi, kaynak yönetimi kötü olabilir. Üstelik beceri seviyesi oyun boyunca değişir. Sabit seçim, bu farklılıkları yakalamakta yetersiz kalır.</p>

<p>DDA’nın temel amacı oyuncuyu <strong>akış bölgesinde</strong> tutmaktır. Akış teorisine göre görev çok kolaysa sıkılma, çok zorsa kaygı oluşur. İdeal durumda zorluk $D$, oyuncu becerisi $S$ değerine yakın olmalıdır:</p>

\[D \approx S\]

<p>Aradaki fark büyüdükçe deneyim bozulabilir. Bunu basit bir denge hatasıyla gösterebiliriz:</p>

\[E = S - D\]

<p>$E$ büyük ve pozitifse oyun kolay, büyük ve negatifse oyun zor demektir. Sistem, $E$ değerini sıfıra yaklaştırmaya çalışır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Zorluk değişimi</th>
      <th>Avantajı</th>
      <th>Riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sabit seviye</td>
      <td>Oyuncu seçer</td>
      <td>Şeffaf ve öngörülebilir</td>
      <td>Yanlış seçim deneyimi bozabilir</td>
    </tr>
    <tr>
      <td>Kademeli ilerleme</td>
      <td>Bölümlere göre artar</td>
      <td>Tasarlanması kolaydır</td>
      <td>Her oyuncuya aynı davranır</td>
    </tr>
    <tr>
      <td>DDA</td>
      <td>Performansa göre değişir</td>
      <td>Kişiselleştirilmiş deneyim sunar</td>
      <td>Fark edilirse yapay hissedilebilir</td>
    </tr>
  </tbody>
</table>

<h2 id="sistem-oyuncuyu-nasıl-ölçer">Sistem oyuncuyu nasıl ölçer?</h2>

<p>Önce anlamlı sinyaller toplanır. Ölüm sayısı, isabet oranı, bölüm tamamlama süresi, kalan sağlık, kullanılan yardım miktarı ve başarısız deneme sayısı bunlardan bazılarıdır. Tek bir ölçüte güvenmek yanıltıcıdır; hızlı oynayan biri dikkatsiz, yavaş oynayan biri ise keşif meraklısı olabilir.</p>

<p>Ölçümler normalize edilerek birleşik bir beceri puanı üretilebilir:</p>

\[S = 0.4A + 0.3H + 0.3T\]

<p>Burada $A$ isabet oranını, $H$ hayatta kalma başarısını, $T$ ise hedef süreye göre performansı temsil eder. Katsayılar oyunun önceliklerine göre değiştirilir.</p>

<h2 id="basit-bir-uygulama">Basit bir uygulama</h2>

<p>Aşağıdaki Python sınıfı, son performans puanlarının ortalamasını alır ve hedef zorluğu küçük adımlarla günceller:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">DifficultyManager</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">difficulty</span> <span class="o">=</span> <span class="mf">0.5</span>
        <span class="n">self</span><span class="p">.</span><span class="n">history</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">accuracy</span><span class="p">,</span> <span class="n">survival</span><span class="p">,</span> <span class="n">speed</span><span class="p">):</span>
        <span class="n">score</span> <span class="o">=</span> <span class="mf">0.4</span> <span class="o">*</span> <span class="n">accuracy</span> <span class="o">+</span> <span class="mf">0.3</span> <span class="o">*</span> <span class="n">survival</span> <span class="o">+</span> <span class="mf">0.3</span> <span class="o">*</span> <span class="n">speed</span>
        <span class="n">self</span><span class="p">.</span><span class="n">history</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">score</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">history</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">history</span><span class="p">[</span><span class="o">-</span><span class="mi">5</span><span class="p">:]</span>

        <span class="n">skill</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">history</span><span class="p">)</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">history</span><span class="p">)</span>
        <span class="n">change</span> <span class="o">=</span> <span class="p">(</span><span class="n">skill</span> <span class="o">-</span> <span class="n">self</span><span class="p">.</span><span class="n">difficulty</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.2</span>
        <span class="n">self</span><span class="p">.</span><span class="n">difficulty</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.1</span><span class="p">,</span> <span class="nf">min</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">difficulty</span> <span class="o">+</span> <span class="n">change</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">difficulty</span>
</code></pre></div></div>

<p>Son beş sonucun kullanılması, tek bir kötü maçın sistemi paniğe sürüklemesini engeller. <code class="language-plaintext highlighter-rouge">0.2</code> katsayısı değişimin hızını sınırlar; böylece düşmanlar bir anda salyangozdan terminatöre dönüşmez. Döndürülen değer düşman sağlığına, yapay zekâ tepki süresine veya kaynak miktarına uygulanabilir.</p>

<h2 id="neler-ayarlanabilir">Neler ayarlanabilir?</h2>

<table>
  <thead>
    <tr>
      <th>Parametre</th>
      <th>Düşük zorlukta</th>
      <th>Yüksek zorlukta</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Düşman sağlığı</td>
      <td>Daha az</td>
      <td>Daha fazla</td>
    </tr>
    <tr>
      <td>Tepki süresi</td>
      <td>Daha yavaş</td>
      <td>Daha hızlı</td>
    </tr>
    <tr>
      <td>Kaynaklar</td>
      <td>Daha bol</td>
      <td>Daha kıt</td>
    </tr>
    <tr>
      <td>İpucu sıklığı</td>
      <td>Daha fazla</td>
      <td>Daha az</td>
    </tr>
    <tr>
      <td>Rakip taktikleri</td>
      <td>Basit</td>
      <td>Koordineli</td>
    </tr>
  </tbody>
</table>

<p>İyi bir DDA sistemi hile yapıyormuş gibi görünmemelidir. Oyuncu sırf başarılı olduğu için kurşunlarının sebepsiz yere kaçtığını hissederse sistem güven kaybeder. Bu nedenle değişiklikler yumuşak, sınırlı ve mümkünse oyun dünyası içinde anlamlı olmalıdır.</p>

<p>Sonuç olarak DDA yalnızca düşmanların canını artıran bir düğme değildir; ölçüm, modelleme ve deneyim tasarımının birleşimidir. En başarılı sistem oyuncuyu cezalandırmaz veya kayırmaz. Onun becerisine uygun, heyecanlı ve adil görünen bir mücadeleyi sessizce sahneye koyar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun geliştirme" /><category term="dda" /><category term="yapay zeka" /><category term="oyuncu deneyimi" /><category term="python" /><category term="oyun tasarımı" /><summary type="html"><![CDATA[Bir bölümde art arda yenildiğinizde düşmanların gizlice yavaşladığını veya oyunu rahatça geçtiğinizde rakiplerin birden akıllandığını düşündünüz mü? Bu değişim her zaman hayal gücünüzün ürünü değildir. Dynamic Difficulty Adjustment, yani Dinamik Zorluk Ayarlama (DDA), oyuncunun performansını izleyip oyunun zorluk seviyesini gerçek zamanlı olarak değiştiren bir tasarım yaklaşımıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/oyun-seni-izliyor-79.png" /><media:content medium="image" url="https://program.sonsuz.us/img/oyun-seni-izliyor-79.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Roguelike Türünün Felsefesi: Kalıcı Ölüm, Risk ve Öğrenme</title><link href="https://program.sonsuz.us/posts/roguelike-turunun-felsefesi-kalici-olum-risk-ve-ogrenme/" rel="alternate" type="text/html" title="Roguelike Türünün Felsefesi: Kalıcı Ölüm, Risk ve Öğrenme" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/roguelike-turunun-felsefesi-kalici-olum-risk-ve-ogrenme</id><content type="html" xml:base="https://program.sonsuz.us/posts/roguelike-turunun-felsefesi-kalici-olum-risk-ve-ogrenme/"><![CDATA[<p><img src="/img/roguelike-turunun-felsefesi-61.svg" alt="roguelike-turunun-felsefesi-61" /></p>

<p>Roguelike oyunlarda ölüm, kısa bir yükleme ekranından çok daha fazlasıdır. Saatlerdir geliştirdiğiniz karakterin, topladığınız eşyaların ve kurduğunuz planların tek bir hatayla silinmesi mümkündür. <strong>Kalıcı ölüm</strong> olarak bilinen bu mekanik, oyuncuya yalnızca kaybetme korkusu yaşatmaz; karar verme, öğrenme ve risk değerlendirme biçimini de kökten değiştirir.
``</p>

<h2 id="ölüm-neden-bu-kadar-önemlidir">Ölüm neden bu kadar önemlidir?</h2>

<p>Geleneksel oyunlarda ölüm çoğunlukla geçici bir aksaklıktır. Oyuncu kayıt noktasına döner ve aynı bölümü küçük değişikliklerle tekrarlar. Roguelike türünde ise ölüm, mevcut koşunun sonudur. Bu nedenle oyuncu yalnızca ekrandaki düşmanla değil, verdiği kararların geri döndürülemezliğiyle de mücadele eder.</p>

<table>
  <thead>
    <tr>
      <th>Geleneksel kayıt sistemi</th>
      <th>Kalıcı ölüm sistemi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hata kolayca geri alınabilir</td>
      <td>Hatanın maliyeti yüksektir</td>
    </tr>
    <tr>
      <td>Deneme cesaretlendirilir</td>
      <td>Hazırlık ve gözlem öne çıkar</td>
    </tr>
    <tr>
      <td>Karakter ilerlemesi korunur</td>
      <td>Bilgi, ana ilerleme biçimine dönüşür</td>
    </tr>
    <tr>
      <td>Risk kısa vadeli düşünülür</td>
      <td>Risk koşunun bütünüyle değerlendirilir</td>
    </tr>
  </tbody>
</table>

<p>Bu fark, roguelike felsefesinin merkezindeki fikri ortaya çıkarır: <strong>Oyuncu karakteri kaybedebilir, fakat öğrendiklerini kaybetmez.</strong> Bir canavarın saldırı düzenini, zehrin etkisini veya hangi eşyanın hangi durumda değerli olduğunu öğrenmek, görünmeyen bir gelişim sistemidir.</p>

<h2 id="riskin-matematiği">Riskin matematiği</h2>

<p>Oyuncu bir odaya girmeden önce çoğu zaman sezgisel bir beklenen değer hesabı yapar. Bir kararın yaklaşık değeri şöyle gösterilebilir:</p>

\[E = P_b \times O - P_k \times M\]

<p>Burada $P_b$ başarı olasılığını, $O$ elde edilecek ödülü, $P_k$ kayıp olasılığını ve $M$ kaybın maliyetini temsil eder. Kalıcı ölümde $M$ çok büyüktür; çünkü yalnızca birkaç sağlık puanı değil, bütün koşu tehlikededir. Bu yüzden ödül yüksek olsa bile düşük başarı olasılığı oyuncuyu geri çekilmeye yöneltebilir.</p>

<p>Ancak insan zihni kusursuz bir hesap makinesi değildir. Nadir bir eşya görüldüğünde açgözlülük, uzun süren başarılı bir koşuda aşırı güven veya son anda gelen panik matematiksel değerlendirmeyi bozar. Roguelike oyunlar tam da bu duygusal çatışmadan beslenir: Mantık kapıyı kapatmayı söylerken merak içeride ne olduğunu fısıldar.</p>

<h2 id="basit-bir-risk-modeli">Basit bir risk modeli</h2>

<p>Bir oyunda karar puanlaması aşağıdaki gibi modellenebilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">risk_puani</span><span class="p">(</span><span class="n">odul</span><span class="p">,</span> <span class="n">basari_ihtimali</span><span class="p">,</span> <span class="n">kayip</span><span class="p">,</span> <span class="n">kaynak_orani</span><span class="p">):</span>
    <span class="n">beklenen_kazanc</span> <span class="o">=</span> <span class="n">odul</span> <span class="o">*</span> <span class="n">basari_ihtimali</span>
    <span class="n">beklenen_kayip</span> <span class="o">=</span> <span class="n">kayip</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">basari_ihtimali</span><span class="p">)</span>

    <span class="c1"># Kaynaklar azaldıkça aynı tehlike daha ciddi kabul edilir.
</span>    <span class="n">baski_carpani</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">kaynak_orani</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">beklenen_kazanc</span> <span class="o">-</span> <span class="n">beklenen_kayip</span> <span class="o">*</span> <span class="n">baski_carpani</span>
</code></pre></div></div>

<p>Bu kod, ödül ile olası kaybı karşılaştırır. <code class="language-plaintext highlighter-rouge">kaynak_orani</code>, oyuncunun sağlık, iksir veya mühimmat gibi kaynaklarının ne kadarının kaldığını belirtir. Sonuç negatifse çatışmadan kaçınmak mantıklı olabilir. Elbette iyi bir roguelike, bütün bilgileri açıkça sunmaz; belirsizlik, kararın heyecanını artırır.</p>

<h2 id="korkaklık-mı-ustalık-mı">Korkaklık mı, ustalık mı?</h2>

<p>Kalıcı ölüm başlangıçta oyuncuyu aşırı temkinli yapabilir. Her sandık tuzak, her koridor tehdit gibi görünür. Deneyim arttıkça temkin yerini <strong>hesaplanmış cesarete</strong> bırakır. Usta oyuncu hiçbir risk almayan kişi değildir; hangi riskin gerekli olduğunu anlayan kişidir.</p>

<p>Bu süreçte davranışlar belirgin biçimde değişir:</p>

<ul>
  <li>Kaynaklar hemen tüketilmek yerine kritik anlar için saklanır.</li>
  <li>Bilinmeyen düşmanlara doğrudan saldırmak yerine gözlem yapılır.</li>
  <li>Kaçış, başarısızlık değil stratejik bir araç olarak görülür.</li>
  <li>Kısa vadeli ödüller, uzun vadeli hayatta kalmayla karşılaştırılır.</li>
  <li>Her ölümden sonra neden-sonuç ilişkisi kurulmaya çalışılır.</li>
</ul>

<h2 id="yenilginin-anlamı">Yenilginin anlamı</h2>

<p>Roguelike türü, başarısızlığı oyunun karşıtı olmaktan çıkarıp oyunun parçasına dönüştürür. Adil tasarlanmış bir ölüm, oyuncuya cezadan çok ders verir: Yanlış eşya mı seçildi, gereksiz çatışmaya mı girildi, yoksa bilinmeyen bir mekanik mi gözden kaçtı?</p>

<p>Sonuç olarak kalıcı ölüm, yapay bir zorluk düğmesi değildir. Oyuncunun eşyalarla, zamanla ve kendi duygularıyla ilişkisini değiştiren felsefi bir tasarım tercihidir. Karakterler tekrar tekrar ölürken oyuncu giderek daha dikkatli, bilgili ve soğukkanlı hâle gelir. Roguelike deneyiminin gerçek kahramanı ekrandaki savaşçı değil, her yenilgiden sonra yeniden düşünen oyuncudur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="roguelike" /><category term="oyun tasarımı" /><category term="kalıcı ölüm" /><category term="risk yönetimi" /><category term="oyuncu psikolojisi" /><summary type="html"><![CDATA[Roguelike oyunlarda ölüm, kısa bir yükleme ekranından çok daha fazlasıdır. Saatlerdir geliştirdiğiniz karakterin, topladığınız eşyaların ve kurduğunuz planların tek bir hatayla silinmesi mümkündür. Kalıcı ölüm olarak bilinen bu mekanik, oyuncuya yalnızca kaybetme korkusu yaşatmaz; karar verme, öğrenme ve risk değerlendirme biçimini de kökten değiştirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/roguelike-turunun-felsefesi-61.png" /><media:content medium="image" url="https://program.sonsuz.us/img/roguelike-turunun-felsefesi-61.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Yıldız Işığındaki Fısıltılar: Geçiş Fotometrisiyle Ötegezegen Tespiti</title><link href="https://program.sonsuz.us/posts/yildiz-isigindaki-fisiltilar-gecis-fotometrisiyle-otegezegen-tespiti/" rel="alternate" type="text/html" title="Yıldız Işığındaki Fısıltılar: Geçiş Fotometrisiyle Ötegezegen Tespiti" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/yildiz-isigindaki-fisiltilar-gecis-fotometrisiyle-otegezegen-tespiti</id><content type="html" xml:base="https://program.sonsuz.us/posts/yildiz-isigindaki-fisiltilar-gecis-fotometrisiyle-otegezegen-tespiti/"><![CDATA[<p><img src="/img/yildiz-isigindaki-fisiltilar-35.svg" alt="yildiz-isigindaki-fisiltilar-35" /></p>

<p>Bir yıldızın önünden geçen gezegen, yıldız ışığının çok küçük bir bölümünü engeller. Teleskop açısından bu olay, parlaklıkta düzenli aralıklarla tekrarlanan sığ düşüşler olarak görünür. Ancak yıldız lekeleri, cihaz gürültüsü ve veri boşlukları da benzer izler bırakabilir. Geçiş fotometrisinin asıl heyecanı, bu kozmik saklambaç oyununu istatistik ve algoritmalar yardımıyla çözmektir.</p>

<p>``</p>

<h2 id="geçiş-sinyalinin-fiziği">Geçiş sinyalinin fiziği</h2>

<p>Bir gezegen yıldız diskinin önünden geçtiğinde ölçülen göreli parlaklık azalmasına <strong>geçiş derinliği</strong> denir. Basitçe yıldız ve gezegen disklerini düzgün daireler kabul edersek:</p>

\[delta \approx \left(\frac{R_p}{R_*}\right)^2\]

<p>Burada $R_p$ gezegenin, $R_*$ yıldızın yarıçapıdır. Örneğin yarıçapı yıldızın onda biri olan bir gezegen yaklaşık $0.01$, yani yüzde bir parlaklık düşüşü oluşturur. Dünya büyüklüğündeki gezegenlerde bu oran çok daha küçüktür; dolayısıyla hassas ölçüm gerekir.</p>

<p>Algoritma yalnızca düşüşün derinliğini değil, süresini ve tekrar aralığını da inceler. Ardışık geçişlerin arasındaki zaman gezegenin yörünge periyodu $P$ hakkında bilgi verir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Gezegen geçişi</th>
      <th>Gürültü veya yıldız etkinliği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tekrarlanma</td>
      <td>Yaklaşık periyodik</td>
      <td>Genellikle düzensiz</td>
    </tr>
    <tr>
      <td>Şekil</td>
      <td>Simetrik, kutuya benzer</td>
      <td>Değişken veya sivri</td>
    </tr>
    <tr>
      <td>Derinlik</td>
      <td>Geçişler arasında benzer</td>
      <td>Sıkça değişken</td>
    </tr>
    <tr>
      <td>Süre</td>
      <td>Yörüngeyle uyumlu</td>
      <td>Rastlantısal olabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="ham-veriden-temiz-ışık-eğrisine">Ham veriden temiz ışık eğrisine</h2>

<p>Analiz; zaman ve akı, yani parlaklık ölçümleriyle başlar. Önce eksik veya geçersiz değerler kaldırılır. Ardından akı medyana bölünerek yıldızın normal parlaklığı yaklaşık 1 yapılır. Teleskobun sıcaklık değişimi ya da yıldızın uzun dönemli etkinliği gibi yavaş eğilimler de çıkarılmalıdır. Bu adıma <strong>detrending</strong> denir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="n">scipy.signal</span> <span class="kn">import</span> <span class="n">savgol_filter</span>

<span class="c1"># time ve flux teleskoptan alınmış NumPy dizileridir.
</span><span class="n">valid</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">isfinite</span><span class="p">(</span><span class="n">time</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">np</span><span class="p">.</span><span class="nf">isfinite</span><span class="p">(</span><span class="n">flux</span><span class="p">)</span>
<span class="n">time_clean</span> <span class="o">=</span> <span class="n">time</span><span class="p">[</span><span class="n">valid</span><span class="p">]</span>
<span class="n">flux_clean</span> <span class="o">=</span> <span class="n">flux</span><span class="p">[</span><span class="n">valid</span><span class="p">]</span>

<span class="n">normalized</span> <span class="o">=</span> <span class="n">flux_clean</span> <span class="o">/</span> <span class="n">np</span><span class="p">.</span><span class="nf">median</span><span class="p">(</span><span class="n">flux_clean</span><span class="p">)</span>
<span class="n">trend</span> <span class="o">=</span> <span class="nf">savgol_filter</span><span class="p">(</span><span class="n">normalized</span><span class="p">,</span> <span class="mi">301</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">flat_flux</span> <span class="o">=</span> <span class="n">normalized</span> <span class="o">/</span> <span class="n">trend</span>
</code></pre></div></div>

<p>Bu kod geçersiz ölçümleri temizler, ışık eğrisini normalize eder ve Savitzky–Golay filtresiyle yavaş değişen eğilimi tahmin eder. Pencere boyutu yanlış seçilirse gerçek geçişler de silinebileceği için beklenen geçiş süresinden belirgin biçimde büyük olmalıdır.</p>

<h2 id="periyodik-düşüşleri-bls-ile-aramak">Periyodik düşüşleri BLS ile aramak</h2>

<p>Geçişler sinüs dalgasına benzemez; daha çok kısa süreli kutu biçimli çukurlardır. Bu nedenle yaygın çözüm <strong>Box Least Squares (BLS)</strong> algoritmasıdır. BLS, çok sayıda aday periyodu dener, veriyi o periyoda göre katlar ve hangi kutu modelinin gözlemleri en iyi açıkladığını hesaplar.</p>

<p>Sinyalin güvenilirliği kabaca şu oranla değerlendirilebilir:</p>

\[SNR = \frac{\delta}{\sigma}\sqrt{N_{in}}\]

<p>Burada $\sigma$ ölçüm saçılımı, $N_{in}$ ise geçiş içinde kalan veri noktalarının sayısıdır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">astropy.timeseries</span> <span class="kn">import</span> <span class="n">BoxLeastSquares</span>

<span class="n">model</span> <span class="o">=</span> <span class="nc">BoxLeastSquares</span><span class="p">(</span><span class="n">time_clean</span><span class="p">,</span> <span class="n">flat_flux</span><span class="p">)</span>
<span class="n">periods</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mf">0.5</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span>
<span class="n">durations</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mf">0.05</span><span class="p">,</span> <span class="mf">0.3</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">power</span><span class="p">(</span><span class="n">periods</span><span class="p">,</span> <span class="n">durations</span><span class="p">)</span>

<span class="n">best</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">argmax</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="n">power</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Aday periyot:</span><span class="sh">'</span><span class="p">,</span> <span class="n">result</span><span class="p">.</span><span class="n">period</span><span class="p">[</span><span class="n">best</span><span class="p">])</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Geçiş derinliği:</span><span class="sh">'</span><span class="p">,</span> <span class="n">result</span><span class="p">.</span><span class="n">depth</span><span class="p">[</span><span class="n">best</span><span class="p">])</span>
</code></pre></div></div>

<p>Kod, 0,5 ile 30 gün arasındaki periyotları tarar ve en güçlü kutu biçimli sinyali seçer. Bulunan zirve doğrudan gezegen kanıtı değildir; yalnızca incelenmeye değer bir adaydır.</p>

<h2 id="yanlış-pozitifleri-elemek">Yanlış pozitifleri elemek</h2>

<p>Tutulmalı çift yıldızlar gezegen geçişlerini taklit edebilir. Bu nedenle tek ve çift numaralı geçişlerin derinlikleri karşılaştırılır. Belirgin fark varsa iki yıldızın karşılıklı tutulması söz konusu olabilir. Geçiş sırasında yıldız görüntüsünün merkezinin kayması da sinyalin yakındaki başka bir yıldızdan geldiğini gösterebilir.</p>

<p>Son aşamada aday periyotla katlanmış ışık eğrisi görselleştirilir, farklı gözlemlerle doğrulanır ve gerekirse tayfsal hız ölçümleri yapılır. Böylece birkaç yüz milyonda birlik parlaklık değişimleri, uzak bir dünyanın yarıçapı ve yörüngesi hakkında bilgi veren güçlü bir astronomik kanıta dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ötegezegen" /><category term="astronomi" /><category term="veri analizi" /><category term="python" /><category term="geçiş fotometrisi" /><category term="ışık eğrisi" /><category term="algoritma" /><summary type="html"><![CDATA[Bir yıldızın önünden geçen gezegen, yıldız ışığının çok küçük bir bölümünü engeller. Teleskop açısından bu olay, parlaklıkta düzenli aralıklarla tekrarlanan sığ düşüşler olarak görünür. Ancak yıldız lekeleri, cihaz gürültüsü ve veri boşlukları da benzer izler bırakabilir. Geçiş fotometrisinin asıl heyecanı, bu kozmik saklambaç oyununu istatistik ve algoritmalar yardımıyla çözmektir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/yildiz-isigindaki-fisiltilar-35.png" /><media:content medium="image" url="https://program.sonsuz.us/img/yildiz-isigindaki-fisiltilar-35.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>