<?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://sonsuzus.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sonsuzus.github.io/" rel="alternate" type="text/html" /><updated>2026-07-27T07:13:23+00:00</updated><id>https://sonsuzus.github.io/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">Aircrack-ng ile Kablosuz Ağ Güvenlik Testleri: WEP, WPA ve WPA2</title><link href="https://sonsuzus.github.io/posts/aircrack-ng-ile-kablosuz-ag-guvenlik-testleri-wep-wpa-ve-wpa2/" rel="alternate" type="text/html" title="Aircrack-ng ile Kablosuz Ağ Güvenlik Testleri: WEP, WPA ve WPA2" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/aircrack-ng-ile-kablosuz-ag-guvenlik-testleri-wep-wpa-ve-wpa2</id><content type="html" xml:base="https://sonsuzus.github.io/posts/aircrack-ng-ile-kablosuz-ag-guvenlik-testleri-wep-wpa-ve-wpa2/"><![CDATA[<p>Kablosuz ağ güvenlik testi, yalnızca parolayı “kırmayı” denemek değildir; kullanılan protokolün güvenlik modelini, istemci davranışlarını ve parola politikasını birlikte değerlendirmektir. Aircrack-ng paketi bu süreçte trafiği izleme, paket yakalama ve parola dayanıklılığını çevrimdışı sınama gibi görevler sunar. Bu çalışmaları yalnızca sahibi olduğunuz veya test iznini yazılı olarak aldığınız, izole bir laboratuvar ağında gerçekleştirmelisiniz.</p>

<p>``</p>

<h2 id="önce-yetki-sonra-terminal">Önce yetki, sonra terminal</h2>

<p>Gerçek bir Wi-Fi ağına izinsiz bağlanmaya çalışmak, paket toplamak veya istemcilerin bağlantısını bozmak hukuki ve etik sonuçlar doğurabilir. Güvenli bir laboratuvar için ayrı bir erişim noktası, test amaçlı istemci, monitor mode destekleyen USB adaptör ve internete yönlendirilmeyen bir ağ kullanılabilir. “Yetkisiz erişim simülasyonu” burada gerçek bir üçüncü taraf ağına saldırmak değil, kontrollü ortamda zayıf yapılandırmanın oluşturacağı sonucu gözlemlemek anlamına gelir.</p>

<h2 id="protokollerin-teorik-farkları">Protokollerin teorik farkları</h2>

<p>WEP, RC4 akış şifrelemesini kısa bir başlangıç vektörüyle kullanır. 24 bitlik IV alanı nedeniyle yoğun trafikte tekrarların oluşması kaçınılmazdır. Doğum günü paradoksuna benzer şekilde, $N$ olası değer arasındaki çakışma ihtimali yaklaşık olarak</p>

\[P \approx 1-e^{-k(k-1)/(2N)}\]

<p>ile ifade edilir. Yeterli paket toplandığında IV tekrarları anahtar hakkında istatistiksel bilgi sızdırabilir. Bu, güçlü görünen bir WEP parolasını bile güvenli yapmaz.</p>

<p>WPA, geçiş çözümü olarak TKIP’i; WPA2 ise çoğunlukla AES tabanlı CCMP’yi kullanır. WPA/WPA2-Personal testlerinde genellikle şifreleme matematiği doğrudan kırılmaz. Yakalanan kimlik doğrulama verisi üzerinden aday parolalar çevrimdışı denenir. Yaklaşık çalışma maliyeti $T=D/R$ şeklindedir; burada $D$ aday sayısı, $R$ ise saniyede test edilen aday miktarıdır. Uzun ve rastgele parola, $D$ değerini dramatik biçimde büyütür.</p>

<table>
  <thead>
    <tr>
      <th>Protokol</th>
      <th>Temel teknoloji</th>
      <th>Başlıca risk</th>
      <th>Güvenlik kararı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>WEP</td>
      <td>RC4 ve 24 bit IV</td>
      <td>IV tekrarları, yapısal zayıflıklar</td>
      <td>Kesinlikle kullanılmamalı</td>
    </tr>
    <tr>
      <td>WPA</td>
      <td>TKIP</td>
      <td>Eski tasarım, zayıf parola</td>
      <td>Devre dışı bırakılmalı</td>
    </tr>
    <tr>
      <td>WPA2</td>
      <td>AES-CCMP</td>
      <td>Tahmin edilebilir PSK, yanlış yapılandırma</td>
      <td>Güçlü parolayla kabul edilebilir</td>
    </tr>
  </tbody>
</table>

<h2 id="kontrollü-aircrack-ng-laboratuvarı">Kontrollü Aircrack-ng laboratuvarı</h2>

<p>Önce adaptörün monitor mode desteği doğrulanır ve izleme arayüzü başlatılır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>airmon-ng start wlan0
iw dev
</code></pre></div></div>

<p>İkinci komut, oluşan arayüzü ve çalışma modunu gösterir. Ardından yalnızca laboratuvar erişim noktasının BSSID ve kanalı hedeflenerek kayıt alınır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>airodump-ng <span class="nt">--channel</span> &lt;KANAL&gt; <span class="se">\</span>
  <span class="nt">--bssid</span> &lt;LAB_BSSID&gt; <span class="nt">--write</span> lab-kaydi wlan0mon
</code></pre></div></div>

<p>Bu komut paketleri <code class="language-plaintext highlighter-rouge">lab-kaydi-01.cap</code> benzeri bir dosyada saklar. WPA/WPA2 laboratuvarında kendi test istemcinizi normal biçimde ağa bağlayarak kimlik doğrulama kaydının oluşmasını bekleyin; başka istemcileri zorla düşüren yöntemlerden kaçının.</p>

<p>Parola politikasını denetlemek için yalnızca laboratuvar parolalarını içeren küçük ve izinli bir aday listesi kullanılabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>aircrack-ng <span class="nt">-w</span> ./izinli-test-listesi.txt <span class="se">\</span>
  <span class="nt">-b</span> &lt;LAB_BSSID&gt; lab-kaydi-01.cap
</code></pre></div></div>

<p>Aircrack-ng burada ağa tekrar tekrar bağlanmaz; yakalanan doğrulama verisine karşı çevrimdışı aday kontrolü yapar. Parolanın listede bulunması, protokolün otomatik olarak kırıldığı anlamına değil, parola seçiminin tahmin edilebilir olduğuna işaret eder. WEP testinde ise paket sayısı arttıkça istatistiksel çözüm olasılığının yükselmesi doğrudan protokolün tasarım kusurunu gösterir.</p>

<h2 id="bulguları-savunmaya-dönüştürmek">Bulguları savunmaya dönüştürmek</h2>

<p>Rapor; kapsamı, cihazları, protokolü, yakalama süresini ve sonucun tekrar üretilebilirliğini içermelidir. WEP ve WPA-TKIP kapatılmalı, WPA2-AES veya mümkünse WPA3 seçilmeli, uzun ve benzersiz parolalar kullanılmalı, WPS devre dışı bırakılmalı ve erişim noktası yazılımı güncellenmelidir. Başarılı testin amacı ağa gizlice girmek değil, gerçek bir saldırgandan önce zayıflığı görüp düzeltmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Aircrack-ng" /><category term="Wi-Fi Güvenliği" /><category term="Sızma Testi" /><summary type="html"><![CDATA[Kablosuz ağ güvenlik testi, yalnızca parolayı “kırmayı” denemek değildir; kullanılan protokolün güvenlik modelini, istemci davranışlarını ve parola politikasını birlikte değerlendirmektir. Aircrack-ng paketi bu süreçte trafiği izleme, paket yakalama ve parola dayanıklılığını çevrimdışı sınama gibi görevler sunar. Bu çalışmaları yalnızca sahibi olduğunuz veya test iznini yazılı olarak aldığınız, izole bir laboratuvar ağında gerçekleştirmelisiniz.]]></summary></entry><entry><title type="html">Bizans Generalleri Problemi: Dağıtık Sistemlerin İçindeki İnsan Hikâyesi</title><link href="https://sonsuzus.github.io/posts/bizans-generalleri-problemi-dagitik-sistemlerin-icindeki-insan-hikayesi/" rel="alternate" type="text/html" title="Bizans Generalleri Problemi: Dağıtık Sistemlerin İçindeki İnsan Hikâyesi" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/bizans-generalleri-problemi-dagitik-sistemlerin-icindeki-insan-hikayesi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/bizans-generalleri-problemi-dagitik-sistemlerin-icindeki-insan-hikayesi/"><![CDATA[<p>Bir grup insanın ortak karar vermesi gerektiğini düşünün: Bazıları dürüst, bazıları kararsız, bazılarıysa kasıtlı olarak yalan söylüyor. Üstelik kimse aynı odada değil; iletişim gecikebilir, mesajlar kaybolabilir ve farklı kişilere farklı bilgiler ulaşabilir. Bu senaryo bir aile grubunu, şirket toplantısını veya siyasi ittifakı çağrıştırsa da dağıtık sistemlerin en ünlü problemlerinden birini anlatır: <strong>Bizans Generalleri Problemi</strong>. Bilgisayar bilimindeki bu teknik mesele, özünde güvenilir bir otorite olmadan işbirliği yapabilmenin hikâyesidir.
``</p>

<h2 id="generaller-neden-anlaşamıyor">Generaller neden anlaşamıyor?</h2>

<p>Problemde Bizans ordusunu kuşatan generaller, saldırmak ya da geri çekilmek konusunda ortak karar vermelidir. Başarı için yalnızca karar vermeleri yetmez; dürüst generallerin <strong>aynı kararı</strong> vermesi gerekir. Ancak aralarında hainler bulunabilir. Bir hain, bir generale “saldır”, diğerine “geri çekil” mesajı göndererek uzlaşmayı sabote edebilir.</p>

<p>Buradaki temel hedefler şunlardır:</p>

<ol>
  <li><strong>Tutarlılık:</strong> Bütün dürüst katılımcılar aynı sonuca ulaşmalıdır.</li>
  <li><strong>Geçerlilik:</strong> Komutan dürüstse onun önerdiği değer kabul edilmelidir.</li>
  <li><strong>Sonlanma:</strong> Katılımcılar sonsuza kadar beklememeli, sonunda karar vermelidir.</li>
</ol>

<p>Bu ilkeler teknik görünse de günlük hayattaki güven beklentilerimize benzer. Bir ekipte herkesin aynı plana göre hareket etmesini, doğru bilginin korunmasını ve toplantının bir gün gerçekten bitmesini isteriz.</p>

<h2 id="matematik-bize-ne-söylüyor">Matematik bize ne söylüyor?</h2>

<p>Klasik Bizans hata toleransında, en fazla $f$ kötü niyetli düğüme dayanabilmek için genellikle en az</p>

\[n \geq 3f + 1\]

