<?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-24T12:05:40+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ış 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üpün ve Kontrolcünün Ritmi: Speedcubing ile Video Oyun Optimizasyonu</title><link href="https://program.sonsuz.us/posts/kupun-ve-kontrolcunun-ritmi-speedcubing-ile-video-oyun-optimizasyonu/" rel="alternate" type="text/html" title="Küpün ve Kontrolcünün Ritmi: Speedcubing ile Video Oyun Optimizasyonu" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kupun-ve-kontrolcunun-ritmi-speedcubing-ile-video-oyun-optimizasyonu</id><content type="html" xml:base="https://program.sonsuz.us/posts/kupun-ve-kontrolcunun-ritmi-speedcubing-ile-video-oyun-optimizasyonu/"><![CDATA[<p>Bir Rubik küpünü saniyeler içinde çözmek ile bir video oyununda kusursuz hareket dizileri uygulamak ilk bakışta farklı beceriler gibi görünür. Oysa speedcuber’ın algoritma çalışmasıyla oyuncunun hareket, nişan veya kaynak yönetimi pratiği aynı zihinsel dönüşüme dayanır: Yavaş ve bilinçli kararlar, tekrar sayesinde hızlı ve otomatik motor kalıplara dönüşür.</p>

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

<p>``</p>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>``</p>

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>Aşağıdaki kod, iki boyutlu bir sistemde bütün cisimlerin ivmelerini hesaplar ve Leapfrog adımı uygular:</p>

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

<span class="n">G</span> <span class="o">=</span> <span class="mf">1.0</span>
<span class="n">EPS</span> <span class="o">=</span> <span class="mf">0.01</span>
<span class="n">DT</span> <span class="o">=</span> <span class="mf">0.001</span>

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

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

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

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

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

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

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

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

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

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

<p>Sonuçları değerlendirirken yalnızca güzel yörüngelere bakmak yeterli değildir. Toplam enerji ve momentum yaklaşık korunmalıdır. Enerji sürekli artıyor veya azalıyorsa zaman adımı fazla büyük olabilir. İşte N-cisim simülasyonunun temel sırrı budur: doğru fizik kadar, hatayı kontrol eden doğru sayısal yöntem de gerekir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="n-cisim" /><category term="python" /><category term="fizik" /><category term="simülasyon" /><category term="kütle-çekimi" /><category term="sayısal-analiz" /><summary type="html"><![CDATA[Gökyüzündeki hareketler ilk bakışta kusursuz bir saat mekanizması gibi görünür. Ancak sisteme üçüncü bir gök cismi eklendiğinde işler hızla kozmik bir bilardo masasına dönüşür! N-cisim problemi; yıldızların, gezegenlerin veya galaksilerin karşılıklı kütle çekimi altında nasıl hareket ettiğini bulmayı amaçlar. Genel bir analitik çözümü bulunmadığından bilgisayarlarla küçük zaman adımları hâlinde yaklaşık sonuçlar hesaplarız.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/n-cisim-problemi-71.png" /><media:content medium="image" url="https://program.sonsuz.us/img/n-cisim-problemi-71.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Oyun Fiziğinde Clipping: Nesneler Duvarlardan Neden Geçer?</title><link href="https://program.sonsuz.us/posts/oyun-fiziginde-clipping-nesneler-duvarlardan-neden-gecer/" rel="alternate" type="text/html" title="Oyun Fiziğinde Clipping: Nesneler Duvarlardan Neden Geçer?" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/oyun-fiziginde-clipping-nesneler-duvarlardan-neden-gecer</id><content type="html" xml:base="https://program.sonsuz.us/posts/oyun-fiziginde-clipping-nesneler-duvarlardan-neden-gecer/"><![CDATA[<p>Bir merminin duvara çarpması gerekirken öbür tarafta belirmesi, karakterin zemine gömülmesi veya kutuların üst üste binerek titremesi yalnızca görsel birer aksilik değildir. Bu davranışlar, gerçek dünyadaki sürekli hareketin bilgisayarda ayrık zaman adımlarıyla taklit edilmesinden kaynaklanır. Fizik motoru kusursuz bir kâhin değil; nesnelerin geleceğini küçük aralıklarla hesaplayan, bazen de aradaki önemli olayları kaçıran çalışkan bir muhasebecidir.
``</p>

<h2 id="simülasyon-neden-sürekli-değildir">Simülasyon neden sürekli değildir?</h2>

<p>Gerçek dünyada bir nesnenin konumu zamanla kesintisiz değişir. Oyunlarda ise fizik motoru konumu belirli aralıklarla günceller. Basit Euler integrasyonunda yeni konum yaklaşık olarak şöyle hesaplanır:</p>

\[x_{yeni} = x_{eski} + v · Δt\]

<p>Burada $v$ hız, $Δt$ ise fizik adımının süresidir. Hızı 100 m/s olan bir mermi, $Δt = 0.02$ saniyelik adımda tek güncellemede 2 metre ilerler. Duvar yalnızca 20 santimetre kalınlığındaysa mermi bir karede duvarın önünde, sonraki karede arkasında olabilir. Motor sadece iki konumu kontrol ediyorsa çarpışmayı hiç görmez. Bu olaya genellikle <strong>tunneling</strong>, sonucunda oluşan görsel probleme ise <strong>clipping</strong> denir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Çalışma biçimi</th>
      <th>Avantajı</th>
      <th>Riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ayrık çarpışma</td>
      <td>Yalnızca mevcut konumdaki örtüşmeyi test eder</td>
      <td>Hızlıdır</td>
      <td>Hızlı nesneleri kaçırabilir</td>
    </tr>
    <tr>
      <td>Sürekli çarpışma</td>
      <td>Önceki ve yeni konum arasını tarar</td>
      <td>Tunneling azalır</td>
      <td>Daha pahalıdır</td>
    </tr>
    <tr>
      <td>Alt adımlama</td>
      <td>Bir fizik adımını küçük parçalara böler</td>
      <td>Simülasyonu kararlı kılar</td>
      <td>CPU maliyetini artırır</td>
    </tr>
    <tr>
      <td>Işın veya şekil taraması</td>
      <td>Hareket yolu boyunca engel arar</td>
      <td>Mermiler için etkilidir</td>
      <td>Ek uygulama mantığı ister</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/oyun-fiziginde-clipping-42.svg" alt="oyun-fiziginde-clipping-42" /></p>

<h2 id="tek-suçlu-yüksek-hız-değil">Tek suçlu yüksek hız değil</h2>

<p>Clipping hatalarının birkaç suç ortağı vardır:</p>

<ul>
  <li><strong>Büyük zaman adımı:</strong> $Δt$ büyüdükçe nesnenin tek adımda aldığı mesafe artar.</li>
  <li><strong>İnce collider:</strong> Duvarın çarpışma hacmi ne kadar inceyse atlanması o kadar kolaydır.</li>
  <li><strong>Yetersiz çözücü iterasyonu:</strong> Üst üste giren gövdeleri ayıran solver yeterince çalışmazsa nesneler gömülü kalabilir.</li>
  <li><strong>Doğrudan Transform değiştirmek:</strong> Fizik gövdesini motorun hareket API’si yerine ışınlanmış gibi taşımak, hız ve temas hesaplarını bozar.</li>
  <li><strong>Kayan nokta hassasiyeti:</strong> Dünya merkezinden çok uzakta küçük konum farkları duyarlılığını kaybeder.</li>
  <li><strong>Aşırı kütle farkı:</strong> Çok hafif ve çok ağır cisimlerin teması çözücüyü zorlayabilir.</li>
</ul>

<p>Sayısal kararlılık açısından önemli oran, nesnenin bir adımda aldığı mesafenin engel kalınlığına oranıdır:</p>

\[r = (\vert v\vert  · Δt) / d\]

<p>$d$ engel kalınlığıdır. $r &gt; 1$ olduğunda nesne tek adımda engelin tamamını aşabilir. Bu kesin bir hata garantisi değildir ancak parlak bir alarm lambasıdır.</p>

<h2 id="unity-ile-hareket-yolunu-taramak">Unity ile hareket yolunu taramak</h2>

<p>Aşağıdaki örnek, hızlı bir küreyi taşımadan önce gideceği yönde <code class="language-plaintext highlighter-rouge">SphereCast</code> uygular. Böylece yalnızca hedef konum değil, iki konum arasındaki yol da denetlenir:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">UnityEngine</span><span class="p">;</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">SafeProjectile</span> <span class="p">:</span> <span class="n">MonoBehaviour</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">float</span> <span class="n">speed</span> <span class="p">=</span> <span class="m">80f</span><span class="p">;</span>
    <span class="k">public</span> <span class="kt">float</span> <span class="n">radius</span> <span class="p">=</span> <span class="m">0.1f</span><span class="p">;</span>

    <span class="k">void</span> <span class="nf">FixedUpdate</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Vector3</span> <span class="n">direction</span> <span class="p">=</span> <span class="n">transform</span><span class="p">.</span><span class="n">forward</span><span class="p">;</span>
        <span class="kt">float</span> <span class="n">distance</span> <span class="p">=</span> <span class="n">speed</span> <span class="p">*</span> <span class="n">Time</span><span class="p">.</span><span class="n">fixedDeltaTime</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">SphereCast</span><span class="p">(</span><span class="n">transform</span><span class="p">.</span><span class="n">position</span><span class="p">,</span> <span class="n">radius</span><span class="p">,</span> <span class="n">direction</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="n">distance</span><span class="p">))</span>
        <span class="p">{</span>
            <span class="n">transform</span><span class="p">.</span><span class="n">position</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">direction</span> <span class="p">*</span> <span class="n">radius</span><span class="p">;</span>
            <span class="n">Debug</span><span class="p">.</span><span class="nf">Log</span><span class="p">(</span><span class="s">"Çarpılan nesne: "</span> <span class="p">+</span> <span class="n">hit</span><span class="p">.</span><span class="n">collider</span><span class="p">.</span><span class="n">name</span><span class="p">);</span>
            <span class="nf">Destroy</span><span class="p">(</span><span class="n">gameObject</span><span class="p">);</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">transform</span><span class="p">.</span><span class="n">position</span> <span class="p">+=</span> <span class="n">direction</span> <span class="p">*</span> <span class="n">distance</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Raycast</code> yerine <code class="language-plaintext highlighter-rouge">SphereCast</code> kullanılması, hacmi olan merminin kenardan temaslarını daha güvenilir yakalar. Fizik tabanlı bir gövde kullanılıyorsa doğrudan <code class="language-plaintext highlighter-rouge">Transform</code> taşımak yerine <code class="language-plaintext highlighter-rouge">Rigidbody.MovePosition</code>, hız veya kuvvet yöntemleri tercih edilmelidir. Motorun sunduğu <strong>Continuous Dynamic</strong> gibi sürekli çarpışma seçenekleri de hızlı gövdelerde etkinleştirilebilir.</p>

<h2 id="dengeli-çözüm-nasıl-seçilir">Dengeli çözüm nasıl seçilir?</h2>

<p>Her nesneye en pahalı çarpışma modunu vermek doğru değildir. Yavaş dekor kutularında ayrık algılama yeterliyken mermiler, hızlı araçlar ve oyuncu karakterleri daha dikkatli ele alınmalıdır. Sabit fizik adımını küçültmek doğruluğu artırır fakat saniyedeki hesap sayısını yükseltir. Bu nedenle kritik nesnelerde sürekli algılama, çok hızlı mühimmatta şekil taraması ve büyük dünyalarda kayan başlangıç noktası yaklaşımı kullanılabilir.</p>

<p>Kısacası clipping, fizik motorunun “duvarları sevmemesi” değil, zaman ve konumu örnekleme biçiminin doğal sonucudur. Hız, zaman adımı, collider kalınlığı ve çözücü ayarları birlikte değerlendirildiğinde hayalet mermiler azalır; duvarlar da yeniden duvar gibi davranmaya başlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun fiziği" /><category term="clipping" /><category term="çarpışma algılama" /><category term="unity" /><category term="simülasyon" /><category term="kararlılık" /><summary type="html"><![CDATA[Bir merminin duvara çarpması gerekirken öbür tarafta belirmesi, karakterin zemine gömülmesi veya kutuların üst üste binerek titremesi yalnızca görsel birer aksilik değildir. Bu davranışlar, gerçek dünyadaki sürekli hareketin bilgisayarda ayrık zaman adımlarıyla taklit edilmesinden kaynaklanır. Fizik motoru kusursuz bir kâhin değil; nesnelerin geleceğini küçük aralıklarla hesaplayan, bazen de aradaki önemli olayları kaçıran çalışkan bir muhasebecidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/oyun-fiziginde-clipping-42.png" /><media:content medium="image" url="https://program.sonsuz.us/img/oyun-fiziginde-clipping-42.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Oyunlarda Işık ve Gölgeleme: Ray Tracing mi, Önceden Hesaplanmış Aydınlatma mı?</title><link href="https://program.sonsuz.us/posts/oyunlarda-isik-ve-golgeleme-ray-tracing-mi-onceden-hesaplanmis-aydinlatma-mi/" rel="alternate" type="text/html" title="Oyunlarda Işık ve Gölgeleme: Ray Tracing mi, Önceden Hesaplanmış Aydınlatma mı?" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/oyunlarda-isik-ve-golgeleme-ray-tracing-mi-onceden-hesaplanmis-aydinlatma-mi</id><content type="html" xml:base="https://program.sonsuz.us/posts/oyunlarda-isik-ve-golgeleme-ray-tracing-mi-onceden-hesaplanmis-aydinlatma-mi/"><![CDATA[<p>Bir oyun sahnesindeki ışık, yalnızca çevreyi görünür hâle getirmez; atmosferi, derinlik algısını ve oyuncunun dikkatini de yönetir. Karanlık bir koridordaki titrek lamba gerilim yaratırken gün batımının yumuşak gölgeleri huzur verebilir. Bu görüntüler üretilirken geliştiricilerin karşısına iki temel yaklaşım çıkar: ışığı çalışma anında fiziksel olarak simüle eden gerçek zamanlı ışın izleme ve aydınlatma sonuçlarını önceden hesaplayıp saklayan baked lighting.
``</p>

<h2 id="işığın-arkasındaki-temel-matematik">Işığın arkasındaki temel matematik</h2>

<p>Bilgisayar grafiklerinde bir yüzeyin görünen rengi; ışık kaynağına, yüzey malzemesine ve kameraya bağlıdır. Basit Lambert aydınlatmasında dağınık ışık şu şekilde ifade edilir:</p>

\[I_d = k_d I_l \max(0, \vec{N} \cdot \vec{L})\]

<p>Burada $I_l$ ışık şiddetini, $k_d$ malzemenin ışığı yansıtma oranını, $\vec{N}$ yüzey normalini ve $\vec{L}$ ışığın yönünü temsil eder. Normal ile ışık yönü birbirine yaklaştıkça yüzey daha parlak görünür.</p>

<p>Gerçekçi sahnelerde ışık yalnızca kaynaktan yüzeye gelmez. Duvarlardan sekebilir, parlak yüzeylerde yansıyabilir ve saydam nesnelerden kırılarak geçebilir. Render denklemi bu davranışı genel biçimde açıklar:</p>

\[L_o = L_e + \int_{\Omega} f_r L_i (\vec{N} \cdot \vec{L})\,d\omega\]

<p>Bu integralin eksiksiz hesaplanması pahalıdır. Oyun motorları bu nedenle hız ile doğruluk arasında çeşitli numaralar yapar; grafik programlamanın sihri biraz da buradadır.</p>

<h2 id="gerçek-zamanlı-ray-tracing">Gerçek zamanlı ray tracing</h2>

<p>Ray tracing, kameradan sahneye ışınlar göndererek bu ışınların hangi üçgenlerle kesiştiğini araştırır. Çarpışma noktasından gölge, yansıma veya dolaylı aydınlatma için yeni ışınlar üretilebilir. Böylece ekran alanının dışında kalan nesneler bile yansımalarda görülebilir.</p>

<p>Bir ışının parametrik gösterimi şöyledir:</p>

\[P(t) = O + tD\]

<p>$O$ başlangıç noktası, $D$ yön ve $t$ ilerleme mesafesidir. Modern ekran kartlarındaki özel çekirdekler ve BVH gibi hızlandırma yapıları, milyonlarca üçgen arasındaki kesişme aramasını yönetir.</p>

<p>Aşağıdaki sade HLSL örneği, gölge ışını sonucuna göre görünürlüğü belirler:</p>

<div class="language-hlsl highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">float</span> <span class="n">visibility</span> <span class="o">=</span> <span class="mi">1</span><span class="p">.</span><span class="mi">0</span><span class="p">;</span>
<span class="n">RayDesc</span> <span class="n">shadowRay</span><span class="p">;</span>
<span class="n">shadowRay</span><span class="p">.</span><span class="n">Origin</span> <span class="o">=</span> <span class="n">hitPosition</span> <span class="o">+</span> <span class="n">normal</span> <span class="o">*</span> <span class="mi">0</span><span class="p">.</span><span class="mo">001</span><span class="p">;</span>
<span class="n">shadowRay</span><span class="p">.</span><span class="n">Direction</span> <span class="o">=</span> <span class="n">lightDirection</span><span class="p">;</span>
<span class="n">shadowRay</span><span class="p">.</span><span class="n">TMin</span> <span class="o">=</span> <span class="mi">0</span><span class="p">.</span><span class="mi">0</span><span class="p">;</span>
<span class="n">shadowRay</span><span class="p">.</span><span class="n">TMax</span> <span class="o">=</span> <span class="n">distanceToLight</span><span class="p">;</span>

<span class="n">TraceRay</span><span class="p">(</span><span class="n">scene</span><span class="p">,</span> <span class="n">RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH</span><span class="p">,</span>
         <span class="mh">0xFF</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">shadowRay</span><span class="p">,</span> <span class="n">visibility</span><span class="p">);</span>
</code></pre></div></div>

<p>Buradaki küçük normal ofseti, ışının çıktığı yüzeye tekrar çarpmasını önler. İlk engelde aramayı durdurmak da gölge hesabını hızlandırır.</p>

<h2 id="önceden-hesaplanmış-aydınlatma">Önceden hesaplanmış aydınlatma</h2>

<p>Baked lighting yönteminde doğrudan ve dolaylı ışık, oyun yayınlanmadan önce hesaplanır. Sonuçlar lightmap adı verilen dokulara veya light probe verilerine kaydedilir. Çalışma sırasında ağır ışık simülasyonu yerine bu veriler okunur.</p>

<p>Bu yaklaşım özellikle duvarların, zeminin ve ışıkların hareket etmediği sahnelerde son derece verimlidir. Ancak bir oyuncu lambayı devirdiğinde lightmap bunu umursamaz; gölge hâlâ eski yerde kalabilir. Dinamik nesneler için probe, shadow map veya ekran alanı teknikleriyle destek gerekir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Gerçek zamanlı ray tracing</th>
      <th>Önceden hesaplanmış ışık</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hesaplama zamanı</td>
      <td>Oyun çalışırken</td>
      <td>Geliştirme aşamasında</td>
    </tr>
    <tr>
      <td>Dinamik sahneler</td>
      <td>Çok başarılı</td>
      <td>Sınırlı</td>
    </tr>
    <tr>
      <td>Donanım maliyeti</td>
      <td>Yüksek</td>
      <td>Düşük</td>
    </tr>
    <tr>
      <td>Yansıma doğruluğu</td>
      <td>Fiziksel olarak daha tutarlı</td>
      <td>Genellikle yaklaşık</td>
    </tr>
    <tr>
      <td>Bellek ihtiyacı</td>
      <td>Hızlandırma yapıları</td>
      <td>Lightmap dokuları</td>
    </tr>
    <tr>
      <td>Düzenleme süreci</td>
      <td>Anlık geri bildirim</td>
      <td>Yeniden bake gerekebilir</td>
    </tr>
  </tbody>
</table>

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

<p>Hareketli ışıkların, aynaların ve yıkılabilir çevrenin öne çıktığı bir oyunda ray tracing güçlü bir seçenektir. Mobil oyunlarda, düşük sistem gereksinimi hedeflerinde veya büyük ölçüde sabit mekânlarda baked lighting daha mantıklıdır.</p>

<p>Pratikte kazanan çoğunlukla hibrit yaklaşımdır. Statik ortamın dolaylı ışığı lightmap ile saklanırken karakter gölgeleri shadow map, parlak yansımalar ise ray tracing ile üretilebilir. Gürültülü ışın izleme sonuçları temporal accumulation ve denoiser filtreleriyle temizlenir. Böylece kalite bütçesi gerçekten görünür alanlara harcanır; ekran kartı da küçük bir güneşi simüle etmeye çalışırken tamamen ter içinde kalmaz.</p>

<p><img src="/img/oyunlarda-isik-ve-37.svg" alt="oyunlarda-isik-ve-37" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun geliştirme" /><category term="ray tracing" /><category term="ışıklandırma" /><category term="gölgeleme" /><category term="grafik programlama" /><category term="render" /><summary type="html"><![CDATA[Bir oyun sahnesindeki ışık, yalnızca çevreyi görünür hâle getirmez; atmosferi, derinlik algısını ve oyuncunun dikkatini de yönetir. Karanlık bir koridordaki titrek lamba gerilim yaratırken gün batımının yumuşak gölgeleri huzur verebilir. Bu görüntüler üretilirken geliştiricilerin karşısına iki temel yaklaşım çıkar: ışığı çalışma anında fiziksel olarak simüle eden gerçek zamanlı ışın izleme ve aydınlatma sonuçlarını önceden hesaplayıp saklayan baked lighting.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/oyunlarda-isik-ve-37.png" /><media:content medium="image" url="https://program.sonsuz.us/img/oyunlarda-isik-ve-37.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Value at Risk (VaR): Portföy Riskini Python ile Ölçmek</title><link href="https://program.sonsuz.us/posts/value-at-risk-var-portfoy-riskini-python-ile-olcmek/" rel="alternate" type="text/html" title="Value at Risk (VaR): Portföy Riskini Python ile Ölçmek" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/value-at-risk-var-portfoy-riskini-python-ile-olcmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/value-at-risk-var-portfoy-riskini-python-ile-olcmek/"><![CDATA[<p>Bir yatırım portföyü bugün sakin görünebilir; ancak yarın piyasalar küçük bir korku filmi çekmeye karar verebilir. Value at Risk, yani VaR, belirli bir zaman aralığında ve güven düzeyinde portföyün karşılaşabileceği kaybı tek bir sayıyla özetler. Bu yazıda VaR’ın mantığını kuracak, yöntemleri karşılaştıracak ve Python ile hesaplama yapacağız.</p>

<p><img src="/img/value-at-risk-30.svg" alt="value-at-risk-30" /></p>

<p>``</p>

<h2 id="var-tam-olarak-ne-söyler">VaR tam olarak ne söyler?</h2>

<p>VaR üç bileşene dayanır: portföy değeri, zaman ufku ve güven düzeyi. Örneğin günlük %95 güven düzeyinde VaR değeri 20.000 TL ise ifade şu anlama gelir:</p>

<blockquote>
  <p>Normal piyasa koşulları altında, portföyün bir günlük kaybının %95 olasılıkla 20.000 TL’yi aşmaması beklenir.</p>
</blockquote>

<p>Bunun tersinden söylenmesi daha öğreticidir: Günlerin yaklaşık %5’inde kayıp 20.000 TL’den büyük olabilir. VaR, oluşabilecek en yüksek kaybı söylemez. Kuyruğun başladığı eşiği gösterir; kuyruğun ne kadar korkutucu olduğunu ise tek başına açıklamaz.</p>

<p>Getiri $R$ ve güven düzeyi $c$ olmak üzere VaR, getiri dağılımının sol kuyruğundaki kantil üzerinden tanımlanabilir:</p>

\[VaR_c = -V_0 Q_{1-c}(R)\]

<p>Burada $V_0$ portföyün bugünkü değeri, $Q_{1-c}$ ise getirilerin $(1-c)$ kantilidir. Eksi işareti, negatif getiriyi pozitif bir kayıp tutarı olarak sunar.</p>

<h2 id="başlıca-hesaplama-yöntemleri">Başlıca hesaplama yöntemleri</h2>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Temel varsayım</th>
      <th>Güçlü yanı</th>
      <th>Zayıf yanı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tarihsel VaR</td>
      <td>Geçmiş geleceği temsil eder</td>
      <td>Basit ve dağılımdan bağımsızdır</td>
      <td>Geçmişte görülmeyen şoku yakalayamaz</td>
    </tr>
    <tr>
      <td>Parametrik VaR</td>
      <td>Getiriler genellikle normal dağılır</td>
      <td>Hızlı ve hesaplaması kolaydır</td>
      <td>Kalın kuyrukları küçümseyebilir</td>
    </tr>
    <tr>
      <td>Monte Carlo VaR</td>
      <td>Seçilen modele göre senaryo üretilir</td>
      <td>Karmaşık portföylere uygulanabilir</td>
      <td>Model ve işlem maliyeti yüksektir</td>
    </tr>
  </tbody>
</table>

<p>Parametrik yöntemde ortalama getiri $\mu$, standart sapma $\sigma$ ve standart normal dağılımın kritik değeri $z_{1-c}$ kullanılır:</p>

\[VaR_c = -V_0(\mu + z_{1-c}\sigma)\]

<p>%95 güven düzeyinde sol kuyruk değeri yaklaşık $z_{0.05}=-1.645$ olur. Volatilite yükseldikçe VaR da büyür; başka bir deyişle portföyün kalp atışları hızlandıkça risk göstergesi kırmızıya yaklaşır.</p>

<h2 id="python-ile-tarihsel-ve-parametrik-var">Python ile tarihsel ve parametrik VaR</h2>

<p>Aşağıdaki örnek, günlük portföy getirilerinden iki farklı VaR tahmini üretir. Gerçek bir uygulamada <code class="language-plaintext highlighter-rouge">returns</code> dizisi, portföy bileşenlerinin ağırlıklı getirilerinden veya portföy değer serisinden hesaplanmalıdır.</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.stats</span> <span class="kn">import</span> <span class="n">norm</span>

<span class="c1"># Örnek günlük portföy getirileri
</span><span class="n">returns</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span>
    <span class="mf">0.004</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.012</span><span class="p">,</span> <span class="mf">0.006</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.021</span><span class="p">,</span> <span class="mf">0.003</span><span class="p">,</span>
    <span class="o">-</span><span class="mf">0.008</span><span class="p">,</span> <span class="mf">0.011</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.017</span><span class="p">,</span> <span class="mf">0.002</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.005</span>
<span class="p">])</span>

<span class="n">portfolio_value</span> <span class="o">=</span> <span class="mi">1_000_000</span>
<span class="n">confidence</span> <span class="o">=</span> <span class="mf">0.95</span>

<span class="c1"># Sol kuyruktaki %5 kantilini bulur.
</span><span class="n">historical_quantile</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">quantile</span><span class="p">(</span><span class="n">returns</span><span class="p">,</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">confidence</span><span class="p">)</span>
<span class="n">historical_var</span> <span class="o">=</span> <span class="o">-</span><span class="n">portfolio_value</span> <span class="o">*</span> <span class="n">historical_quantile</span>

<span class="c1"># Ortalama ve volatiliteyle normal dağılım yaklaşımı kurar.
</span><span class="n">mu</span> <span class="o">=</span> <span class="n">returns</span><span class="p">.</span><span class="nf">mean</span><span class="p">()</span>
<span class="n">sigma</span> <span class="o">=</span> <span class="n">returns</span><span class="p">.</span><span class="nf">std</span><span class="p">(</span><span class="n">ddof</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">z_score</span> <span class="o">=</span> <span class="n">norm</span><span class="p">.</span><span class="nf">ppf</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">confidence</span><span class="p">)</span>
<span class="n">parametric_var</span> <span class="o">=</span> <span class="o">-</span><span class="n">portfolio_value</span> <span class="o">*</span> <span class="p">(</span><span class="n">mu</span> <span class="o">+</span> <span class="n">z_score</span> <span class="o">*</span> <span class="n">sigma</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">Tarihsel VaR: </span><span class="si">{</span><span class="n">historical_var</span><span class="si">:</span><span class="p">,.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="s"> TL</span><span class="sh">"</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">Parametrik VaR: </span><span class="si">{</span><span class="n">parametric_var</span><span class="si">:</span><span class="p">,.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="s"> TL</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Tarihsel yöntemde <code class="language-plaintext highlighter-rouge">np.quantile</code>, gözlemlerin en kötü %5’lik bölümünün başladığı noktayı belirler. Parametrik yöntemde ise <code class="language-plaintext highlighter-rouge">norm.ppf</code>, seçilen güven düzeyine karşılık gelen kritik değeri verir. Veri sayısı az olduğunda her iki sonuç da oynak olabilir; yüzlerce veya binlerce günlük gözlem daha anlamlıdır.</p>

<h2 id="zaman-ufku-ve-varın-sınırları">Zaman ufku ve VaR’ın sınırları</h2>

<p>Bağımsız ve benzer dağılan getiriler varsayılırsa günlük VaR, karekök-zaman kuralıyla yaklaşık olarak ölçeklenebilir:</p>

\[VaR_T \approx VaR_1\sqrt{T}\]

<p>Örneğin 10 günlük VaR yaklaşık olarak günlük VaR’ın $\sqrt{10}$ katıdır. Fakat kriz dönemlerinde getiriler bağımsız davranmayabilir ve volatilite kümelenebilir. Bu nedenle formül mekanik biçimde kullanılmamalıdır.</p>

<p>VaR ayrıca eşik sonrasındaki kaybı açıklamadığı için Expected Shortfall ile desteklenmelidir. Expected Shortfall, VaR aşıldığında ortalama kaybı ölçer. Sağlam bir risk sistemi; geriye dönük testler, stres senaryoları ve farklı güven düzeyleriyle sonuçları sınamalıdır. VaR kullanışlı bir pusuladır, fakat finansal fırtınalarda haritanın tamamı değildir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="var" /><category term="python" /><category term="finans" /><category term="risk yönetimi" /><category term="portföy" /><category term="numpy" /><summary type="html"><![CDATA[Bir yatırım portföyü bugün sakin görünebilir; ancak yarın piyasalar küçük bir korku filmi çekmeye karar verebilir. Value at Risk, yani VaR, belirli bir zaman aralığında ve güven düzeyinde portföyün karşılaşabileceği kaybı tek bir sayıyla özetler. Bu yazıda VaR’ın mantığını kuracak, yöntemleri karşılaştıracak ve Python ile hesaplama yapacağız.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/value-at-risk-30.png" /><media:content medium="image" url="https://program.sonsuz.us/img/value-at-risk-30.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>