<?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-27T18:06:11+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ı Evin Beyni İçeride: Ev Otomasyonunda Yerel İşleme</title><link href="https://program.sonsuz.us/posts/akilli-evin-beyni-iceride-ev-otomasyonunda-yerel-isleme/" rel="alternate" type="text/html" title="Akıllı Evin Beyni İçeride: Ev Otomasyonunda Yerel İşleme" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-evin-beyni-iceride-ev-otomasyonunda-yerel-isleme</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-evin-beyni-iceride-ev-otomasyonunda-yerel-isleme/"><![CDATA[<p>Akıllı ampuller, hareket sensörleri, kameralar ve termostatlar her gün çok sayıda veri üretir. Bu verilerin tamamını uzak sunuculara göndermek yerine evdeki bir merkez üzerinde işlemek, otomasyonları hızlandırırken internet bağımlılığını ve mahremiyet risklerini azaltır. İşte edge computing, yani uçta veya yerelde işleme yaklaşımı tam olarak bunu sağlar.
``</p>

<h2 id="yerel-işleme-nedir">Yerel işleme nedir?</h2>

<p>Klasik bulut mimarisinde sensörden alınan veri internete çıkar, sağlayıcının sunucusunda değerlendirilir ve sonuç tekrar eve gönderilir. Yerel mimaride ise karar; Home Assistant çalıştıran bir mini bilgisayar, Raspberry Pi, NAS ya da özel bir otomasyon merkezi tarafından evin içinde verilir.</p>

<p>Örneğin koridordaki hareket sensörü etkinleştiğinde ışığın açılması için bulut sunucusundan cevap beklemek gerekmez. Merkez, sensör olayını yerel ağ üzerinden alır ve lambaya anında komut yollar.</p>

<p>Toplam tepki süresini basitçe şöyle düşünebiliriz:</p>

\[T = T_{iletim} + T_{isleme} + T_{cevap}\]

<p>Bulut tabanlı sistemde internet yolculuğu nedeniyle $T_{iletim}$ ve $T_{cevap}$ büyür. Yerel işlemede veri yalnızca ev ağı içinde dolaştığından toplam gecikme çoğu zaman belirgin biçimde azalır.</p>

<h2 id="bulut-ve-edge-computing-karşılaştırması">Bulut ve edge computing karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Bulut tabanlı işleme</th>
      <th>Yerel işleme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İnternet gereksinimi</td>
      <td>Genellikle zorunlu</td>
      <td>Çoğu otomasyonda gereksiz</td>
    </tr>
    <tr>
      <td>Tepki süresi</td>
      <td>Ağ durumuna bağlı</td>
      <td>Genellikle çok düşük</td>
    </tr>
    <tr>
      <td>Mahremiyet</td>
      <td>Veri dış sunucuya gider</td>
      <td>Veri evde kalabilir</td>
    </tr>
    <tr>
      <td>Kurulum kolaylığı</td>
      <td>Çoğunlukla daha kolay</td>
      <td>Teknik bilgi gerektirebilir</td>
    </tr>
    <tr>
      <td>Bakım</td>
      <td>Sağlayıcı tarafından yapılır</td>
      <td>Kullanıcı sorumluluğundadır</td>
    </tr>
    <tr>
      <td>Ölçeklenebilirlik</td>
      <td>Yüksek sunucu kapasitesi</td>
      <td>Donanım kapasitesiyle sınırlı</td>
    </tr>
  </tbody>
</table>

<p>Yerel yaklaşım her durumda bulutu çöpe atmak anlamına gelmez. Hava durumu tahmini veya ev dışından bildirim gönderme gibi hizmetlerde bulut yararlıdır. En dengeli çözüm, kritik kararları evde verip yalnızca gerekli verileri dış servislere aktaran hibrit mimaridir.</p>

<h2 id="bir-otomasyon-nasıl-çalışır">Bir otomasyon nasıl çalışır?</h2>

<p>Yerel merkezler genellikle olay güdümlü bir model kullanır. Sensör bir olay üretir, sistem koşulları denetler ve uygun eylemi gerçekleştirir:</p>

<ol>
  <li>Hareket sensörü <code class="language-plaintext highlighter-rouge">aktif</code> durumuna geçer.</li>
  <li>Merkez saatin gece olup olmadığını kontrol eder.</li>
  <li>Işık seviyesi belirlenen eşikten düşükse lambayı açar.</li>
  <li>Hareket kesildikten sonra zamanlayıcı başlatır.</li>
  <li>Süre dolunca lambayı kapatır.</li>
</ol>

<p>Aşağıdaki Home Assistant otomasyonu bu mantığın sade bir örneğidir:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">alias</span><span class="pi">:</span> <span class="s">Gece koridor ışığı</span>
<span class="na">trigger</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">platform</span><span class="pi">:</span> <span class="s">state</span>
    <span class="na">entity_id</span><span class="pi">:</span> <span class="s">binary_sensor.koridor_hareket</span>
    <span class="na">to</span><span class="pi">:</span> <span class="s2">"</span><span class="s">on"</span>
<span class="na">condition</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">condition</span><span class="pi">:</span> <span class="s">numeric_state</span>
    <span class="na">entity_id</span><span class="pi">:</span> <span class="s">sensor.koridor_aydinlik</span>
    <span class="na">below</span><span class="pi">:</span> <span class="m">30</span>
<span class="na">action</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">service</span><span class="pi">:</span> <span class="s">light.turn_on</span>
    <span class="na">target</span><span class="pi">:</span>
      <span class="na">entity_id</span><span class="pi">:</span> <span class="s">light.koridor</span>
  <span class="pi">-</span> <span class="na">delay</span><span class="pi">:</span> <span class="s2">"</span><span class="s">00:02:00"</span>
  <span class="pi">-</span> <span class="na">service</span><span class="pi">:</span> <span class="s">light.turn_off</span>
    <span class="na">target</span><span class="pi">:</span>
      <span class="na">entity_id</span><span class="pi">:</span> <span class="s">light.koridor</span>
</code></pre></div></div>

<p>Bu kod, hareket algılandığında ortam aydınlığı 30 lüksün altındaysa ışığı açar ve iki dakika sonra kapatır. Sensörler ile merkez aynı yerel ağdaysa işlem internet kesildiğinde de devam edebilir.</p>

<h2 id="mahremiyet-ve-kaynak-kullanımı">Mahremiyet ve kaynak kullanımı</h2>

<p>Kameralar yerel işlemenin değerini daha görünür hâle getirir. Görüntüyü buluta göndermek yerine cihaz üzerinde insan algılama modeli çalıştırılabilir. Böylece dışarıya video yerine yalnızca <code class="language-plaintext highlighter-rouge">insan algılandı</code> olayı çıkar.</p>

<p>Yerel donanım seçerken işlemci gücü, bellek ve enerji tüketimi birlikte değerlendirilmelidir. Verimlilik kabaca şu oranla yorumlanabilir:</p>

\[E = \frac{islenen\ olay\ sayisi}{enerji\ tuketimi}\]

<p>Basit sensör otomasyonları için düşük güçlü bir Raspberry Pi yeterli olabilir. Birden fazla kamera üzerinde yapay zekâ çalıştırılacaksa mini PC veya donanım hızlandırıcısı gerekebilir.</p>

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

<p>Edge computing, akıllı evi yalnızca daha hızlı değil, aynı zamanda daha dayanıklı ve mahremiyet dostu hâle getirir. En iyi başlangıç yöntemi; ışık, sıcaklık ve hareket gibi basit otomasyonları yerelleştirmek, ardından kamera analizi gibi ağır işlemlere geçmektir. Böylece internet gittiğinde akıllı eviniz bir anda oldukça pahalı bir sıradan eve dönüşmez!</p>