<p>düğüm gerekir. Örneğin bir kötü niyetli katılımcıya karşı sistemde en az dört düğüm bulunmalıdır. Karar oluşturmak için kullanılan tipik yeter sayı ise $2f+1$ dürüstlük ağırlığı taşıyan oydur.</p>

<p>Bunun mantığı “çoğunluk her zaman haklıdır” demek değildir. Amaç, iki çelişkili kararın aynı anda yeterli desteği toplamasını engellemektir. Yeter sayılar kesiştiğinde, bu kesişimde en az bir dürüst katılımcı bulunur ve dürüst düğüm iki farklı kararı onaylamaz.</p>

<table>
  <thead>
    <tr>
      <th>İnsan topluluğu</th>
      <th>Dağıtık sistem</th>
      <th>Ortak sorun</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Söylenti yayan kişi</td>
      <td>Hatalı veya kötü niyetli düğüm</td>
      <td>Çelişkili bilgi üretmek</td>
    </tr>
    <tr>
      <td>Toplantı tutanağı</td>
      <td>Dağıtık kayıt</td>
      <td>Geçmişi doğrulanabilir kılmak</td>
    </tr>
    <tr>
      <td>Güvenilir çoğunluk</td>
      <td>Quorum</td>
      <td>Karara yeterli destek sağlamak</td>
    </tr>
    <tr>
      <td>İmza ve mühür</td>
      <td>Dijital imza</td>
      <td>Mesajın kaynağını kanıtlamak</td>
    </tr>
    <tr>
      <td>Son teslim tarihi</td>
      <td>Zaman aşımı</td>
      <td>Sonsuz beklemeyi önlemek</td>
    </tr>
  </tbody>
</table>

<h2 id="küçük-bir-oylama-modeli">Küçük bir oylama modeli</h2>

<p>Aşağıdaki Python örneği, düğümlerin önerilerini sayarak bir karar için yeter sayı aranmasını gösterir:</p>

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

