<?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-24T09:53:15+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">Anonim Arenanın Karanlık Yüzü: Multiplayer Oyunlarda Toksisite ve Sosyal Mühendislik</title><link href="https://program.sonsuz.us/posts/anonim-arenanin-karanlik-yuzu-multiplayer-oyunlarda-toksisite-ve-sosyal-muhendislik/" rel="alternate" type="text/html" title="Anonim Arenanın Karanlık Yüzü: Multiplayer Oyunlarda Toksisite ve Sosyal Mühendislik" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/anonim-arenanin-karanlik-yuzu-multiplayer-oyunlarda-toksisite-ve-sosyal-muhendislik</id><content type="html" xml:base="https://program.sonsuz.us/posts/anonim-arenanin-karanlik-yuzu-multiplayer-oyunlarda-toksisite-ve-sosyal-muhendislik/"><![CDATA[<p><img src="/img/anonim-arenanin-karanlik-33.svg" alt="anonim-arenanin-karanlik-33" /></p>

<p>Bir multiplayer maçına giriyorsunuz: Takım arkadaşınız yanlış koridora gidiyor, biri mikrofonu sonuna kadar açıyor ve henüz ikinci dakika dolmadan sohbet kutusunda küçük çaplı bir iç savaş başlıyor. Bu davranışlar yalnızca “kötü oyunculuk kültürü” değildir. Anonimlik, rekabet, grup kimliği ve sosyal mühendislik aynı dijital arenada buluştuğunda insanların yüz yüze ortamda sergilemeyeceği davranışlar ortaya çıkabilir.
``</p>
<h2 id="anonimlik-neden-freni-gevşetir">Anonimlik neden freni gevşetir?</h2>

<p>Sosyal psikolojide <strong>çevrimiçi disinhibisyon etkisi</strong>, kişinin dijital ortamda daha dürtüsel davranmasını açıklar. Oyuncu gerçek adını, yüzünü ve sosyal çevresini göstermediğinde davranışlarının kişisel itibarına zarar verme ihtimali azalır. “Ben” yerine geçici bir kullanıcı adı öne çıkar.</p>

<p>Bu durumu basitleştirilmiş bir davranış modeliyle gösterebiliriz:</p>

\[T = \frac{A \times R \times G}{H + C}\]

<p>Burada $T$ toksik davranış olasılığını, $A$ anonimlik düzeyini, $R$ rekabet baskısını, $G$ grup kutuplaşmasını, $H$ hesap verebilirliği ve $C$ davranışın algılanan maliyetini temsil eder. Bu bilimsel bir teşhis formülü değil, ilişkileri anlamayı kolaylaştıran kavramsal bir modeldir. Anonimlik ve rekabet yükselirken yaptırım ihtimali düşerse toksisite için elverişli bir ortam oluşur.</p>

<table>
  <thead>
    <tr>
      <th>Etken</th>
      <th>Yüz yüze ortam</th>
      <th>Anonim oyun ortamı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kimlik</td>
      <td>Genellikle görünür</td>
      <td>Takma adla gizlenebilir</td>
    </tr>
    <tr>
      <td>Sosyal bedel</td>
      <td>Hızlı ve doğrudan</td>
      <td>Gecikmeli veya belirsiz</td>
    </tr>
    <tr>
      <td>Empati</td>
      <td>Ses, mimik ve beden dili güçlü</td>
      <td>İpuçları sınırlı</td>
    </tr>
    <tr>
      <td>Rekabet</td>
      <td>Sosyal kurallarla dengelenir</td>
      <td>Sıralama ve ödüllerle büyütülebilir</td>
    </tr>
    <tr>
      <td>Sorumluluk</td>
      <td>Bireye kolayca atanır</td>
      <td>Takıma veya sisteme yüklenebilir</td>
    </tr>
  </tbody>
</table>

<h2 id="rekabet-grup-kimliği-ve-günah-keçileri">Rekabet, grup kimliği ve günah keçileri</h2>

<p>Dereceli maçlarda puan kaybetmek, yalnızca sanal bir sayı kaybı gibi görünmeyebilir. Oyuncunun beceri algısı ve grup içindeki statüsü de tehdit edilir. İnsanlar böyle anlarda başarısızlığı kendi kararları yerine takım arkadaşlarına bağlamaya eğilimlidir. Bu, <strong>kendine hizmet eden yanlılık</strong> olarak bilinir.</p>

<p>Takımlar ayrıca hızlı biçimde “biz” ve “onlar” ayrımı üretir. Rakip insan olmaktan çıkıp engel gibi algılandığında empati azalabilir. Takım içinde çoğunluğun bir oyuncuyu suçlaması ise sorumluluğun dağılmasına yol açar: Herkes hakarete katıldığı için kimse kendisini asıl fail olarak görmez.</p>

<h2 id="sosyal-mühendislik-oyuna-nasıl-sızar">Sosyal mühendislik oyuna nasıl sızar?</h2>

<p>Sosyal mühendislik, teknik açık yerine güven, korku, merak veya otorite algısını hedefler. Saldırgan; takım arkadaşı, turnuva yöneticisi ya da destek görevlisi gibi davranarak bağlantıya tıklatmaya, hesap bilgisini almaya veya oyuncuyu başka platforma taşımaya çalışabilir. “Hemen doğrulamazsan hesabın kapanacak” mesajı, zaman baskısıyla eleştirel düşünmeyi devre dışı bırakmayı amaçlar.</p>

<p>Toksik atmosfer saldırgana avantaj sağlar. Öfkeli veya panik hâlindeki oyuncu, normalde sorgulayacağı bir isteğe daha hızlı tepki verebilir. Bu nedenle güvenliğin ilk kuralı basittir: Şifre, doğrulama kodu ve kurtarma anahtarı sohbet üzerinden paylaşılmaz.</p>

<h2 id="yazılımla-erken-uyarı-mümkün-mü">Yazılımla erken uyarı mümkün mü?</h2>