<p><img src="/img/akilli-evin-beyni-38.svg" alt="akilli-evin-beyni-38" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="edge computing" /><category term="ev otomasyonu" /><category term="iot" /><category term="yerel işleme" /><category term="mahremiyet" /><category term="home assistant" /><summary type="html"><![CDATA[Akıllı ampuller, hareket sensörleri, kameralar ve termostatlar her gün çok sayıda veri üretir. Bu verilerin tamamını uzak sunuculara göndermek yerine evdeki bir merkez üzerinde işlemek, otomasyonları hızlandırırken internet bağımlılığını ve mahremiyet risklerini azaltır. İşte edge computing, yani uçta veya yerelde işleme yaklaşımı tam olarak bunu sağlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-evin-beyni-38.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-evin-beyni-38.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Akıllı Sulama Sistemlerinde Optimizasyon: Her Damlayı Algoritmayla Yönetmek</title><link href="https://program.sonsuz.us/posts/akilli-sulama-sistemlerinde-optimizasyon-her-damlayi-algoritmayla-yonetmek/" rel="alternate" type="text/html" title="Akıllı Sulama Sistemlerinde Optimizasyon: Her Damlayı Algoritmayla Yönetmek" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-sulama-sistemlerinde-optimizasyon-her-damlayi-algoritmayla-yonetmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-sulama-sistemlerinde-optimizasyon-her-damlayi-algoritmayla-yonetmek/"><![CDATA[<p>Geleneksel sulamada karar çoğu zaman takvime göre verilir: “Salı günü tarlayı sula.” Akıllı sulama sistemi ise daha meraklıdır; toprağın nemini, bitkinin gelişim dönemini, hava tahminini ve su deposunun durumunu sorgular. Böylece yalnızca gerekli bölgeye, gerekli zamanda ve gerekli miktarda su gönderir. Amaç musluğu robotlaştırmak değil, sınırlı suyu ölçülebilir bir optimizasyon problemi olarak yönetmektir.</p>

<p>``</p>

<h2 id="bitkinin-su-ihtiyacı-nasıl-hesaplanır">Bitkinin su ihtiyacı nasıl hesaplanır?</h2>

<p>Sistemin temel girdilerinden biri <strong>referans evapotranspirasyon</strong> değeridir. Evapotranspirasyon, topraktan buharlaşan ve bitkinin yapraklarından atmosfere aktarılan toplam suyu ifade eder. Belirli bir bitkinin yaklaşık ihtiyacı şöyle bulunabilir:</p>

\[ET_c = K_c \times ET_0\]

<p>Burada $ET_0$ hava koşullarına bağlı referans evapotranspirasyon, $K_c$ ise bitki katsayısıdır. Örneğin domatesin gelişim dönemindeki katsayısı, yeni ekilmiş bir bitkininkinden farklıdır.</p>

<p>Yağış ve mevcut toprak nemi de hesaba katıldığında net sulama ihtiyacı basitleştirilmiş biçimde şöyle modellenebilir:</p>

\[D = max(0, ET_c - P_e - M)\]

<p>$D$ verilecek suyu, $P_e$ etkili yağışı, $M$ ise kök bölgesinde kullanılabilir nem katkısını gösterir. <code class="language-plaintext highlighter-rouge">max</code> işlemi, yağış ihtiyacı zaten karşıladıysa negatif miktarda sulama yapılmasını engeller.</p>

<h2 id="takvim-tabanlı-ve-akıllı-sulama-karşılaştırması">Takvim tabanlı ve akıllı sulama karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Takvim tabanlı sulama</th>
      <th>Akıllı sulama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Karar kaynağı</td>
      <td>Sabit gün ve saat</td>
      <td>Sensörler ve tahminler</td>
    </tr>
    <tr>
      <td>Su miktarı</td>
      <td>Genellikle sabit</td>
      <td>Bitki ihtiyacına göre değişken</td>
    </tr>
    <tr>
      <td>Yağmur tepkisi</td>
      <td>Manuel müdahale gerekir</td>
      <td>Sulama otomatik ertelenebilir</td>
    </tr>
    <tr>
      <td>Bölgesel kontrol</td>
      <td>Sınırlı</td>
      <td>Her vana ayrı yönetilebilir</td>
    </tr>
    <tr>
      <td>Risk</td>
      <td>Fazla veya yetersiz sulama</td>
      <td>Sensör hatasına bağımlılık</td>
    </tr>
  </tbody>
</table>

<p>Akıllı yaklaşım açıkça avantajlı görünse de sensör kalibrasyonu ihmal edilirse sistem son derece kararlı biçimde yanlış karar verebilir. Başka bir deyişle, kötü veri kullanan harika bir algoritma hâlâ kötü bir sulamacıdır.</p>

<h2 id="optimizasyon-problemi">Optimizasyon problemi</h2>

<p>Bir tarlada birden fazla sulama bölgesi bulunduğunu düşünelim. Her bölgenin ihtiyacı farklıdır, fakat pompanın debisi ve depodaki su sınırlıdır. Hedef fonksiyonu, ihtiyaç ile verilen su arasındaki farkı küçültebilir:</p>

\[minimize \sum_i w_i(D_i - x_i)^2\]

<p>Burada $D_i$ bölgenin ihtiyacı, $x_i$ tahsis edilen su ve $w_i$ öncelik katsayısıdır. Yeni dikilmiş veya su stresine hassas bitkilere daha yüksek ağırlık verilebilir. Model ayrıca şu kısıtları taşıyabilir:</p>

<ul>
  <li>Toplam dağıtılan su depo kapasitesini aşmamalıdır.</li>
  <li>Bir vananın çalışma süresi teknik sınırlar içinde kalmalıdır.</li>
  <li>Yağmur olasılığı yüksekse tahsis azaltılmalıdır.</li>
  <li>Pompa aynı anda yalnızca belirli sayıda bölgeyi beslemelidir.</li>
</ul>

<h2 id="basit-bir-python-karar-mekanizması">Basit bir Python karar mekanizması</h2>

<p>Aşağıdaki fonksiyon, nem eşiklerini ve beklenen yağışı kullanarak sulama süresi üretir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">sulama_suresi</span><span class="p">(</span><span class="n">nem</span><span class="p">,</span> <span class="n">hedef_nem</span><span class="p">,</span> <span class="n">alan_m2</span><span class="p">,</span>
                   <span class="n">yagis_mm</span><span class="p">,</span> <span class="n">debi_litre_dk</span><span class="p">):</span>
    <span class="n">nem_acigi</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">hedef_nem</span> <span class="o">-</span> <span class="n">nem</span><span class="p">)</span>

    <span class="c1"># Beklenen yağmur arttıkça ihtiyaç azaltılır.
</span>    <span class="n">gerekli_mm</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">nem_acigi</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">-</span> <span class="n">yagis_mm</span><span class="p">)</span>

    <span class="c1"># 1 mm yağış, 1 m² alanda yaklaşık 1 litre sudur.