<span class="k">def</span> <span class="nf">bizans_karari</span><span class="p">(</span><span class="n">oylar</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">En az 2f+1 destek alan değeri döndürür.</span><span class="sh">"""</span>
    <span class="n">gereken</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">f</span> <span class="o">+</span> <span class="mi">1</span>
    <span class="n">sayac</span> <span class="o">=</span> <span class="nc">Counter</span><span class="p">(</span><span class="n">oylar</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">karar</span><span class="p">,</span> <span class="n">destek</span> <span class="ow">in</span> <span class="n">sayac</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
        <span class="k">if</span> <span class="n">destek</span> <span class="o">&gt;=</span> <span class="n">gereken</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">karar</span>

    <span class="k">return</span> <span class="sh">"</span><span class="s">UZLASMA_YOK</span><span class="sh">"</span>

<span class="n">oylar</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">SALDIR</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">SALDIR</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">SALDIR</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">GERI_CEKIL</span><span class="sh">"</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">bizans_karari</span><span class="p">(</span><span class="n">oylar</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>  <span class="c1"># SALDIR
</span></code></pre></div></div>

<p>Kodda tek bir hain düğüm farklı oy verse bile üç uyumlu oy kararı oluşturur. Elbette gerçek protokoller bundan daha karmaşıktır: Mesaj turları, kimlik doğrulama, lider seçimi, ağ gecikmeleri ve tekrar saldırıları hesaba katılır. PBFT gibi protokoller bu fikirleri uygularken blokzincir sistemleri ekonomik teşvikleri de güven modeline ekler.</p>

<h2 id="güven-kişilik-değil-mekanizma-meselesidir">Güven, kişilik değil mekanizma meselesidir</h2>

<p>Bizans Generalleri Problemi’nin en insani dersi şudur: Sağlam işbirliği, herkesin iyi niyetli olduğunu varsayarak kurulmaz. Bunun yerine sistem, anlaşmazlığı görünür kılar, iddiaları doğrular ve kötü davranışın etkisini sınırlar.</p>

<p>Toplumlarda bunu şeffaf kayıtlar, bağımsız denetim ve görev ayrılığıyla yaparız. Yazılımda ise çoğaltma, dijital imza, quorum ve hata toleranslı protokoller kullanırız. Güven böylece “Sana inanıyorum” cümlesinden çıkarak “Yanlış davransan bile sistem çalışmaya devam ediyor” güvencesine dönüşür.</p>

<p>Sonuçta Bizans generalleri yalnızca sunucuların hikâyesi değildir. Farklı bilgilere, çıkarlara ve niyetlere sahip aktörlerin ortak bir gerçeklik üretme çabasıdır. Dağıtık sistemler bize kusursuz insanları değil, kusurlara rağmen işbirliğini mümkün kılan kuralları tasarlamamız gerektiğini hatırlatır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="dağıtık sistemler" /><category term="Bizans hata toleransı" /><category term="sosyal güven" /><summary type="html"><![CDATA[Bir grup insanın ortak karar vermesi gerektiğini düşünün: Bazıları dürüst, bazıları kararsız, bazılarıysa kasıtlı olarak yalan söylüyor. Üstelik kimse aynı odada değil; iletişim gecikebilir, mesajlar kaybolabilir ve farklı kişilere farklı bilgiler ulaşabilir. Bu senaryo bir aile grubunu, şirket toplantısını veya siyasi ittifakı çağrıştırsa da dağıtık sistemlerin en ünlü problemlerinden birini anlatır: Bizans Generalleri Problemi. Bilgisayar bilimindeki bu teknik mesele, özünde güvenilir bir otorite olmadan işbirliği yapabilmenin hikâyesidir.]]></summary></entry><entry><title type="html">Git Commit Mesajlarının Sosyolojisi: Kod Geçmişinden Takım Kültürünü Okumak</title><link href="https://sonsuzus.github.io/posts/git-commit-mesajlarinin-sosyolojisi-kod-gecmisinden-takim-kulturunu-okumak/" rel="alternate" type="text/html" title="Git Commit Mesajlarının Sosyolojisi: Kod Geçmişinden Takım Kültürünü Okumak" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/git-commit-mesajlarinin-sosyolojisi-kod-gecmisinden-takim-kulturunu-okumak</id><content type="html" xml:base="https://sonsuzus.github.io/posts/git-commit-mesajlarinin-sosyolojisi-kod-gecmisinden-takim-kulturunu-okumak/"><![CDATA[<p>Bir Git deposunun commit geçmişi yalnızca kodun nasıl değiştiğini anlatmaz; ekibin iletişim alışkanlıklarını, baskı altında nasıl davrandığını ve sorumluluğu nasıl paylaştığını da gösterir. “fix”, “nihayet çalıştı” veya “ödeme servisinde zaman aşımını düzelt” ifadeleri teknik olarak aynı değişikliği işaret edebilir; fakat her biri bambaşka bir ekip kültürünün izini taşır.</p>

<p>``</p>

<h2 id="commit-mesajı-neden-sosyal-bir-veridir">Commit mesajı neden sosyal bir veridir?</h2>

<p>Commit mesajı, geliştiricinin gelecekteki okuyucuya bıraktığı küçük bir nottur. Bu okuyucu ekip arkadaşı, kod incelemecisi veya altı ay sonraki kendisi olabilir. Dolayısıyla mesaj yazarken harcanan emek, ekibin ortak hafızaya verdiği önemi yansıtır.</p>

<p>Bu ilişkiyi basitçe şöyle modelleyebiliriz:</p>

\[K = \frac{B \times O}{G + 1}\]

<p>Burada $K$ kurumsal hafıza katkısını, $B$ mesajın bilgi yoğunluğunu, $O$ okunabilirliğini ve $G$ gereksiz gürültüyü temsil eder. Bu bilimsel bir ölçüm değil, düşünme aracıdır: Bilgi ve okunabilirlik arttıkça geçmiş daha anlaşılır hâle gelir; gürültü arttıkça <code class="language-plaintext highlighter-rouge">git log</code> arkeolojik kazıya dönüşür.</p>

<h2 id="üsluplar-ne-anlatabilir">Üsluplar ne anlatabilir?</h2>

<table>
  <thead>
    <tr>
      <th>Commit üslubu</th>
      <th>Örnek</th>
      <th>Muhtemel kültürel işaret</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Aşırı kısa</td>
      <td><code class="language-plaintext highlighter-rouge">fix</code></td>
      <td>Hız baskısı veya düşük dokümantasyon alışkanlığı</td>
    </tr>
    <tr>
      <td>Açıklayıcı</td>
      <td><code class="language-plaintext highlighter-rouge">Sepet toplamında KDV yuvarlamasını düzelt</code></td>
      <td>Gelecekteki okuyucuya özen</td>
    </tr>
    <tr>
      <td>Emir kipinde</td>
      <td><code class="language-plaintext highlighter-rouge">Add retry policy to payment client</code></td>
      <td>Ortak ve standartlaştırılmış dil</td>
    </tr>
    <tr>
      <td>Duygusal</td>
      <td><code class="language-plaintext highlighter-rouge">Finally fix this nightmare</code></td>
      <td>Samimiyet, yorgunluk ya da tükenmişlik sinyali</td>
    </tr>
    <tr>
      <td>Suçlayıcı</td>
      <td><code class="language-plaintext highlighter-rouge">Undo Ahmet's broken change</code></td>
      <td>Düşük psikolojik güvenlik ve kişiselleştirme riski</td>
    </tr>
    <tr>
      <td>Kural tabanlı</td>
      <td><code class="language-plaintext highlighter-rouge">fix(api): handle expired tokens</code></td>
      <td>Otomasyon ve süreç odaklı çalışma</td>
    </tr>
  </tbody>
</table>

<p>Bu tablo kesin teşhis koymaz. Tek bir “WIP” mesajı kaotik kültür kanıtı değildir; geliştirici aceleyle ara kayıt almış olabilir. Sosyolojik okuma, tekil örneklerden değil, tekrar eden örüntülerden yapılmalıdır.</p>

<h2 id="mesajların-görünmeyen-aktörleri">Mesajların görünmeyen aktörleri</h2>

<p>Commit geçmişinde yalnızca yazar bulunmaz. Kod inceleme kuralları, CI sistemi, teslim tarihleri ve yöneticilerin beklentileri de mesaj biçimini etkiler. Örneğin Conventional Commits kullanan bir ekipte düzenli mesajlar, herkesin doğal olarak titiz olduğunu değil, otomasyonun davranışı yönlendirdiğini gösterebilir.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>feat(search): add typo tolerance
fix(auth): reject expired refresh tokens
refactor(cart): extract price calculator
</code></pre></div></div>

<p>Bu yapıdaki <code class="language-plaintext highlighter-rouge">feat</code>, <code class="language-plaintext highlighter-rouge">fix</code> ve <code class="language-plaintext highlighter-rouge">refactor</code> türleri değişikliğin amacını makine tarafından okunabilir hâle getirir. Böylece sürüm notları üretilebilir ve değişiklikler sınıflandırılabilir. Ancak şablon doğru olsa bile açıklama anlamsız olabilir: <code class="language-plaintext highlighter-rouge">fix(api): fix bug</code> biçimsel olarak düzenli, içerik olarak yoksuldur.</p>

<h2 id="kültürel-sinyalleri-ölçmek">Kültürel sinyalleri ölçmek</h2>

<p>Bir deponun mesaj uzunluklarını hızlıca incelemek için şu komut kullanılabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">--pretty</span><span class="o">=</span>format:%s |
<span class="nb">awk</span> <span class="s1">'{ total += length($0); count++ }
END { print "Ortalama:", total / count }'</span>
</code></pre></div></div>

<p>Komut, commit başlıklarının ortalama karakter sayısını hesaplar. Yine de uzunluk kalite değildir. Daha anlamlı bir değerlendirme için açıklayıcılık oranı düşünülebilir:</p>

\[A = \frac{N_{bağlamlı}}{N_{toplam}} \times 100\]

<p>Burada bağlamlı mesaj; neyin değiştiğini ve mümkünse nedenini belirten mesajdır. Oranı sürüm dönemlerine göre karşılaştırmak, teslim tarihi yaklaşırken iletişim kalitesinin düşüp düşmediğini gösterebilir.</p>

<h2 id="sağlıklı-bir-commit-dili-kurmak">Sağlıklı bir commit dili kurmak</h2>

<p>İyi bir ekip, commit mesajını performans değerlendirme silahına dönüştürmez. Bunun yerine birkaç ortak ilke belirler:</p>

<ul>
  <li>Değişikliğin <strong>ne yaptığını</strong> açıkça yazmak,</li>
  <li>Koddan anlaşılmayan durumlarda <strong>nedenini</strong> belirtmek,</li>
  <li>İnsanları değil davranışı ve teknik sonucu tarif etmek,</li>
  <li>Aynı dil ve biçim standardını kullanmak,</li>
  <li>Büyük değişiklikleri anlamlı, küçük parçalara ayırmak.</li>
</ul>

<p>Sonuçta commit geçmişi takımın günlüğüdür. Düzenli, açıklayıcı ve saygılı mesajlar yalnızca iyi Git kullanımı değildir; ortak sorumluluğun, psikolojik güvenliğin ve gelecekteki ekip arkadaşlarına duyulan nezaketin küçük ama kalıcı göstergeleridir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Git" /><category term="Takım Kültürü" /><category term="Yazılım Geliştirme" /><summary type="html"><![CDATA[Bir Git deposunun commit geçmişi yalnızca kodun nasıl değiştiğini anlatmaz; ekibin iletişim alışkanlıklarını, baskı altında nasıl davrandığını ve sorumluluğu nasıl paylaştığını da gösterir. “fix”, “nihayet çalıştı” veya “ödeme servisinde zaman aşımını düzelt” ifadeleri teknik olarak aynı değişikliği işaret edebilir; fakat her biri bambaşka bir ekip kültürünün izini taşır.]]></summary></entry><entry><title type="html">Oyun Teorisi Gözünden Açık Kaynak Lisans Savaşları: GPL mi MIT mi Kazanır?</title><link href="https://sonsuzus.github.io/posts/oyun-teorisi-gozunden-acik-kaynak-lisans-savaslari-gpl-mi-mit-mi-kazanir/" rel="alternate" type="text/html" title="Oyun Teorisi Gözünden Açık Kaynak Lisans Savaşları: GPL mi MIT mi Kazanır?" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/oyun-teorisi-gozunden-acik-kaynak-lisans-savaslari-gpl-mi-mit-mi-kazanir</id><content type="html" xml:base="https://sonsuzus.github.io/posts/oyun-teorisi-gozunden-acik-kaynak-lisans-savaslari-gpl-mi-mit-mi-kazanir/"><![CDATA[<p>Bir açık kaynak lisansı seçmek, yalnızca hukuk metinleri arasında tercih yapmak değildir; geliştiriciler, şirketler ve kullanıcılar arasında oynanan uzun vadeli bir strateji oyununa katılmaktır. MIT özgürlüğü en az koşulla dağıtırken GPL, bu özgürlüğün sonraki sürümlerde de korunmasını ister. Peki rasyonel aktörlerin bulunduğu bir ekosistemde hangi yaklaşım kazanır?
``</p>
<h2 id="oyuncular-stratejiler-ve-kazançlar">Oyuncular, stratejiler ve kazançlar</h2>

<p>Basitleştirilmiş modelimizde üç aktör bulunsun:</p>

<ul>
  <li><strong>Bağımsız geliştirici:</strong> Kodun yayılmasını, itibar ve katkı kazanmayı hedefler.</li>
  <li><strong>Şirket:</strong> Geliştirme maliyetini düşürmek ve rekabet avantajı elde etmek ister.</li>
  <li><strong>Topluluk:</strong> İyileştirmelerin ortak havuza dönmesini ve projenin yaşamasını önemser.</li>
</ul>

<p>Her aktörün faydasını kabaca şöyle gösterebiliriz:</p>

\[U_i = \alpha A + \beta C + \gamma R - \delta K\]

<p>Burada $A$ benimsenme oranını, $C$ topluluğa dönen katkıyı, $R$ rekabet avantajını ve $K$ uyumluluk maliyetini temsil eder. Katsayılar aktöre göre değişir. Bir girişim için $R$ yüksek ağırlık taşırken topluluk odaklı geliştiricide $C$ daha önemlidir.</p>

<table>
  <thead>
    <tr>
      <th>Ölçüt</th>
      <th>MIT</th>
      <th>GPL</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ticari benimsenme</td>
      <td>Genellikle çok kolay</td>
      <td>Dağıtım modeline bağlı</td>
    </tr>
    <tr>
      <td>Değişiklikleri kapatma</td>
      <td>Mümkün</td>
      <td>Türetilmiş çalışmalarda sınırlı</td>
    </tr>
    <tr>
      <td>Katkının geri dönmesi</td>
      <td>Gönüllülüğe bağlı</td>
      <td>Lisansla teşvik edilir</td>
    </tr>
    <tr>
      <td>Uyumluluk maliyeti</td>
      <td>Düşük</td>
      <td>Daha yüksek</td>
    </tr>
    <tr>
      <td>Ekosistem etkisi</td>
      <td>Hızlı yayılma</td>
      <td>Ortak havuzu koruma</td>
    </tr>
  </tbody>
</table>

<h2 id="tekrarlanan-oyun-neden-önemli">Tekrarlanan oyun neden önemli?</h2>

<p>Oyun yalnızca bir kez oynansaydı şirket, MIT kodunu alıp kapalı bir ürüne dönüştürerek yüksek kısa vadeli kazanç sağlayabilirdi. Geliştirici de daha geniş benimsenme elde ederdi. Bu senaryoda MIT güçlü görünür.</p>

<p>Açık kaynak ekosistemleri ise <strong>tekrarlanan oyunlardır</strong>. Aynı şirketler ve geliştiriciler yıllarca karşılaşır. Bugün katkıyı saklayan aktör yarın kötü itibar, zayıf topluluk ve daha yüksek bakım maliyetiyle karşılaşabilir. Gelecekteki kazançların bugünkü değeri şu seriyle modellenebilir:</p>

\[V = u_0 + \delta u_1 + \delta^2 u_2 + \cdots\]

<p>$\delta$ geleceğe verilen önemi gösterir. $\delta$ yüksekse iş birliği rasyonelleşir. GPL, iş birliğini yalnızca iyi niyete bırakmayıp oyunun kurallarına yerleştirir. MIT ise güven, itibar ve ağ etkisine daha fazla yaslanır.</p>

<h2 id="basit-bir-kazanç-matrisi">Basit bir kazanç matrisi</h2>

<p>Şirketin “katkıyı paylaş” veya “kodu kapat” stratejilerinden birini seçtiğini düşünelim. Değerler kesin sonuçlar değil, teşvikleri görünür kılan örnek puanlardır.</p>

<table>
  <thead>
    <tr>
      <th>Lisans ve strateji</th>
      <th style="text-align: right">Şirket kazancı</th>
      <th style="text-align: right">Topluluk kazancı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>MIT + paylaş</td>
      <td style="text-align: right">7</td>
      <td style="text-align: right">8</td>
    </tr>
    <tr>
      <td>MIT + kapat</td>
      <td style="text-align: right">9</td>
      <td style="text-align: right">3</td>
    </tr>
    <tr>
      <td>GPL + paylaş</td>
      <td style="text-align: right">6</td>
      <td style="text-align: right">9</td>
    </tr>
    <tr>
      <td>GPL + kapatmaya çalışma</td>
      <td style="text-align: right">2</td>
      <td style="text-align: right">4</td>
    </tr>
  </tbody>
</table>

<p>MIT altında şirket için kapatma stratejisi kısa vadede baskın olabilir. GPL ise bu seçeneğin maliyetini artırarak dengeyi paylaşmaya yaklaştırır. Buna karşılık ağır uyumluluk gereksinimleri bazı şirketlerin oyuna hiç girmemesine yol açabilir.</p>

<h2 id="modeli-kodla-deneyelim">Modeli kodla deneyelim</h2>

<p>Aşağıdaki Python örneği, geleceğe verilen önem değiştikçe paylaşmanın toplam değerini karşılaştırır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">uzun_vadeli_kazanc</span><span class="p">(</span><span class="n">anlik_kazanc</span><span class="p">,</span> <span class="n">delta</span><span class="p">,</span> <span class="n">tur</span><span class="o">=</span><span class="mi">20</span><span class="p">):</span>
    <span class="c1"># Tekrarlanan oyundaki indirgenmiş toplam faydayı hesaplar.
</span>    <span class="k">return</span> <span class="nf">sum</span><span class="p">((</span><span class="n">delta</span> <span class="o">**</span> <span class="n">t</span><span class="p">)</span> <span class="o">*</span> <span class="n">anlik_kazanc</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">tur</span><span class="p">))</span>

<span class="k">for</span> <span class="n">delta</span> <span class="ow">in</span> <span class="p">(</span><span class="mf">0.3</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">,</span> <span class="mf">0.95</span><span class="p">):</span>
    <span class="n">paylas</span> <span class="o">=</span> <span class="nf">uzun_vadeli_kazanc</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="n">delta</span><span class="p">)</span>
    <span class="n">kapat</span> <span class="o">=</span> <span class="mi">9</span> <span class="o">+</span> <span class="nf">uzun_vadeli_kazanc</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">delta</span><span class="p">,</span> <span class="n">tur</span><span class="o">=</span><span class="mi">19</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">delta</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="n">paylas</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="nf">round</span><span class="p">(</span><span class="n">kapat</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
</code></pre></div></div>

<p>Burada kapatma ilk turda yüksek, sonraki turlarda düşük kazanç üretir; çünkü topluluk güveninin azaldığını varsayıyoruz. <code class="language-plaintext highlighter-rouge">delta</code> yükseldikçe sürdürülebilir iş birliğinin değeri belirginleşir.</p>

<h2 id="öyleyse-kim-kazanır">Öyleyse kim kazanır?</h2>

<p>Tek bir evrensel galip yoktur. Amaç <strong>maksimum yayılma, düşük sürtünme ve geniş entegrasyon</strong> ise MIT çoğu zaman avantajlıdır. Amaç <strong>iyileştirmelerin ortak havuzda kalması ve özel mülke dönüşmenin sınırlandırılması</strong> ise GPL daha güçlü bir mekanizma tasarlar.</p>

<p>Oyun teorisinin cevabı şudur: Lisans, oyuncunun kişiliğini değiştirmez; kazanç tablosunu değiştirir. MIT “daha çok oyuncu gelsin” derken GPL “gelen oyuncu ortak masayı büyütsün” der. Kazanan, projenizin hangi oyunu oynamak istediğine bağlıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun teorisi" /><category term="açık kaynak" /><category term="yazılım lisansları" /><summary type="html"><![CDATA[Bir açık kaynak lisansı seçmek, yalnızca hukuk metinleri arasında tercih yapmak değildir; geliştiriciler, şirketler ve kullanıcılar arasında oynanan uzun vadeli bir strateji oyununa katılmaktır. MIT özgürlüğü en az koşulla dağıtırken GPL, bu özgürlüğün sonraki sürümlerde de korunmasını ister. Peki rasyonel aktörlerin bulunduğu bir ekosistemde hangi yaklaşım kazanır?]]></summary></entry><entry><title type="html">Programcının Bilişsel Yükü: Bazı Kodlar Neden Beyni Daha Çok Yorar?</title><link href="https://sonsuzus.github.io/posts/programcinin-bilissel-yuku-bazi-kodlar-neden-beyni-daha-cok-yorar/" rel="alternate" type="text/html" title="Programcının Bilişsel Yükü: Bazı Kodlar Neden Beyni Daha Çok Yorar?" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/programcinin-bilissel-yuku-bazi-kodlar-neden-beyni-daha-cok-yorar</id><content type="html" xml:base="https://sonsuzus.github.io/posts/programcinin-bilissel-yuku-bazi-kodlar-neden-beyni-daha-cok-yorar/"><![CDATA[<p>Bir kod bloğunu okurken bazen her şey ilk bakışta yerine oturur; bazen de üç satır sonra değişkenlerin neyi temsil ettiğini unutup başa dönersiniz. Sorun her zaman algoritmanın karmaşıklığı değildir. Kod, bilgisayar için kusursuz çalışırken insan zihni için yorucu olabilir. Bunun nedeni, beynimizin aynı anda işleyebildiği bilgi miktarının sınırlı olmasıdır.</p>

<p>``</p>

<h2 id="çalışan-bellek-zihnin-küçük-çalışma-masası">Çalışan bellek: Zihnin küçük çalışma masası</h2>

<p>Bilişsel psikolojide <strong>çalışan bellek</strong>, bilgiyi kısa süre boyunca tutup işlediğimiz zihinsel sistemdir. Bir telefon numarasını tuşlayana kadar akılda tutmak veya bir fonksiyonun akışını takip etmek çalışan belleği kullanır.</p>

<p>Kapasitesi sınırsız değildir. Modern çalışmalar kesin sayının göreve göre değiştiğini gösterse de insanın aynı anda yaklaşık $4 \pm 1$ anlamlı bilgi parçasını etkin biçimde yönetebildiği kabul edilir. Programcı bir kod bloğunu incelerken değişkenlerin değerlerini, koşulları, fonksiyon çağrılarını ve iş kurallarını bu küçük çalışma masasına yerleştirir.</p>

<p>Bilişsel yükü kabaca şöyle düşünebiliriz:</p>

\[Y_{toplam} = Y_{içsel} + Y_{dışsal} + Y_{öğrenme}\]

<ul>
  <li><strong>İçsel yük</strong>, problemin doğal karmaşıklığıdır. Dağıtık sistemler, tarih hesaplamasından doğası gereği daha zordur.</li>
  <li><strong>Dışsal yük</strong>, kötü adlar, gereksiz iç içe koşullar ve dağınık akış gibi sunum kaynaklı yüktür.</li>
  <li><strong>Öğrenme yükü</strong>, yeni ve yararlı zihinsel modeller kurmak için harcanan çabadır.</li>
</ul>

<p>İçsel yükü her zaman azaltamayız; fakat dışsal yükü iyi tasarlanmış kodla ciddi biçimde düşürebiliriz.</p>

<h2 id="aynı-iş-farklı-zihinsel-maliyet">Aynı iş, farklı zihinsel maliyet</h2>

<p>Aşağıdaki JavaScript kodu indirimli ve aktif ürünlerin toplamını hesaplıyor:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">t</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">p</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">p</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">a</span> <span class="o">===</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">p</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">s</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
      <span class="nx">t</span> <span class="o">+=</span> <span class="nx">p</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">pr</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="nx">p</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">d</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bilgisayar bunu kolayca yorumlar. İnsan ise <code class="language-plaintext highlighter-rouge">t</code>, <code class="language-plaintext highlighter-rouge">p</code>, <code class="language-plaintext highlighter-rouge">a</code>, <code class="language-plaintext highlighter-rouge">s</code>, <code class="language-plaintext highlighter-rouge">pr</code> ve <code class="language-plaintext highlighter-rouge">d</code> kısaltmalarını sürekli zihninde çevirmek zorundadır. İki iç içe koşul da akışın hangi dalında bulunduğumuzu hatırlatır.</p>

<p>Aynı işlem, niyeti görünür hâle getirilerek yazılabilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">purchasableProducts</span> <span class="o">=</span> <span class="nx">products</span><span class="p">.</span><span class="nf">filter</span><span class="p">(</span>
  <span class="nx">product</span> <span class="o">=&gt;</span> <span class="nx">product</span><span class="p">.</span><span class="nx">isActive</span> <span class="o">&amp;&amp;</span> <span class="nx">product</span><span class="p">.</span><span class="nx">stockCount</span> <span class="o">&gt;</span> <span class="mi">0</span>
<span class="p">);</span>

<span class="kd">const</span> <span class="nx">discountedTotal</span> <span class="o">=</span> <span class="nx">purchasableProducts</span><span class="p">.</span><span class="nf">reduce</span><span class="p">(</span>
  <span class="p">(</span><span class="nx">total</span><span class="p">,</span> <span class="nx">product</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">total</span> <span class="o">+</span> <span class="nx">product</span><span class="p">.</span><span class="nx">price</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="nx">product</span><span class="p">.</span><span class="nx">discountRate</span><span class="p">),</span>
  <span class="mi">0</span>
<span class="p">);</span>
</code></pre></div></div>

<p>Burada ara değişken yalnızca veri saklamaz; zihinsel bir <strong>parça</strong>, yani anlamlı bir bütün oluşturur. Okur, ayrıntıları tek tek taşımak yerine “satın alınabilir ürünler” kavramını hatırlar.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Yüksek bilişsel yük</th>
      <th>Düşük bilişsel yük</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Değişken adları</td>
      <td><code class="language-plaintext highlighter-rouge">x</code>, <code class="language-plaintext highlighter-rouge">tmp</code>, <code class="language-plaintext highlighter-rouge">d</code></td>
      <td><code class="language-plaintext highlighter-rouge">discountRate</code>, <code class="language-plaintext highlighter-rouge">totalPrice</code></td>
    </tr>
    <tr>
      <td>Kontrol akışı</td>
      <td>Derin iç içe koşullar</td>
      <td>Erken dönüşler</td>
    </tr>
    <tr>
      <td>Soyutlama</td>
      <td>Gizli iş kuralları</td>
      <td>Niyeti anlatan fonksiyonlar</td>
    </tr>
    <tr>
      <td>Fonksiyon boyutu</td>
      <td>Birçok sorumluluk</td>
      <td>Tek ve belirgin görev</td>
    </tr>
    <tr>
      <td>Durum değişimi</td>
      <td>Dağınık mutasyon</td>
      <td>Sınırlı, görünür değişim</td>
    </tr>
  </tbody>
</table>

<h2 id="erken-dönüş-neden-rahatlatır">Erken dönüş neden rahatlatır?</h2>

<p>İç içe koşullar, açık kalan zihinsel parantezlere benzer. Her seviye çalışan bellekte tutulur:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">ship_order</span><span class="p">(</span><span class="n">order</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">order</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">'</span><span class="s">Sipariş bulunamadı</span><span class="sh">'</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">order</span><span class="p">.</span><span class="n">is_paid</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">'</span><span class="s">Ödeme bekleniyor</span><span class="sh">'</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">order</span><span class="p">.</span><span class="n">items</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">'</span><span class="s">Sepet boş</span><span class="sh">'</span>

    <span class="nf">create_shipment</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
    <span class="k">return</span> <span class="sh">'</span><span class="s">Kargo oluşturuldu</span><span class="sh">'</span>
</code></pre></div></div>

<p>Bu <strong>guard clause</strong> yaklaşımı, geçersiz durumları erkenden eleyerek ana senaryoyu düz bir çizgide bırakır. Okur, “ilk koşul doğruydu, şimdi ikinci dalın içindeyim” bilgisini taşımak zorunda kalmaz.</p>

<h2 id="beyne-uygun-kod-için-pratik-ilkeler">Beyne uygun kod için pratik ilkeler</h2>

<ol>
  <li>İsimleri kısa değil, anlamı açık olacak şekilde seçin.</li>
  <li>Bir fonksiyonda tek soyutlama düzeyi kullanın.</li>
  <li>Karmaşık ifadeleri açıklayıcı ara değişkenlere ayırın.</li>
  <li>Gizli yan etkileri ve global durum değişimlerini azaltın.</li>
  <li>Yorumlarla kötü kodu tercüme etmek yerine kodun niyetini görünür yapın.</li>
  <li>Benzer işlemleri tutarlı kalıplarla yazın.</li>
</ol>

<p>Okunabilirlik yalnızca estetik değildir; sınırlı bir bilişsel kaynağı yönetme problemidir. İyi kod, okurun hafızasını ayrıntılarla doldurmaz. Ona doğru kavramları, doğru sırada ve sindirilebilir parçalar hâlinde sunar. Kısacası temiz kod, bilgisayardan önce insan beynine yapılan bir optimizasyondur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="bilişsel yük" /><category term="kod okunabilirliği" /><category term="çalışan bellek" /><summary type="html"><![CDATA[Bir kod bloğunu okurken bazen her şey ilk bakışta yerine oturur; bazen de üç satır sonra değişkenlerin neyi temsil ettiğini unutup başa dönersiniz. Sorun her zaman algoritmanın karmaşıklığı değildir. Kod, bilgisayar için kusursuz çalışırken insan zihni için yorucu olabilir. Bunun nedeni, beynimizin aynı anda işleyebildiği bilgi miktarının sınırlı olmasıdır.]]></summary></entry><entry><title type="html">Satranç Motorlarının Evrimi: Minimax’tan AlphaZero’ya Zekânın Değişen Yüzü</title><link href="https://sonsuzus.github.io/posts/satranc-motorlarinin-evrimi-minimaxtan-alphazeroya-zekanin-degisen-yuzu/" rel="alternate" type="text/html" title="Satranç Motorlarının Evrimi: Minimax’tan AlphaZero’ya Zekânın Değişen Yüzü" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/satranc-motorlarinin-evrimi-minimaxtan-alphazeroya-zekanin-degisen-yuzu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/satranc-motorlarinin-evrimi-minimaxtan-alphazeroya-zekanin-degisen-yuzu/"><![CDATA[<p>Bir satranç motorunun tahtaya bakıp “Bu hamle bana mantıklı geliyor” dediğini hayal ederiz; oysa uzun yıllar boyunca makinelerin sezgisi değil, yalnızca yorulmak bilmeyen hesap gücü vardı. Satranç motorlarının Minimax’tan AlphaZero’ya uzanan tarihi, daha fazla pozisyon hesaplamanın ötesinde, “Zekâ nedir?” sorusuna verilen mühendislik cevaplarının da tarihidir.</p>

<p>``</p>

<h2 id="satranç-neden-yapay-zekânın-laboratuvarı-oldu">Satranç neden yapay zekânın laboratuvarı oldu?</h2>

<p>Satranç; kuralları kesin, sonuçları ölçülebilir ve seçenekleri olağanüstü geniş bir oyundur. Ortalama bir konumda yaklaşık 35 yasal hamle bulunur. Bir motor yalnızca $d$ yarım hamle ileri bakarsa incelemesi gereken düğüm sayısı kabaca</p>

\[N \approx 35^d\]

<p>olur. Sadece 8 yarım hamlede bu sayı trilyonlara yaklaşır. Dolayısıyla bütün oyunu baştan sona hesaplamak pratik değildir. Asıl mesele, olası geleceklerin hangilerinin araştırılmaya değer olduğunu belirlemektir.</p>

<h2 id="minimax-rakibin-de-akıllı-olduğunu-varsaymak">Minimax: Rakibin de akıllı olduğunu varsaymak</h2>

<p>1950’lerin klasik yaklaşımı olan <strong>Minimax</strong>, oyuncuların kusursuz davranacağını kabul eder. Motor kendi hamlesinde skoru büyütürken rakibin cevabında skorun küçültüleceğini varsayar. Başka bir ifadeyle “Benim en iyi hamlem, rakibimin en güçlü cevabından sonra bile beni en iyi durumda bırakan hamledir” der.</p>

<p>Basitleştirilmiş algoritma şöyledir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">minimax</span><span class="p">(</span><span class="n">dugum</span><span class="p">,</span> <span class="n">derinlik</span><span class="p">,</span> <span class="n">maksimize</span><span class="p">):</span>
    <span class="c1"># Arama sınırına gelince konumu sayısal olarak değerlendirir.
</span>    <span class="k">if</span> <span class="n">derinlik</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">dugum</span><span class="p">.</span><span class="nf">oyun_bitti</span><span class="p">():</span>
        <span class="k">return</span> <span class="n">dugum</span><span class="p">.</span><span class="nf">degerlendir</span><span class="p">()</span>

    <span class="n">skorlar</span> <span class="o">=</span> <span class="p">[</span>
        <span class="nf">minimax</span><span class="p">(</span><span class="n">cocuk</span><span class="p">,</span> <span class="n">derinlik</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">not</span> <span class="n">maksimize</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">cocuk</span> <span class="ow">in</span> <span class="n">dugum</span><span class="p">.</span><span class="nf">cocuklar</span><span class="p">()</span>
    <span class="p">]</span>

    <span class="c1"># Sıra bizdeyse en yüksek, rakipteyse en düşük skor seçilir.
</span>    <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="n">skorlar</span><span class="p">)</span> <span class="k">if</span> <span class="n">maksimize</span> <span class="k">else</span> <span class="nf">min</span><span class="p">(</span><span class="n">skorlar</span><span class="p">)</span>
</code></pre></div></div>

<p>Buradaki kritik unsur <strong>değerlendirme fonksiyonudur</strong>. Motor; taş değerleri, şah güvenliği, piyon yapısı ve merkez kontrolü gibi özellikleri ağırlıklandırır:</p>

\[E(s)=9V+5K+3F+3A+P+0.2M\]

<p>Burada semboller vezir, kale, fil, at, piyon ve hareketlilik farklarını temsil edebilir. Bu formül “satranç bilgisi”nin insan tarafından makineye çevrilmiş hâlidir.</p>

<h2 id="alpha-beta-ve-kaba-kuvvetin-akıllanması">Alpha-Beta ve kaba kuvvetin akıllanması</h2>

<p><strong>Alpha-Beta budaması</strong>, sonucu değiştiremeyeceği kesinleşen dalları incelemez. Doğru hamle sıralamasıyla Minimax’ın etkili karmaşıklığını yaklaşık $O(b^d)$ seviyesinden $O(b^{d/2})$ seviyesine indirebilir. Böylece aynı sürede neredeyse iki kat derinlik araştırılır.</p>

<p>1997’de Garry Kasparov’u yenen <strong>Deep Blue</strong>, bu geleneğin zirvesiydi: özel donanım, uzmanlarca yazılmış değerlendirme kuralları ve saniyede milyonlarca konum. Zeki görünüyordu; fakat bilgisini kendi deneyiminden üretmiyordu.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Bilginin kaynağı</th>
      <th>Temel güç</th>
      <th>Başlıca sınır</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Minimax</td>
      <td>İnsan yapımı kurallar</td>
      <td>Tutarlı planlama</td>
      <td>Üstel arama ağacı</td>
    </tr>
    <tr>
      <td>Deep Blue</td>
      <td>Uzman bilgisi ve donanım</td>
      <td>Çok derin hesap</td>
      <td>Dar alana bağımlılık</td>
    </tr>
    <tr>
      <td>AlphaZero</td>
      <td>Kendi kendine oyun</td>
      <td>Öğrenilmiş sezgi</td>
      <td>Yüksek eğitim maliyeti</td>
    </tr>
  </tbody>
</table>

<h2 id="alphazero-hesaplamadan-öğrenilmiş-sezgiye">AlphaZero: Hesaplamadan öğrenilmiş sezgiye</h2>

<table>
  <tbody>
    <tr>
      <td>2017’de tanıtılan <strong>AlphaZero</strong>, açılış kitapları veya insan oyunları olmadan yalnızca kuralları öğrendi. Kendisine karşı milyonlarca oyun oynayarak iki önemli çıktı üreten bir sinir ağı geliştirdi: hamle olasılıklarını veren <strong>politika</strong> $p(a</td>
      <td>s)$ ve konumun kazanma beklentisini veren <strong>değer</strong> $v(s)$.</td>
    </tr>
  </tbody>
</table>

<p>Bu ağ, <strong>Monte Carlo Ağaç Araması</strong> ile birleşir. Sistem her dalı eşit biçimde araştırmak yerine umut vadeden hamlelere yoğunlaşır; arama sonuçları da ağı yeniden eğitir. Böylece döngü oluşur: oyna, değerlendir, öğren ve daha güçlü yeniden oyna. AlphaZero’nun fedaları bazen romantik bir büyükustayı andırır; ancak bu estetik, önceden öğretilmiş ilkelerden değil, kazanma olasılığını optimize etmekten doğar.</p>

<h2 id="zekâ-gerçekten-nerede">Zekâ gerçekten nerede?</h2>

<p>Minimax zekâyı mantıklı seçim, Deep Blue devasa hesaplama, AlphaZero ise deneyimden temsil öğrenme olarak yorumlar. Yine de AlphaZero “şah güvenliği”ni bizim gibi kavramsallaştırmak zorunda değildir. İşe yarayan örüntüyü sayılara gömer.</p>

<p>Bu tarih küçük bir felsefi sürpriz sunar: Zeki davranış için insan gibi düşünmek gerekmeyebilir. Kaba kuvvet ile sezgi birbirinin zıddı da değildir; modern motorlarda öğrenilmiş sezgi, hesaplamanın nereye bakacağını söyler. Satranç tahtası böylece yalnızca bir oyun alanı değil, aklın kurallardan mı, deneyimden mi, yoksa ikisinin sürekli etkileşiminden mi doğduğunu sınayan siyah-beyaz bir laboratuvara dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="satranç motorları" /><category term="yapay zeka" /><category term="AlphaZero" /><summary type="html"><![CDATA[Bir satranç motorunun tahtaya bakıp “Bu hamle bana mantıklı geliyor” dediğini hayal ederiz; oysa uzun yıllar boyunca makinelerin sezgisi değil, yalnızca yorulmak bilmeyen hesap gücü vardı. Satranç motorlarının Minimax’tan AlphaZero’ya uzanan tarihi, daha fazla pozisyon hesaplamanın ötesinde, “Zekâ nedir?” sorusuna verilen mühendislik cevaplarının da tarihidir.]]></summary></entry><entry><title type="html">Sızma Sonrası Güvenli Doğrulama ve Profesyonel Raporlama</title><link href="https://sonsuzus.github.io/posts/sizma-sonrasi-guvenli-dogrulama-ve-profesyonel-raporlama/" rel="alternate" type="text/html" title="Sızma Sonrası Güvenli Doğrulama ve Profesyonel Raporlama" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/sizma-sonrasi-guvenli-dogrulama-ve-profesyonel-raporlama</id><content type="html" xml:base="https://sonsuzus.github.io/posts/sizma-sonrasi-guvenli-dogrulama-ve-profesyonel-raporlama/"><![CDATA[<p>Bir sızma testinde ilk erişimi elde etmek final değil, yalnızca hikâyenin dönüm noktasıdır. Post-exploitation aşaması; ele geçirilen erişimin etkisini, saldırganın ilerleyebileceği yolları ve kurumun bu hareketleri fark etme kapasitesini <strong>yetkilendirilmiş sınırlar içinde</strong> incelemeyi amaçlar. Buradaki başarı, sisteme gizlice yerleşmekten çok riski güvenli biçimde kanıtlamak, iz bırakmadan değil kontrollü iz bırakarak çalışmak ve test sonunda ortamı başlangıç durumuna döndürmektir.
``</p>
<h2 id="post-exploitation-mantığı">Post-Exploitation Mantığı</h2>

<p>Bu aşamada test uzmanı genellikle erişim seviyesini, hassas veri görünürlüğünü, ağ içi hareket ihtimalini ve kalıcılık kontrollerini değerlendirir. Kalıcılık, bir saldırganın oturum kapansa veya sistem yeniden başlatılsa bile erişimini sürdürebilmesidir. Ancak profesyonel testlerde gerçek ve gizli bir arka kapı bırakmak yerine, tekniklerin uygulanabilirliği <strong>zararsız göstergeler</strong>, geçici test hesapları ya da savunma ekibiyle kararlaştırılmış simülasyonlar üzerinden doğrulanmalıdır.</p>

<table>
  <thead>
    <tr>
      <th>İnceleme alanı</th>
      <th>Güvenli doğrulama yaklaşımı</th>
      <th>Beklenen savunma</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hesap tabanlı kalıcılık</td>
      <td>Süresi sınırlı test hesabı</td>
      <td>Yeni hesap alarmı ve MFA</td>
    </tr>
    <tr>
      <td>Zamanlanmış çalıştırma</td>
      <td>Zararsız işaret dosyası üreten görev</td>
      <td>Görev oluşturma telemetrisi</td>
    </tr>
    <tr>
      <td>Başlangıç mekanizmaları</td>
      <td>Yalnızca laboratuvarda simülasyon</td>
      <td>Dosya ve kayıt değişikliği alarmı</td>
    </tr>
    <tr>
      <td>Bulut erişimi</td>
      <td>Geçici, düşük yetkili anahtar</td>
      <td>Anahtar kullanımı ve anomali takibi</td>
    </tr>
  </tbody>
</table>

<p>Kalıcılığın riski yalnızca tekniğe bağlı değildir. Basit bir öncelik modeli şu şekilde kurulabilir:</p>

\[R = O \times E \times V\]

<p>Burada $O$ oluşma olasılığını, $E$ erişimin iş etkisini, $V$ ise mekanizmanın görünmeden sürdürülebilme derecesini temsil eder. Örneğin ayrıcalıklı ve denetlenmeyen bir servis hesabı, düşük yetkili ve sürekli izlenen bir hesaptan daha yüksek puan alır.</p>

<h2 id="kontrollü-çalışma-akışı">Kontrollü Çalışma Akışı</h2>

<p>Önce kapsam ve angajman kuralları yeniden kontrol edilir. Ardından mevcut yetkiler belgelenir; erişim yükseltme veya yatay hareket girişimleri yalnızca açık izin varsa gerçekleştirilir. Her değişiklik için zaman, sistem, amaç, sonuç ve geri alma yöntemi kaydedilir. Üretim ortamında hizmet kesintisi oluşturabilecek işlemlerden kaçınılır.</p>

<p>Aşağıdaki örnek, bulguların öncelik puanını hesaplayan zararsız bir raporlama yardımcısıdır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">findings</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Denetlenmeyen test hesabı</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">likelihood</span><span class="sh">"</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="sh">"</span><span class="s">impact</span><span class="sh">"</span><span class="p">:</span> <span class="mi">5</span><span class="p">},</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Eksik görev alarmı</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">likelihood</span><span class="sh">"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="sh">"</span><span class="s">impact</span><span class="sh">"</span><span class="p">:</span> <span class="mi">3</span><span class="p">},</span>
<span class="p">]</span>

<span class="k">for</span> <span class="n">finding</span> <span class="ow">in</span> <span class="n">findings</span><span class="p">:</span>
    <span class="n">finding</span><span class="p">[</span><span class="sh">"</span><span class="s">score</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">finding</span><span class="p">[</span><span class="sh">"</span><span class="s">likelihood</span><span class="sh">"</span><span class="p">]</span> <span class="o">*</span> <span class="n">finding</span><span class="p">[</span><span class="sh">"</span><span class="s">impact</span><span class="sh">"</span><span class="p">]</span>
    <span class="n">finding</span><span class="p">[</span><span class="sh">"</span><span class="s">priority</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Kritik</span><span class="sh">"</span> <span class="k">if</span> <span class="n">finding</span><span class="p">[</span><span class="sh">"</span><span class="s">score</span><span class="sh">"</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">16</span> <span class="k">else</span> <span class="sh">"</span><span class="s">Yüksek</span><span class="sh">"</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> - </span><span class="si">{</span><span class="n">finding</span><span class="p">[</span><span class="sh">'</span><span class="s">priority</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, olasılık ile etkiyi çarparak tutarlı bir ilk sıralama sağlar. Yine de nihai seviye; varlığın önemi, mevcut kontroller ve kurumun risk iştahıyla birlikte değerlendirilmelidir.</p>

<h2 id="yönetimsel-dilde-raporlama">Yönetimsel Dilde Raporlama</h2>

<p>Profesyonel rapor iki farklı okuyucuya seslenir. Yönetici özeti; saldırı zincirini, iş etkisini ve yatırım önceliklerini teknik ayrıntıya boğulmadan anlatır. Teknik bölüm ise kanıtları, zaman çizelgesini, etkilenen varlıkları, tekrarlanabilir doğrulama adımlarını ve düzeltme önerilerini içerir.</p>

<table>
  <thead>
    <tr>
      <th>Teknik ifade</th>
      <th>Yönetimsel karşılığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ayrıcalıklı erişim elde edildi</td>
      <td>Kritik sistemlerde yetkisiz işlem riski oluştu</td>
    </tr>
    <tr>
      <td>Alarm üretilmedi</td>
      <td>Müdahale süresi uzayabilir</td>
    </tr>
    <tr>
      <td>Kalıcılık mümkün</td>
      <td>Erişim, parola değişikliğinden sonra sürebilir</td>
    </tr>
    <tr>
      <td>Ağ içi hareket doğrulandı</td>
      <td>Tek sistemdeki ihlal daha geniş etki yaratabilir</td>
    </tr>
  </tbody>
</table>

<p>Her bulguda başlık, önem derecesi, iş etkisi, kanıt, kök neden, öneri ve sorumlu ekip bulunmalıdır. Ekran görüntüleri hassas verileri maskelemeli; hash değerleriyle kanıt bütünlüğü korunmalıdır. Test sonunda oluşturulan hesaplar, dosyalar, görevler ve anahtarlar temizlenmeli, temizlik ikinci bir uzman tarafından doğrulanmalıdır.</p>

<p>İyi bir post-exploitation çalışması “ne kadar içeride kaldık?” sorusuyla değil, “kurum neyi daha iyi savunabilir?” sorusuyla ölçülür. Net kanıt, güvenli temizlik ve yönetimin anlayacağı risk dili; teknik beceriyi gerçek güvenlik kazanımına dönüştüren üçlüdür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="post-exploitation" /><category term="sızma testi" /><category term="siber güvenlik raporlama" /><summary type="html"><![CDATA[Bir sızma testinde ilk erişimi elde etmek final değil, yalnızca hikâyenin dönüm noktasıdır. Post-exploitation aşaması; ele geçirilen erişimin etkisini, saldırganın ilerleyebileceği yolları ve kurumun bu hareketleri fark etme kapasitesini yetkilendirilmiş sınırlar içinde incelemeyi amaçlar. Buradaki başarı, sisteme gizlice yerleşmekten çok riski güvenli biçimde kanıtlamak, iz bırakmadan değil kontrollü iz bırakarak çalışmak ve test sonunda ortamı başlangıç durumuna döndürmektir.]]></summary></entry><entry><title type="html">Veri Setlerindeki Sessiz Önyargılar: Modelin Kararlarını Şekillendiren Görünmez Eller</title><link href="https://sonsuzus.github.io/posts/veri-setlerindeki-sessiz-onyargilar-modelin-kararlarini-sekillendiren-gorunmez-eller/" rel="alternate" type="text/html" title="Veri Setlerindeki Sessiz Önyargılar: Modelin Kararlarını Şekillendiren Görünmez Eller" /><published>2026-07-27T00:00:00+00:00</published><updated>2026-07-27T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/veri-setlerindeki-sessiz-onyargilar-modelin-kararlarini-sekillendiren-gorunmez-eller</id><content type="html" xml:base="https://sonsuzus.github.io/posts/veri-setlerindeki-sessiz-onyargilar-modelin-kararlarini-sekillendiren-gorunmez-eller/"><![CDATA[<p>Bir makine öğrenmesi modeli dünyayı doğrudan gözlemlemez; ona sunduğumuz veri setinin penceresinden bakar. Pencerenin camı çizik, renkli veya yalnızca belirli bir sokağa dönükse model de gerçeği öyle sanır. Bu nedenle toplumsal önyargılar, kötü niyetli bir algoritma yazılmasa bile veri toplama, etiketleme ve örnekleme süreçlerinden modele sessizce sızabilir.
``</p>

<h2 id="model-değil-geçmiş-konuşuyor">Model değil, geçmiş konuşuyor</h2>

<p>Denetimli öğrenmede model, girdiler $X$ ile hedef değişken $Y$ arasındaki ilişkiyi öğrenmeye çalışır. Basitçe amaç, tahmin hatasını küçülten bir $f(X)$ fonksiyonu bulmaktır:</p>

\[f^* = argmin_f E[L(Y, f(X))]\]

<p>Ancak $Y$ tarafındaki etiketler geçmişte verilmiş insan kararlarından oluşuyorsa model yalnızca gerçeği değil, o kararların önyargılarını da öğrenir. Örneğin işe alım verisinde geçmiş çalışanların çoğu erkekse, başarılı çalışan etiketi erkeklikle dolaylı biçimde ilişkilendirilebilir. Cinsiyet sütununu silmek de yeterli değildir; askerlik durumu, okul, posta kodu veya kariyer araları aynı bilgiyi taşıyan vekil değişkenlere dönüşebilir.</p>

<table>
  <thead>
    <tr>
      <th>Veri toplama sorunu</th>
      <th>Somut örnek</th>
      <th>Modeldeki olası sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Eksik temsil</td>
      <td>Yüz veri setinde koyu tenli kişilerin az olması</td>
      <td>Bazı yüzlerde daha yüksek hata</td>
    </tr>
    <tr>
      <td>Tarihsel önyargı</td>
      <td>Geçmiş terfilerde kadınların geri planda kalması</td>
      <td>Terfi puanlarının eşitsizleşmesi</td>
    </tr>
    <tr>
      <td>Ölçüm yanlılığı</td>
      <td>Sağlık ihtiyacını harcama miktarıyla ölçmek</td>
      <td>Sağlığa erişemeyenleri düşük riskli sanmak</td>
    </tr>
    <tr>
      <td>Seçim yanlılığı</td>
      <td>Anketi yalnızca internet kullanıcılarına sunmak</td>
      <td>Toplumun tamamını temsil etmeyen sonuçlar</td>
    </tr>
    <tr>
      <td>Etiketleme yanlılığı</td>
      <td>Aynı davranışın farklı gruplarda farklı yorumlanması</td>
      <td>Hatalı sınıflandırma oranlarının ayrışması</td>
    </tr>
  </tbody>
</table>

<h2 id="polis-verisi-paradoksu">Polis verisi paradoksu</h2>

<p>Bir bölgede daha fazla polis devriyesi yapılırsa daha fazla olay kaydedilebilir. Veri seti bu kayıtlarla oluşturulduğunda model, bölgenin doğası gereği daha riskli olduğu sonucuna varır. Ardından bölgeye daha fazla devriye gönderilir ve daha çok kayıt üretilir. Böylece veri, tahmini; tahmin de yeni veriyi besleyen bir döngü yaratır. Bu durum, termometrenin ateşi ölçmek yerine ateşi yükseltmesine benzer.</p>

<p>Benzer bir sorun sağlık alanında görülür. Bir sistem, hastanın sağlık ihtiyacını geçmiş sağlık harcamasıyla temsil edebilir. Oysa iki grubun hastalık düzeyi aynı olsa bile sağlık hizmetine erişimi düşük grubun harcaması daha azdır. Model şu hatalı varsayımı öğrenir: düşük harcama eşittir düşük ihtiyaç.</p>

<h2 id="ortalamalar-adaleti-garanti-etmez">Ortalamalar adaleti garanti etmez</h2>

<p>Bir modelin genel doğruluğunun yüzde 92 olması etkileyici görünebilir. Fakat başarı gruplara göre ayrıştırılmadığında önemli farklar saklanır. Örneğin yanlış negatif oranı şöyle tanımlanır:</p>

\[FNR = FN / (FN + TP)\]

<p>Toplam hata düşükken $FNR_A = 0.08$ ve $FNR_B = 0.31$ olabilir. Yani model, B grubundaki gerçek olumlu örnekleri yaklaşık dört kat daha sık kaçırmaktadır.</p>

<p>Aşağıdaki Python kodu, sonuçları gruplara göre inceleyerek bu sessiz farkı görünür kılar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">from</span> <span class="n">sklearn.metrics</span> <span class="kn">import</span> <span class="n">confusion_matrix</span>

<span class="k">def</span> <span class="nf">grup_raporu</span><span class="p">(</span><span class="n">df</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">grup</span><span class="p">,</span> <span class="n">parca</span> <span class="ow">in</span> <span class="n">df</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">'</span><span class="s">grup</span><span class="sh">'</span><span class="p">):</span>
        <span class="n">tn</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">fn</span><span class="p">,</span> <span class="n">tp</span> <span class="o">=</span> <span class="nf">confusion_matrix</span><span class="p">(</span>
            <span class="n">parca</span><span class="p">[</span><span class="sh">'</span><span class="s">gercek</span><span class="sh">'</span><span class="p">],</span> <span class="n">parca</span><span class="p">[</span><span class="sh">'</span><span class="s">tahmin</span><span class="sh">'</span><span class="p">],</span> <span class="n">labels</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
        <span class="p">).</span><span class="nf">ravel</span><span class="p">()</span>

        <span class="n">fnr</span> <span class="o">=</span> <span class="n">fn</span> <span class="o">/</span> <span class="p">(</span><span class="n">fn</span> <span class="o">+</span> <span class="n">tp</span><span class="p">)</span> <span class="k">if</span> <span class="n">fn</span> <span class="o">+</span> <span class="n">tp</span> <span class="k">else</span> <span class="mi">0</span>
        <span class="n">fpr</span> <span class="o">=</span> <span class="n">fp</span> <span class="o">/</span> <span class="p">(</span><span class="n">fp</span> <span class="o">+</span> <span class="n">tn</span><span class="p">)</span> <span class="k">if</span> <span class="n">fp</span> <span class="o">+</span> <span class="n">tn</span> <span class="k">else</span> <span class="mi">0</span>
        <span class="nf">print</span><span class="p">(</span><span class="n">grup</span><span class="p">,</span> <span class="p">{</span><span class="sh">'</span><span class="s">FNR</span><span class="sh">'</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="n">fnr</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="sh">'</span><span class="s">FPR</span><span class="sh">'</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="n">fpr</span><span class="p">,</span> <span class="mi">3</span><span class="p">)})</span>
</code></pre></div></div>

<p>Kod, yalnızca genel doğruluğa bakmak yerine her grup için yanlış negatif ve yanlış pozitif oranlarını hesaplar. Elbette grupları analiz etmek, kişileri kalıcı kalıplara hapsetmek için değil, sistematik zararları teşhis etmek için kullanılmalıdır.</p>

<h2 id="daha-dikkatli-veri-daha-dürüst-model">Daha dikkatli veri, daha dürüst model</h2>

<table>
  <thead>
    <tr>
      <th>Kontrol</th>
      <th>Sorulması gereken soru</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kaynak analizi</td>
      <td>Veriyi kim, hangi amaçla topladı?</td>
    </tr>
    <tr>
      <td>Temsil kontrolü</td>
      <td>Hangi gruplar az veya hiç temsil edilmiyor?</td>
    </tr>
    <tr>
      <td>Etiket denetimi</td>
      <td>Etiket bir gerçek mi, insan yorumu mu?</td>
    </tr>
    <tr>
      <td>Vekil değişken taraması</td>
      <td>Hassas özellikler başka sütunlardan çıkarılabilir mi?</td>
    </tr>
    <tr>
      <td>Grup bazlı değerlendirme</td>
      <td>Hata oranları gruplar arasında değişiyor mu?</td>
    </tr>
    <tr>
      <td>Sürekli izleme</td>
      <td>Model devreye girdikten sonra yeni eşitsizlik üretiyor mu?</td>
    </tr>
  </tbody>
</table>

<p>Çözüm yalnızca veri setini büyütmek değildir; yanlış mekanizmayla toplanan daha fazla veri, önyargıyı daha güvenilir biçimde yeniden üretir. Veri kartları hazırlamak, örnekleme sürecini belgelemek, etkilenen toplulukları tasarıma katmak ve modelleri düzenli olarak denetlemek gerekir. Çünkü algoritmalar görünmez eller değildir; asıl görünmez eller, hangi olayın kaydedildiğine, kimin temsil edildiğine ve neyin başarı sayıldığına karar veren süreçlerdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zeka etiği" /><category term="veri önyargısı" /><category term="makine öğrenmesi" /><summary type="html"><![CDATA[Bir makine öğrenmesi modeli dünyayı doğrudan gözlemlemez; ona sunduğumuz veri setinin penceresinden bakar. Pencerenin camı çizik, renkli veya yalnızca belirli bir sokağa dönükse model de gerçeği öyle sanır. Bu nedenle toplumsal önyargılar, kötü niyetli bir algoritma yazılmasa bile veri toplama, etiketleme ve örnekleme süreçlerinden modele sessizce sızabilir.]]></summary></entry><entry><title type="html">Ağdaki Görünmez Gözler: Wireshark ve Ettercap ile MitM Analizi</title><link href="https://sonsuzus.github.io/posts/agdaki-gorunmez-gozler-wireshark-ve-ettercap-ile-mitm-analizi/" rel="alternate" type="text/html" title="Ağdaki Görünmez Gözler: Wireshark ve Ettercap ile MitM Analizi" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/agdaki-gorunmez-gozler-wireshark-ve-ettercap-ile-mitm-analizi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/agdaki-gorunmez-gozler-wireshark-ve-ettercap-ile-mitm-analizi/"><![CDATA[<p>Bir ağdan geçen veriler gerçekten görünmez mi? Ne yazık ki hayır. Özellikle şifrelenmemiş protokoller kullanıldığında paketler, aynı ağı paylaşan kötü niyetli kişiler tarafından okunabilir. Wireshark ve Ettercap, yalnızca izinli laboratuvar ortamlarında kullanıldığında bu riski gözlemlemek, paketlerin yapısını öğrenmek ve savunma yöntemlerini test etmek için oldukça güçlü araçlardır.</p>

<p>``</p>

<h2 id="paket-dinleme-nasıl-çalışır">Paket dinleme nasıl çalışır?</h2>

<p>Bilgisayarlar iletişim kurarken veriyi küçük paketlere böler. Her pakette kaynak ve hedef adresleri, kullanılan protokol ve taşınan veri gibi alanlar bulunur. Ağ kartı normalde yalnızca kendisine gönderilen çerçeveleri işler. <strong>Promiscuous mode</strong> etkinleştirildiğinde ise erişebildiği diğer çerçeveleri de yakalama yazılımına iletebilir.</p>

<p>Yakalanan veri miktarı yaklaşık olarak</p>

\[D = R \times t\]

<p>şeklinde düşünülebilir. Burada $R$ saniyedeki ortalama trafik miktarını, $t$ dinleme süresini, $D$ ise incelenecek toplam veriyi temsil eder. Yoğun bir ağda kısa süreli kayıtların bile hızla büyümesinin nedeni budur.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Wireshark</th>
      <th>Ettercap</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel amaç</td>
      <td>Paket yakalama ve ayrıntılı analiz</td>
      <td>MitM senaryolarını laboratuvarda inceleme</td>
    </tr>
    <tr>
      <td>Kullanım biçimi</td>
      <td>Grafik arayüz ve görüntüleme filtreleri</td>
      <td>Grafik veya terminal arayüzü</td>
    </tr>
    <tr>
      <td>Güçlü yanı</td>
      <td>Protokol çözümleme</td>
      <td>Ağ uçları arasındaki akışı gözlemleme</td>
    </tr>
    <tr>
      <td>Başlıca risk</td>
      <td>Hassas verilerin kaydedilmesi</td>
      <td>Aktif ağ müdahalesi ve bağlantı bozulması</td>
    </tr>
  </tbody>
</table>

<h2 id="wireshark-ile-güvenli-trafik-analizi">Wireshark ile güvenli trafik analizi</h2>

<p>Kendi bilgisayarınızda veya izole bir sanal laboratuvarda doğru ağ arayüzü seçilerek kayıt başlatılabilir. Wireshark yüzlerce protokolü tanıdığı için filtre kullanmak önemlidir. Aşağıdaki görüntüleme filtreleri mevcut kayıt içerisindeki paketleri daraltır; yeni bir saldırı gerçekleştirmez:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http

dns

tcp.port == 80

ip.addr == 192.0.2.10
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">http</code>, şifrelenmemiş HTTP paketlerini; <code class="language-plaintext highlighter-rouge">dns</code>, alan adı sorgularını gösterir. <code class="language-plaintext highlighter-rouge">tcp.port == 80</code> belirli bir TCP portuna, <code class="language-plaintext highlighter-rouge">ip.addr</code> ise dokümantasyon amacıyla ayrılmış örnek bir IP adresine odaklanır. Bir paket seçildiğinde Ethernet, IP, TCP ve uygulama katmanları ayrı ayrı açılarak başlık bilgileri incelenebilir.</p>

<p>Komut satırında yalnızca kendi arayüzünüzde temel bir protokol özeti görmek için TShark da kullanılabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tshark <span class="nt">-i</span> &lt;izinli-arayuz&gt; <span class="nt">-f</span> <span class="s2">"tcp port 80"</span>
</code></pre></div></div>

<p>Bu komut HTTP içeriğini değiştirmez; belirtilen arayüzdeki 80 numaralı TCP portuna ait trafiği görüntüler. Yakalama dosyaları hassas bilgi içerebileceğinden paylaşılmadan önce anonimleştirilmelidir.</p>

<h2 id="ettercap-ve-ortadaki-adam-mantığı">Ettercap ve ortadaki adam mantığı</h2>

<p>MitM saldırısında saldırgan, iki uç arasındaki iletişimin ortasına yerleşmeye çalışır. Yerel ağlarda bunun tarihsel örneklerinden biri, sahte ARP yanıtlarıyla cihazların IP–MAC eşleştirmelerini yanıltmaktır. Trafik saldırgan üzerinden geçerse şifrelenmemiş içerik okunabilir veya değiştirilebilir.</p>

<p>Ettercap bu davranışı eğitim laboratuvarlarında canlandırabilir; ancak aktif ARP manipülasyonu gerçek ağlarda kesintiye, veri ihlaline ve hukuki sonuçlara yol açabilir. Bu nedenle saldırı komutları üretim ağında denenmemeli; yalnızca sahibi olduğunuz, internetten ayrılmış sanal makinelerde ve açık izinle çalışılmalıdır.</p>

<h2 id="şifreleme-neden-oyunu-değiştirir">Şifreleme neden oyunu değiştirir?</h2>

<p>HTTP kullanıldığında istek yolu, başlıklar ve form alanları açık biçimde görülebilir. HTTPS ise uygulama verisini TLS ile şifreler. Dinleyici IP adresleri, portlar ve paket boyutları gibi metaverileri görebilse de içerik uygun anahtar olmadan anlamlı değildir.</p>

<table>
  <thead>
    <tr>
      <th>Protokol</th>
      <th>İçerik görünürlüğü</th>
      <th>Tercih</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>HTTP, FTP, Telnet</td>
      <td>Genellikle açık metin</td>
      <td>Kullanılmamalı</td>
    </tr>
    <tr>
      <td>HTTPS, SFTP, SSH</td>
      <td>Şifreli</td>
      <td>Önerilir</td>
    </tr>
    <tr>
      <td>Güvensiz Wi-Fi</td>
      <td>Dinlemeye daha açık</td>
      <td>VPN ve HTTPS kullanılmalı</td>
    </tr>
  </tbody>
</table>

<p>Savunma için HTTPS zorunluluğu, güvenli DNS seçenekleri, VPN, dinamik ARP denetimi, istemci izolasyonu ve sertifika uyarılarının ciddiye alınması önemlidir. Wireshark ile olağan dışı ARP yanıtları veya tekrarlanan adres değişimleri araştırılabilir. Kısacası bu araçların en değerli kullanımı başkalarının verisini yakalamak değil, kendi ağımızın hangi koşullarda savunmasız kaldığını görüp şifrelemeyi doğru uygulamaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Wireshark" /><category term="Ettercap" /><category term="ağ güvenliği" /><summary type="html"><![CDATA[Bir ağdan geçen veriler gerçekten görünmez mi? Ne yazık ki hayır. Özellikle şifrelenmemiş protokoller kullanıldığında paketler, aynı ağı paylaşan kötü niyetli kişiler tarafından okunabilir. Wireshark ve Ettercap, yalnızca izinli laboratuvar ortamlarında kullanıldığında bu riski gözlemlemek, paketlerin yapısını öğrenmek ve savunma yöntemlerini test etmek için oldukça güçlü araçlardır.]]></summary></entry><entry><title type="html">Bilgi Toplama Araçları: Nmap, Maltego ve Recon-ng ile Footprinting Mantığı</title><link href="https://sonsuzus.github.io/posts/bilgi-toplama-araclari-nmap-maltego-ve-recon-ng-ile-footprinting-mantigi/" rel="alternate" type="text/html" title="Bilgi Toplama Araçları: Nmap, Maltego ve Recon-ng ile Footprinting Mantığı" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/bilgi-toplama-araclari-nmap-maltego-ve-recon-ng-ile-footprinting-mantigi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/bilgi-toplama-araclari-nmap-maltego-ve-recon-ng-ile-footprinting-mantigi/"><![CDATA[<p>Bir sistemi güvenli hâle getirmenin ilk adımı, saldırgan gözüyle ne kadar görünür olduğunu anlamaktır. Bilgi toplama, yani footprinting, hedef hakkında alan adları, IP aralıkları, açık portlar, kullanılan teknolojiler, ilişkili e-posta adresleri ve organizasyon yapısı gibi ipuçlarını sistemli biçimde toplamaktır. Elbette bu süreç yalnızca izinli testlerde, kendi laboratuvarında veya kurum içi güvenlik çalışmalarında yapılmalıdır; çünkü aynı teknikler savunma kadar kötüye kullanım için de değerlidir.
``</p>

<p>Bilgi toplama iki ana aileye ayrılır: pasif ve aktif. Pasif toplamada hedef sisteme doğrudan dokunmadan açık kaynaklardan veri çekilir; arama motorları, WHOIS kayıtları, sertifika şeffaflığı kayıtları ve sosyal ağlar buna örnektir. Aktif toplamada ise hedefe paket gönderilir; port taraması, servis sürüm tespiti ve ağ haritalama bu gruba girer. Basit bir zihinsel model kurarsak, görünür risk yaklaşık şöyle düşünülebilir: $R = A \times E \times V$. Burada $A$ saldırı yüzeyi, $E$ erişilebilirlik, $V$ ise zafiyet olasılığıdır. Bilgi toplama, bu üç değişkeni daha net ölçmeye yarar.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th style="text-align: right">Hedefe temas</th>
      <th>Tipik araç</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Pasif OSINT</td>
      <td style="text-align: right">Yok veya çok az</td>
      <td>Maltego, Recon-ng</td>
      <td>Sessiz ve geniş kapsamlı</td>
      <td>Veri eski olabilir</td>
    </tr>
    <tr>
      <td>Aktif tarama</td>
      <td style="text-align: right">Var</td>
      <td>Nmap</td>
      <td>Güncel teknik sonuç verir</td>
      <td>Log bırakır, izin gerekir</td>
    </tr>
    <tr>
      <td>Hibrit analiz</td>
      <td style="text-align: right">Kontrollü</td>
      <td>Üçü birlikte</td>
      <td>Daha doğru korelasyon</td>
      <td>Yanlış yorum maliyeti artar</td>
    </tr>
  </tbody>
</table>

<p>Nmap, aktif keşif tarafının İsviçre çakısı gibidir. Bir ağı haritalamak, açık portları görmek ve servislerin sürümlerini tahmin etmek için kullanılır. Örneğin kendi test makinenizde şu komut, yaygın portları ve servis bilgilerini listeler:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-sV</span> <span class="nt">-O</span> 192.168.56.10
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">-sV</code> servis sürüm tespiti yapar, <code class="language-plaintext highlighter-rouge">-O</code> işletim sistemi tahminini dener. Sonuçta 22/tcp üzerinde OpenSSH, 80/tcp üzerinde Nginx gibi bilgiler görebilirsiniz. Ancak çıktıyı büyülü kehanet gibi değil, olasılık tablosu gibi okumak gerekir. Nmap paket davranışlarından tahmin yapar; güvenlik duvarları, ters proxyler veya honeypotlar sonuçları yanıltabilir.</p>

<p>Maltego ise ilişkileri görselleştirme konusunda parlıyor. Bir alan adından başlayıp DNS kayıtlarına, alt alan adlarına, e-posta desenlerine, sosyal medya izlerine ve şirket bağlantılarına uzanan bir grafik çıkarabilir. Maltego’nun gücü tek bir veriden çok, düğümler arasındaki ilişkiyi göstermesidir. Örneğin bir e-posta adresinin aynı zamanda sızmış veri kümelerinde, GitHub commitlerinde ve kurum sayfalarında görünmesi, savunma ekibine farkındalık eğitimi veya erişim politikası açısından sinyal verebilir.</p>

<p>Recon-ng, terminal sevenler için modüler bir OSINT çatısıdır. Metasploit benzeri bir çalışma akışı vardır: workspace oluştur, modül seç, kaynak ekle, sonucu tabloya yaz. Kendi alan adınız üzerinde pasif keşif yaparken şöyle bir akış kullanılabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>recon-ng
workspaces create lab
marketplace search domains
modules load recon/domains-hosts/hackertarget
options <span class="nb">set </span>SOURCE example.com
run
show hosts
</code></pre></div></div>

<p>Bu komutlar, seçilen modül destekliyorsa <code class="language-plaintext highlighter-rouge">example.com</code> için host kayıtlarını toplar ve veritabanında saklar. Recon-ng’nin güzel tarafı, çıktıları düzenli tutmasıdır; böylece bulunan alt alan adlarını daha sonra Nmap ile doğrulayabilir veya Maltego grafiğine aktarabilirsiniz.</p>

<p>Pratikte iyi bir bilgi toplama süreci sırayla ilerler: kapsamı belirle, pasif kaynaklardan veri topla, veriyi temizle, aktif taramayı yalnızca izinli aralıkta çalıştır, sonuçları ilişkilendir ve raporla. En sık yapılan hata, araç çıktısını doğrudan gerçek kabul etmektir. Oysa aynı IP üzerinde CDN, paylaşımlı hosting veya bulut yük dengeleyici olabilir. Bu yüzden her bulguya güven puanı vermek faydalıdır: $G = \frac{D}{T}$ gibi basit bir oran düşünebiliriz; burada $D$ doğrulanan kaynak sayısı, $T$ toplam iddia sayısıdır.</p>

<p>Sonuç olarak Nmap sana teknik kapıları, Maltego ilişkisel haritayı, Recon-ng ise tekrarlanabilir OSINT akışını sunar. Üçünü birlikte kullandığında hedefin dijital siluetini daha net görürsün. Ama unutma: iyi bir güvenlik uzmanını araç listesi değil, etik sınırları, metodolojisi ve bulguları doğru yorumlama becerisi güçlü yapar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="siber güvenlik" /><category term="information gathering" /><category term="nmap" /><category term="osint" /><summary type="html"><![CDATA[Bir sistemi güvenli hâle getirmenin ilk adımı, saldırgan gözüyle ne kadar görünür olduğunu anlamaktır. Bilgi toplama, yani footprinting, hedef hakkında alan adları, IP aralıkları, açık portlar, kullanılan teknolojiler, ilişkili e-posta adresleri ve organizasyon yapısı gibi ipuçlarını sistemli biçimde toplamaktır. Elbette bu süreç yalnızca izinli testlerde, kendi laboratuvarında veya kurum içi güvenlik çalışmalarında yapılmalıdır; çünkü aynı teknikler savunma kadar kötüye kullanım için de değerlidir.]]></summary></entry></feed>