<p>Moderasyon sistemleri mesajları yalnızca yasaklı kelimelerle değil; tekrar, tehdit, büyük harf kullanımı ve rapor geçmişi gibi sinyallerle değerlendirebilir. Aşağıdaki örnek, açıklanabilir basit bir risk puanı üretir:</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">mesaj</span><span class="p">,</span> <span class="n">tekrar</span><span class="p">,</span> <span class="n">gecmis_rapor</span><span class="p">):</span>
    <span class="n">tehditler</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">hesabını kapatırım</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">adresini bulurum</span><span class="sh">"</span><span class="p">]</span>
    <span class="n">puan</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">ifade</span> <span class="ow">in</span> <span class="n">mesaj</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">ifade</span> <span class="ow">in</span> <span class="n">tehditler</span><span class="p">)</span> <span class="o">*</span> <span class="mi">3</span>
    <span class="n">puan</span> <span class="o">+=</span> <span class="nf">min</span><span class="p">(</span><span class="n">tekrar</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
    <span class="n">puan</span> <span class="o">+=</span> <span class="nf">min</span><span class="p">(</span><span class="n">gecmis_rapor</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span>
    <span class="n">puan</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">mesaj</span><span class="p">.</span><span class="nf">isupper</span><span class="p">()</span> <span class="ow">and</span> <span class="nf">len</span><span class="p">(</span><span class="n">mesaj</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">12</span> <span class="k">else</span> <span class="mi">0</span>
    <span class="k">return</span> <span class="n">puan</span>
</code></pre></div></div>

<p>Bu kod otomatik ceza vermek yerine inceleme sırası oluşturabilir. Dil, mizah ve bağlam değiştiği için insan denetimi gereklidir; aksi hâlde yanlış pozitifler ve kültürel önyargılar oluşabilir.</p>

<h2 id="daha-sağlıklı-bir-arena">Daha sağlıklı bir arena</h2>

<p>Etkili çözüm yalnızca oyuncuları susturmak değildir. Hızlı raporlama, davranış geri bildirimi, kademeli yaptırım, pozitif takım ödülleri ve iki faktörlü kimlik doğrulama birlikte kullanılmalıdır. Oyuncular da öfkeliyken yanıt vermemeli, şüpheli bağlantıları açmamalı ve saldırganı engelleyip kanıtları platforma iletmelidir. İyi tasarlanmış sistemler insan doğasını değiştirmez; fakat kötü davranışın ödülünü azaltıp iş birliğini daha görünür ve değerli hâle getirebilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="sosyal mühendislik" /><category term="oyun güvenliği" /><category term="toksisite" /><category term="siber psikoloji" /><category term="multiplayer" /><category term="moderasyon" /><summary type="html"><![CDATA[Bir multiplayer maçına giriyorsunuz: Takım arkadaşınız yanlış koridora gidiyor, biri mikrofonu sonuna kadar açıyor ve henüz ikinci dakika dolmadan sohbet kutusunda küçük çaplı bir iç savaş başlıyor. Bu davranışlar yalnızca “kötü oyunculuk kültürü” değildir. Anonimlik, rekabet, grup kimliği ve sosyal mühendislik aynı dijital arenada buluştuğunda insanların yüz yüze ortamda sergilemeyeceği davranışlar ortaya çıkabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/anonim-arenanin-karanlik-33.png" /><media:content medium="image" url="https://program.sonsuz.us/img/anonim-arenanin-karanlik-33.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C# Operatör Aşırı Yükleme: Nesnelerin Matematikle Dansı</title><link href="https://program.sonsuz.us/posts/c-operator-asiri-yukleme-nesnelerin-matematikle-dansi/" rel="alternate" type="text/html" title="C# Operatör Aşırı Yükleme: Nesnelerin Matematikle Dansı" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-operator-asiri-yukleme-nesnelerin-matematikle-dansi</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-operator-asiri-yukleme-nesnelerin-matematikle-dansi/"><![CDATA[<p><img src="/img/c-operator-asiri-55.svg" alt="c-operator-asiri-55" /></p>

<p>C# ile geliştirdiğimiz özel sınıflar, varsayılan olarak <code class="language-plaintext highlighter-rouge">+</code>, <code class="language-plaintext highlighter-rouge">-</code>, <code class="language-plaintext highlighter-rouge">&gt;</code>, <code class="language-plaintext highlighter-rouge">==</code> gibi operatörlerin ne anlama geldiğini bilmez. Örneğin iki vektörü <code class="language-plaintext highlighter-rouge">vektor1 + vektor2</code> biçiminde toplamak istersek derleyici doğal olarak şaşırır. Operatör aşırı yükleme, bu sembollere kendi nesnelerimiz için anlam kazandırmamızı sağlar. Böylece kod hem matematiksel gösterime yaklaşır hem de daha okunabilir hâle gelir.</p>

<p>``</p>

<h2 id="operatör-aşırı-yükleme-nedir">Operatör aşırı yükleme nedir?</h2>

<p>Operatör aşırı yükleme, mevcut bir operatörün özel bir tür üzerindeki davranışını tanımlamaktır. Burada yeni bir operatör icat etmeyiz; C# tarafından desteklenen operatörlerden birini yeniden anlamlandırırız.</p>

<p>Örneğin iki boyutlu bir vektörümüz şu şekilde gösterilsin:</p>

\[\vec{v} = (x, y)\]

<p>İki vektörün toplamı ise bileşenlerin ayrı ayrı toplanmasıyla bulunur:</p>

\[(x_1, y_1) + (x_2, y_2) = (x_1+x_2, y_1+y_2)\]

<p>Bu matematiksel kuralı C# sınıfına taşıyarak <code class="language-plaintext highlighter-rouge">+</code> operatörünü programlayabiliriz.</p>

<h2 id="temel-söz-dizimi">Temel söz dizimi</h2>

<p>Aşırı yüklenen operatörler <code class="language-plaintext highlighter-rouge">public</code> ve <code class="language-plaintext highlighter-rouge">static</code> olarak tanımlanmalıdır. Metot adı yerine <code class="language-plaintext highlighter-rouge">operator</code> anahtar sözcüğü ve ilgili sembol kullanılır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Vektor</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">X</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">Y</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">Vektor</span><span class="p">(</span><span class="kt">double</span> <span class="n">x</span><span class="p">,</span> <span class="kt">double</span> <span class="n">y</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">X</span> <span class="p">=</span> <span class="n">x</span><span class="p">;</span>
        <span class="n">Y</span> <span class="p">=</span> <span class="n">y</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="n">Vektor</span> <span class="k">operator</span> <span class="p">+(</span><span class="n">Vektor</span> <span class="n">sol</span><span class="p">,</span> <span class="n">Vektor</span> <span class="n">sag</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="k">new</span> <span class="nf">Vektor</span><span class="p">(</span><span class="n">sol</span><span class="p">.</span><span class="n">X</span> <span class="p">+</span> <span class="n">sag</span><span class="p">.</span><span class="n">X</span><span class="p">,</span> <span class="n">sol</span><span class="p">.</span><span class="n">Y</span> <span class="p">+</span> <span class="n">sag</span><span class="p">.</span><span class="n">Y</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">override</span> <span class="kt">string</span> <span class="nf">ToString</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="s">$"(</span><span class="p">{</span><span class="n">X</span><span class="p">}</span><span class="s">, </span><span class="p">{</span><span class="n">Y</span><span class="p">}</span><span class="s">)"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu metot iki <code class="language-plaintext highlighter-rouge">Vektor</code> nesnesini alır ve toplamı temsil eden yeni bir nesne döndürür. Mevcut nesneleri değiştirmemek, özellikle matematiksel değer türlerinde daha güvenli ve tahmin edilebilir bir tasarımdır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">a</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vektor</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">b</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vektor</span><span class="p">(</span><span class="m">4</span><span class="p">,</span> <span class="m">1</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">toplam</span> <span class="p">=</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span><span class="p">;</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">toplam</span><span class="p">);</span> <span class="c1">// (6, 4)</span>
</code></pre></div></div>

<p>Normalde <code class="language-plaintext highlighter-rouge">Vektor.Topla(a, b)</code> gibi bir metot yazılabilirdi. Ancak <code class="language-plaintext highlighter-rouge">a + b</code>, işlemin niyetini çok daha hızlı anlatır.</p>

<p>\vert  Yaklaşım \vert  Kullanım \vert  Okunabilirlik \vert  Matematiksel uyum \vert 
\vert —\vert —\vert —:\vert —:\vert 
\vert  Normal metot \vert  <code class="language-plaintext highlighter-rouge">Vektor.Topla(a, b)</code> \vert  Orta \vert  Düşük \vert 
\vert  Operatör \vert  <code class="language-plaintext highlighter-rouge">a + b</code> \vert  Yüksek \vert  Yüksek \vert 
\vert  Elle hesaplama \vert  <code class="language-plaintext highlighter-rouge">new Vektor(a.X+b.X, a.Y+b.Y)</code> \vert  Düşük \vert  Orta \vert</p>

<h2 id="i̇lişkisel-operatörleri-yüklemek">İlişkisel operatörleri yüklemek</h2>

<p>Vektörleri büyüklüklerine göre karşılaştırabiliriz. Bir vektörün uzunluğu Pisagor bağıntısıyla hesaplanır:</p>

\[\vert \vec{v}\vert  = \sqrt{x^2+y^2}\]

<p>Karşılaştırma sırasında karekök almaya gerek yoktur. Çünkü pozitif değerlerde $a^2 &gt; b^2$ ise $a &gt; b$ olur.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">double</span> <span class="n">UzunlukKaresi</span> <span class="p">=&gt;</span> <span class="n">X</span> <span class="p">*</span> <span class="n">X</span> <span class="p">+</span> <span class="n">Y</span> <span class="p">*</span> <span class="n">Y</span><span class="p">;</span>

<span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&gt;(</span><span class="n">Vektor</span> <span class="n">sol</span><span class="p">,</span> <span class="n">Vektor</span> <span class="n">sag</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">sol</span><span class="p">.</span><span class="n">UzunlukKaresi</span> <span class="p">&gt;</span> <span class="n">sag</span><span class="p">.</span><span class="n">UzunlukKaresi</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">&lt;(</span><span class="n">Vektor</span> <span class="n">sol</span><span class="p">,</span> <span class="n">Vektor</span> <span class="n">sag</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">sol</span><span class="p">.</span><span class="n">UzunlukKaresi</span> <span class="p">&lt;</span> <span class="n">sag</span><span class="p">.</span><span class="n">UzunlukKaresi</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>C# bazı operatörlerin çiftler hâlinde tanımlanmasını ister. <code class="language-plaintext highlighter-rouge">&lt;</code> ekleniyorsa <code class="language-plaintext highlighter-rouge">&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;=</code> ekleniyorsa <code class="language-plaintext highlighter-rouge">&gt;=</code>, <code class="language-plaintext highlighter-rouge">==</code> ekleniyorsa <code class="language-plaintext highlighter-rouge">!=</code> de tanımlanmalıdır. Derleyici bu konuda “Birini çağırdıysan arkadaşını da getir!” yaklaşımındadır.</p>

<table>
  <thead>
    <tr>
      <th>Operatör</th>
      <th>Zorunlu eşi</th>
      <th>Örnek anlam</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">==</code></td>
      <td><code class="language-plaintext highlighter-rouge">!=</code></td>
      <td>Değer eşitliği</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;</code></td>
      <td><code class="language-plaintext highlighter-rouge">&gt;</code></td>
      <td>Büyüklük karşılaştırması</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;=</code></td>
      <td><code class="language-plaintext highlighter-rouge">&gt;=</code></td>
      <td>Sıralama ve eşitlik</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">true</code></td>
      <td><code class="language-plaintext highlighter-rouge">false</code></td>
      <td>Mantıksal değerlendirme</td>
    </tr>
  </tbody>
</table>

<h2 id="eşitlikte-dikkat-edilmesi-gerekenler">Eşitlikte dikkat edilmesi gerekenler</h2>

<p><code class="language-plaintext highlighter-rouge">==</code> operatörü yüklendiğinde <code class="language-plaintext highlighter-rouge">Equals</code> ve <code class="language-plaintext highlighter-rouge">GetHashCode</code> metotları da uyumlu biçimde ezilmelidir. Aksi hâlde operatöre göre eşit olan iki nesne, bir <code class="language-plaintext highlighter-rouge">Dictionary</code> veya <code class="language-plaintext highlighter-rouge">HashSet</code> içinde farklı kabul edilebilir. Eşitlik tanımı uygulamanın her noktasında aynı mantığı izlemelidir.</p>

<p>Operatör aşırı yükleme güçlüdür; fakat yalnızca operatörün anlamı kullanıcı için doğal olduğunda tercih edilmelidir. Bir <code class="language-plaintext highlighter-rouge">Musteri</code> nesnesini başka bir müşteriyle toplamak belirsizken, para, tarih aralığı, karmaşık sayı veya vektörleri toplamak oldukça anlaşılırdır. Ayrıca operatörün önceliği ve operand sayısı değiştirilemez. Doğru kullanıldığında bu özellik, C++’taki benzer yaklaşım gibi özel nesneleri dilin doğal parçalarıymış gibi kullanmamızı sağlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="csharp" /><category term="operatör-aşırı-yükleme" /><category term="nesne-yönelimli-programlama" /><category term="dotnet" /><category term="operator-overloading" /><summary type="html"><![CDATA[C# ile geliştirdiğimiz özel sınıflar, varsayılan olarak +, -, &gt;, == gibi operatörlerin ne anlama geldiğini bilmez. Örneğin iki vektörü vektor1 + vektor2 biçiminde toplamak istersek derleyici doğal olarak şaşırır. Operatör aşırı yükleme, bu sembollere kendi nesnelerimiz için anlam kazandırmamızı sağlar. Böylece kod hem matematiksel gösterime yaklaşır hem de daha okunabilir hâle gelir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-operator-asiri-55.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-operator-asiri-55.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Küpün ve Kontrolcünün Ritmi: Speedcubing ile Video Oyun Optimizasyonu</title><link href="https://program.sonsuz.us/posts/kupun-ve-kontrolcunun-ritmi-speedcubing-ile-video-oyun-optimizasyonu/" rel="alternate" type="text/html" title="Küpün ve Kontrolcünün Ritmi: Speedcubing ile Video Oyun Optimizasyonu" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kupun-ve-kontrolcunun-ritmi-speedcubing-ile-video-oyun-optimizasyonu</id><content type="html" xml:base="https://program.sonsuz.us/posts/kupun-ve-kontrolcunun-ritmi-speedcubing-ile-video-oyun-optimizasyonu/"><![CDATA[<p>Bir Rubik küpünü saniyeler içinde çözmek ile bir video oyununda kusursuz hareket dizileri uygulamak ilk bakışta farklı beceriler gibi görünür. Oysa speedcuber’ın algoritma çalışmasıyla oyuncunun hareket, nişan veya kaynak yönetimi pratiği aynı zihinsel dönüşüme dayanır: Yavaş ve bilinçli kararlar, tekrar sayesinde hızlı ve otomatik motor kalıplara dönüşür.</p>

<p><img src="/img/kupun-ve-kontrolcunun-82.svg" alt="kupun-ve-kontrolcunun-82" /></p>

<p>``</p>

<h2 id="bilinçli-hareketten-otomatik-tepkiye">Bilinçli hareketten otomatik tepkiye</h2>

<p>Yeni başlayan bir speedcuber, karşısındaki deseni tanımaya ve uygun algoritmayı hatırlamaya çalışır. Deneyimli biri ise deseni gördüğü anda ellerini harekete geçirir. Benzer biçimde acemi bir oyuncu hangi tuşa basacağını düşünürken deneyimli oyuncu saldırıdan kaçıp karşı hamle yapabilir.</p>

<p>Bu gelişim <strong>motor hafızası</strong> olarak adlandırılır. Ancak kasların kendi başına bilgi depoladığı düşünülmemelidir. Öğrenme; beyin, sinir sistemi, görsel algı ve kas koordinasyonu arasında kurulan bağlantıların güçlenmesidir. Bir hareket dizisi tekrarlandıkça karar verme maliyeti azalır ve işlem otomatikleşir.</p>

<p>Basitleştirilmiş bir öğrenme modeli şöyle gösterilebilir:</p>

\[T(n) = T_{min} + (T_0 - T_{min})e^{-kn}\]

<p>Burada $T(n)$, $n$ tekrar sonrasındaki uygulama süresi; $T_0$ başlangıç süresi; $T_{min}$ ulaşılabilecek yaklaşık alt sınır; $k$ ise öğrenme hızıdır. İlk tekrarlar büyük gelişmeler sağlarken ilerleyen aşamalarda her küçük iyileştirme daha fazla emek ister. Yani 60 saniyeden 30 saniyeye düşmek, 12 saniyeden 11 saniyeye düşmekten çoğu zaman daha kolaydır.</p>

<h2 id="i̇ki-dünyanın-ortak-mekanikleri">İki dünyanın ortak mekanikleri</h2>

<table>
  <thead>
    <tr>
      <th>Zihinsel süreç</th>
      <th>Speedcubing örneği</th>
      <th>Video oyunu örneği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Desen tanıma</td>
      <td>F2L çiftini fark etmek</td>
      <td>Rakibin saldırı animasyonunu okumak</td>
    </tr>
    <tr>
      <td>Parçalama</td>
      <td>Algoritmayı kısa tetiklere ayırmak</td>
      <td>Komboyu küçük giriş dizilerine bölmek</td>
    </tr>
    <tr>
      <td>Motor hafıza</td>
      <td>Parmak hareketlerini otomatikleştirmek</td>
      <td>Tuş, fare veya kontrolcü hareketini otomatikleştirmek</td>
    </tr>
    <tr>
      <td>İleri planlama</td>
      <td>Sonraki çifti çözüm sırasında aramak</td>
      <td>Sonraki rota veya hamleyi önceden seçmek</td>
    </tr>
    <tr>
      <td>Hata analizi</td>
      <td>Küp rotasyonlarını incelemek</td>
      <td>Kayıt veya tekrar görüntüsünü izlemek</td>
    </tr>
  </tbody>
</table>

<p>Her iki alanda da uzmanlık yalnızca “daha hızlı hareket etmek” değildir. Asıl kazanç, gereksiz kararları ve hareketleri ortadan kaldırmaktır. Speedcubing’de buna düşük hamle sayısı, akıcı dönüşler ve iyi look-ahead eşlik eder. Oyunlarda ise doğru rota, uygun zamanlama ve minimum girdiyle maksimum sonuç önem kazanır.</p>

<h2 id="tekrar-var-tekrar-var">Tekrar var, tekrar var</h2>

<p>Aynı diziyi düşünmeden yüz kez yapmak her zaman verimli değildir. Hatalı hareket tekrarlandığında beyin o hatayı da otomatikleştirebilir. Bu nedenle <strong>bilinçli pratik</strong>, rastgele tekrardan daha değerlidir.</p>

<table>
  <thead>
    <tr>
      <th>Verimsiz tekrar</th>
      <th>Bilinçli pratik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sürekli tam çözüm veya tam maç yapmak</td>
      <td>Tek bir zayıf beceriyi izole etmek</td>
    </tr>
    <tr>
      <td>Yalnızca sonucu ölçmek</td>
      <td>Süreç, hata ve tutarlılığı ölçmek</td>
    </tr>
    <tr>
      <td>Hız uğruna tekniği bozmak</td>
      <td>Önce doğru, sonra hızlı uygulamak</td>
    </tr>
    <tr>
      <td>Yorulana kadar devam etmek</td>
      <td>Kısa çalışma ve dinlenme döngüleri kullanmak</td>
    </tr>
  </tbody>
</table>

<p>Örneğin bir speedcuber yalnızca zorlandığı algoritmayı çalışabilir. Bir oyuncu da tüm bölümü yeniden oynamak yerine problemli sıçramayı, komboyu veya nişan geçişini ayrı bir antrenman ortamında tekrarlayabilir.</p>

<h2 id="gelişimi-veriye-dönüştürmek">Gelişimi veriye dönüştürmek</h2>

<p>Aşağıdaki küçük Python kodu, pratik sürelerinin ortalamasını ve tutarlılığını ölçer:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">statistics</span> <span class="kn">import</span> <span class="n">mean</span><span class="p">,</span> <span class="n">pstdev</span>

<span class="n">sureler</span> <span class="o">=</span> <span class="p">[</span><span class="mf">18.4</span><span class="p">,</span> <span class="mf">17.9</span><span class="p">,</span> <span class="mf">18.1</span><span class="p">,</span> <span class="mf">17.6</span><span class="p">,</span> <span class="mf">17.8</span><span class="p">]</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Ortalama:</span><span class="sh">'</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="nf">mean</span><span class="p">(</span><span class="n">sureler</span><span class="p">),</span> <span class="mi">2</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Sapma:</span><span class="sh">'</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="nf">pstdev</span><span class="p">(</span><span class="n">sureler</span><span class="p">),</span> <span class="mi">2</span><span class="p">))</span>
</code></pre></div></div>

<p>Ortalama süre genel performansı, standart sapma ise denemeler arasındaki değişkenliği gösterir. Daha düşük ortalama hızlanmayı; daha düşük sapma ise becerinin güvenilir biçimde otomatikleştiğini anlatır. Aynı yaklaşım küp çözme sürelerine, bölüm tamamlama kayıtlarına veya hedef vurma testlerine uygulanabilir.</p>

<h2 id="sonuç-hız-düşünmemek-değil-doğru-düşünmektir">Sonuç: Hız, düşünmemek değil doğru düşünmektir</h2>

<p>Speedcubing ve oyun optimizasyonunda ustalık, zihni tamamen devre dışı bırakmak anlamına gelmez. Temel hareketler motor hafızasına aktarılınca bilinçli dikkat daha üst düzey problemlere ayrılır. Eller mevcut hamleyi tamamlarken zihin bir sonraki deseni, rotayı veya riski değerlendirebilir. Gerçek hız böyle doğar: doğru hareketi öğrenmek, onu parçalara ayırmak, kontrollü biçimde tekrarlamak ve sonunda akışın doğal bir parçasına dönüştürmek.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="speedcubing" /><category term="video oyunları" /><category term="motor hafıza" /><category term="optimizasyon" /><category term="bilinçli pratik" /><category term="bilişsel bilim" /><summary type="html"><![CDATA[Bir Rubik küpünü saniyeler içinde çözmek ile bir video oyununda kusursuz hareket dizileri uygulamak ilk bakışta farklı beceriler gibi görünür. Oysa speedcuber’ın algoritma çalışmasıyla oyuncunun hareket, nişan veya kaynak yönetimi pratiği aynı zihinsel dönüşüme dayanır: Yavaş ve bilinçli kararlar, tekrar sayesinde hızlı ve otomatik motor kalıplara dönüşür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kupun-ve-kontrolcunun-82.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kupun-ve-kontrolcunun-82.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Mars Rover’larında Otonom Karar Verme: Gecikmeye Rağmen Güvenli Keşif</title><link href="https://program.sonsuz.us/posts/mars-roverlarinda-otonom-karar-verme-gecikmeye-ragmen-guvenli-kesif/" rel="alternate" type="text/html" title="Mars Rover’larında Otonom Karar Verme: Gecikmeye Rağmen Güvenli Keşif" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/mars-roverlarinda-otonom-karar-verme-gecikmeye-ragmen-guvenli-kesif</id><content type="html" xml:base="https://program.sonsuz.us/posts/mars-roverlarinda-otonom-karar-verme-gecikmeye-ragmen-guvenli-kesif/"><![CDATA[<p>Mars yüzeyinde ilerleyen bir rover, Dünya’dan verilen her komutu anında uygulayan uzaktan kumandalı bir araba değildir. Gezegenlerin konumuna bağlı olarak tek yönlü iletişim yaklaşık 4–24 dakika sürebilir. Rover bir kayaya yaklaşırken operatörün “Sola dön!” komutunu bekleseydi cevap gelene kadar çoktan kuma saplanmış olabilirdi. Bu nedenle araç; çevresini algılayan, riskleri hesaplayan ve güvenli rotayı kendi başına seçen küçük bir robot kâşif gibi davranır.
``</p>

<h2 id="neden-otonomi-gerekli">Neden otonomi gerekli?</h2>

<p>Bir komutun Dünya’dan Mars’a gidip sonucunun geri dönmesi için gereken yaklaşık süre şöyle düşünülebilir:</p>

\[T_{toplam} = 2 \times \frac{d}{c} + T_{işleme}\]

<p>Burada $d$ gezegenler arasındaki mesafe, $c$ ışık hızı ve $T_{işleme}$ görev merkezindeki değerlendirme süresidir. Radyo sinyalleri ışık hızında ilerlese bile mesafe ortadan kalkmaz. Üstelik bant genişliği sınırlıdır; rover sürekli yüksek çözünürlüklü görüntü gönderemez.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dünya’dan doğrudan kontrol</td>
      <td>İnsan uzmanlığı yüksektir</td>
      <td>Gecikme nedeniyle anlık tepki veremez</td>
    </tr>
    <tr>
      <td>Tam otonom hareket</td>
      <td>Hızlı karar alır</td>
      <td>Hatalı algılama riski taşır</td>
    </tr>
    <tr>
      <td>Karma yaklaşım</td>
      <td>Güvenlik ve esnekliği dengeler</td>
      <td>Karmaşık yazılım ve test gerektirir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/mars-roverlarinda-otonom-71.svg" alt="mars-roverlarinda-otonom-71" /></p>

<p>Güncel görevlerde çoğunlukla karma yaklaşım kullanılır. Bilim insanları hedef bölgeyi belirler; rover ise birkaç metrelik hareket sırasında taşlardan, çukurlardan ve tehlikeli eğimlerden kaçınır.</p>

<h2 id="rover-çevresini-nasıl-görüyor">Rover çevresini nasıl görüyor?</h2>

<p>Otonom sürüşün ilk aşaması <strong>algılama</strong>dır. Stereo kameralar aynı sahneyi iki farklı noktadan görüntüler. İnsan gözlerindeki derinlik algısına benzeyen bu yöntemle pikseller arasındaki kayma, yani disparity, ölçülür. Basitleştirilmiş derinlik bağıntısı şöyledir:</p>

\[Z = \frac{fB}{\Delta x}\]

<p>$Z$ engele olan uzaklığı, $f$ kameranın odak uzaklığını, $B$ iki kamera arasındaki mesafeyi ve $\Delta x$ görüntülerdeki piksel farkını gösterir. Rover bu verilerden üç boyutlu bir nokta bulutu ve yerel arazi haritası üretir.</p>

<p>Her arazi parçasına bir maliyet atanabilir:</p>

\[C = w_1E + w_2S + w_3R + w_4D\]

<p>Burada $E$ eğim, $S$ zeminin gevşekliği, $R$ kaya riski ve $D$ hedefe olan uzaklıktır. Ağırlıklar görev önceliklerine göre ayarlanır. Böylece en kısa rota yerine en güvenli ve enerji açısından uygun rota seçilebilir.</p>

<h2 id="rota-planlama-nasıl-çalışıyor">Rota planlama nasıl çalışıyor?</h2>

<p>Harita hücrelere veya düğümlere ayrıldıktan sonra A<em>, Dijkstra ya da örnekleme tabanlı algoritmalar kullanılabilir. A</em> algoritmasının temel değerlendirmesi şöyledir:</p>

\[f(n) = g(n) + h(n)\]

<p>$g(n)$ başlangıçtan mevcut noktaya kadar gerçek maliyeti, $h(n)$ ise hedefe kalan tahmini maliyeti temsil eder.</p>

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

<span class="k">def</span> <span class="nf">guvenli_adimlar</span><span class="p">(</span><span class="n">baslangic</span><span class="p">,</span> <span class="n">hedef</span><span class="p">,</span> <span class="n">komsular</span><span class="p">):</span>
    <span class="n">kuyruk</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="n">baslangic</span><span class="p">,</span> <span class="p">[])]</span>
    <span class="n">ziyaret</span> <span class="o">=</span> <span class="nf">set</span><span class="p">()</span>

    <span class="k">while</span> <span class="n">kuyruk</span><span class="p">:</span>
        <span class="n">maliyet</span><span class="p">,</span> <span class="n">konum</span><span class="p">,</span> <span class="n">yol</span> <span class="o">=</span> <span class="nf">heappop</span><span class="p">(</span><span class="n">kuyruk</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">konum</span> <span class="o">==</span> <span class="n">hedef</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">yol</span> <span class="o">+</span> <span class="p">[</span><span class="n">konum</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">konum</span> <span class="ow">in</span> <span class="n">ziyaret</span><span class="p">:</span>
            <span class="k">continue</span>

        <span class="n">ziyaret</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">konum</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">yeni</span><span class="p">,</span> <span class="n">arazi_riski</span> <span class="ow">in</span> <span class="nf">komsular</span><span class="p">(</span><span class="n">konum</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">yeni</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ziyaret</span><span class="p">:</span>
                <span class="nf">heappush</span><span class="p">(</span><span class="n">kuyruk</span><span class="p">,</span> <span class="p">(</span>
                    <span class="n">maliyet</span> <span class="o">+</span> <span class="n">arazi_riski</span><span class="p">,</span>
                    <span class="n">yeni</span><span class="p">,</span>
                    <span class="n">yol</span> <span class="o">+</span> <span class="p">[</span><span class="n">konum</span><span class="p">]</span>
                <span class="p">))</span>
    <span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>

<p>Bu sade örnek, komşu konumları arazi riskine göre kuyruğa ekler. Gerçek rover yazılımı tekerlek kaymasını, enerji tüketimini, gövde yüksekliğini ve iletişim fırsatlarını da hesaba katar.</p>

<h2 id="karar-vermek-yalnızca-ilerlemek-değildir">Karar vermek yalnızca ilerlemek değildir</h2>

<p>Rover risk yükseldiğinde durabilir, yeni fotoğraflar çekebilir veya farklı bir rota hesaplayabilir. Tekerleklerin dönüşüyle beklenen hareket karşılaştırılarak kayma tahmin edilir. Motorlar çalıştığı hâlde konum değişmiyorsa sistem gevşek kum ihtimalini fark eder.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Otonom tepki</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Büyük kaya</td>
      <td>Yanal kaçış rotası oluşturma</td>
    </tr>
    <tr>
      <td>Dik eğim</td>
      <td>Maliyeti artırma veya rotayı reddetme</td>
    </tr>
    <tr>
      <td>Tekerlek kayması</td>
      <td>Hızı azaltma ve yeniden planlama</td>
    </tr>
    <tr>
      <td>Belirsiz görüntü</td>
      <td>Durup ek görüntü toplama</td>
    </tr>
    <tr>
      <td>Kritik hata</td>
      <td>Güvenli moda geçme</td>
    </tr>
  </tbody>
</table>

<p>Mars’ta başarılı otonomi, rover’ın “zekice cesur” değil, ölçülü biçimde temkinli olmasıdır. Çünkü milyonlarca kilometre uzaktaki bir robot için en iyi karar bazen yeni bir keşfe koşmak değil, durup Dünya’daki ekibin talimatını beklemektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="mars" /><category term="otonom sistemler" /><category term="yapay zeka" /><category term="rota planlama" /><category term="robotik" /><category term="bilgisayarlı görü" /><summary type="html"><![CDATA[Mars yüzeyinde ilerleyen bir rover, Dünya’dan verilen her komutu anında uygulayan uzaktan kumandalı bir araba değildir. Gezegenlerin konumuna bağlı olarak tek yönlü iletişim yaklaşık 4–24 dakika sürebilir. Rover bir kayaya yaklaşırken operatörün “Sola dön!” komutunu bekleseydi cevap gelene kadar çoktan kuma saplanmış olabilirdi. Bu nedenle araç; çevresini algılayan, riskleri hesaplayan ve güvenli rotayı kendi başına seçen küçük bir robot kâşif gibi davranır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/mars-roverlarinda-otonom-71.png" /><media:content medium="image" url="https://program.sonsuz.us/img/mars-roverlarinda-otonom-71.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">N-Cisim Problemi: Python ile Kütle Çekimi Simülasyonu</title><link href="https://program.sonsuz.us/posts/n-cisim-problemi-python-ile-kutle-cekimi-simulasyonu/" rel="alternate" type="text/html" title="N-Cisim Problemi: Python ile Kütle Çekimi Simülasyonu" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/n-cisim-problemi-python-ile-kutle-cekimi-simulasyonu</id><content type="html" xml:base="https://program.sonsuz.us/posts/n-cisim-problemi-python-ile-kutle-cekimi-simulasyonu/"><![CDATA[<p><img src="/img/n-cisim-problemi-71.svg" alt="n-cisim-problemi-71" /></p>

<p>Gökyüzündeki hareketler ilk bakışta kusursuz bir saat mekanizması gibi görünür. Ancak sisteme üçüncü bir gök cismi eklendiğinde işler hızla kozmik bir bilardo masasına dönüşür! N-cisim problemi; yıldızların, gezegenlerin veya galaksilerin karşılıklı kütle çekimi altında nasıl hareket ettiğini bulmayı amaçlar. Genel bir analitik çözümü bulunmadığından bilgisayarlarla küçük zaman adımları hâlinde yaklaşık sonuçlar hesaplarız.</p>

<p>``</p>

<h2 id="newtondan-simülasyona">Newton’dan simülasyona</h2>

<p>İki cismin arasındaki çekim kuvveti Newton yasasıyla hesaplanır:</p>

\[F = G\frac{m_1m_2}{r^2}\]

<p>Burada $G$ kütle çekim sabiti, $m_1$ ve $m_2$ kütleler, $r$ ise cisimler arasındaki uzaklıktır. Fakat yönü de hesaba katmak için vektörel ifadeye ihtiyacımız vardır. $i$ cisminin $j$ nedeniyle kazandığı ivme şöyledir:</p>

\[\vec{a}_{ij}=Gm_j\frac{\vec{r}_j-\vec{r}_i}{(\vert \vec{r}_j-\vec{r}_i\vert ^2+\epsilon^2)^{3/2}}\]

<p>Toplam ivme, diğer bütün cisimlerin katkılarının toplamıdır:</p>

\[\vec{a}_i=\sum_{j\ne i}\vec{a}_{ij}\]

<p>Formüldeki $\epsilon$, iki cisim aşırı yaklaştığında ivmenin sonsuza gitmesini engelleyen <strong>yumuşatma parametresidir</strong>. Bu değer fiziksel bir yasa değil, sayısal simülasyonu kararlı tutan küçük bir emniyet yastığıdır.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Fiziksel anlamı</th>
      <th>Simülasyondaki görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Konum</td>
      <td>Cismin uzaydaki yeri</td>
      <td>Uzaklık ve yön hesabı</td>
    </tr>
    <tr>
      <td>Hız</td>
      <td>Konumun değişim oranı</td>
      <td>Yeni konumu belirleme</td>
    </tr>
    <tr>
      <td>İvme</td>
      <td>Hızın değişim oranı</td>
      <td>Kütle çekimini uygulama</td>
    </tr>
    <tr>
      <td>Zaman adımı</td>
      <td>İki hesap arasındaki süre</td>
      <td>Hassasiyet ve performans dengesi</td>
    </tr>
    <tr>
      <td>Yumuşatma</td>
      <td>Yakın geçiş düzeltmesi</td>
      <td>Sayısal patlamayı önleme</td>
    </tr>
  </tbody>
</table>

<h2 id="neden-adım-adım-hesaplıyoruz">Neden adım adım hesaplıyoruz?</h2>

<p>İvme sürekli değiştiği için gelecekteki konumu tek hamlede bulamayız. Zamanı $\Delta t$ büyüklüğünde dilimlere ayırır, her dilimde ivme, hız ve konumu güncelleriz. Basit Euler yöntemi kolaydır fakat uzun simülasyonlarda enerji hatası biriktirir. <strong>Leapfrog</strong> yöntemi ise hız ve konumu birbirinin arasına yerleştirerek daha kararlı sonuç verir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th style="text-align: right">Kolaylık</th>
      <th style="text-align: right">Kararlılık</th>
      <th>Tipik kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Euler</td>
      <td style="text-align: right">Yüksek</td>
      <td style="text-align: right">Düşük</td>
      <td>Eğitim ve hızlı prototip</td>
    </tr>
    <tr>
      <td>Leapfrog</td>
      <td style="text-align: right">Orta</td>
      <td style="text-align: right">Yüksek</td>
      <td>Yörünge simülasyonları</td>
    </tr>
    <tr>
      <td>Runge-Kutta 4</td>
      <td style="text-align: right">Orta</td>
      <td style="text-align: right">Yüksek</td>
      <td>Hassas kısa süreli hesaplar</td>
    </tr>
  </tbody>
</table>

<h2 id="python-ile-temel-uygulama">Python ile temel uygulama</h2>

<p>Aşağıdaki kod, iki boyutlu bir sistemde bütün cisimlerin ivmelerini hesaplar ve Leapfrog adımı uygular:</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="n">G</span> <span class="o">=</span> <span class="mf">1.0</span>
<span class="n">EPS</span> <span class="o">=</span> <span class="mf">0.01</span>
<span class="n">DT</span> <span class="o">=</span> <span class="mf">0.001</span>

<span class="k">def</span> <span class="nf">accelerations</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">mass</span><span class="p">):</span>
    <span class="n">n</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">mass</span><span class="p">)</span>
    <span class="n">acc</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">zeros_like</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">j</span><span class="p">:</span>
                <span class="k">continue</span>

            <span class="n">delta</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">pos</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="n">distance2</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">dot</span><span class="p">(</span><span class="n">delta</span><span class="p">,</span> <span class="n">delta</span><span class="p">)</span> <span class="o">+</span> <span class="n">EPS</span><span class="o">**</span><span class="mi">2</span>
            <span class="n">acc</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">G</span> <span class="o">*</span> <span class="n">mass</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">delta</span> <span class="o">/</span> <span class="n">distance2</span><span class="o">**</span><span class="mf">1.5</span>

    <span class="k">return</span> <span class="n">acc</span>

<span class="k">def</span> <span class="nf">leapfrog_step</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">vel</span><span class="p">,</span> <span class="n">mass</span><span class="p">):</span>
    <span class="c1"># Hızı yarım adım ilerlet.
</span>    <span class="n">acc</span> <span class="o">=</span> <span class="nf">accelerations</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">mass</span><span class="p">)</span>
    <span class="n">vel</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">DT</span> <span class="o">*</span> <span class="n">acc</span>

    <span class="c1"># Yeni hızla konumu tam adım ilerlet.
</span>    <span class="n">pos</span> <span class="o">+=</span> <span class="n">DT</span> <span class="o">*</span> <span class="n">vel</span>

    <span class="c1"># Yeni konumdaki ivmeyle hız adımını tamamla.
</span>    <span class="n">acc</span> <span class="o">=</span> <span class="nf">accelerations</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">mass</span><span class="p">)</span>
    <span class="n">vel</span> <span class="o">+=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">DT</span> <span class="o">*</span> <span class="n">acc</span>
    <span class="k">return</span> <span class="n">pos</span><span class="p">,</span> <span class="n">vel</span>

<span class="n">mass</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">1000.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">])</span>
<span class="n">pos</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span> <span class="p">[</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span> <span class="p">[</span><span class="o">-</span><span class="mf">1.5</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">]])</span>
<span class="n">vel</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">],</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">31.6</span><span class="p">],</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">25.8</span><span class="p">]])</span>

<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">):</span>
    <span class="n">pos</span><span class="p">,</span> <span class="n">vel</span> <span class="o">=</span> <span class="nf">leapfrog_step</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">vel</span><span class="p">,</span> <span class="n">mass</span><span class="p">)</span>
</code></pre></div></div>

<p>İç içe döngüler nedeniyle hesaplama maliyeti $O(N^2)$ olur: cisim sayısı iki katına çıktığında etkileşim sayısı yaklaşık dört kat artar. Binlerce cisim için Barnes–Hut algoritması, uzaktaki cisimleri gruplandırarak maliyeti yaklaşık $O(N\log N)$ seviyesine indirebilir.</p>

<p>Sonuçları değerlendirirken yalnızca güzel yörüngelere bakmak yeterli değildir. Toplam enerji ve momentum yaklaşık korunmalıdır. Enerji sürekli artıyor veya azalıyorsa zaman adımı fazla büyük olabilir. İşte N-cisim simülasyonunun temel sırrı budur: doğru fizik kadar, hatayı kontrol eden doğru sayısal yöntem de gerekir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="n-cisim" /><category term="python" /><category term="fizik" /><category term="simülasyon" /><category term="kütle-çekimi" /><category term="sayısal-analiz" /><summary type="html"><![CDATA[Gökyüzündeki hareketler ilk bakışta kusursuz bir saat mekanizması gibi görünür. Ancak sisteme üçüncü bir gök cismi eklendiğinde işler hızla kozmik bir bilardo masasına dönüşür! N-cisim problemi; yıldızların, gezegenlerin veya galaksilerin karşılıklı kütle çekimi altında nasıl hareket ettiğini bulmayı amaçlar. Genel bir analitik çözümü bulunmadığından bilgisayarlarla küçük zaman adımları hâlinde yaklaşık sonuçlar hesaplarız.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/n-cisim-problemi-71.png" /><media:content medium="image" url="https://program.sonsuz.us/img/n-cisim-problemi-71.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Apollo Uçuş Bilgisayarı: 2 KB Bellekle Ay’a Giden Yazılım</title><link href="https://program.sonsuz.us/posts/apollo-ucus-bilgisayari-2-kb-bellekle-aya-giden-yazilim/" rel="alternate" type="text/html" title="Apollo Uçuş Bilgisayarı: 2 KB Bellekle Ay’a Giden Yazılım" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/apollo-ucus-bilgisayari-2-kb-bellekle-aya-giden-yazilim</id><content type="html" xml:base="https://program.sonsuz.us/posts/apollo-ucus-bilgisayari-2-kb-bellekle-aya-giden-yazilim/"><![CDATA[<p>Bugün birkaç tarayıcı sekmesi yüzünden gigabaytlarca bellek tüketebilirken NASA, insanları Ay’a yaklaşık 2 KB yazılabilir belleğe sahip Apollo Guidance Computer (AGC) ile indirdi. Üstelik bu bilgisayar yalnızca rota hesaplamıyor; sensörleri okuyor, motorları yönetiyor ve astronotlarla iletişim kuruyordu. Kısacası AGC, donanım kısıtlarının yaratıcı yazılım mimarisine nasıl dönüştürülebileceğini gösteren tarihî bir gömülü sistem şaheseridir.</p>

<p><img src="/img/apollo-ucus-bilgisayari-20.svg" alt="apollo-ucus-bilgisayari-20" /></p>

<p>``</p>

<h2 id="küçük-ama-görev-kritik-bir-bilgisayar">Küçük ama görev kritik bir bilgisayar</h2>

<p>MIT Instrumentation Laboratory tarafından geliştirilen AGC, Komuta Modülü ve Ay Modülü’nde kullanıldı. Yaklaşık 2,048 MHz saat frekansına sahipti; ancak bu değer modern işlemcilerle doğrudan karşılaştırılmamalıdır. Temel bellek birimi 15 veri biti ve bir eşlik bitinden oluşan 16 bitlik sözcüktü.</p>

<p>Bellek iki ana bölüme ayrılıyordu:</p>

<table>
  <thead>
    <tr>
      <th>Bellek türü</th>
      <th style="text-align: right">Yaklaşık kapasite</th>
      <th>Kullanım amacı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Erasable memory</td>
      <td style="text-align: right">2.048 sözcük</td>
      <td>Değişkenler, çalışma verileri ve yığın benzeri alanlar</td>
    </tr>
    <tr>
      <td>Fixed rope memory</td>
      <td style="text-align: right">36.864 sözcük</td>
      <td>Kalıcı program kodu ve sabitler</td>
    </tr>
  </tbody>
</table>

<p>Modern ölçüyle yazılabilir kapasite yaklaşık olarak şöyle düşünülebilir:</p>

\[M = 2048 \times 15 \text{ bit} \approx 3.75 \text{ KiB}\]

<p>Fakat eşlik bitleri, adresleme düzeni ve kullanılabilir alanlar dikkate alındığında pratik çalışma alanı oldukça sınırlıydı. Sıkça söylenen “2 KB” ifadesi de bu kısıtlı erasable memory yapısını özetler.</p>

<h2 id="core-rope-yazılımı-gerçekten-dokumak">Core rope: Yazılımı gerçekten dokumak</h2>

<p>AGC’nin kalıcı programı, core rope memory adı verilen özel bir bellekte saklanıyordu. Teller manyetik çekirdeklerin içinden geçirilirse bir, dışından geçirilirse sıfır temsil ediliyordu. Bu nedenle yazılım üretiminin son aşaması fiziksel dokuma sürecine benziyordu.</p>

<table>
  <thead>
    <tr>
      <th>Modern geliştirme</th>
      <th>Apollo dönemi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Güncelleme birkaç saniyede yüklenebilir</td>
      <td>Program değişikliği belleğin yeniden üretilmesini gerektirir</td>
    </tr>
    <tr>
      <td>Hata düzeltmesi uzaktan dağıtılabilir</td>
      <td>Hatalar fırlatmadan önce bulunmalıdır</td>
    </tr>
    <tr>
      <td>Depolama görece ucuzdur</td>
      <td>Her sözcük dikkatle planlanır</td>
    </tr>
  </tbody>
</table>

<p>Bu yöntem zahmetliydi ama belleği güç kesintilerine ve uzay koşullarına karşı dayanıklı kılıyordu. Yazılım ekibi, gereksiz her komutu gerçek bir maliyet olarak görüyordu.</p>

<h2 id="executive-erken-dönem-gerçek-zamanlı-işletim-sistemi">Executive: Erken dönem gerçek zamanlı işletim sistemi</h2>

<p>AGC yazılımının kalbinde <strong>Executive</strong> bulunuyordu. Executive, görevleri önceliklerine göre çalıştıran kooperatif ve kesme destekli bir zamanlama mekanizmasıydı. Kritik bir görev geldiğinde daha düşük öncelikli işler ertelenebiliyordu. Böylece bilgisayar, aynı anda yapılacak çok iş varken “önce hangisi hayati?” sorusunu cevaplıyordu.</p>

<p>Basitleştirilmiş mantık şu sözde kodla gösterilebilir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>while görev_var:
    görev = en_yüksek_öncelikli_görevi_seç()

    if yeterli_kaynak_var(görev):
        görevi_çalıştır(görev)
    else:
        düşük_öncelikli_işleri_bırak()
        alarm_göster()
</code></pre></div></div>

<p>Bu kod, gerçek AGC kaynak kodu değildir; Executive’in kaynak yetersizliğinde önemli işleri koruma yaklaşımını anlatır. Ayrıca <strong>Interpreter</strong> adlı sanal makine benzeri katman, navigasyon hesaplarında kullanılan karmaşık vektör ve matris işlemlerini daha yoğun biçimde ifade ediyordu. Yani ekip, sınırlı komut kümesinin üzerine göreve özel bir soyutlama katmanı kurmuştu.</p>

<h2 id="1201-ve-1202-alarmları-neden-başarı-hikâyesidir">1201 ve 1202 alarmları neden başarı hikâyesidir?</h2>

<p>Apollo 11’in inişi sırasında buluşma radarından gelen beklenmedik işler işlemci yükünü artırdı. AGC, 1201 ve 1202 program alarmlarını üretti. Bu alarmlar bilgisayarın tamamen çöktüğünü değil, Executive’in bütün işleri zamanında tamamlayamadığını bildiriyordu.</p>

<p>Yeniden başlatma koruması sayesinde sistem, düşük öncelikli görevleri bıraktı; uçuş kontrolü ve yönlendirme gibi kritik görevleri sürdürdü. Yaklaşım kabaca şu ilkeye dayanıyordu:</p>

\[kritik\ görevler &gt; yardımcı\ görevler\]

<p>Bu, günümüzde gerçek zamanlı işletim sistemlerinde kullanılan önceliklendirme, hata yalıtımı ve kontrollü bozulma fikirlerinin erken ve etkileyici bir örneğidir.</p>

<h2 id="dsky-ve-kalıcı-dersler">DSKY ve kalıcı dersler</h2>

<p>Astronotlar bilgisayarla <strong>DSKY</strong> adlı ekran-klavye birimi üzerinden, “verb” ve “noun” kodlarıyla iletişim kuruyordu. Örneğin fiil yapılacak işlemi, isim ise işlenecek veriyi belirtiyordu. Kullanımı alışılmadıktı ama az tuşla çok sayıda komut sunuyordu.</p>

<p>AGC bize iyi gömülü yazılımın yüksek donanım gücünden önce doğru öncelikler, öngörülebilir zamanlama ve güvenli hata davranışı gerektirdiğini öğretir. Ay’a inişi mümkün kılan şey sınırsız kaynaklar değil; her bitin, görevin ve hatanın titizlikle düşünülmesiydi.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="apollo" /><category term="nasa" /><category term="gömülü sistemler" /><category term="yazılım mimarisi" /><category term="agc" /><category term="bilgisayar tarihi" /><summary type="html"><![CDATA[Bugün birkaç tarayıcı sekmesi yüzünden gigabaytlarca bellek tüketebilirken NASA, insanları Ay’a yaklaşık 2 KB yazılabilir belleğe sahip Apollo Guidance Computer (AGC) ile indirdi. Üstelik bu bilgisayar yalnızca rota hesaplamıyor; sensörleri okuyor, motorları yönetiyor ve astronotlarla iletişim kuruyordu. Kısacası AGC, donanım kısıtlarının yaratıcı yazılım mimarisine nasıl dönüştürülebileceğini gösteren tarihî bir gömülü sistem şaheseridir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/apollo-ucus-bilgisayari-20.png" /><media:content medium="image" url="https://program.sonsuz.us/img/apollo-ucus-bilgisayari-20.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Biyolojik Gürültüden Anlamlı Veriye: EEG, EKG ve EMG Sinyalleri Nasıl Temizlenir?</title><link href="https://program.sonsuz.us/posts/biyolojik-gurultuden-anlamli-veriye-eeg-ekg-ve-emg-sinyalleri-nasil-temizlenir/" rel="alternate" type="text/html" title="Biyolojik Gürültüden Anlamlı Veriye: EEG, EKG ve EMG Sinyalleri Nasıl Temizlenir?" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/biyolojik-gurultuden-anlamli-veriye-eeg-ekg-ve-emg-sinyalleri-nasil-temizlenir</id><content type="html" xml:base="https://program.sonsuz.us/posts/biyolojik-gurultuden-anlamli-veriye-eeg-ekg-ve-emg-sinyalleri-nasil-temizlenir/"><![CDATA[<p>Kalbin elektriksel ritmini, beynin düşünürken oluşturduğu dalgaları veya kasların çalışırken ürettiği gerilimleri bilgisayarda görebiliyoruz. Ne var ki elektrotlardan gelen ham EEG, EKG ve EMG kayıtları çoğu zaman tertemiz değildir; şebeke elektriği, hareket, terleme ve hatta göz kırpma bile ölçüme karışır. Tıbbi sinyal işleme, işte bu gürültülü elektrik çorbasından klinik açıdan anlamlı bilgiyi ayırma sanatıdır.</p>

<p>``</p>

<h2 id="önce-sinyalin-matematiği">Önce sinyalin matematiği</h2>

<p>Bilgisayar, biyolojik sinyali belirli aralıklarla ölçülmüş sayılar dizisi olarak saklar. Sürekli zamanlı $x(t)$ sinyali, örnekleme sonrasında $x[n]$ biçimine dönüşür. Örnekleme frekansı $f_s$ ise iki ölçüm arasındaki süre $T_s = 1/f_s$ olur.</p>

<p>Nyquist ilkesine göre, frekansı $f_{max}$ olan bir bileşeni kaybetmeden yakalayabilmek için $f_s &gt; 2f_{max}$ seçilmelidir. Örneğin 150 Hz’e kadar EMG bileşenleri incelenecekse 300 Hz teorik alt sınırdır; pratikte daha yüksek bir değer kullanılır.</p>

<p>Ham kayıt basitçe şöyle modellenebilir:</p>

\[x[n] = s[n] + g[n] + a[n]\]

<p>Burada $s[n]$ aradığımız biyolojik sinyal, $g[n]$ rastgele gürültü, $a[n]$ ise göz kırpması veya elektrot hareketi gibi artefaktlardır. Amaç her şeyi susturmak değil, $s[n]$ bileşenini bozmadan diğerlerini azaltmaktır.</p>

<h2 id="üç-sinyal-üç-farklı-karakter">Üç sinyal, üç farklı karakter</h2>

<table>
  <thead>
    <tr>
      <th>Sinyal</th>
      <th>Kaynak</th>
      <th style="text-align: right">Yaklaşık anlamlı bant</th>
      <th>Yaygın sorun</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>EEG</td>
      <td>Beyin etkinliği</td>
      <td style="text-align: right">0.5–45 Hz</td>
      <td>Göz kırpması, kas hareketi</td>
    </tr>
    <tr>
      <td>EKG</td>
      <td>Kalbin elektriksel etkinliği</td>
      <td style="text-align: right">0.5–40 Hz</td>
      <td>Baz çizgisi kayması, şebeke gürültüsü</td>
    </tr>
    <tr>
      <td>EMG</td>
      <td>Kas liflerinin etkinliği</td>
      <td style="text-align: right">20–450 Hz</td>
      <td>Hareket artefaktı, elektrot teması</td>
    </tr>
  </tbody>
</table>

<p>Bu farklılık önemlidir: EKG için uygun olan bir filtre, EMG’nin değerli yüksek frekanslarını silebilir. Yani tek bir “sihirli temizleme düğmesi” yoktur.</p>

<h2 id="temizleme-hattı-nasıl-kurulur">Temizleme hattı nasıl kurulur?</h2>

<p>İlk adım çoğunlukla <strong>bant geçiren filtredir</strong>. Yüksek geçiren bölüm yavaş baz çizgisi kaymasını, alçak geçiren bölüm ise gereksiz yüksek frekansları azaltır. Ardından 50 Hz veya 60 Hz elektrik şebekesi parazitine karşı dar bir <strong>notch filtresi</strong> uygulanabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Güçlü yanı</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bant geçiren filtre</td>
      <td>İstenen frekansları ayırır</td>
      <td>Kesim frekansları bilgi silebilir</td>
    </tr>
    <tr>
      <td>Notch filtre</td>
      <td>Şebeke parazitini bastırır</td>
      <td>Yakındaki biyolojik bileşenleri etkileyebilir</td>
    </tr>
    <tr>
      <td>Medyan filtre</td>
      <td>Ani sıçramalara dayanıklıdır</td>
      <td>Dalga biçimini değiştirebilir</td>
    </tr>
    <tr>
      <td>ICA</td>
      <td>Karışmış kaynakları ayırabilir</td>
      <td>Uzman yorumu ve çok kanallı kayıt ister</td>
    </tr>
    <tr>
      <td>Wavelet</td>
      <td>Zamana göre değişen olaylarda etkilidir</td>
      <td>Eşik ve dalgacık seçimi kritiktir</td>
    </tr>
  </tbody>
</table>

<p>Özellikle EEG’de göz kırpması birden fazla kanala yayılır. Bağımsız Bileşen Analizi, yani ICA, kayıtları istatistiksel olarak bağımsız kaynaklara ayırmaya çalışır. Göz hareketine benzeyen bileşen çıkarılıp kalanlar yeniden birleştirilebilir. Ancak yanlış bileşeni silmek, beynin gerçek etkinliğini de çöpe atabilir.</p>

<h2 id="python-ile-örnek-filtreleme">Python ile örnek filtreleme</h2>

<p>Aşağıdaki örnek, 250 Hz ile kaydedilmiş bir EKG sinyaline 0.5–40 Hz bant geçiren Butterworth filtresi uygular:</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">butter</span><span class="p">,</span> <span class="n">sosfiltfilt</span>

<span class="k">def</span> <span class="nf">ekg_temizle</span><span class="p">(</span><span class="n">sinyal</span><span class="p">,</span> <span class="n">fs</span><span class="o">=</span><span class="mi">250</span><span class="p">):</span>
    <span class="c1"># SOS gösterimi sayısal kararlılığı artırır.
</span>    <span class="n">sos</span> <span class="o">=</span> <span class="nf">butter</span><span class="p">(</span>
        <span class="n">N</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span>
        <span class="n">Wn</span><span class="o">=</span><span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mi">40</span><span class="p">],</span>
        <span class="n">btype</span><span class="o">=</span><span class="sh">"</span><span class="s">bandpass</span><span class="sh">"</span><span class="p">,</span>
        <span class="n">fs</span><span class="o">=</span><span class="n">fs</span><span class="p">,</span>
        <span class="n">output</span><span class="o">=</span><span class="sh">"</span><span class="s">sos</span><span class="sh">"</span>
    <span class="p">)</span>

    <span class="c1"># İleri-geri filtreleme faz kaymasını önler.
</span>    <span class="k">return</span> <span class="nf">sosfiltfilt</span><span class="p">(</span><span class="n">sos</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="nf">asarray</span><span class="p">(</span><span class="n">sinyal</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sosfiltfilt</code>, filtreyi iki yönde çalıştırarak dalgaların zamanını kaydırmaz. Bu, R tepesinin konumu gibi zamanlamaya bağlı EKG ölçümlerinde değerlidir. Bununla birlikte gerçek zamanlı sistemler gelecekteki örnekleri göremediği için aynı yöntemi doğrudan kullanamaz.</p>

<h2 id="temiz-sinyal-her-zaman-doğru-sinyal-değildir">Temiz sinyal her zaman doğru sinyal değildir</h2>

<p>Filtreleme sonrasında ham ve temizlenmiş kayıt mutlaka birlikte karşılaştırılmalıdır. Güç spektrumu, sinyal-gürültü oranı ve klinik dalga biçimleri kontrol edilmelidir. Örneğin sinyal-gürültü oranı $SNR = 10\log_{10}(P_s/P_g)$ ile ifade edilebilir; yükselmesi olumlu görünse de tanısal bir tepenin silinmediğini garanti etmez.</p>

<p>Sonuç olarak başarılı tıbbi sinyal işleme; matematik, biyoloji ve dikkatli doğrulamanın birleşimidir. Amaç grafiği güzel göstermek değil, hastaya ait gerçek bilgiyi güvenilir biçimde korumaktır.</p>

<p><img src="/img/biyolojik-gurultuden-anlamli-50.svg" alt="biyolojik-gurultuden-anlamli-50" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="sinyal işleme" /><category term="eeg" /><category term="ekg" /><category term="emg" /><category term="python" /><category term="biyomedikal" /><category term="filtreleme" /><summary type="html"><![CDATA[Kalbin elektriksel ritmini, beynin düşünürken oluşturduğu dalgaları veya kasların çalışırken ürettiği gerilimleri bilgisayarda görebiliyoruz. Ne var ki elektrotlardan gelen ham EEG, EKG ve EMG kayıtları çoğu zaman tertemiz değildir; şebeke elektriği, hareket, terleme ve hatta göz kırpma bile ölçüme karışır. Tıbbi sinyal işleme, işte bu gürültülü elektrik çorbasından klinik açıdan anlamlı bilgiyi ayırma sanatıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/biyolojik-gurultuden-anlamli-50.png" /><media:content medium="image" url="https://program.sonsuz.us/img/biyolojik-gurultuden-anlamli-50.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><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">Cerrahî Navigasyon Sistemleri: Vücudun İçinde GPS Gibi Yol Bulmak</title><link href="https://program.sonsuz.us/posts/cerrahi-navigasyon-sistemleri-vucudun-icinde-gps-gibi-yol-bulmak/" rel="alternate" type="text/html" title="Cerrahî Navigasyon Sistemleri: Vücudun İçinde GPS Gibi Yol Bulmak" /><published>2026-10-23T00:00:00+00:00</published><updated>2026-10-23T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/cerrahi-navigasyon-sistemleri-vucudun-icinde-gps-gibi-yol-bulmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/cerrahi-navigasyon-sistemleri-vucudun-icinde-gps-gibi-yol-bulmak/"><![CDATA[<p>Bir cerrahın milimetrelerle ölçülen bir hedefe ulaşması gerektiğini düşünün: Beyindeki küçük bir tümör, omurgaya yerleştirilecek vida veya eklem içindeki hassas bir bölge… Cerrahî navigasyon sistemleri; tıbbi görüntüleri, konum sensörlerini ve matematiksel dönüşümleri birleştirerek cerraha aletinin vücut içindeki yerini gerçek zamanlı gösterir. Kısacası sistem, otomobillerdeki GPS’in ameliyathaneye uyarlanmış, çok daha hassas kuzenidir.</p>

<p>``</p>

<h2 id="temel-fikir-harita-konum-ve-hedef">Temel fikir: Harita, konum ve hedef</h2>

<p>Navigasyon için üç şey gerekir: Önceden hazırlanmış bir <strong>harita</strong>, harita üzerinde belirlenmiş bir <strong>hedef</strong> ve hareket eden nesnenin güncel <strong>konumu</strong>. Cerrahî sistemlerde harita genellikle BT, MR veya ultrason görüntülerinden oluşturulur. Hareket eden nesne ise cerrahın kullandığı prob, matkap ya da iğnedir.</p>

<table>
  <thead>
    <tr>
      <th>Navigasyon kavramı</th>
      <th>Otomobilde</th>
      <th>Cerrahî sistemde</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Harita</td>
      <td>Yol ağı</td>
      <td>BT, MR veya 3B anatomi modeli</td>
    </tr>
    <tr>
      <td>Konum ölçümü</td>
      <td>GPS uyduları</td>
      <td>Optik ya da elektromanyetik sensörler</td>
    </tr>
    <tr>
      <td>Hedef</td>
      <td>Adres</td>
      <td>Tümör, kemik veya giriş noktası</td>
    </tr>
    <tr>
      <td>Rota</td>
      <td>Yol tarifi</td>
      <td>Güvenli cerrahî yaklaşım</td>
    </tr>
    <tr>
      <td>Hata riski</td>
      <td>Yanlış sokağa girmek</td>
      <td>Sağlıklı dokuya yaklaşmak</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/cerrahi-navigasyon-sistemleri-95.svg" alt="cerrahî-navigasyon-sistemleri-95" /></p>

<p>Buradaki önemli fark hassasiyettir. Otomobil navigasyonunda birkaç metrelik sapma kabul edilebilirken beyin veya omurga cerrahisinde birkaç milimetre bile kritik olabilir.</p>

<h2 id="kayıt-i̇ki-dünyayı-üst-üste-getirmek">Kayıt: İki dünyayı üst üste getirmek</h2>

<p>Bilgisayardaki görüntü koordinatları ile hastanın ameliyat masasındaki fiziksel koordinatları başlangıçta aynı değildir. <strong>Kayıt</strong> veya <em>registration</em> adı verilen işlem, bu iki koordinat sistemini eşleştirir. Cerrah hastanın üzerinde bilinen bazı anatomik noktaları işaretleyebilir ya da sistem yüzeyi tarayabilir.</p>

<p>Bir noktanın görüntü uzayından hasta uzayına dönüşümü basitleştirilmiş biçimde şöyle yazılır:</p>

\[\mathbf{p}_{hasta} = \mathbf{R}\mathbf{p}_{görüntü} + \mathbf{t}\]

<p>Burada $\mathbf{R}$ dönüşü temsil eden döndürme matrisi, $\mathbf{t}$ öteleme vektörü, $\mathbf{p}$ ise üç boyutlu noktadır. Sistem, eşleştirilen referans noktaları arasındaki toplam hatayı en aza indirecek $\mathbf{R}$ ve $\mathbf{t}$ değerlerini hesaplar.</p>

<h2 id="cerrahî-alet-nasıl-takip-edilir">Cerrahî alet nasıl takip edilir?</h2>

<p>Optik sistemlerde ameliyathanedeki kızılötesi kameralar, aletlere ve hastaya bağlanan yansıtıcı işaretçileri izler. Elektromanyetik sistemlerde ise küçük sensörler oluşturulan manyetik alan içindeki konumlarını bildirir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Avantaj</th>
      <th>Sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Optik takip</td>
      <td>Yüksek doğruluk ve hızlı ölçüm</td>
      <td>Kamera ile işaretçi arasında görüş gerekir</td>
    </tr>
    <tr>
      <td>Elektromanyetik takip</td>
      <td>Görüş hattına ihtiyaç duymaz</td>
      <td>Metal araçlar alanı bozabilir</td>
    </tr>
    <tr>
      <td>Robotik kodlayıcılar</td>
      <td>Eklem konumlarını doğrudan ölçer</td>
      <td>Robot mekanizmasına bağımlıdır</td>
    </tr>
  </tbody>
</table>

<p>Ölçülen alet ucu, kayıt dönüşümü kullanılarak görüntü üzerinde çizilir. Aşağıdaki Python örneği, homojen koordinatlarla basit bir dönüşümü gösterir:</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="c1"># Alet ucunun takip sistemi tarafından ölçülen konumu
</span><span class="n">alet_ucu</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">12.0</span><span class="p">,</span> <span class="mf">35.0</span><span class="p">,</span> <span class="mf">80.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">])</span>

<span class="c1"># Döndürme ve ötelemeyi içeren 4x4 kayıt matrisi
</span><span class="n">kayit_matrisi</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>  <span class="mi">2</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span>  <span class="mi">3</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>  <span class="mi">1</span><span class="p">]</span>
<span class="p">])</span>

<span class="n">goruntu_konumu</span> <span class="o">=</span> <span class="n">kayit_matrisi</span> <span class="o">@</span> <span class="n">alet_ucu</span>
<span class="nf">print</span><span class="p">(</span><span class="n">goruntu_konumu</span><span class="p">[:</span><span class="mi">3</span><span class="p">])</span>
</code></pre></div></div>

<p>Gerçek sistemlerde matrisler sürekli güncellenir; filtreleme, kamera kalibrasyonu ve gecikme telafisi gibi ek işlemler uygulanır.</p>

<h2 id="hata-nereden-gelir">Hata nereden gelir?</h2>

<p>Navigasyon ekranı mutlak gerçek değildir. Görüntüleme çözünürlüğü, yanlış işaretlenen referans noktaları, sensör gürültüsü ve hastanın hareketi hata oluşturabilir. Beyin cerrahisinde dokunun operasyon sırasında yer değiştirmesi, <strong>brain shift</strong> adı verilen önemli bir problemdir. Başlangıçta çekilen MR artık güncel anatomiyi tam yansıtmayabilir. Ameliyat içi ultrason veya yeni görüntüleme yöntemleri haritayı güncellemek için kullanılır.</p>

<p>Toplam hedef hatası kabaca bağımsız hata bileşenleriyle modellenebilir:</p>

\[E_{toplam} \approx \sqrt{E_{kayıt}^2 + E_{takip}^2 + E_{kalibrasyon}^2}\]

<p>Bu nedenle sistemler ameliyat öncesinde doğrulanır ve cerrah, ekrandaki bilgiyi anatomik gözlemleriyle birlikte değerlendirir.</p>

<p>Cerrahî navigasyon cerrahın yerine karar veren bir otomatik pilot değildir; ona konum farkındalığı sağlayan gelişmiş bir yardımcıdır. Artırılmış gerçeklik, yapay zekâ ve ameliyat sırasında güncellenen 3B modeller geliştikçe bu dijital pusula daha da hassaslaşacaktır. Ancak son karar ve sorumluluk daima eğitimli sağlık ekibinde kalır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="cerrahi navigasyon" /><category term="medikal teknoloji" /><category term="bilgisayarlı görü" /><category term="görüntü işleme" /><category term="robotik" /><category term="yapay zekâ" /><summary type="html"><![CDATA[Bir cerrahın milimetrelerle ölçülen bir hedefe ulaşması gerektiğini düşünün: Beyindeki küçük bir tümör, omurgaya yerleştirilecek vida veya eklem içindeki hassas bir bölge… Cerrahî navigasyon sistemleri; tıbbi görüntüleri, konum sensörlerini ve matematiksel dönüşümleri birleştirerek cerraha aletinin vücut içindeki yerini gerçek zamanlı gösterir. Kısacası sistem, otomobillerdeki GPS’in ameliyathaneye uyarlanmış, çok daha hassas kuzenidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/cerrahi-navigasyon-sistemleri-95.png" /><media:content medium="image" url="https://program.sonsuz.us/img/cerrahi-navigasyon-sistemleri-95.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>