</span>    <span class="n">gerekli_litre</span> <span class="o">=</span> <span class="n">gerekli_mm</span> <span class="o">*</span> <span class="n">alan_m2</span>
    <span class="n">dakika</span> <span class="o">=</span> <span class="n">gerekli_litre</span> <span class="o">/</span> <span class="n">debi_litre_dk</span>

    <span class="k">return</span> <span class="nf">round</span><span class="p">(</span><span class="n">dakika</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>

<span class="n">sure</span> <span class="o">=</span> <span class="nf">sulama_suresi</span><span class="p">(</span>
    <span class="n">nem</span><span class="o">=</span><span class="mi">24</span><span class="p">,</span>
    <span class="n">hedef_nem</span><span class="o">=</span><span class="mi">35</span><span class="p">,</span>
    <span class="n">alan_m2</span><span class="o">=</span><span class="mi">120</span><span class="p">,</span>
    <span class="n">yagis_mm</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
    <span class="n">debi_litre_dk</span><span class="o">=</span><span class="mi">18</span>
<span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">'</span><span class="s">Sulama süresi: </span><span class="si">{</span><span class="n">sure</span><span class="si">}</span><span class="s"> dakika</span><span class="sh">'</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu örnek üretim sistemi için tek başına yeterli değildir; ancak sensör verisinin fiziksel su miktarına ve vana süresine nasıl dönüştürüldüğünü gösterir. Gerçek projede sensör okumaları filtrelenmeli, anormal değerler elenmeli ve vana komutları kayıt altına alınmalıdır.</p>

<h2 id="daha-akıllı-bir-mimari">Daha akıllı bir mimari</h2>

<p>Uygulamada nem sensörleri MQTT gibi bir protokolle merkezi sunucuya veri gönderebilir. Sunucu hava tahminini alır, optimizasyonu çalıştırır ve vanalara komut iletir. Elektrik veya internet kesintisine karşı yerel denetleyicide güvenli bir varsayılan program bulunması önemlidir.</p>

<p>Sonuç olarak akıllı sulama; sensör, tarım bilgisi ve optimizasyonun ortak çalışmasıdır. Başarı yalnızca su tasarrufuyla değil, bitki sağlığı, enerji tüketimi ve ürün verimi birlikte izlenerek ölçülmelidir. En iyi sistem en çok sulayan değil, doğru damlayı doğru köke ulaştırandır.</p>

<p><img src="/img/akilli-sulama-sistemlerinde-76.svg" alt="akilli-sulama-sistemlerinde-76" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="akıllı sulama" /><category term="optimizasyon" /><category term="nesnelerin interneti" /><category term="python" /><category term="tarım teknolojileri" /><category term="sensörler" /><summary type="html"><![CDATA[Geleneksel sulamada karar çoğu zaman takvime göre verilir: “Salı günü tarlayı sula.” Akıllı sulama sistemi ise daha meraklıdır; toprağın nemini, bitkinin gelişim dönemini, hava tahminini ve su deposunun durumunu sorgular. Böylece yalnızca gerekli bölgeye, gerekli zamanda ve gerekli miktarda su gönderir. Amaç musluğu robotlaştırmak değil, sınırlı suyu ölçülebilir bir optimizasyon problemi olarak yönetmektir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-sulama-sistemlerinde-76.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-sulama-sistemlerinde-76.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bir Dakika mı, Sonsuzluk mu? Oyunlarda Zaman Algısının Tasarımı</title><link href="https://program.sonsuz.us/posts/bir-dakika-mi-sonsuzluk-mu-oyunlarda-zaman-algisinin-tasarimi/" rel="alternate" type="text/html" title="Bir Dakika mı, Sonsuzluk mu? Oyunlarda Zaman Algısının Tasarımı" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bir-dakika-mi-sonsuzluk-mu-oyunlarda-zaman-algisinin-tasarimi</id><content type="html" xml:base="https://program.sonsuz.us/posts/bir-dakika-mi-sonsuzluk-mu-oyunlarda-zaman-algisinin-tasarimi/"><![CDATA[<p>Bir oyunda geçen 30 saniye her zaman 30 saniye gibi hissedilmez. Çatışmanın ortasında göz açıp kapayıncaya kadar geçen bu süre, boş bir yükleme ekranında küçük bir sonsuzluğa dönüşebilir. Çünkü oyuncunun sabrı yalnızca kronometreyle değil; dikkat, beklenti, kontrol hissi ve sunulan geri bildirimle yönetilir. İyi oyun tasarımı zamanı hızlandıramasa bile beynin onu nasıl yorumladığını ustalıkla değiştirebilir.</p>

<p><img src="/img/bir-dakika-mi-15.svg" alt="bir-dakika-mi-15" /></p>

<p>``</p>

<h2 id="fiziksel-zaman-ve-algılanan-zaman">Fiziksel zaman ve algılanan zaman</h2>

<p>Fiziksel zaman ölçülebilirken algılanan zaman öznel bir deneyimdir. Bunu basitleştirilmiş bir modelle şöyle ifade edebiliriz:</p>

\[T_a = T_g \times \frac{B + D}{E + K}\]

<p>Burada $T_a$ algılanan zamanı, $T_g$ gerçek süreyi, $B$ belirsizliği, $D$ dikkatin beklemeye yönelmesini, $E$ eğlenceyi ve $K$ kontrol hissini temsil eder. Bu bilimsel bir ölçüm formülü değil, tasarım kararlarını düşünmek için kullanışlı bir modeldir. Belirsizlik ve beklemeye odaklanma arttıkça süre uzamış gibi hissedilir. Eğlence ve kontrol hissi yükseldiğinde ise aynı süre daha kısa algılanır.</p>

<p>Örneğin yüzde göstergesi bulunmayan donmuş bir ekran, oyuncuya sistemin çalışıp çalışmadığını düşündürür. Belirsizlik yükselir ve oyuncu her saniyeyi izlemeye başlar. Hareketli bir ipucu, ilerleme çubuğu veya etkileşimli mini oyun ise dikkati dağıtır.</p>

<table>
  <thead>
    <tr>
      <th>Bekleme tasarımı</th>
      <th>Oyuncunun düşüncesi</th>
      <th>Algılanan etki</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Boş ve hareketsiz ekran</td>
      <td>“Oyun çöktü mü?”</td>
      <td>Süre çok uzun gelir</td>
    </tr>
    <tr>
      <td>İlerleme çubuğu</td>
      <td>“Ne kadar kaldığını biliyorum.”</td>
      <td>Belirsizlik azalır</td>
    </tr>
    <tr>
      <td>Oynanış ipuçları</td>
      <td>“Bu bilgiyi kullanabilirim.”</td>
      <td>Bekleme faydalı görünür</td>
    </tr>
    <tr>
      <td>Etkileşimli animasyon</td>
      <td>“Hâlâ bir şey yapıyorum.”</td>
      <td>Kontrol hissi artar</td>
    </tr>
    <tr>
      <td>Gizli yükleme koridoru</td>
      <td>“Dünyada ilerliyorum.”</td>
      <td>Yükleme fark edilmez</td>
    </tr>
  </tbody>
</table>

<h2 id="i̇lerleme-çubuğunun-küçük-oyunları">İlerleme çubuğunun küçük oyunları</h2>

<p>İlerleme çubukları her zaman yüklemenin gerçek hızını birebir göstermez. Dosyaların boyutu, disk hızı ve ağ gecikmesi değişken olduğu için doğrusal ilerleme üretmek zordur. Çubuğun uzun süre yüzde 99’da kalması özellikle sinir bozucudur; çünkü arayüz, bitiş sözü vermiş gibi görünür.</p>

<p>Daha dengeli bir gösterge için ölçülen ilerleme doğrudan ekrana verilmek yerine yumuşatılabilir:</p>

\[P_{yeni} = P_{eski} + \alpha(P_{gerçek} - P_{eski})\]

<p>$\alpha$ değeri 0 ile 1 arasındadır. Küçük değerler daha akıcı fakat daha yavaş tepki veren bir animasyon oluşturur. Aşağıdaki JavaScript örneği ani sıçramaları azaltır:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">displayedProgress</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="kd">function</span> <span class="nf">updateLoading</span><span class="p">(</span><span class="nx">realProgress</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">smoothing</span> <span class="o">=</span> <span class="mf">0.12</span><span class="p">;</span>
  <span class="nx">displayedProgress</span> <span class="o">+=</span>
    <span class="nx">smoothing</span> <span class="o">*</span> <span class="p">(</span><span class="nx">realProgress</span> <span class="o">-</span> <span class="nx">displayedProgress</span><span class="p">);</span>

  <span class="kd">const</span> <span class="nx">percent</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nx">displayedProgress</span> <span class="o">*</span> <span class="mi">100</span><span class="p">);</span>
  <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.progress-bar</span><span class="dl">"</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="s2">`</span><span class="p">${</span><span class="nx">percent</span><span class="p">}</span><span class="s2">%`</span><span class="p">;</span>
  <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.progress-label</span><span class="dl">"</span><span class="p">).</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">`</span><span class="p">${</span><span class="nx">percent</span><span class="p">}</span><span class="s2">%`</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Kod, gerçek yükleme oranına bir anda atlamak yerine ona kademeli biçimde yaklaşır. Ancak gösterge kullanıcıyı kandırmamalıdır. Gerçek işlem tamamlanmadan yüzde 100 göstermek, kısa vadede hızlı görünse de güven kaybına yol açabilir.</p>

<h2 id="beklemeyi-oynanışa-dönüştürmek">Beklemeyi oynanışa dönüştürmek</h2>

<p>Bazı oyunlar yüklemeyi dar geçitler, asansör yolculukları veya yavaş açılan kapılar içine saklar. Oyuncu hareket etmeye devam ettiği için teknik bekleme, kurgu dünyasının parçası olur. Buna karşılık aynı numara çok sık kullanılırsa oyuncular “Bu asansör aslında yükleme ekranı” diyerek perdenin arkasını görmeye başlar.</p>

<p>Respawn süreleri de bilinçli biçimde tasarlanır. Anında yeniden doğmak cezayı anlamsızlaştırabilir; aşırı uzun beklemek ise öfke yaratır. Takım oyunlarında bekleme süresi, oyuncuya haritayı izleme ve strateji kurma fırsatı veriyorsa pasif ceza olmaktan çıkar.</p>

<p>Başarılı zaman manipülasyonunun amacı oyuncuyu aldatmak değil, beklemeyi anlaşılır ve tahmin edilebilir kılmaktır. Geri bildirim verin, belirsizliği azaltın, mümkünse küçük bir kontrol alanı sunun. Saat aynı hızda ilerlese de oyuncunun zihnindeki kronometre böylece çok daha insaflı çalışır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun tasarımı" /><category term="kullanıcı deneyimi" /><category term="zaman algısı" /><category term="yükleme ekranları" /><category term="oyuncu psikolojisi" /><category term="game development" /><summary type="html"><![CDATA[Bir oyunda geçen 30 saniye her zaman 30 saniye gibi hissedilmez. Çatışmanın ortasında göz açıp kapayıncaya kadar geçen bu süre, boş bir yükleme ekranında küçük bir sonsuzluğa dönüşebilir. Çünkü oyuncunun sabrı yalnızca kronometreyle değil; dikkat, beklenti, kontrol hissi ve sunulan geri bildirimle yönetilir. İyi oyun tasarımı zamanı hızlandıramasa bile beynin onu nasıl yorumladığını ustalıkla değiştirebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bir-dakika-mi-15.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bir-dakika-mi-15.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Director AI: Oyun Zorluğunu Oyuncuya Göre Yöneten Görünmez Yönetmen</title><link href="https://program.sonsuz.us/posts/director-ai-oyun-zorlugunu-oyuncuya-gore-yoneten-gorunmez-yonetmen/" rel="alternate" type="text/html" title="Director AI: Oyun Zorluğunu Oyuncuya Göre Yöneten Görünmez Yönetmen" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/director-ai-oyun-zorlugunu-oyuncuya-gore-yoneten-gorunmez-yonetmen</id><content type="html" xml:base="https://program.sonsuz.us/posts/director-ai-oyun-zorlugunu-oyuncuya-gore-yoneten-gorunmez-yonetmen/"><![CDATA[<p>Bir oyunda tam rahatladığınız anda zombilerin koridordan taşması tesadüf olmayabilir. <em>Left 4 Dead</em> gibi yapımlarda kullanılan Director AI, önceden hazırlanmış olayları sırayla oynatmak yerine oyuncuların durumunu izler, gerilim seviyesini tahmin eder ve karşılaşmaları dinamik biçimde düzenler. Kısacası bu sistem, oyun dünyasının görünmez film yönetmenidir.</p>

<p><img src="/img/director-ai-oyun-26.svg" alt="director-ai-oyun-26" /></p>

<p>``</p>

<h2 id="director-ai-tam-olarak-nedir">Director AI tam olarak nedir?</h2>

<p>Director AI, tek bir düşmanın nasıl hareket edeceğini belirleyen klasik yapay zekâdan farklıdır. Bireysel düşman AI’ı hedef seçme, siper alma veya yol bulma gibi yerel kararlarla ilgilenirken yönetmen sistemi bütün oyun deneyimini denetler.</p>

<table>
  <thead>
    <tr>
      <th>Sistem</th>
      <th>İzlediği ölçek</th>
      <th>Tipik karar</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Düşman AI</td>
      <td>Tek karakter</td>
      <td>Kime saldırmalıyım?</td>
    </tr>
    <tr>
      <td>Director AI</td>
      <td>Takım ve bölüm</td>
      <td>Ne zaman saldırı başlamalı?</td>
    </tr>
    <tr>
      <td>Sabit zorluk</td>
      <td>Önceden tanımlı kurallar</td>
      <td>Düşman ne kadar güçlü?</td>
    </tr>
    <tr>
      <td>Dinamik zorluk</td>
      <td>Anlık oyuncu performansı</td>
      <td>Baskı artırılmalı mı?</td>
    </tr>
  </tbody>
</table>

<p>Amaç oyuncuyu sürekli cezalandırmak değildir. İyi bir yönetmen; stres, rahatlama ve yeniden yükselişten oluşan dramatik bir ritim üretir. Kesintisiz baskı yorucu, sürekli kolaylık ise sıkıcıdır.</p>

<h2 id="oyuncunun-stresi-nasıl-ölçülür">Oyuncunun stresi nasıl ölçülür?</h2>

<p>Sistem doğrudan oyuncunun heyecanını okuyamaz; bunun yerine ölçülebilir sinyaller kullanır. Can miktarı, takım üyeleri arasındaki mesafe, isabet oranı, alınan hasar, cephane ve son saldırıdan beri geçen süre bunlardan bazılarıdır.</p>

<p>Basitleştirilmiş bir stres puanı şöyle hesaplanabilir:</p>

\[S = 0.35D + 0.25(1-H) + 0.20I + 0.20A\]

<p>Burada $D$ normalize edilmiş hasarı, $H$ kalan sağlık oranını, $I$ takımın dağılma seviyesini ve $A$ aktif düşman yoğunluğunu temsil eder. Katsayıların toplamının $1$ olması yorumlamayı kolaylaştırır. Örneğin $S$ değeri $1$’e yaklaştıkça oyuncuların baskı altında olduğu varsayılır.</p>

<p>Tek karelik ölçümler yanıltıcı olabileceğinden üstel hareketli ortalama kullanılabilir:</p>

\[S_t = \alpha x_t + (1-\alpha)S_{t-1}\]

<p>Küçük bir $\alpha$, sistemin ani değişimlere aşırı tepki vermesini engeller. Böylece tek bir kötü nişan, hemen devasa bir zombi sürüsüyle sonuçlanmaz.</p>

<h2 id="gerilim-döngüsü">Gerilim döngüsü</h2>

<p>Director AI genellikle deneyimi aşamalara böler:</p>

<ol>
  <li><strong>Hazırlık:</strong> Oyuncular kaynak toplar ve çevreyi inceler.</li>
  <li><strong>Yükseliş:</strong> Düşman sayısı veya özel tehdit olasılığı artar.</li>
  <li><strong>Zirve:</strong> Yoğun bir saldırı ya da kritik karşılaşma yaşanır.</li>
  <li><strong>Rahatlama:</strong> Baskı azaltılır, oyuncuya toparlanma fırsatı verilir.</li>
</ol>

<p>Bu döngü yalnızca düşman sayısını değiştirmez. Sağlık paketlerinin konumu, müzik, özel düşman türleri ve alternatif yollar da yönetilebilir. Ancak sistem oyuncuya açıkça yardım ederse yapaylık hissi doğar. Bu nedenle ayarlamalar çoğunlukla perde arkasında yapılır.</p>

<h2 id="basit-bir-yönetmen-prototipi">Basit bir yönetmen prototipi</h2>

<p>Aşağıdaki Python örneği, stres puanına göre yönetmenin hangi aşamaya geçeceğini gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Director</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">stress</span> <span class="o">=</span> <span class="mf">0.0</span>
        <span class="n">self</span><span class="p">.</span><span class="n">phase</span> <span class="o">=</span> <span class="sh">"</span><span class="s">hazirlik</span><span class="sh">"</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">damage</span><span class="p">,</span> <span class="n">low_health</span><span class="p">,</span> <span class="n">isolation</span><span class="p">,</span> <span class="n">enemies</span><span class="p">):</span>
        <span class="n">sample</span> <span class="o">=</span> <span class="p">(</span>
            <span class="mf">0.35</span> <span class="o">*</span> <span class="n">damage</span>
            <span class="o">+</span> <span class="mf">0.25</span> <span class="o">*</span> <span class="n">low_health</span>
            <span class="o">+</span> <span class="mf">0.20</span> <span class="o">*</span> <span class="n">isolation</span>
            <span class="o">+</span> <span class="mf">0.20</span> <span class="o">*</span> <span class="n">enemies</span>
        <span class="p">)</span>

        <span class="c1"># Ölçümü yumuşatarak ani ve dengesiz kararları önler.
</span>        <span class="n">self</span><span class="p">.</span><span class="n">stress</span> <span class="o">=</span> <span class="mf">0.2</span> <span class="o">*</span> <span class="n">sample</span> <span class="o">+</span> <span class="mf">0.8</span> <span class="o">*</span> <span class="n">self</span><span class="p">.</span><span class="n">stress</span>

        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">stress</span> <span class="o">&lt;</span> <span class="mf">0.25</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">phase</span> <span class="o">=</span> <span class="sh">"</span><span class="s">yukselis</span><span class="sh">"</span>
        <span class="k">elif</span> <span class="n">self</span><span class="p">.</span><span class="n">stress</span> <span class="o">&gt;</span> <span class="mf">0.75</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">phase</span> <span class="o">=</span> <span class="sh">"</span><span class="s">rahatlama</span><span class="sh">"</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">phase</span> <span class="o">=</span> <span class="sh">"</span><span class="s">denge</span><span class="sh">"</span>

        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">phase</span>
</code></pre></div></div>

<p>Buradaki önemli ayrıntı ters dengedir: stres düşükken tehdit artırılır, yüksekken oyuncuya nefes aldırılır. Gerçek projelerde eşiklerin sürekli aşılmasını önlemek için histerezis, aşamalar için minimum süre ve rastlantısal seçim ağırlıkları da eklenir.</p>

<h2 id="adil-görünmek-adil-olmaktan-farklıdır">Adil görünmek, adil olmaktan farklıdır</h2>

<p>Dinamik zorluk sisteminin en büyük riski oyuncunun başarılarını değersizleştirmesidir. İyi oynayan kişiye durmadan daha güçlü düşman göndermek, ilerleme hissini yok edebilir. Çözüm; zorluğu yalnızca sayısal güçle değil, karşılaşma çeşitliliği ve tempo üzerinden düzenlemektir.</p>

<p>Başarılı bir Director AI, oyuncunun ne kazanacağını belirlemez; unutulmaz bir mücadele yaşayabileceği koşulları hazırlar. En iyi yönetmen de zaten varlığını hissettirmeden sahneyi yöneten yönetmendir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zeka" /><category term="oyun geliştirme" /><category term="director ai" /><category term="dinamik zorluk" /><category term="left 4 dead" /><category term="oyuncu deneyimi" /><summary type="html"><![CDATA[Bir oyunda tam rahatladığınız anda zombilerin koridordan taşması tesadüf olmayabilir. Left 4 Dead gibi yapımlarda kullanılan Director AI, önceden hazırlanmış olayları sırayla oynatmak yerine oyuncuların durumunu izler, gerilim seviyesini tahmin eder ve karşılaşmaları dinamik biçimde düzenler. Kısacası bu sistem, oyun dünyasının görünmez film yönetmenidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/director-ai-oyun-26.png" /><media:content medium="image" url="https://program.sonsuz.us/img/director-ai-oyun-26.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Genom Dizileme Verilerinin Biyoinformatik Analizi: Bazlardan Biyolojik Anlama</title><link href="https://program.sonsuz.us/posts/genom-dizileme-verilerinin-biyoinformatik-analizi-bazlardan-biyolojik-anlama/" rel="alternate" type="text/html" title="Genom Dizileme Verilerinin Biyoinformatik Analizi: Bazlardan Biyolojik Anlama" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/genom-dizileme-verilerinin-biyoinformatik-analizi-bazlardan-biyolojik-anlama</id><content type="html" xml:base="https://program.sonsuz.us/posts/genom-dizileme-verilerinin-biyoinformatik-analizi-bazlardan-biyolojik-anlama/"><![CDATA[<p><img src="/img/genom-dizileme-verilerinin-43.svg" alt="genom-dizileme-verilerinin-43" /></p>

<p>Modern dizileme cihazları tek bir deneyde milyarlarca DNA bazı üretebilir. Ancak cihazdan çıkan A, T, G ve C harfleri tek başına pek anlamlı değildir. Bu devasa yapbozu çözmek; kısa DNA parçalarını referans genoma yerleştirmeyi, farklılıkları bulmayı ve sonuçların güvenilirliğini ölçmeyi gerektirir. İşte biyoinformatik, moleküler biyoloji ile algoritmaların el sıkıştığı noktada devreye girer.
``</p>

<h2 id="ham-veriden-genoma-uzanan-yol">Ham veriden genoma uzanan yol</h2>

<p>Dizileme sonucu çoğunlukla <strong>FASTQ</strong> dosyaları elde edilir. Her okuma, yani <em>read</em>, bir DNA dizisiyle birlikte baz kalitesini belirten sayısal değerlere sahiptir. Phred kalite skoru şu ilişkiyle tanımlanır:</p>

\[Q = -10 \log_{10}(P)\]

<p>Buradaki $P$, bazın yanlış okunma olasılığıdır. Örneğin $Q=30$, yaklaşık $P=0.001$ hata olasılığına, yani %99,9 doğruluğa karşılık gelir. Analizin ilk aşamasında FastQC gibi araçlarla kalite dağılımı, GC oranı ve adaptör kalıntıları incelenir. Düşük kaliteli uçlar ve adaptörler temizlenmezse sonraki algoritmalar biyolojik olmayan eşleşmeler üretebilir.</p>

<h2 id="hizalama-neden-zordur">Hizalama neden zordur?</h2>

<p>İnsan genomu yaklaşık 3,2 milyar baz çifti içerir. Buna karşılık tipik bir kısa okuma yalnızca 100–150 baz uzunluğundadır. Üstelik genomda tekrar eden bölgeler, dizileme hataları, eklemeler ve silinmeler bulunur. Dolayısıyla amaç yalnızca aynı metni aramak değil, küçük farklılıklara izin veren en olası konumu bulmaktır.</p>

<p>İki diziyi karşılaştıran klasik dinamik programlama yaklaşımında genel süre karmaşıklığı $O(nm)$ seviyesindedir. Milyonlarca okumada bu maliyet kabul edilemez. Modern hizalayıcılar bu yüzden genomu indeksler ve yalnızca umut vadeden bölgeleri ayrıntılı olarak değerlendirir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Temel fikir</th>
      <th>Güçlü yanı</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Needleman–Wunsch</td>
      <td>Dizileri uçtan uca hizalar</td>
      <td>Küresel hizalamada kesin sonuç</td>
      <td>Büyük veride yavaş</td>
    </tr>
    <tr>
      <td>Smith–Waterman</td>
      <td>En iyi yerel bölgeyi arar</td>
      <td>Hassas eşleşme</td>
      <td>Yüksek hesaplama maliyeti</td>
    </tr>
    <tr>
      <td>Hash indeksleri</td>
      <td>Kısa kelimeleri konumlarla eşler</td>
      <td>Hızlı aday bulma</td>
      <td>Bellek tüketebilir</td>
    </tr>
    <tr>
      <td>BWT/FM-index</td>
      <td>Sıkıştırılmış genom indeksi kullanır</td>
      <td>Hız ve bellek dengesi</td>
      <td>Tekrar bölgelerinde belirsizlik</td>
    </tr>
    <tr>
      <td>De Bruijn grafı</td>
      <td>Okumaları $k$-mer bağlantılarıyla birleştirir</td>
      <td>Referanssız genom montajı</td>
      <td>Hatalara ve $k$ seçimine duyarlı</td>
    </tr>
  </tbody>
</table>

<p>BWA ve Bowtie2 gibi araçlar <strong>Burrows–Wheeler Dönüşümü</strong> ile oluşturulan FM-index yapısından yararlanır. Böylece referans genomun tamamını her okuma için baştan taramak yerine eşleşme aralığı hızlı biçimde daraltılır. Uzun okumalar için Minimap2, dizilerden seçilmiş temsilci parçaları kullanarak aday konumları bulur.</p>

<h2 id="küçük-bir-dizi-karşılaştırma-örneği">Küçük bir dizi karşılaştırma örneği</h2>

<p>Aşağıdaki Python kodu, iki eşit uzunluklu dizinin farklı olduğu konumları belirler. Gerçek hizalayıcıların yaptığı iş çok daha karmaşıktır; ancak varyant bulmanın temel fikrini gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">reference</span> <span class="o">=</span> <span class="sh">"</span><span class="s">ACGTTGCAACGT</span><span class="sh">"</span>
<span class="n">sample</span> <span class="o">=</span> <span class="sh">"</span><span class="s">ACGTCGCAATGT</span><span class="sh">"</span>

<span class="n">variants</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">position</span><span class="p">,</span> <span class="p">(</span><span class="n">ref_base</span><span class="p">,</span> <span class="n">sample_base</span><span class="p">)</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span>
    <span class="nf">zip</span><span class="p">(</span><span class="n">reference</span><span class="p">,</span> <span class="n">sample</span><span class="p">),</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span>
<span class="p">):</span>
    <span class="k">if</span> <span class="n">ref_base</span> <span class="o">!=</span> <span class="n">sample_base</span><span class="p">:</span>
        <span class="n">variants</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
            <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="n">position</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">reference</span><span class="sh">"</span><span class="p">:</span> <span class="n">ref_base</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">sample</span><span class="sh">"</span><span class="p">:</span> <span class="n">sample_base</span>
        <span class="p">})</span>

<span class="k">for</span> <span class="n">variant</span> <span class="ow">in</span> <span class="n">variants</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">variant</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, referans ile örneği baz baz karşılaştırır ve değişen konumları kaydeder. Gerçek analizlerde GATK, FreeBayes veya DeepVariant gibi araçlar yalnızca harf farkına bakmaz; okuma derinliği, baz kalitesi ve hizalama güvenini de hesaba katar.</p>

<p>Bir varyantın destek oranı kabaca $f = a/d$ ile ifade edilebilir. Burada $a$ alternatif bazı destekleyen okuma sayısı, $d$ ise toplam kapsama derinliğidir. Örneğin 40 okumanın 20’si farklı bazı taşıyorsa $f=0.5$ olur; bu durum diploid bir genomda heterozigot varyanta işaret edebilir.</p>

<h2 id="sonuçların-biyolojik-yorumu">Sonuçların biyolojik yorumu</h2>

<p>Hizalama sonrasında SAM/BAM dosyaları düzenlenir, yinelenen okumalar işaretlenir ve varyantlar VCF biçiminde raporlanır. Ardından bulunan değişikliklerin genleri, proteinleri veya hastalık riskini etkileyip etkilemediği araştırılır. En hızlı algoritma bile kötü kaliteli veriyle güvenilir biyoloji üretemez. Bu nedenle genom analizi; doğru indeksleme, istatistiksel değerlendirme, kalite kontrolü ve biyolojik yorumun birlikte yürütüldüğü dikkatli bir süreçtir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="biyoinformatik" /><category term="genomik" /><category term="dna" /><category term="dizileme" /><category term="algoritma" /><category term="python" /><summary type="html"><![CDATA[Modern dizileme cihazları tek bir deneyde milyarlarca DNA bazı üretebilir. Ancak cihazdan çıkan A, T, G ve C harfleri tek başına pek anlamlı değildir. Bu devasa yapbozu çözmek; kısa DNA parçalarını referans genoma yerleştirmeyi, farklılıkları bulmayı ve sonuçların güvenilirliğini ölçmeyi gerektirir. İşte biyoinformatik, moleküler biyoloji ile algoritmaların el sıkıştığı noktada devreye girer.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/genom-dizileme-verilerinin-43.png" /><media:content medium="image" url="https://program.sonsuz.us/img/genom-dizileme-verilerinin-43.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Görünmez Öğretmen: Oyun Tasarımında Zımni Öğretim</title><link href="https://program.sonsuz.us/posts/gorunmez-ogretmen-oyun-tasariminda-zimni-ogretim/" rel="alternate" type="text/html" title="Görünmez Öğretmen: Oyun Tasarımında Zımni Öğretim" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/gorunmez-ogretmen-oyun-tasariminda-zimni-ogretim</id><content type="html" xml:base="https://program.sonsuz.us/posts/gorunmez-ogretmen-oyun-tasariminda-zimni-ogretim/"><![CDATA[<p>Bir oyun size ekrana kocaman bir pencere açıp “Zıplamak için Space tuşuna bas!” demeden zıplamayı öğretebilir mi? Elbette. Hatta iyi tasarlanmış bir oyun, kurallarını açıktan anlatmak yerine merakınızı, çevreyi okuma yeteneğinizi ve deneme isteğinizi kullanır. İşte oyuncunun farkında olmadan öğrendiği bu yaklaşım, <strong>zımni öğretim</strong> veya İngilizce adıyla <em>implicit tutorial</em> olarak bilinir.</p>

<p><img src="/img/gorunmez-ogretmen-oyun-29.svg" alt="gorunmez-ogretmen-oyun-29" /></p>

<p>``</p>
<h2 id="zımni-öğretim-nedir">Zımni öğretim nedir?</h2>

<p>Zımni öğretim, oyunun mekaniklerini metin kutuları veya uzun açıklamalar yerine <strong>seviye düzeni, görsel ipuçları, güvenli deneyler ve sonuçlar</strong> aracılığıyla öğretmesidir. Tasarımcı oyuncuya doğrudan ne yapacağını söylemez; doğru davranışı keşfedebileceği kontrollü bir durum hazırlar.</p>

<p>Bu yaklaşımın temel döngüsü şöyle modellenebilir:</p>

\[Gözlem \rightarrow Deneme \rightarrow Geri\ Bildirim \rightarrow Öğrenme\]

<p>Örneğin oyuncunun önüne küçük bir çukur yerleştirilir. İlerlemek için zıplaması gerekir; fakat çukur ölümcül değildir. Oyuncu düşse bile kolayca geri çıkabilir. Böylece oyun hem zıplama gereksinimini gösterir hem de hata yapmayı cezalandırmadan denemeye izin verir.</p>

<h2 id="açık-ve-zımni-öğretimin-farkı">Açık ve zımni öğretimin farkı</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Açık öğretim</th>
      <th>Zımni öğretim</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bilgi aktarımı</td>
      <td>Metin, ses veya tuş göstergesi</td>
      <td>Seviye ve çevre düzeni</td>
    </tr>
    <tr>
      <td>Oyuncunun rolü</td>
      <td>Talimatı uygulamak</td>
      <td>Kuralı keşfetmek</td>
    </tr>
    <tr>
      <td>Akışa etkisi</td>
      <td>Oyunu durdurabilir</td>
      <td>Oynanışla bütünleşir</td>
    </tr>
    <tr>
      <td>Hatırlanabilirlik</td>
      <td>Okunan bilgi unutulabilir</td>
      <td>Deneyimlenen bilgi daha kalıcıdır</td>
    </tr>
    <tr>
      <td>Risk</td>
      <td>Bilgi bombardımanı</td>
      <td>İpucunun anlaşılmaması</td>
    </tr>
  </tbody>
</table>

<p>Zımni öğretim her durumda üstün değildir. Karmaşık envanter sistemleri veya erişilebilirlik seçenekleri açık açıklamalar gerektirebilir. İyi tasarım, iki yaklaşımı rakip değil tamamlayıcı araçlar olarak görür.</p>

<h2 id="seviye-tasarımı-nasıl-öğretmene-dönüşür">Seviye tasarımı nasıl öğretmene dönüşür?</h2>

<p>İlk yöntem <strong>odak yönetimidir</strong>. Işık, renk, hareket ve mimari çizgiler oyuncunun bakışını önemli noktaya taşır. Karanlık bir koridordaki tek parlak kapı, üzerinde “Buraya git” yazmasa da oldukça konuşkandır.</p>

<p>İkinci yöntem, yeni mekaniği güvenli bir ortamda tanıtmaktır. Oyuncu patlayan bir varili ilk kez düşmansız bir odada görürse ona ateş ederek sonucunu inceleyebilir. Daha sonra aynı varil düşmanların yanında kullanıldığında oyuncu bağlantıyı kendisi kurar.</p>

<p>Öğrenme başarısını basitçe şu şekilde düşünebiliriz:</p>

\[Öğrenme = İpucuNetliği \times DenemeFırsatı \times GeriBildirimGücü\]

<p>Çarpanlardan biri sıfıra yaklaşırsa öğretim de zayıflar. Parlayan bir nesne dikkat çekebilir; ancak oyuncu onunla etkileşime giremiyorsa anlamlı öğrenme oluşmaz.</p>

<h2 id="küçük-bir-tasarım-örneği">Küçük bir tasarım örneği</h2>

<p>Bir platform oyununda duvardan zıplama mekaniğini tanıttığımızı varsayalım. Seviyenin davranışı aşağıdaki sözde kodla ifade edilebilir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>oyuncu öğretim_odasına_girince:
    çıkışı yüksek bir noktaya yerleştir
    iki zıplanabilir duvarı karşılıklı konumlandır
    düşülen zemini güvenli yap

oyuncu duvara temas edince:
    karakteri kısa süre duvara tutundur
    görsel parçacık ve ses geri bildirimi üret

oyuncu çıkışa ulaşınca:
    aynı mekaniği düşük riskli bir engelde tekrar kullan
</code></pre></div></div>

<p>Bu kod gerçek bir oyun motoruna bağlı değildir; tasarımın mantığını gösterir. Yüksek çıkış hedefi belirler, karşılıklı duvarlar çözüm alanını sınırlar, güvenli zemin ise korkmadan denemeyi sağlar. Parçacık ve ses, duvarın özel bir davranış sunduğunu bildirir.</p>

<h2 id="tasarımcının-görünmez-eli">Tasarımcının görünmez eli</h2>

<p>Başarılı bir zımni öğretimde oyuncu “Tasarımcı bana bunu öğretti” demez; “Ben bunu çözdüm!” der. Bu sahiplenme duygusu motivasyonu artırır. Ancak ipuçları fazla belirgin olursa keşif hissi kaybolur, fazla belirsiz olursa oyuncu sıkışır.</p>

<p>Bu nedenle iyi bir seviye önce mekaniği <strong>gösterir</strong>, sonra güvenle <strong>denetir</strong>, ardından farklı bir bağlamda <strong>sınar</strong>. Oyuncu kuralları okumak yerine yaşar. Görünmez öğretmenin en büyük başarısı da ders verdiğini hiç belli etmemesidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun tasarımı" /><category term="seviye tasarımı" /><category term="zımni öğretim" /><category term="oyuncu deneyimi" /><category term="game design" /><category term="çevresel anlatım" /><summary type="html"><![CDATA[Bir oyun size ekrana kocaman bir pencere açıp “Zıplamak için Space tuşuna bas!” demeden zıplamayı öğretebilir mi? Elbette. Hatta iyi tasarlanmış bir oyun, kurallarını açıktan anlatmak yerine merakınızı, çevreyi okuma yeteneğinizi ve deneme isteğinizi kullanır. İşte oyuncunun farkında olmadan öğrendiği bu yaklaşım, zımni öğretim veya İngilizce adıyla implicit tutorial olarak bilinir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/gorunmez-ogretmen-oyun-29.png" /><media:content medium="image" url="https://program.sonsuz.us/img/gorunmez-ogretmen-oyun-29.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Hücresel Otomata ile Kentsel Büyüme Modellemesi</title><link href="https://program.sonsuz.us/posts/hucresel-otomata-ile-kentsel-buyume-modellemesi/" rel="alternate" type="text/html" title="Hücresel Otomata ile Kentsel Büyüme Modellemesi" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/hucresel-otomata-ile-kentsel-buyume-modellemesi</id><content type="html" xml:base="https://program.sonsuz.us/posts/hucresel-otomata-ile-kentsel-buyume-modellemesi/"><![CDATA[<p>Şehirler bazen planlı caddelerle, bazen de “Şuraya da bir bina konduralım!” yaklaşımıyla büyür. Gerçek kentsel gelişim ekonomi, ulaşım, nüfus ve coğrafya gibi pek çok değişkene bağlıdır. Yine de yalnızca karelerden ve birkaç komşuluk kuralından yararlanarak şaşırtıcı derecede gerçekçi büyüme desenleri üretebiliriz. Bunun için kullanacağımız araç, hücresel otomata modelidir.
``</p>

<h2 id="hücresel-otomata-nedir">Hücresel otomata nedir?</h2>

<p>Hücresel otomata, uzayı hücrelerden oluşan bir ızgaraya bölen ayrık bir modeldir. Her hücre belirli bir durumda bulunur ve bir sonraki zaman adımındaki durumu, kendi mevcut durumuna ve komşularına göre hesaplanır.</p>

<p>Kentsel büyüme modelinde hücreler arazi parçalarını temsil edebilir:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">Hücre değeri</th>
      <th>Arazi türü</th>
      <th>Büyüyebilir mi?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">0</td>
      <td>Boş arazi</td>
      <td>Evet</td>
    </tr>
    <tr>
      <td style="text-align: right">1</td>
      <td>Kentsel alan</td>
      <td>Zaten gelişmiş</td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td>Su veya koruma alanı</td>
      <td>Hayır</td>
    </tr>
  </tbody>
</table>

<p>En yaygın iki komşuluk yaklaşımı şunlardır:</p>

<table>
  <thead>
    <tr>
      <th>Komşuluk</th>
      <th style="text-align: right">Hücre sayısı</th>
      <th>Özellik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Von Neumann</td>
      <td style="text-align: right">4</td>
      <td>Yalnızca yatay ve dikey komşular</td>
    </tr>
    <tr>
      <td>Moore</td>
      <td style="text-align: right">8</td>
      <td>Çapraz hücreler dâhil tüm çevre</td>
    </tr>
  </tbody>
</table>

<p>Moore komşuluğu, şehrin daha yuvarlak ve yaygın biçimde büyümesine izin verir. Von Neumann komşuluğu ise daha köşeli desenler oluşturabilir.</p>

<h2 id="büyüme-kuralını-kurmak">Büyüme kuralını kurmak</h2>

<p>Boş bir hücrenin kentleşme olasılığını, çevresindeki kentsel hücrelerin oranıyla ilişkilendirebiliriz. Hücrenin sekiz komşusundan $n$ tanesi kentleşmişse temel olasılık şöyle tanımlanabilir:</p>

\[P = b + w(n / 8)\]

<p>Burada $b$ kendiliğinden büyüme olasılığı, $w$ ise komşuluk etkisinin ağırlığıdır. Örneğin $b=0.01$ ve $w=0.6$ olduğunda, mevcut şehre yakın araziler daha hızlı yapılaşırken uzakta küçük uydu yerleşimler de doğabilir. Olasılığın 1’i aşmaması için $P = min(1, P)$ kullanılır.</p>

<p>Bu basit denklem önemli bir fikri yakalar: Kentsel alanlar altyapı, ulaşım ve hizmetlere yakınlık nedeniyle çoğunlukla mevcut yerleşimlerin çevresinde gelişir.</p>

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

<p>Aşağıdaki kod, 50x50 hücrelik bir haritada Moore komşuluğunu kullanarak büyümeyi simüle eder:</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">size</span> <span class="o">=</span> <span class="mi">50</span>
<span class="n">city</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">size</span><span class="p">,</span> <span class="n">size</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
<span class="n">city</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="mi">27</span><span class="p">,</span> <span class="mi">24</span><span class="p">:</span><span class="mi">27</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>  <span class="c1"># Başlangıçtaki kent merkezi
</span>
<span class="n">base_probability</span> <span class="o">=</span> <span class="mf">0.01</span>
<span class="n">neighbor_weight</span> <span class="o">=</span> <span class="mf">0.60</span>

<span class="k">def</span> <span class="nf">step</span><span class="p">(</span><span class="n">grid</span><span class="p">):</span>
    <span class="n">new_grid</span> <span class="o">=</span> <span class="n">grid</span><span class="p">.</span><span class="nf">copy</span><span class="p">()</span>

    <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">grid</span><span class="p">[</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
                <span class="k">continue</span>

            <span class="n">neighborhood</span> <span class="o">=</span> <span class="n">grid</span><span class="p">[</span><span class="n">row</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span><span class="n">row</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="n">col</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span><span class="n">col</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span>
            <span class="n">urban_neighbors</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">count_nonzero</span><span class="p">(</span><span class="n">neighborhood</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
            <span class="n">probability</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">base_probability</span> <span class="o">+</span>
                              <span class="n">neighbor_weight</span> <span class="o">*</span> <span class="n">urban_neighbors</span> <span class="o">/</span> <span class="mi">8</span><span class="p">)</span>

            <span class="k">if</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">&lt;</span> <span class="n">probability</span><span class="p">:</span>
                <span class="n">new_grid</span><span class="p">[</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>

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

<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">30</span><span class="p">):</span>
    <span class="n">city</span> <span class="o">=</span> <span class="nf">step</span><span class="p">(</span><span class="n">city</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="nf">imshow</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="sh">'</span><span class="s">Greys</span><span class="sh">'</span><span class="p">,</span> <span class="n">interpolation</span><span class="o">=</span><span class="sh">'</span><span class="s">nearest</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">title</span><span class="p">(</span><span class="sh">'</span><span class="s">30 Adım Sonra Kentsel Yayılım</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">axis</span><span class="p">(</span><span class="sh">'</span><span class="s">off</span><span class="sh">'</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><code class="language-plaintext highlighter-rouge">step</code> fonksiyonu her boş araziyi inceler, kentleşmiş komşuları sayar ve hesaplanan olasılığa göre hücrenin durumunu değiştirir. Güncelleme sırasında ayrı bir kopya kullanılması kritiktir; aksi hâlde aynı turda yeni kentleşen hücreler hemen komşularını etkiler ve zaman mantığı bozulur.</p>

<h2 id="modeli-daha-gerçekçi-yapmak">Modeli daha gerçekçi yapmak</h2>

<p>Basit modeli yükselti, yol ve koruma alanı katmanlarıyla geliştirebiliriz. Bir hücrenin toplam uygunluğu örneğin $S = 0.5N + 0.3R - 0.2E$ biçiminde hesaplanabilir. Burada $N$ komşuluk etkisini, $R$ yola yakınlığı, $E$ ise eğim maliyetini temsil eder.</p>

<p>Farklı parametrelerle çok sayıda deney yapmak, tek bir kesin gelecek üretmekten daha değerlidir. Çünkü model bir kehanet makinesi değil, “Bu kurallar geçerliyse ne olabilir?” sorusuna cevap veren bir düşünme laboratuvarıdır. Birkaç satırlık kodla plansız yayılımı, uydu kentleri veya koruma politikalarının etkisini karşılaştırabilir; şehirlerin karmaşık görünümünün basit yerel kararlardan nasıl doğabildiğini gözlemleyebilirsiniz.</p>

<p><img src="/img/hucresel-otomata-ile-80.svg" alt="hucresel-otomata-ile-80" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="hücresel otomata" /><category term="kentsel büyüme" /><category term="python" /><category term="simülasyon" /><category term="modelleme" /><category term="şehir planlama" /><summary type="html"><![CDATA[Şehirler bazen planlı caddelerle, bazen de “Şuraya da bir bina konduralım!” yaklaşımıyla büyür. Gerçek kentsel gelişim ekonomi, ulaşım, nüfus ve coğrafya gibi pek çok değişkene bağlıdır. Yine de yalnızca karelerden ve birkaç komşuluk kuralından yararlanarak şaşırtıcı derecede gerçekçi büyüme desenleri üretebiliriz. Bunun için kullanacağımız araç, hücresel otomata modelidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/hucresel-otomata-ile-80.png" /><media:content medium="image" url="https://program.sonsuz.us/img/hucresel-otomata-ile-80.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">İstemci-Sunucu Senkronizasyonu: Çevrimiçi Oyunlarda Hile Nasıl Yakalanır?</title><link href="https://program.sonsuz.us/posts/istemci-sunucu-senkronizasyonu-cevrimici-oyunlarda-hile-nasil-yakalanir/" rel="alternate" type="text/html" title="İstemci-Sunucu Senkronizasyonu: Çevrimiçi Oyunlarda Hile Nasıl Yakalanır?" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/istemci-sunucu-senkronizasyonu-cevrimici-oyunlarda-hile-nasil-yakalanir</id><content type="html" xml:base="https://program.sonsuz.us/posts/istemci-sunucu-senkronizasyonu-cevrimici-oyunlarda-hile-nasil-yakalanir/"><![CDATA[<p>Çevrimiçi bir oyunda ekranda gördüğümüz dünya, aslında istemci ile sunucunun sürekli uzlaşmaya çalıştığı sayısal bir simülasyondur. Gecikme, paket kaybı ve farklı donanımlar bu uzlaşmayı zorlaştırırken hile yapan oyuncular da istemciden gönderilen verileri değiştirerek avantaj kazanmaya çalışır. Etkili bir hile önleme sistemi bu nedenle yalnızca “hile programı bulmak” değil, oyuncunun davranışını matematiksel ve mantıksal olarak doğrulamak anlamına gelir.</p>

<p><img src="/img/istemci-sunucu-senkronizasyonu-41.svg" alt="istemci-sunucu-senkronizasyonu-41" /></p>

<p>``</p>

<h2 id="temel-güven-modeli-i̇stemciye-güvenme">Temel güven modeli: İstemciye güvenme</h2>

<p>En önemli prensip şudur: <strong>İstemci niyet bildirir, sonucu sunucu hesaplar.</strong> Oyuncunun bilgisayarı “Rakibe 100 hasar verdim” dememeli; yalnızca “Şu yönde ateş ettim” bilgisini göndermelidir. Mermi yolu, çarpışma ve hasar sunucuda doğrulanmalıdır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>İstemcinin gönderdiği bilgi</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İstemci otoriter</td>
      <td>Konum, hasar ve sonuç</td>
      <td>Düşük sunucu maliyeti</td>
      <td>Hileye çok açık</td>
    </tr>
    <tr>
      <td>Sunucu otoriter</td>
      <td>Girdi ve eylem niyeti</td>
      <td>Güçlü doğrulama</td>
      <td>Daha fazla işlem yükü</td>
    </tr>
    <tr>
      <td>Hibrit model</td>
      <td>Tahmin edilen durum ve girdiler</td>
      <td>Akıcı oynanış</td>
      <td>Karmaşık senkronizasyon</td>
    </tr>
  </tbody>
</table>

<p>Oyuncunun azami hızı $v_{max}$, iki güncelleme arasındaki süre $\Delta t$ ise izin verilen yaklaşık hareket mesafesi şu şekilde hesaplanabilir:</p>

\[d_{max} = v_{max} \times \Delta t + \epsilon\]

<p>Buradaki $\epsilon$, ağ gecikmesi ve kayan nokta hataları için bırakılan toleranstır. Bildirilen mesafe sürekli olarak $d_{max}$ değerini aşıyorsa hız hilesi, ışınlanma veya bozuk senkronizasyon şüphesi oluşur.</p>

<h2 id="tahmin-uzlaştırma-ve-gecikme-telafisi">Tahmin, uzlaştırma ve gecikme telafisi</h2>

<p>Her tuş vuruşunda sunucuyu beklemek oyunu hantallaştırır. Bu yüzden istemci, <strong>client-side prediction</strong> ile girdinin sonucunu anında gösterir. Sunucu daha sonra gerçek durumu yollar. İki durum farklıysa istemci, onaylanmamış girdileri yeniden uygulayarak <strong>server reconciliation</strong> gerçekleştirir.</p>

<p>Nişancı oyunlarında sunucu ayrıca geçmiş konumların kısa bir kaydını tutabilir. Ateş paketinin zamanı geldiğinde dünya, oyuncunun gecikmesine göre geçmişteki hâline döndürülür. Buna <strong>lag compensation</strong> denir. Ancak istemcinin bildirdiği zaman sınırsız kabul edilirse saldırganlar geçmişte avantajlı bir ana ateş etmiş gibi davranabilir. Bu nedenle zaman damgaları makul bir pencere içinde sınırlandırılmalıdır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">MAX_SPEED</span> <span class="o">=</span> <span class="mf">7.0</span>
<span class="n">TOLERANCE</span> <span class="o">=</span> <span class="mf">0.35</span>


<span class="k">def</span> <span class="nf">validate_movement</span><span class="p">(</span><span class="n">old_pos</span><span class="p">,</span> <span class="n">new_pos</span><span class="p">,</span> <span class="n">delta_time</span><span class="p">):</span>
    <span class="n">distance</span> <span class="o">=</span> <span class="n">new_pos</span><span class="p">.</span><span class="nf">distance_to</span><span class="p">(</span><span class="n">old_pos</span><span class="p">)</span>
    <span class="n">allowed</span> <span class="o">=</span> <span class="n">MAX_SPEED</span> <span class="o">*</span> <span class="n">delta_time</span> <span class="o">+</span> <span class="n">TOLERANCE</span>

    <span class="k">if</span> <span class="n">distance</span> <span class="o">&gt;</span> <span class="n">allowed</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span><span class="p">,</span> <span class="sh">"</span><span class="s">olağandışı hareket</span><span class="sh">"</span>

    <span class="k">return</span> <span class="bp">True</span><span class="p">,</span> <span class="sh">"</span><span class="s">geçerli</span><span class="sh">"</span>
</code></pre></div></div>

<p>Bu örnek tek başına kusursuz değildir; zıplama, araçlar, geri tepme ve sunucu takılması gibi durumlar için bağlamsal kurallar gerekir. Yine de sunucu tarafındaki temel doğrulama katmanını gösterir.</p>

<h2 id="hile-tespit-yöntemleri">Hile tespit yöntemleri</h2>

<p>Hile önleme genellikle birden fazla sinyali birleştirir:</p>

<ul>
  <li><strong>Kural tabanlı doğrulama:</strong> İmkânsız hız, atış sıklığı, cephane veya görüş açısı aranır.</li>
  <li><strong>İstatistiksel analiz:</strong> İsabet oranı, hedef değiştirme süresi ve fare hareketleri oyuncu geçmişiyle karşılaştırılır.</li>
  <li><strong>Davranışsal modeller:</strong> Aimbot benzeri araçların aşırı düzgün ya da anlık dönüşleri sınıflandırılır.</li>
  <li><strong>Bütünlük kontrolleri:</strong> Oyun dosyaları ve kritik kod bölümleri imza veya özet değerleriyle denetlenir.</li>
  <li><strong>Tekrar incelemesi:</strong> Şüpheli karşılaşmalar kaydedilerek otomatik ya da insan destekli değerlendirme yapılır.</li>
</ul>

<table>
  <thead>
    <tr>
      <th>Sinyal</th>
      <th>Normal açıklama</th>
      <th>Hile ihtimali</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ani konum değişimi</td>
      <td>Paket kaybı, yeniden bağlanma</td>
      <td>Teleport hilesi</td>
    </tr>
    <tr>
      <td>Çok yüksek isabet</td>
      <td>Yetenekli oyuncu</td>
      <td>Aimbot</td>
    </tr>
    <tr>
      <td>Duvar arkasına takip</td>
      <td>Ses veya takım bilgisi</td>
      <td>Wallhack</td>
    </tr>
    <tr>
      <td>Kusursuz atış aralığı</td>
      <td>Düzenli giriş</td>
      <td>Makro kullanımı</td>
    </tr>
  </tbody>
</table>

<h2 id="yanlış-pozitiflerden-kaçınmak">Yanlış pozitiflerden kaçınmak</h2>

<p>Tek bir anormallik yüzünden oyuncuyu yasaklamak tehlikelidir. Bunun yerine her sinyale ağırlık verilip bir risk puanı üretilebilir:</p>

\[R = w_1s_1 + w_2s_2 + \dots + w_ns_n\]

<p>Düşük puan yalnızca kayda alınabilir, orta puan ek doğrulama başlatabilir, yüksek ve tekrarlanan puan ise inceleme kuyruğuna gönderilebilir. Böylece kötü bağlantıya sahip masum oyuncular cezalandırılmaz.</p>

<p>Sonuç olarak güçlü koruma; sunucu otoritesi, hareket ve eylem doğrulaması, davranış analizi, güvenli telemetri ve kontrollü yaptırımların birleşimidir. Amaç istemciyi bütünüyle kontrol etmek değil, istemciden gelen hiçbir kritik iddiayı doğrulamadan kabul etmemektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun geliştirme" /><category term="hile önleme" /><category term="istemci sunucu" /><category term="siber güvenlik" /><category term="ağ programlama" /><category term="senkronizasyon" /><summary type="html"><![CDATA[Çevrimiçi bir oyunda ekranda gördüğümüz dünya, aslında istemci ile sunucunun sürekli uzlaşmaya çalıştığı sayısal bir simülasyondur. Gecikme, paket kaybı ve farklı donanımlar bu uzlaşmayı zorlaştırırken hile yapan oyuncular da istemciden gönderilen verileri değiştirerek avantaj kazanmaya çalışır. Etkili bir hile önleme sistemi bu nedenle yalnızca “hile programı bulmak” değil, oyuncunun davranışını matematiksel ve mantıksal olarak doğrulamak anlamına gelir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/istemci-sunucu-senkronizasyonu-41.png" /><media:content medium="image" url="https://program.sonsuz.us/img/istemci-sunucu-senkronizasyonu-41.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kalbin Kodunu Çözmek: EKG Sinyallerinden Ritim Analizi</title><link href="https://program.sonsuz.us/posts/kalbin-kodunu-cozmek-ekg-sinyallerinden-ritim-analizi/" rel="alternate" type="text/html" title="Kalbin Kodunu Çözmek: EKG Sinyallerinden Ritim Analizi" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kalbin-kodunu-cozmek-ekg-sinyallerinden-ritim-analizi</id><content type="html" xml:base="https://program.sonsuz.us/posts/kalbin-kodunu-cozmek-ekg-sinyallerinden-ritim-analizi/"><![CDATA[<p>Kalp, elektriksel uyarılarla çalışan biyolojik bir pompadır. Elektrokardiyografi, yani EKG, bu uyarıların vücut yüzeyindeki küçük gerilim değişimlerini kaydeder. Bilgisayar ise dalgalı görünen bu sinyali temizleyip ölçerek normal ritim, taşikardi veya ritim düzensizliği gibi örüntüler arasında ayrım yapmaya çalışır. Kısacası mesele, kalbin çıkardığı elektriksel “müziğin” temposunu ve notalarını analiz etmektir.</p>

<p>``</p>

<h2 id="ekg-sinyalinde-ne-görüyoruz">EKG sinyalinde ne görüyoruz?</h2>

<p>Tipik bir kalp atımı P dalgası, QRS kompleksi ve T dalgasından oluşur. P dalgası kulakçıkların, QRS kompleksi karıncıkların elektriksel aktivasyonunu temsil eder. T dalgası ise karıncıkların elektriksel olarak toparlanmasıyla ilişkilidir.</p>

<table>
  <thead>
    <tr>
      <th>Bileşen</th>
      <th>Temel anlamı</th>
      <th>Analizdeki önemi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>P dalgası</td>
      <td>Kulakçık aktivasyonu</td>
      <td>Atriyal ritimlerin değerlendirilmesi</td>
    </tr>
    <tr>
      <td>QRS kompleksi</td>
      <td>Karıncık aktivasyonu</td>
      <td>Atımın bulunması ve iletim bozuklukları</td>
    </tr>
    <tr>
      <td>T dalgası</td>
      <td>Karıncıkların toparlanması</td>
      <td>Repolarizasyon değişikliklerinin incelenmesi</td>
    </tr>
    <tr>
      <td>R-R aralığı</td>
      <td>İki R tepesi arasındaki süre</td>
      <td>Nabız ve ritim düzenliliği</td>
    </tr>
  </tbody>
</table>

<p>R tepeleri tespit edildiğinde yaklaşık kalp hızı şöyle hesaplanabilir:</p>

\[HR = 60 / RR\]

<p>Burada $RR$ saniye cinsinden iki atım arasındaki süredir. Örneğin $RR = 0.8$ saniyeyse kalp hızı yaklaşık $75$ atım/dakikadır.</p>

<h2 id="ham-sinyal-neden-doğrudan-kullanılamaz">Ham sinyal neden doğrudan kullanılamaz?</h2>

<p>EKG kayıtları kusursuz değildir. Solunum, kas hareketleri, elektrot temassızlığı ve elektrik şebekesi sinyale gürültü ekler. Bu nedenle ilk aşama genellikle ön işlemedir.</p>

<table>
  <thead>
    <tr>
      <th>Sorun</th>
      <th>Sinyaldeki etkisi</th>
      <th>Yaygın çözüm</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bazal çizgi kayması</td>
      <td>Sinyalin yavaşça yukarı-aşağı gezinmesi</td>
      <td>Yüksek geçiren filtre</td>
    </tr>
    <tr>
      <td>Şebeke gürültüsü</td>
      <td>50 veya 60 Hz titreşim</td>
      <td>Çentik filtresi</td>
    </tr>
    <tr>
      <td>Kas gürültüsü</td>
      <td>Düzensiz, hızlı değişimler</td>
      <td>Alçak geçiren filtre</td>
    </tr>
    <tr>
      <td>Hareket artefaktı</td>
      <td>Büyük ve sahte tepeler</td>
      <td>Artefakt tespiti, kayıt eleme</td>
    </tr>
  </tbody>
</table>

<p>Filtreleme dengeli yapılmalıdır. Çok zayıf filtre gürültüyü bırakırken aşırı güçlü filtre tıbbi açıdan önemli dalgaları bozabilir.</p>

<h2 id="bilgisayar-atımları-nasıl-buluyor">Bilgisayar atımları nasıl buluyor?</h2>

<p>Klasik yöntemler QRS kompleksinin keskinliğinden yararlanır. Sinyalin türevi alınarak hızlı değişimler belirginleştirilir, değerler karesel dönüşümden geçirilir ve hareketli pencereyle enerji hesaplanır. Ardından uyarlanabilir bir eşik, gerçek R tepelerini gürültüden ayırır.</p>

<p>Aşağıdaki Python örneği, filtrelenmiş bir EKG sinyalinde olası R tepelerini bulur:</p>

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

<span class="c1"># ecg: filtrelenmiş EKG dizisi
# fs: saniyedeki örnek sayısı
</span><span class="n">minimum_distance</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="mf">0.3</span> <span class="o">*</span> <span class="n">fs</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">ecg</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">ecg</span><span class="p">)</span>

<span class="n">peaks</span><span class="p">,</span> <span class="n">properties</span> <span class="o">=</span> <span class="nf">find_peaks</span><span class="p">(</span>
    <span class="n">ecg</span><span class="p">,</span>
    <span class="n">distance</span><span class="o">=</span><span class="n">minimum_distance</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">rr_intervals</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">heart_rates</span> <span class="o">=</span> <span class="mi">60</span> <span class="o">/</span> <span class="n">rr_intervals</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">distance</code> parametresi birbirine fizyolojik olarak fazla yakın tepelerin iki ayrı atım sayılmasını engeller. Eşik ise sinyalin ortalaması ve standart sapmasına göre belirlenir. Gerçek klinik sistemlerde ters QRS kompleksleri, farklı derivasyonlar ve değişken sinyal kalitesi de hesaba katılır.</p>

<h2 id="anormallik-kararı-nasıl-veriliyor">Anormallik kararı nasıl veriliyor?</h2>

<p>R tepeleri bulunduktan sonra R-R aralıkları, QRS genişliği, dalga şekli ve kalp hızı değişkenliği gibi özellikler çıkarılır. Örneğin R-R sürelerinin belirgin biçimde düzensiz olması bazı ritim bozukluklarıyla ilişkili olabilir. Ancak tek başına düzensizlik kesin tanı anlamına gelmez.</p>

<p>Modern sistemler özellik tabanlı makine öğrenmesi veya ham sinyali işleyen evrişimsel sinir ağları kullanabilir. Model, uzmanlar tarafından etiketlenmiş çok sayıda kayıt üzerinden normal ve anormal örüntüleri öğrenir. Başarı yalnızca doğrulukla değil; duyarlılık, özgüllük ve yanlış alarm oranıyla da ölçülür.</p>

<p>EKG analizi güçlü bir karar destek aracıdır, fakat kayıt kalitesi, hastanın yaşı, ilaçları ve klinik durumu sonucu etkiler. Bu nedenle bilgisayarın çıktısı tanı değil, uzman değerlendirmesine yardımcı olan bir uyarı olarak görülmelidir.</p>

<p><img src="/img/kalbin-kodunu-cozmek-60.svg" alt="kalbin-kodunu-cozmek-60" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ekg" /><category term="sinyal işleme" /><category term="yapay zeka" /><category term="python" /><category term="sağlık teknolojileri" /><summary type="html"><![CDATA[Kalp, elektriksel uyarılarla çalışan biyolojik bir pompadır. Elektrokardiyografi, yani EKG, bu uyarıların vücut yüzeyindeki küçük gerilim değişimlerini kaydeder. Bilgisayar ise dalgalı görünen bu sinyali temizleyip ölçerek normal ritim, taşikardi veya ritim düzensizliği gibi örüntüler arasında ayrım yapmaya çalışır. Kısacası mesele, kalbin çıkardığı elektriksel “müziğin” temposunu ve notalarını analiz etmektir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kalbin-kodunu-cozmek-60.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kalbin-kodunu-cozmek-60.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Prosedürel Animasyon Sistemleri: Hareketi Oynatmak Yerine Hesaplamak</title><link href="https://program.sonsuz.us/posts/prosedurel-animasyon-sistemleri-hareketi-oynatmak-yerine-hesaplamak/" rel="alternate" type="text/html" title="Prosedürel Animasyon Sistemleri: Hareketi Oynatmak Yerine Hesaplamak" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/prosedurel-animasyon-sistemleri-hareketi-oynatmak-yerine-hesaplamak</id><content type="html" xml:base="https://program.sonsuz.us/posts/prosedurel-animasyon-sistemleri-hareketi-oynatmak-yerine-hesaplamak/"><![CDATA[<p>Bir karakterin merdivene bastığında ayağını gerçekten basamağa koyduğunu, eğimli arazide dengesini koruduğunu veya dev bir yaratığın her adımda çevreye uyum sağladığını düşünün. Bu hareketlerin tamamını önceden hazırlamak yerine çalışma anında hesaplamak, <strong>prosedürel animasyonun</strong> temel fikridir. Böylece karakter yalnızca bir animasyon klibini oynatan kukla olmaktan çıkar; çevresine tepki veren dinamik bir sisteme dönüşür.</p>

<p><img src="/img/prosedurel-animasyon-sistemleri-95.svg" alt="prosedurel-animasyon-sistemleri-95" /></p>

<p>``</p>

<h2 id="önceden-kaydedilmiş-animasyon-mu-prosedürel-hareket-mi">Önceden kaydedilmiş animasyon mu, prosedürel hareket mi?</h2>

<p>Geleneksel sistemlerde sanatçı; yürüme, koşma ve zıplama gibi hareketleri önceden üretir. Oyun motoru uygun klibi seçerek kemiklere uygular. Prosedürel yaklaşımda ise kemiklerin konum ve dönüşleri; hedefler, fizik kuralları, arazi verileri ve karakterin mevcut durumu kullanılarak hesaplanır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Hazır animasyon</th>
      <th>Prosedürel animasyon</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hareket kaynağı</td>
      <td>Önceden hazırlanmış klip</td>
      <td>Gerçek zamanlı hesaplama</td>
    </tr>
    <tr>
      <td>Çevreye uyum</td>
      <td>Sınırlı</td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Sanatçı kontrolü</td>
      <td>Çok yüksek</td>
      <td>Kurallara bağlı</td>
    </tr>
    <tr>
      <td>İşlem maliyeti</td>
      <td>Genellikle düşük</td>
      <td>Daha yüksek olabilir</td>
    </tr>
    <tr>
      <td>Tekrar hissi</td>
      <td>Belirginleşebilir</td>
      <td>Daha doğal çeşitlilik sağlar</td>
    </tr>
  </tbody>
</table>

<p>Bu iki yöntem rakip olmak zorunda değildir. Modern oyunlar çoğunlukla temel yürüyüş klibini oynatır, ardından ayakları zemine yerleştirmek veya karakterin başını hedefe çevirmek için prosedürel düzeltmeler uygular.</p>

<h2 id="matematiksel-temel">Matematiksel temel</h2>

<p>Karakter iskeleti, birbirine bağlı dönüşümlerden oluşan bir hiyerarşidir. Bir kemiğin dünya uzayındaki dönüşümü, ebeveynlerinin dönüşümleriyle çarpılarak bulunur:</p>

\[T_{dunya} = T_0 T_1 T_2 ... T_n\]

<p>Buradaki her $T$, konum, dönüş ve ölçek bilgisi taşıyan bir dönüşüm matrisidir. El veya ayak gibi uç noktanın istenen hedefe ulaşması gerektiğinde <strong>ters kinematik</strong> (Inverse Kinematics, IK) kullanılır. İleri kinematik eklem açılarını kullanarak elin yerini bulurken ters kinematik, hedef konumdan yola çıkarak gerekli eklem açılarını arar.</p>

<p>İki kemikli bir bacakta kosinüs teoremi önemli bir rol oynar:</p>

\[c^2 = a^2 + b^2 - 2ab\cos(\theta)\]

<p>$a$ ve $b$ kemik uzunluklarını, $c$ kalça ile ayak hedefi arasındaki mesafeyi temsil eder. Buradan elde edilen $\theta$, dizin ne kadar büküleceğini belirlemeye yardım eder. Hedef erişim alanının dışındaysa sistem mesafeyi sınırlandırmalıdır; aksi hâlde bacak lastik gibi uzayabilir.</p>

<h2 id="zemine-uyum-sağlayan-ayaklar">Zemine uyum sağlayan ayaklar</h2>

<p>Basit bir ayak yerleştirme sistemi, ayağın üstünden aşağı doğru ışın göndererek zemini bulur. Çarpışma noktası ayağın hedef konumu, yüzey normali ise yaklaşık yönelimi olur.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">void</span> <span class="nf">UpdateFoot</span><span class="p">(</span><span class="n">Transform</span> <span class="n">foot</span><span class="p">,</span> <span class="n">Vector3</span> <span class="n">hipPosition</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Vector3</span> <span class="n">origin</span> <span class="p">=</span> <span class="n">foot</span><span class="p">.</span><span class="n">position</span> <span class="p">+</span> <span class="n">Vector3</span><span class="p">.</span><span class="n">up</span> <span class="p">*</span> <span class="m">0.5f</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">Physics</span><span class="p">.</span><span class="nf">Raycast</span><span class="p">(</span><span class="n">origin</span><span class="p">,</span> <span class="n">Vector3</span><span class="p">.</span><span class="n">down</span><span class="p">,</span> <span class="k">out</span> <span class="n">RaycastHit</span> <span class="n">hit</span><span class="p">,</span> <span class="m">1.5f</span><span class="p">))</span>
    <span class="p">{</span>
        <span class="n">Vector3</span> <span class="n">target</span> <span class="p">=</span> <span class="n">hit</span><span class="p">.</span><span class="n">point</span> <span class="p">+</span> <span class="n">hit</span><span class="p">.</span><span class="n">normal</span> <span class="p">*</span> <span class="m">0.05f</span><span class="p">;</span>
        <span class="n">foot</span><span class="p">.</span><span class="n">position</span> <span class="p">=</span> <span class="n">Vector3</span><span class="p">.</span><span class="nf">Lerp</span><span class="p">(</span>
            <span class="n">foot</span><span class="p">.</span><span class="n">position</span><span class="p">,</span>
            <span class="n">target</span><span class="p">,</span>
            <span class="n">Time</span><span class="p">.</span><span class="n">deltaTime</span> <span class="p">*</span> <span class="m">12f</span>
        <span class="p">);</span>

        <span class="n">Quaternion</span> <span class="n">rotation</span> <span class="p">=</span> <span class="n">Quaternion</span><span class="p">.</span><span class="nf">FromToRotation</span><span class="p">(</span>
            <span class="n">foot</span><span class="p">.</span><span class="n">up</span><span class="p">,</span>
            <span class="n">hit</span><span class="p">.</span><span class="n">normal</span>
        <span class="p">)</span> <span class="p">*</span> <span class="n">foot</span><span class="p">.</span><span class="n">rotation</span><span class="p">;</span>

        <span class="n">foot</span><span class="p">.</span><span class="n">rotation</span> <span class="p">=</span> <span class="n">Quaternion</span><span class="p">.</span><span class="nf">Slerp</span><span class="p">(</span>
            <span class="n">foot</span><span class="p">.</span><span class="n">rotation</span><span class="p">,</span>
            <span class="n">rotation</span><span class="p">,</span>
            <span class="n">Time</span><span class="p">.</span><span class="n">deltaTime</span> <span class="p">*</span> <span class="m">10f</span>
        <span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu Unity örneği zemini <code class="language-plaintext highlighter-rouge">Raycast</code> ile algılar, ayağı çarpışma noktasına yaklaştırır ve yüzey normaline göre döndürür. <code class="language-plaintext highlighter-rouge">Lerp</code> ile <code class="language-plaintext highlighter-rouge">Slerp</code> kullanılması ani sıçramaları azaltır. Üretim ortamında doğrudan kemik dönüşümünü değiştirmek yerine motorun IK katmanı kullanılmalı; ayrıca ayağın havada olduğu adım evresi kontrol edilmelidir.</p>

<h2 id="sistemi-doğal-gösteren-ayrıntılar">Sistemi doğal gösteren ayrıntılar</h2>

<p>Tamamen doğru hesaplanan hareket her zaman doğal görünmez. Karakterin ağırlık merkezi, adım ritmi ve küçük gecikmeler algıyı ciddi biçimde etkiler. Hedefler arasında yumuşak geçiş yapmak için şu karışım kullanılabilir:</p>

\[P = (1-t)P_0 + tP_1\]

<p>Ancak sabit hızla ilerleyen $t$, robotik sonuç verebilir. Yumuşatma eğrileri, yay modelleri ve gürültü fonksiyonları harekete canlılık katar. Örneğin nefes alma için düşük frekanslı sinüs, robot anteni için Perlin gürültüsü uygulanabilir.</p>

<p>Prosedürel animasyon güçlüdür fakat hata ayıklaması zordur. Hedef noktalarını, ışınları ve eklem sınırlarını sahnede renkli çizgilerle göstermek büyük kolaylık sağlar. En başarılı çözüm genellikle hibrittir: Sanatçının hazırladığı güçlü pozlar temel alınır, matematik ise karakteri dünyaya bağlayan görünmez animatör olur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="prosedürel animasyon" /><category term="oyun geliştirme" /><category term="ters kinematik" /><category term="karakter kontrolü" /><category term="unity" /><category term="gerçek zamanlı grafikler" /><summary type="html"><![CDATA[Bir karakterin merdivene bastığında ayağını gerçekten basamağa koyduğunu, eğimli arazide dengesini koruduğunu veya dev bir yaratığın her adımda çevreye uyum sağladığını düşünün. Bu hareketlerin tamamını önceden hazırlamak yerine çalışma anında hesaplamak, prosedürel animasyonun temel fikridir. Böylece karakter yalnızca bir animasyon klibini oynatan kukla olmaktan çıkar; çevresine tepki veren dinamik bir sisteme dönüşür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/prosedurel-animasyon-sistemleri-95.png" /><media:content medium="image" url="https://program.sonsuz.us/img/prosedurel-animasyon-sistemleri-95.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>