<?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-25T06:05:46+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">Akıllı Saat Verileriyle Gerçek Zamanlı Nabız ve Uyku Analizi</title><link href="https://program.sonsuz.us/posts/akilli-saat-verileriyle-gercek-zamanli-nabiz-ve-uyku-analizi/" rel="alternate" type="text/html" title="Akıllı Saat Verileriyle Gerçek Zamanlı Nabız ve Uyku Analizi" /><published>2026-10-25T00:00:00+00:00</published><updated>2026-10-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-saat-verileriyle-gercek-zamanli-nabiz-ve-uyku-analizi</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-saat-verileriyle-gercek-zamanli-nabiz-ve-uyku-analizi/"><![CDATA[<p><img src="/img/akilli-saat-verileriyle-20.svg" alt="akilli-saat-verileriyle-20" /></p>

<p>Akıllı saatler yalnızca saati gösteren cihazlar olmaktan çıkıp bileğimizde çalışan küçük sağlık laboratuvarlarına dönüştü. Nabız, hareket, kandaki oksijen oranı ve uyku gibi ölçümler; doğru algoritmalarla işlendiğinde anlamlı eğilimlere ve erken uyarılara dönüştürülebilir. Ancak ham sensör verisini doğrudan yorumlamak, rüzgârlı havada fısıltı dinlemeye benzer: Önce gürültüyü temizlemek gerekir.
``</p>

<h2 id="sensörden-anlamlı-veriye">Sensörden anlamlı veriye</h2>

<p>Akıllı saatler nabzı çoğunlukla <strong>fotopletismografi (PPG)</strong> yöntemiyle ölçer. Cihazın altındaki LED cilde ışık gönderir; fotodiyot ise geri yansıyan ışığın şiddetini ölçer. Kalp her attığında damarlardaki kan hacmi değiştiği için yansıma sinyalinde tepe noktaları oluşur.</p>

<p>Ardışık iki tepe arasındaki süre $\Delta t$ saniye ise yaklaşık nabız şu şekilde hesaplanır:</p>

\[HR = \frac{60}{\Delta t}\]

<p>Örneğin iki tepe arasındaki süre $0.8$ saniyeyse nabız $75$ BPM olur. Gerçek dünyada hareket, gevşek kayış, ter ve ortam ışığı sinyali bozabilir. Bu nedenle filtreleme, tepe tespiti ve güven puanı hesaplama aşamaları önemlidir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantajı</th>
      <th>Dezavantajı</th>
      <th>Kullanım alanı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hareketli ortalama</td>
      <td>Basit ve hızlıdır</td>
      <td>Ani değişimleri yumuşatabilir</td>
      <td>Canlı nabız göstergesi</td>
    </tr>
    <tr>
      <td>Medyan filtresi</td>
      <td>Sıçramaları temizler</td>
      <td>Büyük pencere gecikme yaratır</td>
      <td>Sensör hatalarının giderilmesi</td>
    </tr>
    <tr>
      <td>Butterworth filtresi</td>
      <td>Frekansları kontrollü süzer</td>
      <td>Parametre ayarı gerekir</td>
      <td>PPG sinyal işleme</td>
    </tr>
    <tr>
      <td>Makine öğrenmesi</td>
      <td>Karmaşık örüntüleri bulur</td>
      <td>Etiketli veri gerektirir</td>
      <td>Uyku evresi tahmini</td>
    </tr>
  </tbody>
</table>

<h2 id="gerçek-zamanlı-nabız-işleme">Gerçek zamanlı nabız işleme</h2>

<p>Aşağıdaki Python sınıfı, saatten geldiği varsayılan BPM değerlerini kayan pencereye ekler. Medyan kullanarak aykırı ölçümlerin etkisini azaltır ve son değerlerin değişkenliğine göre basit bir güven puanı üretir.</p>

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

<span class="k">class</span> <span class="nc">HeartRateStream</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">window_size</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">values</span> <span class="o">=</span> <span class="nf">deque</span><span class="p">(</span><span class="n">maxlen</span><span class="o">=</span><span class="n">window_size</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">bpm</span><span class="p">):</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="mi">30</span> <span class="o">&lt;=</span> <span class="n">bpm</span> <span class="o">&lt;=</span> <span class="mi">220</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">invalid</span><span class="sh">'</span><span class="p">}</span>

        <span class="n">self</span><span class="p">.</span><span class="n">values</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">bpm</span><span class="p">)</span>
        <span class="n">filtered</span> <span class="o">=</span> <span class="nf">median</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">values</span><span class="p">)</span>
        <span class="n">deviation</span> <span class="o">=</span> <span class="nf">pstdev</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">values</span><span class="p">)</span> <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">values</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="mi">0</span>
        <span class="n">confidence</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="n">deviation</span> <span class="o">/</span> <span class="mi">20</span><span class="p">)</span>

        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">ok</span><span class="sh">'</span><span class="p">,</span>
            <span class="sh">'</span><span class="s">bpm</span><span class="sh">'</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="n">filtered</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
            <span class="sh">'</span><span class="s">confidence</span><span class="sh">'</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="n">confidence</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
        <span class="p">}</span>

<span class="n">stream</span> <span class="o">=</span> <span class="nc">HeartRateStream</span><span class="p">()</span>
<span class="k">for</span> <span class="n">measurement</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">74</span><span class="p">,</span> <span class="mi">76</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">140</span><span class="p">,</span> <span class="mi">77</span><span class="p">,</span> <span class="mi">76</span><span class="p">]:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">stream</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">measurement</span><span class="p">))</span>
</code></pre></div></div>

<p>Buradaki <code class="language-plaintext highlighter-rouge">140</code> değeri tek başına geldiğinde medyanı dramatik biçimde değiştirmez. Bununla birlikte gerçek bir egzersiz sırasında yükselen nabzın yanlışlıkla gürültü sayılmaması için ivmeölçer verisi de kullanılmalıdır. Kullanıcı koşuyorsa yüksek nabız beklenebilir; koltukta oturuyorsa aynı ölçüm daha dikkat çekicidir.</p>

<h2 id="uyku-nasıl-tahmin-edilir">Uyku nasıl tahmin edilir?</h2>

<p>Uyku analizi genellikle ivmeölçer hareketleri, nabız ve kalp atışları arasındaki değişkenliği birleştirir. Basit bir modelde düşük hareket ve düşen nabız uykuya işaret eder. Daha gelişmiş sistemler uyanıklık, hafif uyku, derin uyku ve REM sınıflarını tahmin eder.</p>

<p>Bir özellik vektörü şöyle tanımlanabilir:</p>

\[x = [HR_{avg}, HRV, movement, oxygen]\]

<p>Bu değerler karar ağacı, lojistik regresyon veya sinir ağına verilebilir. Başlangıç projesinde açıklanabilir olduğu için karar ağacı iyi bir seçimdir. Veriler 30 saniyelik ya da bir dakikalık pencerelere bölünerek her pencere için ortalama, standart sapma ve hareket toplamı hesaplanabilir.</p>

<h2 id="sağlık-verisinde-kritik-ayrıntılar">Sağlık verisinde kritik ayrıntılar</h2>

<p>Gerçek zamanlı sistem, eksik paketleri ve Bluetooth kopmalarını yönetmelidir. Ölçümlere zaman damgası eklenmeli, veriler aktarımda ve depolamada şifrelenmeli, kullanıcıdan açık izin alınmalıdır. Ayrıca bu algoritmalar tıbbi teşhis koymamalıdır. “Düzensiz ölçüm algılandı” demek, “Kalp hastalığınız var” demekten hem teknik hem etik açıdan daha doğrudur.</p>

<p>Bu projeyi büyütmek için FastAPI ile veri kabul eden bir servis, WebSocket ile canlı panel ve kişiye özel normal değerleri öğrenen bir anomali modeli ekleyebilirsiniz. Böylece bilekte başlayan küçük sinyal, güvenli ve açıklanabilir bir sağlık analizi sistemine dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="giyilebilir-teknoloji" /><category term="sağlık-verisi" /><category term="python" /><category term="gerçek-zamanlı-analiz" /><category term="sinyal-işleme" /><category term="makine-öğrenmesi" /><summary type="html"><![CDATA[Akıllı saatler yalnızca saati gösteren cihazlar olmaktan çıkıp bileğimizde çalışan küçük sağlık laboratuvarlarına dönüştü. Nabız, hareket, kandaki oksijen oranı ve uyku gibi ölçümler; doğru algoritmalarla işlendiğinde anlamlı eğilimlere ve erken uyarılara dönüştürülebilir. Ancak ham sensör verisini doğrudan yorumlamak, rüzgârlı havada fısıltı dinlemeye benzer: Önce gürültüyü temizlemek gerekir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-saat-verileriyle-20.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-saat-verileriyle-20.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">EKG Sinyal İşleme ve Aritmi Tespiti: Kalbin Dijital İzlerini Okumak</title><link href="https://program.sonsuz.us/posts/ekg-sinyal-isleme-ve-aritmi-tespiti-kalbin-dijital-izlerini-okumak/" rel="alternate" type="text/html" title="EKG Sinyal İşleme ve Aritmi Tespiti: Kalbin Dijital İzlerini Okumak" /><published>2026-10-25T00:00:00+00:00</published><updated>2026-10-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ekg-sinyal-isleme-ve-aritmi-tespiti-kalbin-dijital-izlerini-okumak</id><content type="html" xml:base="https://program.sonsuz.us/posts/ekg-sinyal-isleme-ve-aritmi-tespiti-kalbin-dijital-izlerini-okumak/"><![CDATA[<p>Kalp, elektriksel darbelerle çalışan etkileyici bir pompa; EKG ise bu darbelerin zamana karşı çizilmiş hikâyesidir. Ne var ki ham EKG verisi, kas hareketleri, elektrot teması ve şebeke gürültüsü nedeniyle her zaman tertemiz görünmez. Sayısal sinyal işleme teknikleri bu karmaşayı temizleyerek kalp atımlarını bulmamızı, ritmi ölçmemizi ve olası aritmileri işaretlememizi sağlar.</p>

<p>``</p>

<h2 id="ekg-dalgası-bize-ne-anlatır">EKG dalgası bize ne anlatır?</h2>

<p>Tipik bir EKG çevrimi P dalgası, QRS kompleksi ve T dalgasından oluşur. P dalgası kulakçıkların, QRS kompleksi karıncıkların depolarizasyonunu; T dalgası ise karıncıkların toparlanmasını temsil eder. Aritmi tespitinde özellikle yüksek ve keskin <strong>R tepeleri</strong> önemlidir. Ardışık iki R tepesi arasındaki süreye RR aralığı denir.</p>

<p>RR aralığı saniye cinsindense yaklaşık kalp hızı şöyle hesaplanır:</p>

\[BPM = 60 / RR\]

<p>Örneğin RR aralığı $0.8$ saniye olduğunda kalp hızı $75$ BPM olur. Ancak yalnızca BPM yeterli değildir. Atımlar arasındaki düzensizlik, QRS genişliği ve beklenmeyen erken vuruşlar da incelenmelidir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Normal beklenti</th>
      <th>Olası anormallik işareti</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kalp hızı</td>
      <td>60–100 BPM</td>
      <td>Bradikardi veya taşikardi</td>
    </tr>
    <tr>
      <td>RR aralığı</td>
      <td>Görece düzenli</td>
      <td>Atriyal fibrilasyon gibi düzensizlikler</td>
    </tr>
    <tr>
      <td>QRS süresi</td>
      <td>Genellikle 120 ms’den kısa</td>
      <td>İletim bozukluğu veya ventriküler atım</td>
    </tr>
    <tr>
      <td>Erken vuruş</td>
      <td>Beklenmez</td>
      <td>Prematüre kasılma</td>
    </tr>
  </tbody>
</table>

<h2 id="önce-gürültüyü-susturalım">Önce gürültüyü susturalım</h2>

<p>Bir EKG sistemi, analog sinyali $f_s$ örnekleme frekansıyla sayısallaştırır. Nyquist ilkesine göre incelenmek istenen en yüksek frekans $f_{max}$ ise $f_s &gt; 2f_{max}$ olmalıdır. Uygulamada 250 Hz veya 500 Hz gibi hızlar sık kullanılır.</p>

<p>Ham sinyalde üç yaygın sorun bulunur: yavaş taban çizgisi kayması, yüksek frekanslı kas gürültüsü ve 50/60 Hz elektrik şebekesi paraziti. Bunlar sırasıyla yüksek geçiren, alçak geçiren ve çentik filtrelerle azaltılabilir.</p>

<table>
  <thead>
    <tr>
      <th>Filtre</th>
      <th>Bastırdığı bileşen</th>
      <th>EKG’deki amacı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yüksek geçiren</td>
      <td>Çok düşük frekanslar</td>
      <td>Taban çizgisi kaymasını giderme</td>
    </tr>
    <tr>
      <td>Alçak geçiren</td>
      <td>Yüksek frekanslar</td>
      <td>Kas ve ölçüm gürültüsünü azaltma</td>
    </tr>
    <tr>
      <td>Çentik</td>
      <td>Dar bir frekans bandı</td>
      <td>50/60 Hz şebeke parazitini bastırma</td>
    </tr>
    <tr>
      <td>Bant geçiren</td>
      <td>Belirli aralık dışı</td>
      <td>QRS kompleksini belirginleştirme</td>
    </tr>
  </tbody>
</table>

<p>Basit bir sonlu dürtü yanıtlı filtrenin çıkışı şu biçimdedir:</p>

\[y[n] = \sum_{k=0}^{M} b_k x[n-k]\]

<p>Burada $x[n]$ ham EKG’yi, $b_k$ filtre katsayılarını, $y[n]$ ise temizlenmiş sinyali temsil eder.</p>

<h2 id="python-ile-r-tepelerini-yakalamak">Python ile R tepelerini yakalamak</h2>

<p>Aşağıdaki örnek, EKG’yi bant geçiren filtreyle temizler ve R tepelerini bulur. <code class="language-plaintext highlighter-rouge">distance</code> parametresi, fizyolojik olarak imkânsız derecede yakın tepelerin seçilmesini önler.</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">filtfilt</span><span class="p">,</span> <span class="n">find_peaks</span>

<span class="n">fs</span> <span class="o">=</span> <span class="mi">250</span>  <span class="c1"># Örnekleme frekansı
</span>
<span class="k">def</span> <span class="nf">bandpass</span><span class="p">(</span><span class="n">ecg</span><span class="p">,</span> <span class="n">low</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">high</span><span class="o">=</span><span class="mi">20</span><span class="p">):</span>
    <span class="n">nyquist</span> <span class="o">=</span> <span class="n">fs</span> <span class="o">/</span> <span class="mi">2</span>
    <span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="o">=</span> <span class="nf">butter</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="p">[</span><span class="n">low</span> <span class="o">/</span> <span class="n">nyquist</span><span class="p">,</span> <span class="n">high</span> <span class="o">/</span> <span class="n">nyquist</span><span class="p">],</span> <span class="n">btype</span><span class="o">=</span><span class="sh">'</span><span class="s">band</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">return</span> <span class="nf">filtfilt</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">ecg</span><span class="p">)</span>

<span class="n">filtered</span> <span class="o">=</span> <span class="nf">bandpass</span><span class="p">(</span><span class="n">ecg</span><span class="p">)</span>
<span class="n">threshold</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">mean</span><span class="p">(</span><span class="n">filtered</span><span class="p">)</span> <span class="o">+</span> <span class="mf">0.8</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">std</span><span class="p">(</span><span class="n">filtered</span><span class="p">)</span>
<span class="n">peaks</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="nf">find_peaks</span><span class="p">(</span>
    <span class="n">filtered</span><span class="p">,</span>
    <span class="n">height</span><span class="o">=</span><span class="n">threshold</span><span class="p">,</span>
    <span class="n">distance</span><span class="o">=</span><span class="nf">int</span><span class="p">(</span><span class="mf">0.25</span> <span class="o">*</span> <span class="n">fs</span><span class="p">)</span>
<span class="p">)</span>

<span class="n">rr</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">diff</span><span class="p">(</span><span class="n">peaks</span><span class="p">)</span> <span class="o">/</span> <span class="n">fs</span>
<span class="n">bpm</span> <span class="o">=</span> <span class="mi">60</span> <span class="o">/</span> <span class="n">rr</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Ortalama BPM:</span><span class="sh">'</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="nf">mean</span><span class="p">(</span><span class="n">bpm</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu yaklaşım öğretici olsa da gerçek verilerde ters QRS kompleksleri veya hareket artefaktları nedeniyle uyarlanabilir eşikler gerekebilir. Pan–Tompkins algoritması; bant geçiren filtreleme, türev alma, karesini hesaplama ve hareketli pencere integrasyonu adımlarını birleştirerek daha dayanıklı R tepesi tespiti sunar.</p>

<h2 id="aritmi-kararı-nasıl-verilir">Aritmi kararı nasıl verilir?</h2>

<p>Kural tabanlı sistem, BPM ve RR değişkenliğine eşikler uygulayabilir. Daha gelişmiş sistemlerde RR istatistikleri, QRS süresi, dalga morfolojisi ve frekans özellikleri bir özellik vektörüne dönüştürülür. Ardından SVM, rastgele orman veya sinir ağı kullanılarak normal ritim ile aritmi sınıflandırılır.</p>

<p>Yine de algoritmanın verdiği sonuç tıbbi tanı değildir. Model; farklı yaş grupları, cihazlar ve hasta kayıtları üzerinde doğrulanmalı, duyarlılık ve özgüllük birlikte değerlendirilmelidir. Kısacası bilgisayar kalbin ritmini dikkatle dinler, fakat son sözü klinik uzmanlık söyler.</p>

<p><img src="/img/ekg-sinyal-isleme-60.svg" alt="ekg-sinyal-isleme-60" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ekg" /><category term="sinyal işleme" /><category term="aritmi" /><category term="python" /><category term="biyomedikal" /><category term="makine öğrenmesi" /><summary type="html"><![CDATA[Kalp, elektriksel darbelerle çalışan etkileyici bir pompa; EKG ise bu darbelerin zamana karşı çizilmiş hikâyesidir. Ne var ki ham EKG verisi, kas hareketleri, elektrot teması ve şebeke gürültüsü nedeniyle her zaman tertemiz görünmez. Sayısal sinyal işleme teknikleri bu karmaşayı temizleyerek kalp atımlarını bulmamızı, ritmi ölçmemizi ve olası aritmileri işaretlememizi sağlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ekg-sinyal-isleme-60.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ekg-sinyal-isleme-60.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Roket Motorlarında Telemetri: Binlerce Sensörden Gerçek Zamanlı Karara</title><link href="https://program.sonsuz.us/posts/roket-motorlarinda-telemetri-binlerce-sensorden-gercek-zamanli-karara/" rel="alternate" type="text/html" title="Roket Motorlarında Telemetri: Binlerce Sensörden Gerçek Zamanlı Karara" /><published>2026-10-25T00:00:00+00:00</published><updated>2026-10-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/roket-motorlarinda-telemetri-binlerce-sensorden-gercek-zamanli-karara</id><content type="html" xml:base="https://program.sonsuz.us/posts/roket-motorlarinda-telemetri-binlerce-sensorden-gercek-zamanli-karara/"><![CDATA[<p><img src="/img/roket-motorlarinda-telemetri-54.svg" alt="roket-motorlarinda-telemetri-54" /></p>

<p>Bir roket motoru ateşlendiğinde yalnızca yakıt yanmaz; aynı anda devasa bir veri nehri akmaya başlar. Basınç, sıcaklık, titreşim, yakıt debisi ve valf konumu gibi binlerce ölçüm, saniyenin küçük dilimlerinde kontrol bilgisayarlarına ulaşır. Telemetri sistemi bu gürültülü akışı anlamlı bilgilere dönüştürerek mühendislerin motorun sağlığını izlemesini ve kritik durumları erkenden fark etmesini sağlar.</p>

<p>``</p>

<h2 id="sensörden-başlayan-yolculuk">Sensörden başlayan yolculuk</h2>

<p>Bir ölçüm zinciri sensörle başlar. Termokupl sıcaklığı, piezoelektrik sensör titreşimi, basınç dönüştürücü ise yanma odası basıncını elektrik sinyaline çevirir. Bu analog sinyaller önce yükseltilir ve filtrelenir, ardından ADC kullanılarak sayısallaştırılır.</p>

<p>Örnekleme hızı rastgele seçilemez. Nyquist ilkesine göre ölçülmek istenen en yüksek frekans $f_{max}$ ise örnekleme frekansı şu koşulu sağlamalıdır:</p>

\[f_s &gt; 2f_{max}\]

<p>Örneğin 5 kHz seviyesindeki titreşimleri gözlemlemek için teorik olarak 10 kHz’den yüksek bir hız gerekir. Pratikte filtreleme ve güvenlik payı nedeniyle daha yüksek değerler seçilir. Sıcaklık gibi yavaş değişen veriler ise saniyede birkaç örnekle izlenebilir. Her sensörü aynı hızda okumak, veri hattını gereksiz yere şişirir.</p>

<table>
  <thead>
    <tr>
      <th>Ölçüm türü</th>
      <th style="text-align: right">Tipik örnekleme yaklaşımı</th>
      <th>İzlenen durum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sıcaklık</td>
      <td style="text-align: right">Düşük hız</td>
      <td>Aşırı ısınma</td>
    </tr>
    <tr>
      <td>Oda basıncı</td>
      <td style="text-align: right">Orta-yüksek hız</td>
      <td>Yanma kararlılığı</td>
    </tr>
    <tr>
      <td>Titreşim</td>
      <td style="text-align: right">Çok yüksek hız</td>
      <td>Rezonans ve mekanik hasar</td>
    </tr>
    <tr>
      <td>Valf konumu</td>
      <td style="text-align: right">Orta hız</td>
      <td>Komut-tepki uyumu</td>
    </tr>
    <tr>
      <td>Yakıt debisi</td>
      <td style="text-align: right">Orta hız</td>
      <td>Karışım oranı</td>
    </tr>
  </tbody>
</table>

<h2 id="gerçek-zamanlı-veri-hattı">Gerçek zamanlı veri hattı</h2>

<p>Ham ölçümler çoğunlukla sensör düğümlerinde zaman damgası alır. Paketler CAN, Ethernet veya uzay sistemlerine özel dayanıklı haberleşme protokolleri üzerinden uçuş bilgisayarına taşınır. Burada temel işlem sırası şöyledir:</p>

<ol>
  <li>Paket bütünlüğü ve sıra numarası kontrol edilir.</li>
  <li>Ölçümler ortak bir zaman ekseninde hizalanır.</li>
  <li>Kalibrasyon katsayıları uygulanır.</li>
  <li>Gürültü filtrelenir ve özellikler çıkarılır.</li>
  <li>Eşik ya da model tabanlı sağlık kontrolleri çalıştırılır.</li>
  <li>Özet veriler yer istasyonuna gönderilirken ham veriler kaydedilir.</li>
</ol>

<p>Binlerce kanalın toplam veri hızı yaklaşık olarak</p>

\[R = N \times f_s \times b\]

<p>ile hesaplanabilir. Burada $N$ sensör sayısı, $f_s$ örnekleme hızı, $b$ ise örnek başına bit miktarıdır. 2.000 sensörün 1 kHz’de ve 16 bit çözünürlükte okunması, protokol yükleri hariç 32 Mbit/s üretir. Bu nedenle sıkıştırma, önceliklendirme ve uçta işleme hayati önem taşır.</p>

<h2 id="gürültü-mü-arıza-mı">Gürültü mü, arıza mı?</h2>

<p>Tek bir yüksek değer her zaman motorun sorun yaşadığı anlamına gelmez. Elektriksel parazit veya sensör temassızlığı da ani sıçrama oluşturabilir. Basit bir hareketli ortalama, kısa süreli gürültüyü azaltabilir:</p>

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

<span class="n">pencere</span> <span class="o">=</span> <span class="nf">deque</span><span class="p">(</span><span class="n">maxlen</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">filtrele</span><span class="p">(</span><span class="n">olcum</span><span class="p">):</span>
    <span class="n">pencere</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">olcum</span><span class="p">)</span>
    <span class="k">return</span> <span class="nf">sum</span><span class="p">(</span><span class="n">pencere</span><span class="p">)</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">pencere</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod son beş ölçümün ortalamasını üretir. Ancak hızlı basınç değişimlerini geciktirebileceği için güvenlik kararlarında tek başına kullanılmamalıdır. Gerçek sistemlerde Kalman filtreleri, bant geçiren filtreler ve sensör füzyonu gibi yöntemler tercih edilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sabit eşik</td>
      <td>Hızlı ve anlaşılır</td>
      <td>Değişen koşullara uyumsuz olabilir</td>
    </tr>
    <tr>
      <td>İstatistiksel model</td>
      <td>Sapmaları yakalar</td>
      <td>Geçmiş veriye ihtiyaç duyar</td>
    </tr>
    <tr>
      <td>Makine öğrenmesi</td>
      <td>Karmaşık ilişkileri bulur</td>
      <td>Açıklanabilirlik ve doğrulama zordur</td>
    </tr>
    <tr>
      <td>Sensör füzyonu</td>
      <td>Yanlış alarmı azaltır</td>
      <td>Hesaplama maliyeti yüksektir</td>
    </tr>
  </tbody>
</table>

<h2 id="milisaniyeler-içinde-karar">Milisaniyeler içinde karar</h2>

<p>Roket telemetrisi yalnızca grafik çizmek değildir. Kritik basınç artışı algılandığında kontrol sistemi valfleri ayarlayabilir veya güvenli kapatma sürecini başlatabilir. Bu nedenle yazılımın gecikmesi öngörülebilir olmalı; bellek tahsisi, görev öncelikleri ve hata yönetimi titizlikle tasarlanmalıdır.</p>

<p>Fırlatma sonrasında kaydedilen ham veriler dijital ikizlerle karşılaştırılır. Böylece küçük titreşim değişimleri, verim kayıpları ve sensör sapmaları bulunur. Kısacası telemetri, roket motorunun nabzını ölçen bir stetoskop; gerçek zamanlı analiz ise bu nabzın ne anlattığını milisaniyeler içinde yorumlayan doktordur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="telemetri" /><category term="roket" /><category term="sensör" /><category term="veri-analizi" /><category term="gerçek-zamanlı-sistemler" /><category term="python" /><summary type="html"><![CDATA[Bir roket motoru ateşlendiğinde yalnızca yakıt yanmaz; aynı anda devasa bir veri nehri akmaya başlar. Basınç, sıcaklık, titreşim, yakıt debisi ve valf konumu gibi binlerce ölçüm, saniyenin küçük dilimlerinde kontrol bilgisayarlarına ulaşır. Telemetri sistemi bu gürültülü akışı anlamlı bilgilere dönüştürerek mühendislerin motorun sağlığını izlemesini ve kritik durumları erkenden fark etmesini sağlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/roket-motorlarinda-telemetri-54.png" /><media:content medium="image" url="https://program.sonsuz.us/img/roket-motorlarinda-telemetri-54.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Salgının Matematiği: SIR Modeliyle Hastalık Yayılımını Tahmin Etmek</title><link href="https://program.sonsuz.us/posts/salginin-matematigi-sir-modeliyle-hastalik-yayilimini-tahmin-etmek/" rel="alternate" type="text/html" title="Salgının Matematiği: SIR Modeliyle Hastalık Yayılımını Tahmin Etmek" /><published>2026-10-25T00:00:00+00:00</published><updated>2026-10-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/salginin-matematigi-sir-modeliyle-hastalik-yayilimini-tahmin-etmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/salginin-matematigi-sir-modeliyle-hastalik-yayilimini-tahmin-etmek/"><![CDATA[<p>Bir salgının geleceğini tahmin etmek, kristal küreye bakmaktan çok daha sistematik bir iştir. Matematiksel modeller; bulaşma hızı, iyileşme süresi ve duyarlı nüfus gibi değişkenleri kullanarak vaka sayılarının zaman içinde nasıl değişebileceğini gösterir. Bu modellerin en tanınmış örneklerinden biri olan SIR, karmaşık bir toplumsal olayı üç temel nüfus grubuyla açıklamaya çalışır.</p>

<p>``</p>

<h2 id="sir-modeli-nedir">SIR modeli nedir?</h2>

<p>SIR adı, modeldeki üç grubun İngilizce adlarının baş harflerinden gelir:</p>

<ul>
  <li><strong>S — Susceptible:</strong> Hastalığa yakalanabilecek duyarlı kişiler.</li>
  <li><strong>I — Infectious:</strong> Hastalığı taşıyan ve başkalarına bulaştırabilen kişiler.</li>
  <li><strong>R — Recovered:</strong> İyileşen, bağışıklık kazanan veya bulaştırıcılığı sona eren kişiler.</li>
</ul>

<p>Kapalı bir toplumda toplam nüfusun sabit olduğu varsayılır:</p>

\[N = S(t) + I(t) + R(t)\]

<p>Buradaki $t$ zamanı, $N$ ise toplam nüfusu temsil eder. Model; doğum, göç ve doğal ölüm gibi değişimleri genellikle hesaba katmaz. Başka bir deyişle matematik, işe önce masayı sadeleştirerek başlar.</p>

<table>
  <thead>
    <tr>
      <th>Grup</th>
      <th>Sisteme giriş nedeni</th>
      <th>Sistemden çıkış nedeni</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Duyarlı $S$</td>
      <td>Başlangıç nüfusu</td>
      <td>Enfekte olmak</td>
    </tr>
    <tr>
      <td>Enfekte $I$</td>
      <td>Bulaşıcı kişiyle temas</td>
      <td>İyileşmek veya bulaştırıcılığı kaybetmek</td>
    </tr>
    <tr>
      <td>İyileşen $R$</td>
      <td>Hastalığı atlatmak</td>
      <td>Temel SIR modelinde çıkış yoktur</td>
    </tr>
  </tbody>
</table>

<h2 id="modelin-matematiksel-motoru">Modelin matematiksel motoru</h2>

<p>SIR modeli üç diferansiyel denklemle çalışır:</p>

\[dS/dt = -βSI/N\]

\[dI/dt = βSI/N - γI\]

\[dR/dt = γI\]

<p>Burada $β$, hastalığın etkili temas yoluyla bulaşma hızını; $γ$ ise iyileşme hızını ifade eder. Ortalama bulaşıcı kalma süresi $D$ günse yaklaşık olarak $γ = 1/D$ kabul edilir.</p>

<p>İlk denklem, duyarlı kişilerin enfekte oldukça azaldığını söyler. İkinci denklemde enfekte grubuna yeni vakalar eklenirken iyileşenler çıkarılır. Son denklem ise iyileşen grubunun hangi hızla büyüdüğünü gösterir. Böylece model, nüfusu bölmeler arasında akan bir sıvı gibi ele alır.</p>

<p>Salgının büyüyüp büyümeyeceğini anlamak için temel üreme sayısı kullanılır:</p>

\[R_0 = β/γ\]

<table>
  <thead>
    <tr>
      <th>$R_0$ değeri</th>
      <th>Beklenen davranış</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$R_0 &lt; 1$</td>
      <td>Salgın zamanla küçülür</td>
    </tr>
    <tr>
      <td>$R_0 = 1$</td>
      <td>Vaka sayısı yaklaşık sabit kalır</td>
    </tr>
    <tr>
      <td>$R_0 &gt; 1$</td>
      <td>Salgın başlangıçta büyür</td>
    </tr>
  </tbody>
</table>

<p>Örneğin $β = 0.30$ ve $γ = 0.10$ ise $R_0 = 3$ olur. Bu, tamamen duyarlı bir toplumda her enfekte kişinin ortalama üç yeni enfeksiyon oluşturabileceği anlamına gelir. Ancak duyarlı nüfus azaldıkça etkili üreme sayısı da düşer:</p>

\[R_t = R_0 S(t)/N\]

<h2 id="python-ile-basit-bir-simülasyon">Python ile basit bir simülasyon</h2>

<p>Aşağıdaki kod, denklemleri küçük zaman adımlarıyla yaklaşık olarak çözer. Euler yöntemi kullanılan bu yaklaşım eğitim için yeterlidir; ciddi epidemiyolojik analizlerde daha gelişmiş çözücüler tercih edilir.</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">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>

<span class="n">N</span> <span class="o">=</span> <span class="mi">100_000</span>
<span class="n">beta</span> <span class="o">=</span> <span class="mf">0.30</span>
<span class="n">gamma</span> <span class="o">=</span> <span class="mf">0.10</span>
<span class="n">days</span> <span class="o">=</span> <span class="mi">160</span>

<span class="n">S</span><span class="p">,</span> <span class="n">I</span><span class="p">,</span> <span class="n">R</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">days</span><span class="p">),</span> <span class="n">np</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">days</span><span class="p">),</span> <span class="n">np</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">days</span><span class="p">)</span>
<span class="n">S</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">I</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">R</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">N</span> <span class="o">-</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">0</span>

<span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">days</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
    <span class="n">new_infections</span> <span class="o">=</span> <span class="n">beta</span> <span class="o">*</span> <span class="n">S</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">*</span> <span class="n">I</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">/</span> <span class="n">N</span>
    <span class="n">new_recoveries</span> <span class="o">=</span> <span class="n">gamma</span> <span class="o">*</span> <span class="n">I</span><span class="p">[</span><span class="n">t</span><span class="p">]</span>

    <span class="n">S</span><span class="p">[</span><span class="n">t</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">S</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">-</span> <span class="n">new_infections</span>
    <span class="n">I</span><span class="p">[</span><span class="n">t</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">I</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">+</span> <span class="n">new_infections</span> <span class="o">-</span> <span class="n">new_recoveries</span>
    <span class="n">R</span><span class="p">[</span><span class="n">t</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">R</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">+</span> <span class="n">new_recoveries</span>

<span class="n">plt</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">S</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sh">'</span><span class="s">Duyarlı</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">I</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sh">'</span><span class="s">Enfekte</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sh">'</span><span class="s">İyileşen</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">xlabel</span><span class="p">(</span><span class="sh">'</span><span class="s">Gün</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">ylabel</span><span class="p">(</span><span class="sh">'</span><span class="s">Kişi sayısı</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">legend</span><span class="p">()</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>
</code></pre></div></div>

<p>Grafikte enfekte kişi sayısı önce yükselir, bir zirveye ulaşır ve ardından düşer. Zirvenin zamanı ve yüksekliği, sağlık sisteminin ihtiyaç duyabileceği yatak veya personel kapasitesini tahmin etmeye yardımcı olur.</p>

<h2 id="güçlü-ama-kusursuz-değil">Güçlü ama kusursuz değil</h2>

<p>Temel SIR modeli herkesin eşit sıklıkta temas ettiğini, bağışıklığın kaybolmadığını ve bulaşma hızının sabit kaldığını varsayar. Oysa yaş, konum, davranış değişiklikleri, aşılar ve yeni varyantlar sonucu etkiler. Bu nedenle model bir kehanet makinesi değil, farklı senaryoları karşılaştıran matematiksel bir laboratuvardır. Doğru verilerle güncellendiğinde salgının yönünü anlamayı ve müdahalelerin olası etkisini ölçmeyi sağlayan güçlü bir pusulaya dönüşür.</p>

<p><img src="/img/salginin-matematigi-sir-16.svg" alt="salginin-matematigi-sir-16" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="sir modeli" /><category term="matematiksel modelleme" /><category term="epidemiyoloji" /><category term="python" /><category term="simülasyon" /><category term="veri bilimi" /><summary type="html"><![CDATA[Bir salgının geleceğini tahmin etmek, kristal küreye bakmaktan çok daha sistematik bir iştir. Matematiksel modeller; bulaşma hızı, iyileşme süresi ve duyarlı nüfus gibi değişkenleri kullanarak vaka sayılarının zaman içinde nasıl değişebileceğini gösterir. Bu modellerin en tanınmış örneklerinden biri olan SIR, karmaşık bir toplumsal olayı üç temel nüfus grubuyla açıklamaya çalışır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/salginin-matematigi-sir-16.png" /><media:content medium="image" url="https://program.sonsuz.us/img/salginin-matematigi-sir-16.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Tıbbi Teşhis Destek Sistemlerinde Karar Ağaçları: Semptomdan Öncelik Listesine</title><link href="https://program.sonsuz.us/posts/tibbi-teshis-destek-sistemlerinde-karar-agaclari-semptomdan-oncelik-listesine/" rel="alternate" type="text/html" title="Tıbbi Teşhis Destek Sistemlerinde Karar Ağaçları: Semptomdan Öncelik Listesine" /><published>2026-10-25T00:00:00+00:00</published><updated>2026-10-25T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/tibbi-teshis-destek-sistemlerinde-karar-agaclari-semptomdan-oncelik-listesine</id><content type="html" xml:base="https://program.sonsuz.us/posts/tibbi-teshis-destek-sistemlerinde-karar-agaclari-semptomdan-oncelik-listesine/"><![CDATA[<p>Ateş, öksürük ve nefes darlığı aynı anda görüldüğünde sistem hangi hastalığı önce değerlendirmelidir? Tıbbi teşhis destek sistemlerindeki karar ağaçları, semptomları dallara ayırarak bu soruya açıklanabilir ve denetlenebilir yanıtlar üretir. Ancak amaç doktorun yerine geçmek değil, olası hastalıkları klinik inceleme için önceliklendirmektir.
``</p>

<h2 id="karar-ağacının-temel-mantığı">Karar ağacının temel mantığı</h2>

<p>Karar ağacı, hasta özellikleri üzerinde art arda sorular sorar. Her <strong>düğüm</strong> bir koşulu, <strong>dal</strong> koşulun sonucunu, <strong>yaprak</strong> ise hastalık sınıfını veya risk puanını temsil eder. Örneğin ilk soru “Ateş var mı?”, sonraki soru “Oksijen satürasyonu düşük mü?” olabilir.</p>

<p>Bu yapı klasik uzman sistemlerde hekimlerin tanımladığı kurallarla kurulabilir. Makine öğrenmesi yaklaşımında ise model, geçmiş hasta kayıtlarından hangi soruların daha ayırt edici olduğunu öğrenir. Ağacın iyi bir soru seçmesi için safsızlık ölçüleri kullanılır.</p>

<p>Entropi şu şekilde hesaplanır:</p>

\[H(S)=-\sum_{i=1}^{k} p_i\log_2(p_i)\]

<p>Burada $p_i$, veri kümesindeki $i$ hastalık sınıfının oranıdır. Bir bölünme sonrasında entropi ne kadar azalırsa soru o kadar bilgilendiricidir. Alternatif olarak Gini safsızlığı kullanılabilir:</p>

\[Gini(S)=1-\sum_{i=1}^{k}p_i^2\]

<table>
  <thead>
    <tr>
      <th>Ölçüt</th>
      <th>Temel fikir</th>
      <th>Avantaj</th>
      <th>Kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Entropi</td>
      <td>Belirsizliği ölçer</td>
      <td>Bilgi kuramsal yorumu güçlüdür</td>
      <td>ID3 ve C4.5</td>
    </tr>
    <tr>
      <td>Gini</td>
      <td>Sınıfların karışıklığını ölçer</td>
      <td>Hesaplaması daha hızlıdır</td>
      <td>CART</td>
    </tr>
    <tr>
      <td>Hata oranı</td>
      <td>Yanlış sınıflandırmayı ölçer</td>
      <td>Kolay yorumlanır</td>
      <td>Model değerlendirme</td>
    </tr>
  </tbody>
</table>

<h2 id="semptomlardan-hastalık-önceliğine">Semptomlardan hastalık önceliğine</h2>

<p>Bir teşhis destek sistemi yalnızca “grip” gibi tek bir cevap vermemelidir. Daha güvenli yaklaşım; zatürre, grip ve alerji gibi seçenekleri tahmini olasılıklarıyla sıralamaktır. Yaprak düğümündeki sınıf dağılımı bu amaçla kullanılabilir:</p>

\[P(hastalık_i\mid semptomlar)=\frac{n_i}{N}\]

<p>Burada $n_i$, yaprağa ulaşan ilgili hastalık vakalarının; $N$ ise o yapraktaki tüm vakaların sayısıdır. Yine de bu değer doğrudan klinik kesinlik değildir. Yaş, gebelik, kronik hastalıklar ve test sonuçları risk değerlendirmesini değiştirebilir.</p>

<p>Aşağıdaki örnek, eğitim amacıyla hazırlanmış basitleştirilmiş bir sınıflandırıcıdır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">sklearn.tree</span> <span class="kn">import</span> <span class="n">DecisionTreeClassifier</span>

<span class="c1"># ateş, öksürük, nefes darlığı, düşük satürasyon
</span><span class="n">X</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">[</span><span class="mi">1</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="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</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">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="p">[</span><span class="mi">1</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">1</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">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">]</span>
<span class="n">y</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="s">grip</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">zatürre</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">alerji</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">zatürre</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">alerji</span><span class="sh">'</span><span class="p">]</span>

<span class="n">model</span> <span class="o">=</span> <span class="nc">DecisionTreeClassifier</span><span class="p">(</span>
    <span class="n">criterion</span><span class="o">=</span><span class="sh">'</span><span class="s">entropy</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">max_depth</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
    <span class="n">class_weight</span><span class="o">=</span><span class="sh">'</span><span class="s">balanced</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span>
<span class="p">)</span>
<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>

<span class="n">hasta</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</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="nf">print</span><span class="p">(</span><span class="n">model</span><span class="p">.</span><span class="n">classes_</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">model</span><span class="p">.</span><span class="nf">predict_proba</span><span class="p">(</span><span class="n">hasta</span><span class="p">))</span>
</code></pre></div></div>

<p>Kod, semptomları ikili özellikler olarak işler ve hastalıkların olasılık dağılımını üretir. <code class="language-plaintext highlighter-rouge">max_depth</code> ağacın ezberlemesini sınırlar; <code class="language-plaintext highlighter-rouge">class_weight='balanced'</code> ise az görülen sınıfların tamamen göz ardı edilmesini azaltır. Gerçek sistemlerde bu birkaç satırlık örnek yerine doğrulanmış, anonimleştirilmiş ve çok daha kapsamlı klinik veriler gerekir.</p>

<h2 id="güçlü-ve-riskli-yönler">Güçlü ve riskli yönler</h2>

<table>
  <thead>
    <tr>
      <th>Güçlü yön</th>
      <th>Klinik karşılığı</th>
      <th>Olası risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Açıklanabilir kurallar</td>
      <td>Hekim karar yolunu görebilir</td>
      <td>Aşırı basitleştirme</td>
    </tr>
    <tr>
      <td>Hızlı tahmin</td>
      <td>Triyaj sürecini destekler</td>
      <td>Yanlış güven hissi</td>
    </tr>
    <tr>
      <td>Eksik değerlere uyarlanabilirlik</td>
      <td>Her test zorunlu olmayabilir</td>
      <td>Sistematik veri eksikliği</td>
    </tr>
    <tr>
      <td>Özellik önemleri</td>
      <td>Etkili semptomlar incelenebilir</td>
      <td>Korelasyonu nedensellik sanma</td>
    </tr>
  </tbody>
</table>

<p>En kritik sorunlardan biri sınıf dengesizliğidir. Nadir fakat tehlikeli bir hastalık az sayıda örnek içerdiğinde model onu öğrenemeyebilir. Bu nedenle yalnızca doğruluk değil; duyarlılık, özgüllük ve özellikle yanlış negatif oranı izlenmelidir. Budama, çapraz doğrulama ve bağımsız hastane verileriyle dış doğrulama da aşırı öğrenmeyi azaltır.</p>

<p>Sonuç olarak karar ağaçları, “Bu öneri neden üretildi?” sorusuna anlaşılır cevap verebildikleri için sağlık bilişiminde değerlidir. Fakat kaliteli veri, klinik doğrulama, gizlilik, yanlılık denetimi ve insan gözetimi olmadan güvenli teşhis araçlarına dönüşemezler. En doğru rol, hekime rakip olmak değil; önemli ihtimallerin gözden kaçmasını önleyen dikkatli bir yardımcı olmaktır.</p>

<p><img src="/img/tibbi-teshis-destek-83.svg" alt="tibbi-teshis-destek-83" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="karar ağaçları" /><category term="yapay zeka" /><category term="sağlık bilişimi" /><category term="uzman sistemler" /><category term="makine öğrenmesi" /><category term="açıklanabilir yapay zeka" /><summary type="html"><![CDATA[Ateş, öksürük ve nefes darlığı aynı anda görüldüğünde sistem hangi hastalığı önce değerlendirmelidir? Tıbbi teşhis destek sistemlerindeki karar ağaçları, semptomları dallara ayırarak bu soruya açıklanabilir ve denetlenebilir yanıtlar üretir. Ancak amaç doktorun yerine geçmek değil, olası hastalıkları klinik inceleme için önceliklendirmektir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/tibbi-teshis-destek-83.png" /><media:content medium="image" url="https://program.sonsuz.us/img/tibbi-teshis-destek-83.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Akış Durumu: Oyunlarda Zorluk ve Eğlence Dengesi Nasıl Kurulur?</title><link href="https://program.sonsuz.us/posts/akis-durumu-oyunlarda-zorluk-ve-eglence-dengesi-nasil-kurulur/" rel="alternate" type="text/html" title="Akış Durumu: Oyunlarda Zorluk ve Eğlence Dengesi Nasıl Kurulur?" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akis-durumu-oyunlarda-zorluk-ve-eglence-dengesi-nasil-kurulur</id><content type="html" xml:base="https://program.sonsuz.us/posts/akis-durumu-oyunlarda-zorluk-ve-eglence-dengesi-nasil-kurulur/"><![CDATA[<p>Bir oyunda “Son bir bölüm daha!” dedirten görünmez kuvvet nedir? Çoğu zaman cevap; parlak ödüller, etkileyici grafikler veya destansı müziklerden önce, oyuncunun becerileriyle karşılaştığı zorluk arasındaki hassas dengedir. Psikolog Mihaly Csikszentmihalyi’nin tanımladığı <strong>akış durumu</strong>, kişinin yaptığı işe tamamen dalması, zaman algısını kaybetmesi ve eylemin kendisinden keyif almasıdır.
``</p>

<h2 id="akış-durumu-nedir">Akış durumu nedir?</h2>

<p>Akış sırasında oyuncunun dikkati tek bir hedefe yönelir. Kontroller düşünülmeden uygulanır, kararlar hızlı alınır ve başarısızlık bile oyunu bırakma isteği yerine yeniden deneme dürtüsü yaratır. Ancak bu deneyim, yalnızca oyunu “eğlenceli” yapmakla oluşmaz. Oyuncuya açık hedefler, hızlı geri bildirim ve becerisine uygun mücadele sunulmalıdır.</p>

<p>Temel ilişki basitçe şöyle modellenebilir:</p>

\[F \approx 1 - \frac{\vert C-S\vert }{\max(C,S)}\]

<p>Burada $F$ akış potansiyelini, $C$ oyunun sunduğu zorluğu, $S$ ise oyuncunun beceri seviyesini temsil eder. $C$ ile $S$ birbirine yaklaştıkça akış ihtimali yükselir. Bu, kesin bir psikoloji yasası değil, tasarım mantığını görünür kılan pratik bir modeldir.</p>

<table>
  <thead>
    <tr>
      <th>Zorluk ve beceri ilişkisi</th>
      <th>Psikolojik sonuç</th>
      <th>Oyuncu davranışı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$C \ll S$</td>
      <td>Sıkılma</td>
      <td>Dikkat dağılır, oyun bırakılır</td>
    </tr>
    <tr>
      <td>$C \approx S$</td>
      <td>Akış</td>
      <td>Odaklanma ve devam etme isteği artar</td>
    </tr>
    <tr>
      <td>$C \gg S$</td>
      <td>Kaygı ve çaresizlik</td>
      <td>Öfkelenme veya vazgeçme görülür</td>
    </tr>
    <tr>
      <td>Zorluk belirsiz</td>
      <td>Kontrol kaybı</td>
      <td>Başarısızlık adaletsiz algılanır</td>
    </tr>
  </tbody>
</table>

<h2 id="zorluk-neden-sürekli-artmamalı">Zorluk neden sürekli artmamalı?</h2>

<p>Oyuncu geliştikçe zorluk da artmalıdır; fakat bu artış dümdüz bir rampa olmamalıdır. Aralıksız yükselen baskı zihinsel yorgunluk yaratır. İyi oyunlar genellikle <strong>gerilim ve rahatlama döngüsü</strong> kurar: zor bir çatışmanın ardından güvenli alan, bulmacanın ardından keşif veya bölüm sonu canavarından sonra ödül ekranı gelir.</p>

<p>Bu yapı egzersize benzer. Kaslar dinlenmeden sürekli çalıştırılırsa performans düşer; oyuncunun dikkat kapasitesi de aynı şekilde molaya ihtiyaç duyar. Dolayısıyla akış, kesintisiz stres değil, kontrollü yoğunluktur.</p>

<h2 id="dinamik-zorluk-ayarlaması">Dinamik zorluk ayarlaması</h2>

<p>Her oyuncunun refleksi, deneyimi ve öğrenme hızı farklıdır. Dinamik zorluk sistemleri performansı gözlemleyerek düşman dayanıklılığı, kaynak miktarı veya ipucu sıklığı gibi değişkenleri ayarlayabilir. Basit bir yaklaşım şöyle yazılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">zorluk_hesapla</span><span class="p">(</span><span class="n">basari_orani</span><span class="p">,</span> <span class="n">mevcut_zorluk</span><span class="p">):</span>
    <span class="n">hedef</span> <span class="o">=</span> <span class="mf">0.70</span>  <span class="c1"># Oyuncunun yaklaşık %70 başarı göstermesi amaçlanıyor
</span>    <span class="n">fark</span> <span class="o">=</span> <span class="n">basari_orani</span> <span class="o">-</span> <span class="n">hedef</span>

    <span class="c1"># Küçük adımlar, değişimin yapay ve cezalandırıcı hissedilmesini önler.
</span>    <span class="n">yeni_zorluk</span> <span class="o">=</span> <span class="n">mevcut_zorluk</span> <span class="o">+</span> <span class="n">fark</span> <span class="o">*</span> <span class="mf">0.15</span>
    <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.1</span><span class="p">,</span> <span class="nf">min</span><span class="p">(</span><span class="n">yeni_zorluk</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu kod, oyuncu hedeflenen başarı oranının üzerindeyse zorluğu biraz artırır; altındaysa azaltır. <code class="language-plaintext highlighter-rouge">min</code> ve <code class="language-plaintext highlighter-rouge">max</code> kullanımı değeri güvenli sınırlar içinde tutar. Yine de sistem gizli çalışırken dikkatli olunmalıdır. Oyuncu, oyun tarafından kasıtlı olarak engellendiğini fark ederse başarı duygusu zedelenebilir.</p>

<h2 id="adalet-öğrenme-ve-geri-bildirim">Adalet, öğrenme ve geri bildirim</h2>

<p>Zor bir oyun mutlaka bunaltıcı değildir. Oyuncu neden kaybettiğini anlayabiliyor ve bir sonraki denemede farklı davranabiliyorsa başarısızlık, öğrenme aracına dönüşür. Tehlikeden önce verilen ses, düşmanın okunabilir animasyonu veya doğru anda gösterilen kısa ipucu, adalet algısını güçlendirir.</p>

<table>
  <thead>
    <tr>
      <th>Adil zorluk</th>
      <th>Yapay zorluk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hata oyuncuya açıklanabilir</td>
      <td>Sonuç rastgele görünür</td>
    </tr>
    <tr>
      <td>Kurallar tutarlıdır</td>
      <td>Kurallar habersiz değişir</td>
    </tr>
    <tr>
      <td>Denemeler ilerleme sağlar</td>
      <td>Oyuncu aynı hataya zorlanır</td>
    </tr>
    <tr>
      <td>Başarı beceriyle ilişkilidir</td>
      <td>Başarı şansa bağımlıdır</td>
    </tr>
  </tbody>
</table>

<p>Sonuç olarak iyi zorluk tasarımı, oyuncuyu sürekli yenmek değil, onu gelişebileceğine ikna etmektir. Akışın sihri tam burada ortaya çıkar: Oyun ne çocuk oyuncağıdır ne de klavyeyi pencereden attıracak kadar acımasızdır. Her yeni engel, oyuncuya sessizce “Bunu henüz yapamıyorsun, ama birazdan yapabilirsin” der.</p>

<p><img src="/img/akis-durumu-oyunlarda-83.svg" alt="akis-durumu-oyunlarda-83" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun tasarımı" /><category term="akış durumu" /><category term="oyun psikolojisi" /><category term="zorluk dengesi" /><category term="game design" /><category term="oyuncu deneyimi" /><summary type="html"><![CDATA[Bir oyunda “Son bir bölüm daha!” dedirten görünmez kuvvet nedir? Çoğu zaman cevap; parlak ödüller, etkileyici grafikler veya destansı müziklerden önce, oyuncunun becerileriyle karşılaştığı zorluk arasındaki hassas dengedir. Psikolog Mihaly Csikszentmihalyi’nin tanımladığı akış durumu, kişinin yaptığı işe tamamen dalması, zaman algısını kaybetmesi ve eylemin kendisinden keyif almasıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akis-durumu-oyunlarda-83.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akis-durumu-oyunlarda-83.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><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++ Generic Programming: Fonksiyon ve Sınıf Şablonlarının Tasarım Sınırları</title><link href="https://program.sonsuz.us/posts/c-generic-programming-fonksiyon-ve-sinif-sablonlarinin-tasarim-sinirlari/" rel="alternate" type="text/html" title="C++ Generic Programming: Fonksiyon ve Sınıf Şablonlarının Tasarım Sınırları" /><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-generic-programming-fonksiyon-ve-sinif-sablonlarinin-tasarim-sinirlari</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-generic-programming-fonksiyon-ve-sinif-sablonlarinin-tasarim-sinirlari/"><![CDATA[<p>C++ şablonları, aynı algoritmayı veya veri yapısını farklı türlerle çalıştırmanın güçlü bir yoludur. Ancak fonksiyon şablonları ile sınıf şablonları aynı sözdizimsel aileden gelseler de tür çıkarımı, özelleştirme ve hata yönetimi bakımından farklı tasarım kısıtlarına sahiptir. Kısacası biri çoğunlukla “Bu işlemi hangi türlerle yapabilirim?”, diğeri ise “Bu tür ailesinin durumunu ve davranışını nasıl modellemeliyim?” sorusuna odaklanır.</p>

<p>``</p>

<h2 id="ortak-teorik-temel">Ortak teorik temel</h2>

<p>Bir şablonu, türleri parametre olarak alan bir üretim kuralı gibi düşünebiliriz. $T$ bir tür ve $G$ bir şablon olsun. Derleyici uygun kullanım gördüğünde somut bir örnek üretir:</p>

\[G(T) \rightarrow G_T\]

<p>Bu süreç <strong>örnekleme</strong> olarak adlandırılır. Fakat bir şablonun gerçekten kullanılabilir olması için gövdesindeki işlemlerin seçilen tür üzerinde geçerli olması gerekir. Örneğin <code class="language-plaintext highlighter-rouge">a + b</code> ifadesi kullanılıyorsa $T$ türü toplama işlemini desteklemelidir. Modern C++’ta bu gereksinimler <code class="language-plaintext highlighter-rouge">concept</code> ile açıkça belirtilebilir.</p>

<table>
  <thead>
    <tr>
      <th>Tasarım özelliği</th>
      <th>Fonksiyon şablonu</th>
      <th>Sınıf şablonu</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tür çıkarımı</td>
      <td>Genellikle argümanlardan otomatik</td>
      <td>C++17 CTAD dışında çoğunlukla açık</td>
    </tr>
    <tr>
      <td>Kısmi özelleştirme</td>
      <td>Desteklenmez</td>
      <td>Desteklenir</td>
    </tr>
    <tr>
      <td>Aşırı yükleme</td>
      <td>Doğal ve yaygın</td>
      <td>Üye fonksiyonlar üzerinden</td>
    </tr>
    <tr>
      <td>Durum saklama</td>
      <td>Genellikle yok</td>
      <td>Temel amaçlardan biri</td>
    </tr>
    <tr>
      <td>Arayüz kısıtları</td>
      <td>Çağrı anında belirginleşir</td>
      <td>Sınıf örneği ve üyeler düzeyinde görülür</td>
    </tr>
  </tbody>
</table>

<h2 id="fonksiyon-şablonlarının-temel-kısıtları">Fonksiyon şablonlarının temel kısıtları</h2>

<p>Fonksiyon şablonlarının en büyük avantajı, tür çıkarımıdır. Derleyici parametrelerden <code class="language-plaintext highlighter-rouge">T</code> türünü bulabilir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;concepts&gt;</span><span class="cp">
</span>
<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">requires</span> <span class="n">std</span><span class="o">::</span><span class="n">totally_ordered</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span>
<span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">buyuk</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span> <span class="o">?</span> <span class="n">b</span> <span class="o">:</span> <span class="n">a</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Buradaki <code class="language-plaintext highlighter-rouge">requires</code>, fonksiyonun yalnızca tam sıralama ilişkisi sunan türlerle kullanılacağını anlatır. Böylece anlamsız kullanımlar, şablon gövdesindeki karmaşık hatalar yerine arayüz seviyesinde reddedilir.</p>

<p>Bununla birlikte çıkarım, dönüş türünden yapılmaz. <code class="language-plaintext highlighter-rouge">T sonuc = uret();</code> ifadesindeki hedef tür, klasik fonksiyon şablonu çıkarımını tek başına yönlendiremez. Ayrıca fonksiyon şablonlarında kısmi özelleştirme bulunmaz. Belirli bir tür ailesine farklı davranış vermek için aşırı yükleme, <code class="language-plaintext highlighter-rouge">if constexpr</code>, yardımcı sınıf şablonu veya concept tabanlı overload kullanmak gerekir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">deger</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// Genel davranış</span>
<span class="p">}</span>

<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="n">T</span><span class="o">*</span> <span class="n">adres</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// İşaretçiler için overload</span>
<span class="p">}</span>
</code></pre></div></div>

<p>İkinci fonksiyon kısmi özelleştirme değil, ayrı bir aşırı yüklemedir. Bu ayrım overload çözümleme kurallarını etkilediği için önemlidir.</p>

<h2 id="sınıf-şablonlarının-temel-kısıtları">Sınıf şablonlarının temel kısıtları</h2>

<p>Sınıf şablonları veri üyeleriyle birlikte tür politikası, sahiplik ve yaşam süresi tasarlamaya uygundur:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;cstddef&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdexcept&gt;</span><span class="cp">
</span>
<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">N</span><span class="p">&gt;</span>
<span class="k">class</span> <span class="nc">SabitTampon</span> <span class="p">{</span>
    <span class="n">T</span> <span class="n">veri</span><span class="p">[</span><span class="n">N</span><span class="p">]{};</span>

<span class="k">public</span><span class="o">:</span>
    <span class="n">T</span><span class="o">&amp;</span> <span class="n">getir</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">i</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&gt;=</span> <span class="n">N</span><span class="p">)</span> <span class="k">throw</span> <span class="n">std</span><span class="o">::</span><span class="n">out_of_range</span><span class="p">(</span><span class="s">"indeks"</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">veri</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Burada hem tür hem de derleme zamanı kapasitesi sınıf kimliğinin parçasıdır. Dolayısıyla <code class="language-plaintext highlighter-rouge">SabitTampon&lt;int, 8&gt;</code> ile <code class="language-plaintext highlighter-rouge">SabitTampon&lt;int, 16&gt;</code> tamamen farklı türlerdir. Genel olarak iki örnek ancak tüm şablon argümanları aynıysa aynı türdür:</p>

\[C&lt;T, N&gt; = C&lt;U, M&gt; \iff T=U \land N=M\]

<p>Sınıf şablonlarının önemli üstünlüğü kısmi özelleştirmedir. Örneğin <code class="language-plaintext highlighter-rouge">Depo&lt;T*&gt;</code>, bütün işaretçi türleri için farklı sahiplik kuralları uygulayabilir. Ancak bu güç, tekrar eden kod ve özelleştirmeler arasında tutarsız arayüz riski doğurur. Genel sürümde bulunan bir üyenin özelleştirilmiş sürümde unutulması şaşırtıcı derleme hatalarına yol açabilir.</p>

<h2 id="hangisini-ne-zaman-seçmeli">Hangisini ne zaman seçmeli?</h2>

<p>Tek bir işlem, argümanlardan çıkarılabilen türler ve doğal overload davranışı gerekiyorsa fonksiyon şablonu seçilmelidir. Durum saklama, politika birleştirme, tür ailesi oluşturma veya kısmi özelleştirme gerekiyorsa sınıf şablonu daha uygundur. İyi bir generic tasarım yalnızca “her türle çalışmak” değildir; desteklenen işlemleri mümkün olduğunca erken, açık ve anlaşılır biçimde sınırlandırmaktır. <code class="language-plaintext highlighter-rouge">concept</code> kullanımı da bu sınırların üzerindeki nazik ama kararlı güvenlik görevlisidir.</p>

<p><img src="/img/c-generic-programming-66.svg" alt="c-generic-programming-66" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="generic-programming" /><category term="templates" /><category term="fonksiyon-şablonları" /><category term="sınıf-şablonları" /><category term="concepts" /><summary type="html"><![CDATA[C++ şablonları, aynı algoritmayı veya veri yapısını farklı türlerle çalıştırmanın güçlü bir yoludur. Ancak fonksiyon şablonları ile sınıf şablonları aynı sözdizimsel aileden gelseler de tür çıkarımı, özelleştirme ve hata yönetimi bakımından farklı tasarım kısıtlarına sahiptir. Kısacası biri çoğunlukla “Bu işlemi hangi türlerle yapabilirim?”, diğeri ise “Bu tür ailesinin durumunu ve davranışını nasıl modellemeliyim?” sorusuna odaklanır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-generic-programming-66.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-generic-programming-66.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üplerden Sonsuz Dünyalara: Voksel Tabanlı Dünya Temsili</title><link href="https://program.sonsuz.us/posts/kuplerden-sonsuz-dunyalara-voksel-tabanli-dunya-temsili/" rel="alternate" type="text/html" title="Küplerden Sonsuz Dünyalara: Voksel Tabanlı Dünya Temsili" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kuplerden-sonsuz-dunyalara-voksel-tabanli-dunya-temsili</id><content type="html" xml:base="https://program.sonsuz.us/posts/kuplerden-sonsuz-dunyalara-voksel-tabanli-dunya-temsili/"><![CDATA[<p><img src="/img/kuplerden-sonsuz-dunyalara-19.svg" alt="kuplerden-sonsuz-dunyalara-19" /></p>

<p>Minecraft dünyasına uzaktan bakınca dağlar, mağaralar ve ormanlar görürüz; motorun gözünden bakınca ise devasa bir üç boyutlu tablo vardır. Bu tablonun her hücresi, belirli bir konumdaki bloğun türünü saklar. İşte hacimsel piksel anlamına gelen <strong>voksel</strong>, küplerle kurulan bu dijital evrenin temel yapı taşıdır.
``</p>

<h2 id="voksel-tam-olarak-nedir">Voksel tam olarak nedir?</h2>

<p>İki boyutlu bir görüntüde piksel, $(x, y)$ koordinatındaki rengi temsil eder. Voksel ise buna derinlik ekleyerek $(x, y, z)$ konumundaki hacimsel bilgiyi temsil eder. Bir voksel yalnızca “dolu” veya “boş” olmak zorunda değildir; taş, su, cam ya da toprak gibi bir blok kimliği de taşıyabilir.</p>

<p>Boyutları $W$, $H$ ve $D$ olan yoğun bir dünyanın toplam hücre sayısı:</p>

\[N = W × H × D\]

<p>Örneğin $1024^3$ hücre, bir milyardan fazla voksel demektir. Her voksel yalnızca 2 bayt kullansa bile yaklaşık 2 GB bellek gerekir. Üstelik blok ışığı, nem ve biyom gibi ek veriler bu miktarı büyütür. Bu nedenle oyunlar bütün dünyayı tek parça hâlinde belleğe yüklemez.</p>

<table>
  <thead>
    <tr>
      <th>Temsil yöntemi</th>
      <th>Güçlü yanı</th>
      <th>Zayıf yanı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yoğun 3B dizi</td>
      <td>Hızlı ve doğrudan erişim</td>
      <td>Boş alanlarda bellek israfı</td>
    </tr>
    <tr>
      <td>Seyrek yapı</td>
      <td>Boş dünyalarda verimli</td>
      <td>Erişim ve güncelleme daha karmaşık</td>
    </tr>
    <tr>
      <td>Chunk sistemi</td>
      <td>Yükleme ve kayıt kolaylığı</td>
      <td>Sınır yönetimi gerekir</td>
    </tr>
    <tr>
      <td>Octree</td>
      <td>Farklı ayrıntı seviyeleri</td>
      <td>Uygulaması zor olabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="dünyayı-parçalara-ayırmak-chunk-sistemi">Dünyayı parçalara ayırmak: Chunk sistemi</h2>

<p>Minecraft benzeri oyunlar dünyayı <strong>chunk</strong> adı verilen bölgelere böler. Oyuncuya yakın chunk’lar belleğe alınır; uzaktakiler kaydedilip kaldırılır. Böylece teorik olarak sınırsız bir dünya, sınırlı RAM ile gezilebilir.</p>

<p>Bir chunk’ın $16 × 256 × 16$ bloktan oluştuğunu varsayarsak:</p>

\[16 × 256 × 16 = 65\,536\]

<p>hücre elde edilir. Oyuncu hareket ettiğinde yalnızca görüş mesafesine giren yeni chunk’lar üretilir veya diskten okunur. Bu yaklaşım hem prosedürel dünya üretimini hem de paralel işlemeyi kolaylaştırı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">Chunk</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">Width</span> <span class="p">=</span> <span class="m">16</span><span class="p">;</span>
    <span class="k">public</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">Height</span> <span class="p">=</span> <span class="m">256</span><span class="p">;</span>
    <span class="k">private</span> <span class="k">readonly</span> <span class="kt">ushort</span><span class="p">[,,]</span> <span class="n">blocks</span> <span class="p">=</span>
        <span class="k">new</span> <span class="kt">ushort</span><span class="p">[</span><span class="n">Width</span><span class="p">,</span> <span class="n">Height</span><span class="p">,</span> <span class="n">Width</span><span class="p">];</span>

    <span class="k">public</span> <span class="kt">ushort</span> <span class="nf">GetBlock</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="kt">int</span> <span class="n">z</span><span class="p">)</span>
        <span class="p">=&gt;</span> <span class="n">blocks</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">z</span><span class="p">];</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">SetBlock</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="kt">int</span> <span class="n">z</span><span class="p">,</span> <span class="kt">ushort</span> <span class="n">blockId</span><span class="p">)</span>
        <span class="p">=&gt;</span> <span class="n">blocks</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">z</span><span class="p">]</span> <span class="p">=</span> <span class="n">blockId</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu orta düzey C# örneği, blok kimliklerini bir chunk içinde saklar. <code class="language-plaintext highlighter-rouge">ushort</code>, 65.536 farklı blok durumunu temsil edebilir. Gerçek bir motorda sınır kontrolleri, ışık verisi ve değiştirilmiş blokların diske kaydı da eklenir.</p>

<h2 id="her-küpü-çizmek-neden-kötü-bir-fikir">Her küpü çizmek neden kötü bir fikir?</h2>

<p>Bir küpün 6 yüzü ve genellikle 12 üçgeni vardır. Bir milyon bloğu ayrı ayrı çizmek, görünmeyen iç yüzler yüzünden ekran kartını gereksiz yere yorar. Çözüm, yalnızca havaya komşu yüzleri mesh’e eklemektir. İki katı blok yan yana geldiğinde aralarındaki yüzler görünmez ve üretilmez.</p>

<table>
  <thead>
    <tr>
      <th>Optimizasyon</th>
      <th>Etkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yüz eleme</td>
      <td>Kapalı yüzleri çizmez</td>
    </tr>
    <tr>
      <td>Greedy meshing</td>
      <td>Bitişik yüzleri büyük dörtgenlerde birleştirir</td>
    </tr>
    <tr>
      <td>Frustum culling</td>
      <td>Kamera dışında kalan chunk’ları atlar</td>
    </tr>
    <tr>
      <td>Occlusion culling</td>
      <td>Başka nesnelerin arkasındakileri atlar</td>
    </tr>
    <tr>
      <td>LOD</td>
      <td>Uzaktaki bölgeleri daha basit gösterir</td>
    </tr>
  </tbody>
</table>

<p>Greedy meshing özellikle değerlidir: Yan yana duran 100 aynı çim yüzü, 100 ayrı dörtgen yerine tek bir büyük dörtgene dönüşebilir. Böylece üçgen sayısı ve çizim maliyeti ciddi biçimde azalır.</p>

<h2 id="değiştirilebilir-dünyanın-bedeli">Değiştirilebilir dünyanın bedeli</h2>

<p>Voksellerin en büyük avantajı, dünyayı düzenlemeyi doğal hâle getirmesidir. Bir blok kırıldığında ilgili hücre “hava” yapılır. Ancak değişiklik chunk mesh’inin yeniden oluşturulmasını gerektirir. Blok chunk sınırındaysa komşu chunk da etkilenebilir.</p>

<p>Bu yüzden iyi bir motor; mesh üretimini arka plan iş parçacıklarında yapar, yalnızca değişen chunk’ları günceller ve GPU’ya gönderilen veriyi sınırlar. Sonuç olarak voksel dünyalar basit küplerden oluşsa da performanslı çalışmaları; veri sıkıştırma, görünürlük hesaplama, paralel üretim ve akıllı mesh tekniklerinin uyumuna bağlıdır. Küpler masum görünür, fakat milyonlarcası bir araya geldiğinde motor geliştiricisini gerçek bir optimizasyon madencisine dönüştürür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="voksel" /><category term="minecraft" /><category term="oyun geliştirme" /><category term="grafik programlama" /><category term="performans" /><category term="prosedürel üretim" /><summary type="html"><![CDATA[Minecraft dünyasına uzaktan bakınca dağlar, mağaralar ve ormanlar görürüz; motorun gözünden bakınca ise devasa bir üç boyutlu tablo vardır. Bu tablonun her hücresi, belirli bir konumdaki bloğun türünü saklar. İşte hacimsel piksel anlamına gelen voksel, küplerle kurulan bu dijital evrenin temel yapı taşıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kuplerden-sonsuz-dunyalara-19.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kuplerden-sonsuz-dunyalara-19.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>