<?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-11-14T08:05:43+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">Adli Bilişimde Steganaliz: Piksellerin ve Seslerin Sakladığı Sırlar</title><link href="https://program.sonsuz.us/posts/adli-bilisimde-steganaliz-piksellerin-ve-seslerin-sakladigi-sirlar/" rel="alternate" type="text/html" title="Adli Bilişimde Steganaliz: Piksellerin ve Seslerin Sakladığı Sırlar" /><published>2026-11-14T00:00:00+00:00</published><updated>2026-11-14T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/adli-bilisimde-steganaliz-piksellerin-ve-seslerin-sakladigi-sirlar</id><content type="html" xml:base="https://program.sonsuz.us/posts/adli-bilisimde-steganaliz-piksellerin-ve-seslerin-sakladigi-sirlar/"><![CDATA[<p>Bir tatil fotoğrafı yalnızca deniz manzarası mı gösterir, yoksa içinde ikinci bir hikâye mi taşır? Steganografi, bilgiyi başka bir dosyanın içinde saklarken steganaliz bu saklama işleminin izlerini arar. Adli bilişim uzmanının görevi, piksellere büyüteç tutmaktan biraz daha karmaşıktır: doğal değişkenlikle bilinçli müdahaleyi birbirinden ayırmak gerekir.</p>

<p>``</p>

<h2 id="gizli-mesajdan-önce-gelen-soru-normal-olan-ne">Gizli mesajdan önce gelen soru: Normal olan ne?</h2>

<p>Şifreleme, mesajın anlamını gizler; steganografi ise mesajın varlığını saklamaya çalışır. Steganaliz bu nedenle çoğunlukla doğrudan mesaj okumaz. Önce dosyanın beklenen istatistiksel davranışından sapıp sapmadığını araştırır.</p>

<p>Basit bir örnek, görüntüdeki renk değerlerinin en düşük anlamlı bitinin değiştirilmesidir. LSB adı verilen bu yaklaşımda, sekiz bitlik bir piksel bileşeni şu şekilde güncellenebilir:</p>

\[x' = 2\lfloor x/2 \rfloor + m\]

<p>Burada $m$, saklanan sıfır veya bir bitidir. Değişim en fazla bir yoğunluk seviyesidir; gözünüz bunu kaçırabilir, fakat binlerce değişiklik istatistiksel iz bırakabilir. Yine de her steganografi yöntemi LSB kullanmaz.</p>

<table>
  <thead>
    <tr>
      <th>İnceleme alanı</th>
      <th>Beklenen iz</th>
      <th>Önemli sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Piksel LSB analizi</td>
      <td>Bit dağılımında değişim</td>
      <td>Doğal gürültüyle karışabilir</td>
    </tr>
    <tr>
      <td>JPEG katsayıları</td>
      <td>DCT istatistiklerinde sapma</td>
      <td>Yeniden sıkıştırma benzer iz bırakabilir</td>
    </tr>
    <tr>
      <td>Ses örnekleri</td>
      <td>Bit veya korelasyon anomalileri</td>
      <td>Kayıt cihazı sonucu etkiler</td>
    </tr>
    <tr>
      <td>Dosya yapısı</td>
      <td>Beklenmeyen bloklar, ek veri</td>
      <td>Meşru metadata da bulunabilir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/adli-bilisimde-steganaliz-48.svg" alt="adli-bilisimde-steganaliz-48" /></p>

<h2 id="önce-delili-koru-sonra-dedektifliğe-başla">Önce delili koru, sonra dedektifliğe başla</h2>

<p>İnceleme, özgün dosyanın salt okunur korunmasıyla başlamalıdır. Dosyanın SHA-256 özeti alınır; çalışma kopyası, araç sürümleri ve yapılan işlemler kaydedilir. Özet, sonradan değişiklik kontrolü sağlar; tek başına dosyanın kaynağını doğrulamaz.</p>

<p>Ardından uzantı ile gerçek dosya biçimi karşılaştırılır. Metadata, boyut, dosya sonundaki ek baytlar ve kapsayıcı yapısı incelenir. Biçim doğrulayıcıları ve hex görüntüleyiciler burada yararlıdır. Eklenmiş bir arşiv bulmak önemli olabilir; ancak bu bulgu, piksel düzeyinde gizleme yapıldığını göstermez.</p>

<h2 id="görsellerde-istatistiksel-büyüteç">Görsellerde istatistiksel büyüteç</h2>

<p>LSB değiştirme, bazı koşullarda komşu değer çiftlerinin frekanslarını birbirine yaklaştırır: örneğin 100 ve 101. Aşağıdaki örnek, kayıpsız RGB bir PNG dosyasının kırmızı kanalında bu çiftleri karşılaştırır. Eğitim amaçlıdır; genel geçer bir dedektör değildir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">PIL</span> <span class="kn">import</span> <span class="n">Image</span>
<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">chi2</span>

<span class="k">with</span> <span class="n">Image</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="sh">'</span><span class="s">inceleme.png</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">image</span><span class="p">:</span>
    <span class="k">if</span> <span class="n">image</span><span class="p">.</span><span class="nb">format</span> <span class="o">!=</span> <span class="sh">'</span><span class="s">PNG</span><span class="sh">'</span> <span class="ow">or</span> <span class="n">image</span><span class="p">.</span><span class="n">mode</span> <span class="o">!=</span> <span class="sh">'</span><span class="s">RGB</span><span class="sh">'</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">'</span><span class="s">RGB biçiminde bir PNG gerekli.</span><span class="sh">'</span><span class="p">)</span>
    <span class="n">red</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">asarray</span><span class="p">(</span><span class="n">image</span><span class="p">)[:,</span> <span class="p">:,</span> <span class="mi">0</span><span class="p">]</span>

<span class="n">hist</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">bincount</span><span class="p">(</span><span class="n">red</span><span class="p">.</span><span class="nf">ravel</span><span class="p">(),</span> <span class="n">minlength</span><span class="o">=</span><span class="mi">256</span><span class="p">)</span>
<span class="n">pairs</span> <span class="o">=</span> <span class="n">hist</span><span class="p">.</span><span class="nf">reshape</span><span class="p">(</span><span class="mi">128</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">totals</span> <span class="o">=</span> <span class="n">pairs</span><span class="p">.</span><span class="nf">sum</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">valid</span> <span class="o">=</span> <span class="n">totals</span> <span class="o">&gt;=</span> <span class="mi">10</span>
<span class="n">expected</span> <span class="o">=</span> <span class="n">totals</span><span class="p">[</span><span class="n">valid</span><span class="p">,</span> <span class="bp">None</span><span class="p">]</span> <span class="o">/</span> <span class="mi">2</span>
<span class="n">score</span> <span class="o">=</span> <span class="p">(((</span><span class="n">pairs</span><span class="p">[</span><span class="n">valid</span><span class="p">]</span> <span class="o">-</span> <span class="n">expected</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">/</span> <span class="n">expected</span><span class="p">).</span><span class="nf">sum</span><span class="p">()</span>
<span class="n">df</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">valid</span><span class="p">.</span><span class="nf">sum</span><span class="p">())</span>
<span class="n">p_value</span> <span class="o">=</span> <span class="n">chi2</span><span class="p">.</span><span class="nf">sf</span><span class="p">(</span><span class="n">score</span><span class="p">,</span> <span class="n">df</span><span class="p">)</span> <span class="k">if</span> <span class="n">df</span> <span class="k">else</span> <span class="nf">float</span><span class="p">(</span><span class="sh">'</span><span class="s">nan</span><span class="sh">'</span><span class="p">)</span>
<span class="nf">print</span><span class="p">({</span><span class="sh">'</span><span class="s">chi_square</span><span class="sh">'</span><span class="p">:</span> <span class="nf">float</span><span class="p">(</span><span class="n">score</span><span class="p">),</span> <span class="sh">'</span><span class="s">p_value</span><span class="sh">'</span><span class="p">:</span> <span class="nf">float</span><span class="p">(</span><span class="n">p_value</span><span class="p">)})</span>
</code></pre></div></div>

<p>Kod, az örnek içeren çiftleri dışarıda bırakarak eşit frekans varsayımına karşı yaklaşık bir ki-kare testi hesaplar. Büyük p-değeri, bu varsayımla güçlü bir uyumsuzluk görülmediğini söyler; <strong>gizli veri bulunma olasılığını vermez</strong>. Küçük değer de gizleme olmadığını kanıtlamaz. Görüntünün dokusu, işleme geçmişi ve kullanılan yöntem sonucu değiştirebilir. Aynı kaynaktan temiz referanslarla karşılaştırma yapmak, tek dosyayı yorumlamaktan daha değerlidir.</p>

<h2 id="ses-dosyalarında-kulak-yetmez">Ses dosyalarında kulak yetmez</h2>

<p>Ses steganalizinde dalga biçimi, spektrogram, örneklerin düşük bitleri ve örnekler arası ilişkiler birlikte değerlendirilir. LSB yöntemleri örnek değerlerini değiştirirken faz kodlama veya yankı tabanlı yöntemler farklı izler bırakabilir. Spektrogramdaki alışılmadık çizgiler araştırma ipucudur; otomatik olarak gizli mesaj anlamına gelmez.</p>

<p>PCM ses incelenirken özgün örnek derinliği korunmalıdır. Yeniden örnekleme, normalizasyon veya kayıplı kodlama, aranan izleri bozabilir. MP3 gibi sıkıştırılmış biçimlerde ise yalnızca çözülmüş sesin LSB değerlerine bakmak yetersizdir; kodlayıcının yapısı ve sıkıştırma alanındaki özellikler ayrıca değerlendirilmelidir.</p>

<h2 id="sonuç-şüphe-kanıtın-başlangıcıdır">Sonuç: Şüphe, kanıtın başlangıcıdır</h2>

<p>Güvenilir değerlendirme; yapısal incelemeyi, istatistiksel testleri ve mümkünse bağımsız araçların sonuçlarını birleştirir. Makine öğrenmesi modelleri yardımcı olabilir, ancak farklı kamera veya kodlayıcılarda performansları düşebilir. Düşük yanlış pozitif oranı bile büyük dosya koleksiyonlarında çok sayıda gereksiz alarm üretebilir.</p>

<p>Raporda kullanılan yöntemler, referans veriler, belirsizlikler ve alternatif açıklamalar belirtilmelidir. “Şüpheli özellikler bulundu” ile “gizli içerik doğrulandı” aynı hüküm değildir. Steganalizde iyi dedektiflik, dosyaya suçunu itiraf ettirmek değil; izlerin gerçekten ne söylediğini sabırla anlamaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="adli bilişim" /><category term="steganaliz" /><category term="steganografi" /><category term="görüntü işleme" /><category term="ses analizi" /><category term="python" /><summary type="html"><![CDATA[Bir tatil fotoğrafı yalnızca deniz manzarası mı gösterir, yoksa içinde ikinci bir hikâye mi taşır? Steganografi, bilgiyi başka bir dosyanın içinde saklarken steganaliz bu saklama işleminin izlerini arar. Adli bilişim uzmanının görevi, piksellere büyüteç tutmaktan biraz daha karmaşıktır: doğal değişkenlikle bilinçli müdahaleyi birbirinden ayırmak gerekir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/adli-bilisimde-steganaliz-48.png" /><media:content medium="image" url="https://program.sonsuz.us/img/adli-bilisimde-steganaliz-48.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Antik Dünyanın İzinde: CBS ile Yerleşimlerden Ticaret Yollarına</title><link href="https://program.sonsuz.us/posts/antik-dunyanin-izinde-cbs-ile-yerlesimlerden-ticaret-yollarina/" rel="alternate" type="text/html" title="Antik Dünyanın İzinde: CBS ile Yerleşimlerden Ticaret Yollarına" /><published>2026-11-14T00:00:00+00:00</published><updated>2026-11-14T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/antik-dunyanin-izinde-cbs-ile-yerlesimlerden-ticaret-yollarina</id><content type="html" xml:base="https://program.sonsuz.us/posts/antik-dunyanin-izinde-cbs-ile-yerlesimlerden-ticaret-yollarina/"><![CDATA[<p>Bir liman, dağ eteğinde bir yerleşim ve uzakta bir pazar merkezi düşünün. Aralarındaki çizgileri birleştirmek kolaydır; fakat antik tüccarın hangi güzergâhı seçtiğini anlamak biraz dedektiflik ister. Coğrafi Bilgi Sistemleri (CBS), konum verilerini arazi koşulları ve arkeolojik bulgularla buluşturarak bu dedektifliğe ölçülebilir bir çerçeve kazandırır.</p>

<p><img src="/img/antik-dunyanin-izinde-82.svg" alt="antik-dunyanin-izinde-82" /></p>

<p>``</p>

<h2 id="noktalardan-ilişkilere-harita-neyi-anlatır">Noktalardan ilişkilere: Harita neyi anlatır?</h2>

<p>Arkeolojik yerleşimler, CBS ortamında koordinatları ve özellikleri bulunan nesnelerdir. Her noktanın yanında tarihleme, yerleşim büyüklüğü, buluntu türleri ve konum doğruluğu gibi bilgiler tutulabilir. Böylece yalnızca “Nerede?” değil, “Hangi dönemde, hangi işlevle?” sorularını da sorabiliriz.</p>

<p>Ancak yakınlık, ticari bağlantının kanıtı değildir. İki yerleşim kuş uçuşu komşu görünürken aralarında sarp bir sırt bulunabilir. Daha uzaktaki bir merkez ise nehir vadisi sayesinde kolay erişilebilir olabilir. Kısacası, antik dünyanın navigasyonu cetvelle çalışmaz!</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Ne ölçer?</th>
      <th>Temel sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kuş uçuşu mesafe</td>
      <td>Doğrusal uzaklık</td>
      <td>Arazi engellerini yok sayar</td>
    </tr>
    <tr>
      <td>En düşük maliyetli yol</td>
      <td>Tanımlanan koşullarda en ucuz geçiş</td>
      <td>Sonuç, maliyet varsayımlarına bağlıdır</td>
    </tr>
    <tr>
      <td>Ağ analizi</td>
      <td>Merkezler arasındaki bağlantıları</td>
      <td>Eksik bağlantılar sonucu değiştirebilir</td>
    </tr>
  </tbody>
</table>

<h2 id="önce-veriyi-hazırlayalım">Önce veriyi hazırlayalım</h2>

<p>Başlangıç paketi; yerleşim koordinatları, sayısal yükseklik modeli, akarsular, geçitler ve dönemsel kıyı çizgilerinden oluşabilir. Günümüz kıyısını doğrudan antik döneme taşımak hatalıdır: alüvyon birikimi, deniz seviyesi değişimleri ve tektonik hareketler limanların çevresini değiştirmiş olabilir.</p>

<p>Verileri ortak koordinat sistemine dönüştürmek gerekir. Enlem ve boylam derecelerini metre gibi kullanmayın. Çalışma alanına uygun, metre tabanlı bir izdüşüm seçin. Ayrıca aynı analizdeki yerleşimlerin kronolojik olarak örtüşmesini denetleyin; farklı yüzyıllara ait merkezleri aynı ticaret ağında buluşturmak, tarihsel bir grup sohbetine yanlış kişileri eklemek gibidir.</p>

<p>Konum belirsizliğini de saklamayın. Yaklaşık yeri bilinen bir höyük için hata payını kaydetmek, sonraki güzergâh yorumlarının güvenilirliğini artırır.</p>

<h2 id="maliyet-yüzeyinin-mantığı">Maliyet yüzeyinin mantığı</h2>

<p>Araziyi hücrelere ayırdığımızı düşünelim. Her hücre geçişi, mesafe ve hareket güçlüğüne göre bir maliyet taşır. Basitleştirilmiş model şöyle yazılabilir:</p>

\[C(P)=\sum_{(i,j)\in P} d_{ij}k_{ij}\]

<p>Burada $P$ aday güzergâhı, $d_{ij}$ komşu hücreler arasındaki mesafeyi, $k_{ij}$ ise boyutsuz geçiş güçlüğünü gösterir. Bu tanımda sonuç süre değil, mesafeyle ölçeklenen göreli maliyettir. Saat hesaplamak istiyorsanız eğim ve hareket biçimine uygun hız modeli gerekir.</p>

<p>Eğim, zemin ve geçiş koşulları sürtünmeyi artırabilir. Geçilemeyen alanlar yalnızca pahalılaştırılmamalı, modelden çıkarılmalıdır. Nehir geçişleri ise köprü, sığlık veya mevsim bilgisine göre değerlendirilmelidir.</p>

<h2 id="python-ile-küçük-bir-ağ-deneyi">Python ile küçük bir ağ deneyi</h2>

<p>Aşağıdaki örnek, <code class="language-plaintext highlighter-rouge">geopandas</code>, <code class="language-plaintext highlighter-rouge">networkx</code> ve <code class="language-plaintext highlighter-rouge">shapely</code> kullanır. Koordinatlar ve sürtünmeler tamamen sentetiktir. EPSG:32635 burada örnek bir metrik sistemdir; her bölgeye uygun değildir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">geopandas</span> <span class="k">as</span> <span class="n">gpd</span>
<span class="kn">import</span> <span class="n">networkx</span> <span class="k">as</span> <span class="n">nx</span>
<span class="kn">from</span> <span class="n">shapely.geometry</span> <span class="kn">import</span> <span class="n">LineString</span>

<span class="n">sites</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="nc">GeoDataFrame</span><span class="p">(</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">Liman</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Vadi</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Gecit</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Pazar</span><span class="sh">"</span><span class="p">]},</span>
    <span class="n">geometry</span><span class="o">=</span><span class="n">gpd</span><span class="p">.</span><span class="nf">points_from_xy</span><span class="p">(</span>
        <span class="p">[</span><span class="mi">500000</span><span class="p">,</span> <span class="mi">505000</span><span class="p">,</span> <span class="mi">507000</span><span class="p">,</span> <span class="mi">512000</span><span class="p">],</span>
        <span class="p">[</span><span class="mi">4200000</span><span class="p">,</span> <span class="mi">4201000</span><span class="p">,</span> <span class="mi">4206000</span><span class="p">,</span> <span class="mi">4204000</span><span class="p">]</span>
    <span class="p">),</span>
    <span class="n">crs</span><span class="o">=</span><span class="sh">"</span><span class="s">EPSG:32635</span><span class="sh">"</span>
<span class="p">).</span><span class="nf">set_index</span><span class="p">(</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">)</span>

<span class="n">edges</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Liman</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Vadi</span><span class="sh">"</span><span class="p">,</span> <span class="mf">1.1</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Vadi</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Pazar</span><span class="sh">"</span><span class="p">,</span> <span class="mf">1.3</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Liman</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Gecit</span><span class="sh">"</span><span class="p">,</span> <span class="mf">2.4</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Gecit</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Pazar</span><span class="sh">"</span><span class="p">,</span> <span class="mf">1.8</span><span class="p">)</span>
<span class="p">]</span>

<span class="n">G</span> <span class="o">=</span> <span class="n">nx</span><span class="p">.</span><span class="nc">Graph</span><span class="p">()</span>
<span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">friction</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">:</span>
    <span class="n">distance</span> <span class="o">=</span> <span class="n">sites</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="n">a</span><span class="p">,</span> <span class="sh">"</span><span class="s">geometry</span><span class="sh">"</span><span class="p">].</span><span class="nf">distance</span><span class="p">(</span>
        <span class="n">sites</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="n">b</span><span class="p">,</span> <span class="sh">"</span><span class="s">geometry</span><span class="sh">"</span><span class="p">]</span>
    <span class="p">)</span>
    <span class="n">G</span><span class="p">.</span><span class="nf">add_edge</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">weight</span><span class="o">=</span><span class="n">distance</span> <span class="o">*</span> <span class="n">friction</span><span class="p">)</span>

<span class="n">path</span> <span class="o">=</span> <span class="n">nx</span><span class="p">.</span><span class="nf">shortest_path</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="sh">"</span><span class="s">Liman</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Pazar</span><span class="sh">"</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="sh">"</span><span class="s">weight</span><span class="sh">"</span><span class="p">)</span>
<span class="n">line</span> <span class="o">=</span> <span class="nc">LineString</span><span class="p">([</span><span class="n">sites</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="n">n</span><span class="p">,</span> <span class="sh">"</span><span class="s">geometry</span><span class="sh">"</span><span class="p">]</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">path</span><span class="p">])</span>
<span class="n">route</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="nc">GeoDataFrame</span><span class="p">(</span><span class="n">geometry</span><span class="o">=</span><span class="p">[</span><span class="n">line</span><span class="p">],</span> <span class="n">crs</span><span class="o">=</span><span class="n">sites</span><span class="p">.</span><span class="n">crs</span><span class="p">)</span>
<span class="n">route</span><span class="p">.</span><span class="nf">to_crs</span><span class="p">(</span><span class="mi">4326</span><span class="p">).</span><span class="nf">to_file</span><span class="p">(</span><span class="sh">"</span><span class="s">aday_rota.geojson</span><span class="sh">"</span><span class="p">,</span> <span class="n">driver</span><span class="o">=</span><span class="sh">"</span><span class="s">GeoJSON</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, tanımladığımız bağlantılar arasında toplam ağırlığı en düşük yolu bulur ve GeoJSON olarak kaydeder. Dosyayı QGIS’te açabilirsiniz. Ancak çizgiler gerçek patikalar değildir: bu, maliyetli bağlantı mantığını gösteren küçük bir ağdır. Gerçek raster uygulamasında düğümler hücreleri, kenarlar komşu hücre geçişlerini temsil eder. Yokuş çıkmakla inmek farklı maliyet taşıyorsa yönlü ağ gerekir.</p>

<h2 id="sonucu-kanıt-değil-hipotez-olarak-okuyun">Sonucu kanıt değil, hipotez olarak okuyun</h2>

<p>Aday rotayı seramik dağılımları, köprü kalıntıları, yol izleri ve yazıtlarla karşılaştırın. Ortak buluntular bağlantıyı destekleyebilir; fakat mallar aracılar üzerinden de taşınmış olabilir. Kara ve deniz taşımacılığını aynı sürtünmeyle modellemeyin.</p>

<p>Son olarak eğim ağırlıklarını ve geçiş varsayımlarını değiştirerek analizi tekrarlayın. Farklı senaryolarda korunan koridorlar daha güçlü adaylardır. Yüzey araştırmasının seyrek olduğu bölgelerdeki buluntu eksikliğini de otomatik olarak yol yokluğu saymayın. CBS geçmişi yeniden oynatmaz; hangi tarihsel açıklamaların coğrafyayla daha iyi uyuştuğunu sınamamızı sağlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="cbs" /><category term="arkeoloji" /><category term="mekansal-analiz" /><category term="python" /><category term="ticaret-yollari" /><summary type="html"><![CDATA[Bir liman, dağ eteğinde bir yerleşim ve uzakta bir pazar merkezi düşünün. Aralarındaki çizgileri birleştirmek kolaydır; fakat antik tüccarın hangi güzergâhı seçtiğini anlamak biraz dedektiflik ister. Coğrafi Bilgi Sistemleri (CBS), konum verilerini arazi koşulları ve arkeolojik bulgularla buluşturarak bu dedektifliğe ölçülebilir bir çerçeve kazandırır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/antik-dunyanin-izinde-82.png" /><media:content medium="image" url="https://program.sonsuz.us/img/antik-dunyanin-izinde-82.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Blok Zincirle Tedarik Zinciri Şeffaflığı: Rafın Arkasındaki Hikâye</title><link href="https://program.sonsuz.us/posts/blok-zincirle-tedarik-zinciri-seffafligi-rafin-arkasindaki-hikaye/" rel="alternate" type="text/html" title="Blok Zincirle Tedarik Zinciri Şeffaflığı: Rafın Arkasındaki Hikâye" /><published>2026-11-14T00:00:00+00:00</published><updated>2026-11-14T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/blok-zincirle-tedarik-zinciri-seffafligi-rafin-arkasindaki-hikaye</id><content type="html" xml:base="https://program.sonsuz.us/posts/blok-zincirle-tedarik-zinciri-seffafligi-rafin-arkasindaki-hikaye/"><![CDATA[<p>Marketten aldığınız bal gerçekten etiketteki bölgeden mi geliyor? Soğuk zincirde taşınması gereken ilaç, yol boyunca uygun sıcaklıkta mı tutuldu? Tedarik zincirinde bu soruların cevabı çoğu zaman farklı şirketlerin sistemlerine dağılır. Blok zincir, tarafların ortak bir geçmiş üzerinde uzlaşmasını sağlayarak ürünün yolculuğunu daha denetlenebilir hâle getirebilir.</p>

<p>``</p>

<h2 id="bir-kavanoz-balın-dijital-pasaportu">Bir kavanoz balın dijital pasaportu</h2>

<p>Yolculuk, üreticinin bal partisine benzersiz bir kimlik vermesiyle başlar. Paketleyici, taşıyıcı ve market, bu kimlikle ilişkili olaylar ekler. Her olay; aktör, zaman, konum ve işlem türü gibi alanlar içerir. Böylece yalnızca ürünün nerede olduğu değil, hangi aşamalardan geçtiği de görülebilir.</p>

<p>Ancak ürünler her zaman tek parça ilerlemez. Bir parti yüzlerce kavanoza bölünebilir; farklı partiler aynı sevkiyatta birleşebilir. Bu nedenle sistem, <strong>üst parti–alt parti ilişkilerini</strong> de kaydetmelidir. Aksi hâlde dijital pasaport, yolculuğun yarısında hafızasını kaybeder! GS1 EPCIS gibi standartlar, şirketlerin olayları ortak bir dille paylaşmasına yardımcı olur.</p>

<h2 id="değiştirilemezlik-sihir-değil-tasarımdır">Değiştirilemezlik sihir değil, tasarımdır</h2>

<p>Temel fikir, kayıtları kriptografik özetlerle birbirine bağlamaktır. Basitleştirilmiş bir modelde yeni özet şöyle hesaplanır:</p>

\[h_i = H(h_{i-1}, e_i)\]

<p>Burada $e_i$ olay verisini, $h_{i-1}$ önceki özeti, $H$ ise SHA-256 gibi bir özet fonksiyonunu temsil eder. Eski bir olay değiştirilirse sonraki bağlantılar tutarsızlaşır. Gerçek blok zincirlerde olaylar genellikle bloklarda gruplanır; dijital imzalar yetkilendirilmiş anahtarın kullanımını doğrular, uzlaşma mekanizması hangi geçmişin kabul edileceğini belirler.</p>

<p>Dolayısıyla “değiştirilemez”, hiçbir koşulda değiştirilemez demek değildir. Güvence; doğrulayıcıların bağımsızlığına, anahtar güvenliğine ve ağın yönetim kurallarına bağlıdır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güven modeli</th>
      <th>Başlıca sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Merkezi veritabanı</td>
      <td>Tek işletmeciye güven</td>
      <td>Yönetici geçmişi değiştirebilir</td>
    </tr>
    <tr>
      <td>İzinli blok zincir</td>
      <td>Yetkili kurumlar birlikte doğrular</td>
      <td>Kurumlar anlaşarak sistemi etkileyebilir</td>
    </tr>
    <tr>
      <td>Açık blok zincir</td>
      <td>Protokol ve ekonomik teşvikler</td>
      <td>Ücret, mahremiyet ve kapasite sorunları</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/blok-zincirle-tedarik-93.svg" alt="blok-zincirle-tedarik-93" /></p>

<p>Tedarik zincirinde izinli ağlar sık değerlendirilir; çünkü katılımcılar genellikle bilinen şirketlerdir. Yine de tek şirketin yönettiği bir süreçte, imzalı ve denetlenebilir bir veritabanı daha ekonomik olabilir. Blok zincir, her lojistik sorununa sürülecek dijital ketçap değildir.</p>

<h2 id="python-ile-kurcalamayı-fark-etmek">Python ile kurcalamayı fark etmek</h2>

<p>Aşağıdaki örnek, olayların özetlerle bağlanmasını gösterir. <code class="language-plaintext highlighter-rouge">sort_keys</code> ve sabit ayraçlar, aynı alanların bu örnekte tutarlı biçimde serileştirilmesini sağlar. <code class="language-plaintext highlighter-rouge">dogrula</code>, zinciri baştan hesaplayarak saklanan özetlerle karşılaştırır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">hashlib</span>
<span class="kn">import</span> <span class="n">json</span>


<span class="k">def</span> <span class="nf">ozet</span><span class="p">(</span><span class="n">onceki</span><span class="p">,</span> <span class="n">olay</span><span class="p">):</span>
    <span class="n">veri</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">onceki</span><span class="sh">"</span><span class="p">:</span> <span class="n">onceki</span><span class="p">,</span> <span class="sh">"</span><span class="s">olay</span><span class="sh">"</span><span class="p">:</span> <span class="n">olay</span><span class="p">}</span>
    <span class="n">metin</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">veri</span><span class="p">,</span> <span class="n">sort_keys</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">separators</span><span class="o">=</span><span class="p">(</span><span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">:</span><span class="sh">"</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">(</span><span class="n">metin</span><span class="p">.</span><span class="nf">encode</span><span class="p">(</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">)).</span><span class="nf">hexdigest</span><span class="p">()</span>


<span class="k">def</span> <span class="nf">dogrula</span><span class="p">(</span><span class="n">kayitlar</span><span class="p">):</span>
    <span class="n">onceki</span> <span class="o">=</span> <span class="sh">"</span><span class="s">0</span><span class="sh">"</span> <span class="o">*</span> <span class="mi">64</span>
    <span class="k">for</span> <span class="n">olay</span><span class="p">,</span> <span class="n">beklenen</span> <span class="ow">in</span> <span class="n">kayitlar</span><span class="p">:</span>
        <span class="n">hesaplanan</span> <span class="o">=</span> <span class="nf">ozet</span><span class="p">(</span><span class="n">onceki</span><span class="p">,</span> <span class="n">olay</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">hesaplanan</span> <span class="o">!=</span> <span class="n">beklenen</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>
        <span class="n">onceki</span> <span class="o">=</span> <span class="n">hesaplanan</span>
    <span class="k">return</span> <span class="bp">True</span>


<span class="n">olay</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">parti</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">BAL-042</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">adim</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">paketleme</span><span class="sh">"</span><span class="p">}</span>
<span class="n">kayitlar</span> <span class="o">=</span> <span class="p">[(</span><span class="n">olay</span><span class="p">,</span> <span class="nf">ozet</span><span class="p">(</span><span class="sh">"</span><span class="s">0</span><span class="sh">"</span> <span class="o">*</span> <span class="mi">64</span><span class="p">,</span> <span class="n">olay</span><span class="p">))]</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">dogrula</span><span class="p">(</span><span class="n">kayitlar</span><span class="p">))</span>  <span class="c1"># True
</span>
<span class="n">olay</span><span class="p">[</span><span class="sh">"</span><span class="s">adim</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="sh">"</span><span class="s">teslimat</span><span class="sh">"</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">dogrula</span><span class="p">(</span><span class="n">kayitlar</span><span class="p">))</span>  <span class="c1"># False
</span></code></pre></div></div>

<p>Bu kod bir blok zincir ağı değildir; imza, yetkilendirme ve dağıtık uzlaşma içermez. Saldırgan bütün özetleri yeniden yazabiliyorsa kontrolü aşabilir. Gerçek güvence için bağımsız kopyalar, güvenilir kontrol noktaları ve uygun bir uzlaşma tasarımı gerekir.</p>

<h2 id="zincir-doğruysa-ürün-de-doğru-mudur">Zincir doğruysa ürün de doğru mudur?</h2>

<p>Maalesef hayır. Sensör bozuksa veya görevli yanlış bilgi girerse, zincir yanlış veriyi tutarlı biçimde saklar. Fiziksel dünya ile dijital kayıt arasındaki bu bağlantı, <strong>oracle problemi</strong> olarak bilinir. Güvenilir sensörler, mühürler, kalibrasyon ve saha denetimleri bu yüzden kritiktir.</p>

<p>Pratik bir uygulamada şu ayrıntılar özellikle önemlidir:</p>

<ul>
  <li><strong>Mahremiyet:</strong> Ticari belgeleri ve kişisel verileri zincir dışında tutun; gerektiğinde yalnızca özetlerini kaydedin.</li>
  <li><strong>Düzeltmeler:</strong> Hatalı kaydı silmek yerine, onu açıklayan ve geçersiz kılan yeni olay ekleyin.</li>
  <li><strong>Erişim:</strong> Tüketiciye QR kodla sade bir geçmiş gösterin; hassas bilgileri yetkilendirmeyle sınırlandırın.</li>
  <li><strong>Fiziksel bağ:</strong> Kopyalanabilen QR etiketini tek başına özgünlük kanıtı saymayın.</li>
</ul>

<p>Başarılı bir pilot, tek ürün grubuyla başlayıp geri çağırma süresi ve eksik kayıt oranı gibi ölçümleri izler. Asıl kazanım yalnızca kayıt tutmak değildir: Bir sorun çıktığında hangi partinin, nerede ve kimlerin elinden geçtiğini hızla bulabilmektir. Şeffaflık, teknoloji kadar doğru süreç tasarımıyla büyür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="blok zincir" /><category term="tedarik zinciri" /><category term="izlenebilirlik" /><category term="python" /><category term="veri güvenliği" /><summary type="html"><![CDATA[Marketten aldığınız bal gerçekten etiketteki bölgeden mi geliyor? Soğuk zincirde taşınması gereken ilaç, yol boyunca uygun sıcaklıkta mı tutuldu? Tedarik zincirinde bu soruların cevabı çoğu zaman farklı şirketlerin sistemlerine dağılır. Blok zincir, tarafların ortak bir geçmiş üzerinde uzlaşmasını sağlayarak ürünün yolculuğunu daha denetlenebilir hâle getirebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/blok-zincirle-tedarik-93.png" /><media:content medium="image" url="https://program.sonsuz.us/img/blok-zincirle-tedarik-93.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Piyasanın Ruh Hâlini Ölçmek: Algoritmik Ticarette Duygu Analizi</title><link href="https://program.sonsuz.us/posts/piyasanin-ruh-halini-olcmek-algoritmik-ticarette-duygu-analizi/" rel="alternate" type="text/html" title="Piyasanın Ruh Hâlini Ölçmek: Algoritmik Ticarette Duygu Analizi" /><published>2026-11-14T00:00:00+00:00</published><updated>2026-11-14T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/piyasanin-ruh-halini-olcmek-algoritmik-ticarette-duygu-analizi</id><content type="html" xml:base="https://program.sonsuz.us/posts/piyasanin-ruh-halini-olcmek-algoritmik-ticarette-duygu-analizi/"><![CDATA[<p>Bir şirket rekor kâr açıklarken hissesi neden düşer? Çünkü piyasalar yalnızca gerçekleşen sonuçları değil, beklentilerle sonuçlar arasındaki farkı fiyatlar. Haberler ve sosyal medya, bu beklentilerin izlerini taşır. Duygu analizi ise milyonlarca cümleyi ölçülebilir sinyallere dönüştürmeye çalışır. Ancak piyasanın ruh hâlini okumak, geleceği görmek değildir!</p>

<p>``</p>

<h2 id="duygu-analizi-gerçekte-neyi-ölçer">Duygu analizi gerçekte neyi ölçer?</h2>

<p>Doğal dil işleme modelleri, metinleri olumlu, olumsuz veya nötr olarak sınıflandırabilir. Finans alanında eğitilmiş bir model, “borç azaltımı” ifadesinin çoğu durumda olumlu olabileceğini, “rekor zarar” ifadesininse farklı değerlendirilmesi gerektiğini öğrenir. Genel amaçlı modeller finansal bağlamı kaçırabilir; Türkçe metinlerde dil ve alan uyumu ayrıca önemlidir.</p>

<p>Bir haber için basit duygu skoru şöyle tanımlanabilir:</p>

\[s_i=P(\text{olumlu}\mid x_i)-P(\text{olumsuz}\mid x_i)\]

<p>Burada $x_i$ metni, $s_i$ ise $[-1,1]$ aralığındaki skoru gösterir. Modelin olasılıkları iyi kalibre edilmemişse bu sayı güvenilir bir kesinlik ölçüsü değildir. Ayrıca olumlu haber, mutlaka olumlu getiri demek değildir: Beklentinin altında kalan büyüme, kulağa güzel gelse de satış getirebilir.</p>

<table>
  <thead>
    <tr>
      <th>Kaynak</th>
      <th>Güçlü tarafı</th>
      <th>Temel riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Şirket açıklamaları</td>
      <td>Doğrudan bilgi</td>
      <td>Seçici ve iyimser dil</td>
    </tr>
    <tr>
      <td>Haber siteleri</td>
      <td>Editoryal bağlam</td>
      <td>Gecikme ve tekrar</td>
    </tr>
    <tr>
      <td>Sosyal medya</td>
      <td>Hızlı tepki</td>
      <td>Botlar, ironi, manipülasyon</td>
    </tr>
  </tbody>
</table>

<h2 id="metinden-işlem-sinyaline">Metinden işlem sinyaline</h2>

<p>İlk adım veri toplamaktır; ikinci adım, verinin gerçekten ne zaman bilindiğini belirlemektir. Yayın zamanı, sistemin haberi ilk gördüğü anla aynı olmayabilir. Geriye dönük düzeltilmiş bir metni geçmişte biliniyormuş gibi kullanmak, modele zaman makinesi hediye etmektir. Bu nedenle ilk erişim zamanı, metin sürümü ve kaynak bilgisi saklanmalıdır.</p>

<p>Ardından şirket adları ve işlem sembolleri eşleştirilir. “Apple” geçen her cümle teknoloji hissesiyle ilgili değildir; bazen gerçekten meyveden söz ediliyordur. Tekrarlanan haberler ayıklanır, alıntılar ve bot kaynaklı içerikler ayrıca değerlendirilir.</p>

<p>Birden fazla metni birleştirmek için ağırlıklı ortalama kullanılabilir:</p>

\[S_t=\frac{\sum_i w_i s_i}{\sum_i w_i}\]

<p>Ağırlıklar; şirketle ilgililik, kaynak güvenilirliği ve haberin yaşına göre belirlenebilir. Örneğin $w_i=q_i e^{-\lambda\Delta t_i}$, eski haberlerin etkisini azaltır. Burada $q_i$ kalite katsayısı, $\lambda$ ise unutma hızıdır. Bunlar gelecekteki sonuçlara bakılarak seçilmemelidir.</p>

<h2 id="python-ile-saatlik-sinyal-üretimi">Python ile saatlik sinyal üretimi</h2>

<p>Aşağıdaki örnek, modelin önceden ürettiği olumlu ve olumsuz olasılıkları kullanır. <code class="language-plaintext highlighter-rouge">relevance</code>, sıfır ile bir arasındaki ilgililik ağırlığıdır. Kod tek bir varlık için haberleri saatlik toplar; tamamlanmamış saatin bilgisini kullanmamak için skoru bir dönem kaydırı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">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>


<span class="k">def</span> <span class="nf">hourly_signal</span><span class="p">(</span><span class="n">news</span><span class="p">,</span> <span class="n">ticker</span><span class="p">):</span>
    <span class="n">d</span> <span class="o">=</span> <span class="n">news</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="n">news</span><span class="p">[</span><span class="sh">'</span><span class="s">ticker</span><span class="sh">'</span><span class="p">].</span><span class="nf">eq</span><span class="p">(</span><span class="n">ticker</span><span class="p">)].</span><span class="nf">copy</span><span class="p">()</span>
    <span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">ts</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">to_datetime</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">first_seen</span><span class="sh">'</span><span class="p">],</span> <span class="n">utc</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
    <span class="n">d</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="sh">'</span><span class="s">ts</span><span class="sh">'</span><span class="p">).</span><span class="nf">drop_duplicates</span><span class="p">(</span><span class="sh">'</span><span class="s">news_id</span><span class="sh">'</span><span class="p">)</span>
    <span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">weighted</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">p_pos</span><span class="sh">'</span><span class="p">]</span> <span class="o">-</span> <span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">p_neg</span><span class="sh">'</span><span class="p">])</span> <span class="o">*</span> <span class="n">d</span><span class="p">[</span><span class="sh">'</span><span class="s">relevance</span><span class="sh">'</span><span class="p">]</span>

    <span class="n">h</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="nf">set_index</span><span class="p">(</span><span class="sh">'</span><span class="s">ts</span><span class="sh">'</span><span class="p">).</span><span class="nf">resample</span><span class="p">(</span><span class="sh">'</span><span class="s">1h</span><span class="sh">'</span><span class="p">).</span><span class="nf">agg</span><span class="p">(</span>
        <span class="n">total</span><span class="o">=</span><span class="p">(</span><span class="sh">'</span><span class="s">weighted</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sum</span><span class="sh">'</span><span class="p">),</span>
        <span class="n">weight</span><span class="o">=</span><span class="p">(</span><span class="sh">'</span><span class="s">relevance</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sum</span><span class="sh">'</span><span class="p">)</span>
    <span class="p">)</span>
    <span class="n">h</span><span class="p">[</span><span class="sh">'</span><span class="s">sentiment</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">h</span><span class="p">[</span><span class="sh">'</span><span class="s">total</span><span class="sh">'</span><span class="p">].</span><span class="nf">div</span><span class="p">(</span><span class="n">h</span><span class="p">[</span><span class="sh">'</span><span class="s">weight</span><span class="sh">'</span><span class="p">].</span><span class="nf">replace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="n">nan</span><span class="p">))</span>
    <span class="n">known</span> <span class="o">=</span> <span class="n">h</span><span class="p">[</span><span class="sh">'</span><span class="s">sentiment</span><span class="sh">'</span><span class="p">].</span><span class="nf">shift</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">h</span><span class="p">[</span><span class="sh">'</span><span class="s">target</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">select</span><span class="p">(</span>
        <span class="p">[</span><span class="n">known</span><span class="p">.</span><span class="nf">gt</span><span class="p">(</span><span class="mf">0.2</span><span class="p">),</span> <span class="n">known</span><span class="p">.</span><span class="nf">lt</span><span class="p">(</span><span class="o">-</span><span class="mf">0.2</span><span class="p">)],</span>
        <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span>
    <span class="p">)</span>
    <span class="k">return</span> <span class="n">h</span><span class="p">[[</span><span class="sh">'</span><span class="s">sentiment</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">target</span><span class="sh">'</span><span class="p">]]</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">target</code>, sırasıyla uzun, kısa veya nötr hedefi temsil eder; emir göndermez. Eşikler yalnızca örnektir. Habersiz saatlerde nötr hedef oluşur. Gerçek uygulamada işlem takvimi, veri gecikmesi, açığa satış kısıtları ve emir gerçekleşme zamanı ayrıca modellenmelidir. Sinyalin oluşması, aynı fiyattan işlem yapılabileceği anlamına gelmez.</p>

<h2 id="başarıyı-nasıl-sınarız">Başarıyı nasıl sınarız?</h2>

<p>Asıl soru, duygu skorunun gelecekteki getiriler hakkında mevcut fiyat ve hacmin ötesinde bilgi taşıyıp taşımadığıdır. Bunu ölçmek için veriyi rastgele karıştırmak yerine kronolojik eğitim, doğrulama ve test dönemlerine ayırın. İlerleyen pencere testleriyle modeli yalnızca geçmiş verilerle güncelleyin. Model seçimi ve eşik ayarlarını test döneminden uzak tutun.</p>

<ul>
  <li><strong>Maliyetleri ekleyin:</strong> Komisyon, alış-satış farkı ve kayma küçük avantajları silebilir.</li>
  <li><strong>Basit referanslarla karşılaştırın:</strong> Aynı risk düzeyindeki fiyat tabanlı stratejilere gerçekten katkı var mı?</li>
  <li><strong>Rejimleri inceleyin:</strong> Krizde çalışan ilişki sakin piyasada kaybolabilir.</li>
  <li><strong>Dayanıklılığı ölçün:</strong> Birkaç viral paylaşım çıkarılınca sonuç çöküyorsa sinyal kırılgandır.</li>
</ul>

<p>Sonuç olarak duygu analizi, piyasaya takılan sihirli bir termometre değildir. Daha çok gürültülü bir mikrofon gibidir: Doğru filtreler, zaman damgaları ve dürüst testlerle işe yarayabilir. En değerli çıktı bazen “işlem yap” değil, “burada güvenilir bilgi yok” sonucudur.</p>

<p><img src="/img/piyasanin-ruh-halini-24.svg" alt="piyasanin-ruh-halini-24" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="algoritmik ticaret" /><category term="duygu analizi" /><category term="doğal dil işleme" /><category term="python" /><category term="finans" /><category term="makine öğrenmesi" /><summary type="html"><![CDATA[Bir şirket rekor kâr açıklarken hissesi neden düşer? Çünkü piyasalar yalnızca gerçekleşen sonuçları değil, beklentilerle sonuçlar arasındaki farkı fiyatlar. Haberler ve sosyal medya, bu beklentilerin izlerini taşır. Duygu analizi ise milyonlarca cümleyi ölçülebilir sinyallere dönüştürmeye çalışır. Ancak piyasanın ruh hâlini okumak, geleceği görmek değildir!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/piyasanin-ruh-halini-24.png" /><media:content medium="image" url="https://program.sonsuz.us/img/piyasanin-ruh-halini-24.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Sarsıntıyla Yarışmak: P Dalgası Tespit Algoritmaları Nasıl Erken Uyarı Üretir?</title><link href="https://program.sonsuz.us/posts/sarsintiyla-yarismak-p-dalgasi-tespit-algoritmalari-nasil-erken-uyari-uretir/" rel="alternate" type="text/html" title="Sarsıntıyla Yarışmak: P Dalgası Tespit Algoritmaları Nasıl Erken Uyarı Üretir?" /><published>2026-11-14T00:00:00+00:00</published><updated>2026-11-14T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/sarsintiyla-yarismak-p-dalgasi-tespit-algoritmalari-nasil-erken-uyari-uretir</id><content type="html" xml:base="https://program.sonsuz.us/posts/sarsintiyla-yarismak-p-dalgasi-tespit-algoritmalari-nasil-erken-uyari-uretir/"><![CDATA[<p>Bir deprem başladığında telefonunuzun güçlü sarsıntıdan birkaç saniye önce uyarı verdiğini düşünün. Bu, geleceği görmek değil; farklı hızlarda ilerleyen deprem dalgalarıyla yapılan bir yarıştır. Erken uyarı sistemleri, önce ulaşan P dalgasını yakalayarak daha yavaş gelen S dalgası ve ardından gelişebilecek güçlü sarsıntılar için zaman kazanmaya çalışır.
``</p>

<h2 id="yarışın-fiziği-kazanılabilecek-süre-nereden-gelir">Yarışın fiziği: Kazanılabilecek süre nereden gelir?</h2>

<p>P dalgaları ortamı ilerleme doğrultusunda sıkıştırıp genişletir; S dalgaları ise parçacıkları ilerleme doğrultusuna dik hareket ettirir. Kabuk içinde örnek hızlar sırasıyla yaklaşık $6$ ve $3{,}5\ \text{km/s}$ olabilir. Gerçek hızlar jeolojik yapıya göre değişir.</p>

<p>Bir istasyonun deprem kaynağına uzaklığı $r_d$, korunacak hedefin uzaklığı $r_t$ ise yaklaşık kullanılabilir süre şöyledir:</p>

\[T_{uyari}\approx\frac{r_t}{v_S}-\frac{r_d}{v_P}-\tau\]

<p>Buradaki $\tau$; algılama, iletişim, hesaplama ve bildirimin toplam gecikmesidir. İstasyonla hedefin aynı noktada bulunduğunu, kaynak uzaklığının 60 kilometre ve toplam gecikmenin iki saniye olduğunu varsayarsak yaklaşık beş saniye kalır. Sonuç sıfırın altındaysa zamanında uyarı mümkün değildir: merkez üssüne yakın bölgelerdeki kör alanın temel nedeni budur.</p>

<h2 id="gürültünün-içinden-p-dalgasını-seçmek">Gürültünün içinden P dalgasını seçmek</h2>

<p>Sensör yalnızca depremi dinlemez; trafik, makineler ve elektriksel parazitler de kayda girer. Bu nedenle işlem hattı zaman damgası kontrolü, veri kalitesi değerlendirmesi ve nedensel bant geçiren filtreleme içerir. Örneğin 100 Hz örneklenen veride 1–15 Hz başlangıç bandı denenebilir; ancak uygun bant, istasyonun gürültüsüne ve hedeflenen olaylara göre belirlenmelidir.</p>

<p>Klasik STA/LTA yaklaşımı kısa ve uzun pencerelerdeki ortalama enerjiyi karşılaştırır:</p>

\[R[n]=\frac{STA(y^2[n])}{LTA(y^2[n])+\epsilon}\]

<p>Burada $y[n]$ filtrelenmiş örnek, $\epsilon$ ise sıfıra bölünmeyi önleyen küçük sayıdır. Kısa pencere ani başlangıca hızla tepki verirken uzun pencere arka planı temsil eder. Oran yükselirse sistem “burada yeni bir şey başladı” der; henüz “kesin deprem” demez.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü yanı</th>
      <th>Temel sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>STA/LTA</td>
      <td>Hızlı, açıklanabilir, düşük maliyetli</td>
      <td>Ani çevresel gürültüyle tetiklenebilir</td>
    </tr>
    <tr>
      <td>AIC tabanlı seçim</td>
      <td>Aday başlangıç zamanını hassaslaştırabilir</td>
      <td>Ek analiz penceresi gecikme yaratabilir</td>
    </tr>
    <tr>
      <td>Sinir ağı tabanlı seçici</td>
      <td>Karmaşık dalga biçimlerini öğrenebilir</td>
      <td>Farklı istasyonlarda başarımı değişebilir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/sarsintiyla-yarismak-p-54.svg" alt="sarsintiyla-yarismak-p-54" /></p>

<h2 id="python-ile-akış-üzerinde-aday-üretmek">Python ile akış üzerinde aday üretmek</h2>

<p>Aşağıdaki sınıf, önceden nedensel olarak filtrelenmiş örnekleri tek tek işler. Kayan toplamlar sayesinde her güncellemede pencereyi baştan hesaplamaz. Eşiklerin kısa süre korunmasını istemek, tek örneklik sıçramaları elemek içindir.</p>

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

<span class="k">class</span> <span class="nc">STALTA</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">fs</span><span class="o">=</span><span class="mi">100</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ns</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">nl</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="mf">0.3</span> <span class="o">*</span> <span class="n">fs</span><span class="p">),</span> <span class="nf">int</span><span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="n">fs</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">windows</span> <span class="o">=</span> <span class="p">[</span><span class="nf">deque</span><span class="p">(),</span> <span class="nf">deque</span><span class="p">()]</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sums</span> <span class="o">=</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="n">self</span><span class="p">.</span><span class="n">required</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nf">int</span><span class="p">(</span><span class="mf">0.15</span> <span class="o">*</span> <span class="n">fs</span><span class="p">))</span>
        <span class="n">self</span><span class="p">.</span><span class="n">hits</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="n">self</span><span class="p">.</span><span class="n">armed</span> <span class="o">=</span> <span class="bp">True</span>

    <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">sample</span><span class="p">):</span>
        <span class="n">energy</span> <span class="o">=</span> <span class="nf">float</span><span class="p">(</span><span class="n">sample</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span>
        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">size</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">((</span><span class="n">self</span><span class="p">.</span><span class="n">ns</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">nl</span><span class="p">)):</span>
            <span class="n">self</span><span class="p">.</span><span class="n">windows</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="n">energy</span><span class="p">)</span>
            <span class="n">self</span><span class="p">.</span><span class="n">sums</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">energy</span>
            <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">windows</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">size</span><span class="p">:</span>
                <span class="n">self</span><span class="p">.</span><span class="n">sums</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-=</span> <span class="n">self</span><span class="p">.</span><span class="n">windows</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="nf">popleft</span><span class="p">()</span>

        <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">windows</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">&lt;</span> <span class="n">self</span><span class="p">.</span><span class="n">nl</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span>

        <span class="n">sta</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">sums</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">self</span><span class="p">.</span><span class="n">ns</span>
        <span class="n">lta</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">sums</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">/</span> <span class="n">self</span><span class="p">.</span><span class="n">nl</span>
        <span class="n">ratio</span> <span class="o">=</span> <span class="n">sta</span> <span class="o">/</span> <span class="p">(</span><span class="n">lta</span> <span class="o">+</span> <span class="mf">1e-12</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">hits</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">hits</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">ratio</span> <span class="o">&gt;=</span> <span class="mf">3.5</span> <span class="k">else</span> <span class="mi">0</span>
        <span class="k">if</span> <span class="n">ratio</span> <span class="o">&lt;</span> <span class="mf">1.5</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">armed</span> <span class="o">=</span> <span class="bp">True</span>
        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">armed</span> <span class="ow">and</span> <span class="n">self</span><span class="p">.</span><span class="n">hits</span> <span class="o">&gt;=</span> <span class="n">self</span><span class="p">.</span><span class="n">required</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">armed</span> <span class="o">=</span> <span class="bp">False</span>
            <span class="k">return</span> <span class="bp">True</span>
        <span class="k">return</span> <span class="bp">False</span>
</code></pre></div></div>

<p>İlk beş saniye arka plan penceresini doldurur. Oran 3,5 üzerinde yaklaşık 150 milisaniye kaldığında aday üretilir. Yeniden tetiklenmek için oranın 1,5 altına düşmesi gerekir; bu histerezis, aynı olayda alarm yağmurunu azaltır. Sayılar evrensel değildir. Veri boşluklarında durum sıfırlanmalı; filtre durumu paketler arasında korunmalıdır. Gelecek örnekleri kullanan sıfır fazlı filtreleme, gerçek zamanlı gecikmeyi gizlediğinden bu akışa doğrudan uygun değildir.</p>

<h2 id="adaydan-güvenilir-uyarıya">Adaydan güvenilir uyarıya</h2>

<p>Tek istasyondaki eşik aşımı halka bildirim göndermek için yeterli değildir. Birden fazla istasyonun tutarlı varış zamanları, dalga biçimi özellikleri ve ağ geometrisi birlikte değerlendirilir. Ardından kaynak konumu ve beklenen yer hareketi, belirsizlikleriyle birlikte güncellenir. İlk birkaç saniyeden nihai büyüklüğü kusursuz çıkarmak mümkün değildir.</p>

<p>Başarı yalnızca doğruluk yüzdesiyle ölçülmez: yanlış alarm, kaçırılan olay, başlangıç zamanı hatası ve uçtan uca gecikme birlikte izlenmelidir. Test verisi farklı bölgeleri ve gerçek gürültüyü kapsamalıdır. Amaç depremi önceden tahmin etmek değil; başlamış bir olayda, güvenilir biçimde kazanılabilen saniyeleri otomatik koruyucu işlemlere dönüştürmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="deprem" /><category term="erken uyarı" /><category term="sismoloji" /><category term="sinyal işleme" /><category term="python" /><category term="algoritmalar" /><summary type="html"><![CDATA[Bir deprem başladığında telefonunuzun güçlü sarsıntıdan birkaç saniye önce uyarı verdiğini düşünün. Bu, geleceği görmek değil; farklı hızlarda ilerleyen deprem dalgalarıyla yapılan bir yarıştır. Erken uyarı sistemleri, önce ulaşan P dalgasını yakalayarak daha yavaş gelen S dalgası ve ardından gelişebilecek güçlü sarsıntılar için zaman kazanmaya çalışır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/sarsintiyla-yarismak-p-54.png" /><media:content medium="image" url="https://program.sonsuz.us/img/sarsintiyla-yarismak-p-54.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Depoda Gereksiz Adımlara Son: Raf Yerleştirme Algoritmalarıyla Toplama Optimizasyonu</title><link href="https://program.sonsuz.us/posts/depoda-gereksiz-adimlara-son-raf-yerlestirme-algoritmalariyla-toplama-optimizasyonu/" rel="alternate" type="text/html" title="Depoda Gereksiz Adımlara Son: Raf Yerleştirme Algoritmalarıyla Toplama Optimizasyonu" /><published>2026-11-13T00:00:00+00:00</published><updated>2026-11-13T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/depoda-gereksiz-adimlara-son-raf-yerlestirme-algoritmalariyla-toplama-optimizasyonu</id><content type="html" xml:base="https://program.sonsuz.us/posts/depoda-gereksiz-adimlara-son-raf-yerlestirme-algoritmalariyla-toplama-optimizasyonu/"><![CDATA[<p>Bir depoda çalışanların gün boyunca attığı adımları düşünün: Bazen en çok satan ürün, çıkış kapısından en uzak rafta sessizce bekler. Sonuç, fazladan yürüyüş ve geciken siparişlerdir. Depo yerleşim optimizasyonu, ürünleri rastgele boşluklara koymak yerine talep, mesafe ve fiziksel kısıtları birlikte değerlendirir. Amaç, depoyu dev bir saklambaç oyunundan kurtarmaktır.</p>

<p>``</p>

<h2 id="önce-problemi-doğru-modelleyelim">Önce problemi doğru modelleyelim</h2>

<p>Raf yerleştirme, yani <em>slotting</em>, hangi ürünün hangi konumda tutulacağını belirler. Sipariş toplama rotası ise çalışanların bu konumları hangi sırayla ziyaret edeceğini çözer. Birbirlerini etkileseler de bunlar aynı problem değildir: Harika bir rota, kötü yerleşimin bütün zararını silemez.</p>

<p>Başlangıç için ürünlerin toplama sıklığı, boyutları, stok ağırlığı ve birlikte sipariş edilme sayıları gerekir. Rafların kapasitesi, erişilebilirliği ve başlangıç noktasına uzaklığı da kaydedilir. Burada satış cirosundan çok <strong>toplama ziyaret sıklığı</strong> önemlidir; pahalı ama nadiren alınan bir ürün, kapının önünü hak etmeyebilir.</p>

<p>Basitleştirilmiş bir amaç fonksiyonu şöyle kurulabilir:</p>

\[J=\sum_i f_i\frac{2d(0,x_i)}{v}+\lambda\sum_{i&lt;j}c_{ij}\frac{d(x_i,x_j)}{v}\]

<p>Burada $f_i$ toplama sıklığı, $x_i$ ürünün konumu, $v$ yürüme hızı ve $c_{ij}$ birlikte sipariş edilme sayısıdır. İlk terim girişe yakınlığı, ikinci terim ilişkili ürünlerin yakınlığını ödüllendirir. $\lambda$ bu iki tercihin dengesini ayarlar. Bu ifade gerçek sipariş rotalarının süresini birebir vermez; yerleşimleri karşılaştırmak için kullanılan bir yaklaşımdır.</p>

<h2 id="hangi-yaklaşım-hangi-durumda">Hangi yaklaşım, hangi durumda?</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Temel fikir</th>
      <th>Güçlü yön</th>
      <th>Zayıf yön</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rastgele yerleşim</td>
      <td>Uygun boş rafa koy</td>
      <td>Basit başlangıç</td>
      <td>Uzun yürüyüşler</td>
    </tr>
    <tr>
      <td>ABC yerleşimi</td>
      <td>Sık toplananı yakına al</td>
      <td>Kolay uygulanır</td>
      <td>Ürün ilişkilerini kaçırır</td>
    </tr>
    <tr>
      <td>Birliktelik odaklı</td>
      <td>Birlikte alınanları yakınlaştır</td>
      <td>Çok ürünlü siparişlere uygun</td>
      <td>Talep değişimine duyarlı</td>
    </tr>
    <tr>
      <td>Yerel arama</td>
      <td>Ürün konumlarını takas et</td>
      <td>Mevcut planı iyileştirir</td>
      <td>Yerel optimuma takılabilir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/depoda-gereksiz-adimlara-12.svg" alt="depoda-gereksiz-adimlara-12" /></p>

<p>ABC sınıflandırması iyi bir başlangıçtır; ancak bütün popüler ürünleri aynı koridora yığmak trafik yaratabilir. Ağır ürünlerin güvenli yükseklikte tutulması ve uyumsuz ürünlerin ayrılması, hız uğruna esnetilecek tercihler değil, zorunlu kısıtlardır.</p>

<h2 id="python-ile-açgözlü-yerleştirme">Python ile açgözlü yerleştirme</h2>

<p>Aşağıdaki algoritma, sık toplanan ürünlerden başlayarak uygun raflar arasından en düşük ek maliyetliyi seçer. Her raf tek bir ürün türüne ayrılır; ürünün o konumda tutulacak toplam stok ağırlığının kapasiteye sığdığı varsayılır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">yerlestir</span><span class="p">(</span><span class="n">urunler</span><span class="p">,</span> <span class="n">raflar</span><span class="p">,</span> <span class="n">beraberlik</span><span class="p">,</span> <span class="n">hiz</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span> <span class="n">katsayi</span><span class="o">=</span><span class="mf">0.4</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">mesafe</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="k">return</span> <span class="nf">abs</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="nf">abs</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>

    <span class="n">bos</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="n">raflar</span><span class="p">)</span>
    <span class="n">plan</span> <span class="o">=</span> <span class="p">{}</span>
    <span class="k">for</span> <span class="n">urun</span> <span class="ow">in</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">urunler</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">u</span><span class="p">:</span> <span class="o">-</span><span class="n">u</span><span class="p">[</span><span class="sh">'</span><span class="s">siklik</span><span class="sh">'</span><span class="p">]):</span>
        <span class="n">uygun</span> <span class="o">=</span> <span class="p">[</span><span class="n">r</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">bos</span>
                 <span class="k">if</span> <span class="n">r</span><span class="p">[</span><span class="sh">'</span><span class="s">kapasite</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">urun</span><span class="p">[</span><span class="sh">'</span><span class="s">stok_kg</span><span class="sh">'</span><span class="p">]</span>
                 <span class="ow">and</span> <span class="n">r</span><span class="p">[</span><span class="sh">'</span><span class="s">yukseklik</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">urun</span><span class="p">[</span><span class="sh">'</span><span class="s">boy_cm</span><span class="sh">'</span><span class="p">]]</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">uygun</span><span class="p">:</span>
            <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Uygun raf bulunamadi: </span><span class="si">{</span><span class="n">urun</span><span class="p">[</span><span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

        <span class="k">def</span> <span class="nf">maliyet</span><span class="p">(</span><span class="n">raf</span><span class="p">):</span>
            <span class="n">temel</span> <span class="o">=</span> <span class="n">urun</span><span class="p">[</span><span class="sh">'</span><span class="s">siklik</span><span class="sh">'</span><span class="p">]</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="nf">mesafe</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">raf</span><span class="p">[</span><span class="sh">'</span><span class="s">xy</span><span class="sh">'</span><span class="p">])</span> <span class="o">/</span> <span class="n">hiz</span>
            <span class="n">iliski</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span>
                <span class="n">beraberlik</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="nf">frozenset</span><span class="p">((</span><span class="n">urun</span><span class="p">[</span><span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">],</span> <span class="n">kod</span><span class="p">)),</span> <span class="mi">0</span><span class="p">)</span>
                <span class="o">*</span> <span class="nf">mesafe</span><span class="p">(</span><span class="n">raf</span><span class="p">[</span><span class="sh">'</span><span class="s">xy</span><span class="sh">'</span><span class="p">],</span> <span class="n">diger</span><span class="p">[</span><span class="sh">'</span><span class="s">xy</span><span class="sh">'</span><span class="p">])</span> <span class="o">/</span> <span class="n">hiz</span>
                <span class="k">for</span> <span class="n">kod</span><span class="p">,</span> <span class="n">diger</span> <span class="ow">in</span> <span class="n">plan</span><span class="p">.</span><span class="nf">items</span><span class="p">()</span>
            <span class="p">)</span>
            <span class="k">return</span> <span class="n">temel</span> <span class="o">+</span> <span class="n">katsayi</span> <span class="o">*</span> <span class="n">iliski</span>

        <span class="n">secilen</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">uygun</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">maliyet</span><span class="p">)</span>
        <span class="n">plan</span><span class="p">[</span><span class="n">urun</span><span class="p">[</span><span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">]]</span> <span class="o">=</span> <span class="n">secilen</span>
        <span class="n">bos</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="n">secilen</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">plan</span>
</code></pre></div></div>

<p>Girdiler sözlük listeleridir: Ürünlerde <code class="language-plaintext highlighter-rouge">id</code>, <code class="language-plaintext highlighter-rouge">siklik</code>, <code class="language-plaintext highlighter-rouge">stok_kg</code>, <code class="language-plaintext highlighter-rouge">boy_cm</code>; raflarda <code class="language-plaintext highlighter-rouge">xy</code>, <code class="language-plaintext highlighter-rouge">kapasite</code>, <code class="language-plaintext highlighter-rouge">yukseklik</code> bulunur. <code class="language-plaintext highlighter-rouge">beraberlik</code>, ürün çiftlerini <code class="language-plaintext highlighter-rouge">frozenset</code> anahtarlarıyla sipariş sayılarına bağlar. Koordinatlar metre, hız metre/dakika olarak alınır. Mesafe hesabı engelsiz dik açılı geçişleri varsayar; gerçek depoda rafların içinden yürünemeyeceği için koridor grafındaki en kısa yol kullanılmalıdır.</p>

<p>Açgözlü yöntem hızlıdır, fakat erken kararlarını geri almaz. Uygun raf bulamaması, geçerli hiçbir yerleşim olmadığı anlamına gelmez. İyileştirme aşamasında iki ürünün yerini takas edip kısıtlar sağlanıyorsa toplam maliyeti yeniden hesaplayabilirsiniz.</p>

<h2 id="başarıyı-yürüyüşle-ölçün">Başarıyı yürüyüşle ölçün</h2>

<p>Yeni planı aynı geçmiş siparişler ve aynı rota yöntemiyle karşılaştırın. Ortalama toplama süresinin yanında yüzde 95’lik dilimi, koridor yoğunluğunu ve raf yenileme iş yükünü izleyin. Yer değiştirme maliyetini de hesaba katın: Her gün raf taşımak, kazanılan zamanı geri yiyebilir.</p>

<p>Son olarak küçük bir bölgede pilot uygulama yapın. Mevsimsellik ve kampanyalar ürünlerin önemini değiştireceğinden yerleşimi düzenli aralıklarla yeniden değerlendirin. En iyi depo, matematiksel olarak şık görünen değil; çalışanların güvenle, daha az adımla sipariş tamamladığı depodur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="depo optimizasyonu" /><category term="raf yerleştirme" /><category term="algoritmalar" /><category term="python" /><category term="lojistik" /><summary type="html"><![CDATA[Bir depoda çalışanların gün boyunca attığı adımları düşünün: Bazen en çok satan ürün, çıkış kapısından en uzak rafta sessizce bekler. Sonuç, fazladan yürüyüş ve geciken siparişlerdir. Depo yerleşim optimizasyonu, ürünleri rastgele boşluklara koymak yerine talep, mesafe ve fiziksel kısıtları birlikte değerlendirir. Amaç, depoyu dev bir saklambaç oyunundan kurtarmaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/depoda-gereksiz-adimlara-12.png" /><media:content medium="image" url="https://program.sonsuz.us/img/depoda-gereksiz-adimlara-12.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Elektriğin Yol Haritası: Enerji Şebekelerini Graf Teorisiyle Modellemek</title><link href="https://program.sonsuz.us/posts/elektrigin-yol-haritasi-enerji-sebekelerini-graf-teorisiyle-modellemek/" rel="alternate" type="text/html" title="Elektriğin Yol Haritası: Enerji Şebekelerini Graf Teorisiyle Modellemek" /><published>2026-11-13T00:00:00+00:00</published><updated>2026-11-13T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/elektrigin-yol-haritasi-enerji-sebekelerini-graf-teorisiyle-modellemek</id><content type="html" xml:base="https://program.sonsuz.us/posts/elektrigin-yol-haritasi-enerji-sebekelerini-graf-teorisiyle-modellemek/"><![CDATA[<p><img src="/img/elektrigin-yol-haritasi-99.svg" alt="elektrigin-yol-haritasi-99" /></p>

<p>Bir elektrik şebekesini dev bir yol ağı gibi düşünün: Kavşaklar baralar, yollar iletim hatları, trafik ise güç akışıdır. Ancak elektriğin navigasyon uygulaması yoktur; hangi yoldan gideceğini fizik yasaları belirler. Graf teorisi, bu karmaşık ağı anlaşılır bir matematiksel modele dönüştürerek darboğazları, kritik bağlantıları ve arızaların olası etkilerini keşfetmemizi sağlar.</p>

<p>``</p>

<h2 id="şebekeyi-düğüm-ve-kenarlara-dönüştürmek">Şebekeyi Düğüm ve Kenarlara Dönüştürmek</h2>

<p>Bir şebekeyi $G=(V,E)$ grafıyla gösteririz. Burada $V$, üretim veya tüketimin bağlandığı baraları; $E$ ise hatları ve uygun modellerle transformatörleri temsil eder. Üretim ve tüketim değerleri düğümlere, reaktans ve kapasite gibi özellikler kenarlara atanır.</p>

<p>Başlangıç için yönsüz graf uygundur: Bir hattaki güç, işletme koşullarına göre iki yönde de akabilir. Hesaplamada seçilen yön yalnızca işaret uzlaşımıdır. Aynı iki bara arasında birden fazla hat varsa, bunları ayrı tutmak için çoklu graf kullanmak gerekir.</p>

<table>
  <thead>
    <tr>
      <th>Graf öğesi</th>
      <th>Şebekedeki karşılığı</th>
      <th>Analizdeki rolü</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Düğüm</td>
      <td>Bara</td>
      <td>Güç dengesi</td>
    </tr>
    <tr>
      <td>Kenar</td>
      <td>İletim hattı</td>
      <td>Elektriksel bağlantı</td>
    </tr>
    <tr>
      <td>Kenar ağırlığı</td>
      <td>Reaktansın tersi</td>
      <td>Akışın paylaşılması</td>
    </tr>
    <tr>
      <td>Bağlı bileşen</td>
      <td>Elektriksel ada</td>
      <td>Ayrışma tespiti</td>
    </tr>
  </tbody>
</table>

<p>Buradaki kritik ayrım şudur: Bir grafın bağlı olması, şebekenin güvenli işletilebildiği anlamına gelmez. Bağlantı vardır ama hat kapasitesi yetersiz olabilir!</p>

<h2 id="topolojiden-güç-akışına-laplasyen">Topolojiden Güç Akışına: Laplasyen</h2>

<p>Sadece bağlantıları saymak yerine elektriksel özellikleri de hesaba katalım. Basitleştirilmiş DC güç akışı yaklaşımında gerilim büyüklükleri yaklaşık sabit, açı farkları küçük ve hat dirençleri reaktanslara göre ihmal edilebilir kabul edilir. Kayıplar da modellenmez. Buradaki “DC”, doğru akımlı şebeke değil, AC şebekenin doğrusal yaklaşımıdır.</p>

<p>Hat reaktansı $x_{ij}$ için ağırlık $b_{ij}=1/x_{ij}$ alınır. Bu ağırlıklarla oluşturulan Laplasyen matrisi $B$, güç enjeksiyonlarıyla gerilim açılarını ilişkilendirir:</p>

\[B\theta=P\]

<p>Pozitif $P$ net üretimi, negatif $P$ net tüketimi gösterir. Hat akışı ise:</p>

\[f_{ij}=\frac{\theta_i-\theta_j}{x_{ij}}\]

<p>Bağlı bir şebekede bütün açılara aynı sabiti eklemek akışları değiştirmez. Bu nedenle $B$ tekildir; bir referans barasının açısını sıfıra sabitleyip indirgenmiş sistemi çözeriz. Ayrıca toplam enjeksiyon sıfır olmalıdır. Elektrik muhasebesinde açık bırakılamaz!</p>

<h2 id="python-ile-küçük-bir-deney">Python ile Küçük Bir Deney</h2>

<p>Aşağıdaki örnek için <code class="language-plaintext highlighter-rouge">pip install networkx numpy</code> yeterlidir. Beş baralı ağda reaktansları ortak birim sisteminde, güçleri ise aynı bazdaki per-unit değerlerle tanımlıyoruz. Sıfır numaralı bara referanstır; diğer baralar tüketicidir. Örnek, bağlantı bilgisi ile fiziksel hesabı aynı veri yapısında buluşturur.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">networkx</span> <span class="k">as</span> <span class="n">nx</span>
<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="n">nx</span><span class="p">.</span><span class="nc">Graph</span><span class="p">()</span>
<span class="n">lines</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="mf">0.10</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">),</span>
         <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mf">0.10</span><span class="p">),</span>
         <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mf">0.12</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
    <span class="n">G</span><span class="p">.</span><span class="nf">add_edge</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="mi">1</span><span class="o">/</span><span class="n">x</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mf">0.8</span><span class="p">)</span>

<span class="n">nodes</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="nf">range</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>
<span class="n">P</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">1.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.3</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.2</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.1</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.4</span><span class="p">])</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">nx</span><span class="p">.</span><span class="nf">is_connected</span><span class="p">(</span><span class="n">G</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">np</span><span class="p">.</span><span class="nf">isclose</span><span class="p">(</span><span class="n">P</span><span class="p">.</span><span class="nf">sum</span><span class="p">(),</span> <span class="mi">0</span><span class="p">):</span>
    <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">'</span><span class="s">Bağlılık ve güç dengesi gerekli.</span><span class="sh">'</span><span class="p">)</span>

<span class="n">W</span> <span class="o">=</span> <span class="n">nx</span><span class="p">.</span><span class="nf">to_numpy_array</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="n">nodelist</span><span class="o">=</span><span class="n">nodes</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="sh">'</span><span class="s">b</span><span class="sh">'</span><span class="p">)</span>
<span class="n">B</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">diag</span><span class="p">(</span><span class="n">W</span><span class="p">.</span><span class="nf">sum</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span> <span class="o">-</span> <span class="n">W</span>
<span class="n">theta</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">nodes</span><span class="p">))</span>
<span class="n">theta</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">solve</span><span class="p">(</span><span class="n">B</span><span class="p">[</span><span class="mi">1</span><span class="p">:,</span> <span class="mi">1</span><span class="p">:],</span> <span class="n">P</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>

<span class="k">for</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">G</span><span class="p">.</span><span class="nf">edges</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
    <span class="n">flow</span> <span class="o">=</span> <span class="p">(</span><span class="n">theta</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">-</span> <span class="n">theta</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="o">/</span> <span class="n">data</span><span class="p">[</span><span class="sh">'</span><span class="s">x</span><span class="sh">'</span><span class="p">]</span>
    <span class="n">overloaded</span> <span class="o">=</span> <span class="nf">abs</span><span class="p">(</span><span class="n">flow</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">data</span><span class="p">[</span><span class="sh">'</span><span class="s">limit</span><span class="sh">'</span><span class="p">]</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="n">flow</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="n">overloaded</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Köprüler:</span><span class="sh">'</span><span class="p">,</span> <span class="nf">list</span><span class="p">(</span><span class="n">nx</span><span class="p">.</span><span class="nf">bridges</span><span class="p">(</span><span class="n">G</span><span class="p">)))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">W</code> ağırlıklı komşuluk matrisidir; satır toplamlarından oluşturulan köşegen sayesinde Laplasyen elde edilir. İndirgenmiş sistem açıları, son döngü ise hat akışlarını hesaplar. Negatif sonuç ters yöndeki akışı belirtir. Kapasite karşılaştırması burada aktif güç içindir; gerçek işletmede akım ve görünür güç sınırları da önemlidir.</p>

<h2 id="bir-hat-koparsa-ne-olur">Bir Hat Koparsa Ne Olur?</h2>

<p>Graf teorisindeki köprü, çıkarıldığında ağı bölen kenardır. Örnekte <code class="language-plaintext highlighter-rouge">(2, 3)</code> hattı köprüdür. Devreden çıkması, 3 ve 4 numaralı baraları ayrı bir adaya dönüştürür. Bu adada üretim bulunmadığından mevcut tüketim sürdürülemez.</p>

<table>
  <thead>
    <tr>
      <th>Analiz</th>
      <th>Yanıtladığı soru</th>
      <th>Tek başına yeterli mi?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bağlılık</td>
      <td>Baralar birbirine ulaşabiliyor mu?</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>Köprü tespiti</td>
      <td>Tek hat kaybı adalaşma yaratır mı?</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>DC akış</td>
      <td>Aktif güç nereden geçiyor?</td>
      <td>Yaklaşık olarak</td>
    </tr>
    <tr>
      <td>AC akış</td>
      <td>Gerilim ve reaktif güç uygun mu?</td>
      <td>Statik değerlendirme için</td>
    </tr>
  </tbody>
</table>

<p>N−1 incelemesinde her hat sırayla kaldırılır. Önce adalar bulunur, ardından uygun dengeleme varsayımlarıyla akış yeniden hesaplanır. Köprü olmayan bir hattın kaybı da kalan hatları aşırı yükleyebilir. Dolayısıyla “ağ bölünmedi” demek, “sorun yok” demek değildir.</p>

<h2 id="modeli-büyütürken">Modeli Büyütürken</h2>

<p>Büyük şebekelerde seyrek matrisler bellek ve süre kazandırır. Bunun yanında en kısa yol veya merkezilik ölçümleri yararlı önceliklendirme araçlarıdır; fiziksel akışın yerine geçmezler. Elektrik tek bir kısa yolu seçmez, ağın empedanslarına göre dağılır. Son olarak, statik graf analizi frekans kararlılığını ya da koruma davranışını açıklamaz: Bunlar için dinamik modeller gerekir. Graf teorisi güçlü bir haritadır; fakat haritanın kendisi bütün arazi değildir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="graf teorisi" /><category term="enerji şebekeleri" /><category term="python" /><category term="simülasyon" /><category term="güç sistemleri" /><category term="networkx" /><summary type="html"><![CDATA[Bir elektrik şebekesini dev bir yol ağı gibi düşünün: Kavşaklar baralar, yollar iletim hatları, trafik ise güç akışıdır. Ancak elektriğin navigasyon uygulaması yoktur; hangi yoldan gideceğini fizik yasaları belirler. Graf teorisi, bu karmaşık ağı anlaşılır bir matematiksel modele dönüştürerek darboğazları, kritik bağlantıları ve arızaların olası etkilerini keşfetmemizi sağlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/elektrigin-yol-haritasi-99.png" /><media:content medium="image" url="https://program.sonsuz.us/img/elektrigin-yol-haritasi-99.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Güvenli Kod Geliştirme: Açıkları Sonradan Yamamak Yerine Baştan Önlemek</title><link href="https://program.sonsuz.us/posts/guvenli-kod-gelistirme-aciklari-sonradan-yamamak-yerine-bastan-onlemek/" rel="alternate" type="text/html" title="Güvenli Kod Geliştirme: Açıkları Sonradan Yamamak Yerine Baştan Önlemek" /><published>2026-11-13T00:00:00+00:00</published><updated>2026-11-13T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/guvenli-kod-gelistirme-aciklari-sonradan-yamamak-yerine-bastan-onlemek</id><content type="html" xml:base="https://program.sonsuz.us/posts/guvenli-kod-gelistirme-aciklari-sonradan-yamamak-yerine-bastan-onlemek/"><![CDATA[<p><img src="/img/guvenli-kod-gelistirme-41.svg" alt="guvenli-kod-gelistirme-41" /></p>

<p>Bir uygulamanın güvenliğini yayına çıkmadan önce yapılan son kontrole bırakmak, evi bitirdikten sonra temeline bakmaya benzer. Güvenli kod geliştirme, yalnızca saldırıları engelleyen birkaç koşul yazmak değildir; gereksinimlerden mimariye, kod incelemesinden dağıtıma kadar uzanan bir düşünme biçimidir. İyi haber: Bu yaklaşım, doğru alışkanlıklarla günlük geliştirme akışına yerleşebilir.</p>

<p>``</p>

<h2 id="önce-saldırganın-gözlüğünü-takın">Önce saldırganın gözlüğünü takın</h2>

<p>Güvenlik çalışmasının başlangıcı araç seçmek değil, neyi koruduğunuzu anlamaktır. Kullanıcı verileri, erişim anahtarları ve ödeme kayıtları birer varlıktır. İnternetten gelen isteklerin uygulamaya, uygulamanın veritabanına geçtiği noktalar ise farklı güven sınırları oluşturabilir.</p>

<p>Basit bir önceliklendirme modeli şöyle yazılabilir: $R \approx P(A) \times E(A)$. Burada $P(A)$ saldırı senaryosunun gerçekleşme olasılığını, $E(A)$ gerçekleşirse doğuracağı etkiyi temsil eder. Bu ifade kesin bir ölçüm değil, tartışmayı yapılandıran bir yardımcıdır.</p>

<p>Her özellik için sorun: Kim kötüye kullanabilir? Hangi veriye ulaşabilir? Hangi kontrol bunu önler? Örneğin fatura görüntüleme özelliğinde temel tehdit, kullanıcının başka bir müşterinin faturasını istemesidir.</p>

<h2 id="güvenliği-tasarım-kararı-yapın">Güvenliği tasarım kararı yapın</h2>

<p><strong>Varsayılan olarak reddetmek</strong>, açıkça izin verilmeyen işlemleri engellemektir. <strong>En az ayrıcalık</strong>, kullanıcıya ve servise yalnızca ihtiyaç duyduğu yetkiyi vermektir. Böylece tek bir hatanın etki alanı küçülür.</p>

<table>
  <thead>
    <tr>
      <th>Karar alanı</th>
      <th>Riskli yaklaşım</th>
      <th>Güvenli başlangıç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yetkilendirme</td>
      <td>Düğmeyi arayüzde gizlemek</td>
      <td>Her istekte sunucuda denetlemek</td>
    </tr>
    <tr>
      <td>Veritabanı</td>
      <td>Sorguyu metin birleştirerek kurmak</td>
      <td>Parametreli sorgu kullanmak</td>
    </tr>
    <tr>
      <td>Erişim anahtarları</td>
      <td>Anahtarları kaynak koda yazmak</td>
      <td>Merkezi sır yönetimi kullanmak</td>
    </tr>
    <tr>
      <td>Hata mesajları</td>
      <td>Yığın izini kullanıcıya göstermek</td>
      <td>Genel mesaj ve kontrollü günlükleme</td>
    </tr>
  </tbody>
</table>

<p>Kimlik doğrulama, kullanıcının kim olduğunu söyler; yetkilendirme ise hangi kaynağa erişebileceğini belirler. Oturum açmış olmak, bütün kapıları açan sihirli bir kart değildir. Ayrıca girdinin biçimsel olarak geçerli olması, o girdinin işaret ettiği kaynağa erişimin meşru olduğu anlamına gelmez.</p>

<h2 id="kodda-iki-ayrı-savunmayı-birlikte-kurun">Kodda iki ayrı savunmayı birlikte kurun</h2>

<p>Aşağıdaki Python örneği, SQLite üzerinde fatura okur. <code class="language-plaintext highlighter-rouge">authenticated_user_id</code> değerinin istemciden değil, sunucunun doğruladığı oturumdan geldiği varsayılır. Kod hem kimlik biçimini sınırlar hem de sorguyu kaynak sahibine bağlar.</p>

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


<span class="k">def</span> <span class="nf">get_invoice</span><span class="p">(</span>
    <span class="n">db</span><span class="p">:</span> <span class="n">sqlite3</span><span class="p">.</span><span class="n">Connection</span><span class="p">,</span>
    <span class="n">authenticated_user_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
    <span class="n">invoice_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">record_id</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">invoice_id</span><span class="p">)</span>
    <span class="k">except</span> <span class="nb">ValueError</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">Geçersiz fatura kimliği.</span><span class="sh">"</span><span class="p">)</span> <span class="k">from</span> <span class="bp">None</span>

    <span class="k">if</span> <span class="ow">not</span> <span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">record_id</span> <span class="o">&lt;=</span> <span class="mi">2</span><span class="o">**</span><span class="mi">63</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">Geçersiz fatura kimliği.</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">row</span> <span class="o">=</span> <span class="n">db</span><span class="p">.</span><span class="nf">execute</span><span class="p">(</span>
        <span class="sh">"</span><span class="s">SELECT id, total_kurus FROM invoices </span><span class="sh">"</span>
        <span class="sh">"</span><span class="s">WHERE id = ? AND owner_id = ?</span><span class="sh">"</span><span class="p">,</span>
        <span class="p">(</span><span class="n">record_id</span><span class="p">,</span> <span class="n">authenticated_user_id</span><span class="p">),</span>
    <span class="p">).</span><span class="nf">fetchone</span><span class="p">()</span>

    <span class="k">if</span> <span class="n">row</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">LookupError</span><span class="p">(</span><span class="sh">"</span><span class="s">Kayıt bulunamadı.</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">row</span>
</code></pre></div></div>

<p>Parametreli sorgu, kullanıcı verisinin SQL komutunun parçası olarak yorumlanmasını önler. <code class="language-plaintext highlighter-rouge">owner_id</code> koşulu ise başka kullanıcıların kayıtlarına erişimi engeller. Bunlar farklı tehditlere karşı çalışan, birbirinin yerine geçmeyen kontrollerdir.</p>

<p>Pozitif ve 64 bit aralığında kimlik kontrolü, veritabanının beklediği değer alanını korur. HTTP katmanı bu örnekteki doğrulama hatalarını uygun istemci yanıtlarına dönüştürmeli, beklenmeyen hatalarda iç ayrıntıları gizlemelidir. Bulunamayan ve erişilemeyen kayıtlar için aynı dış yanıtı kullanmak, kayıtların varlığı hakkında gereksiz ipucu vermemeye yardımcı olur.</p>

<h2 id="güvenlik-kontrollerini-geliştirme-hattına-yerleştirin">Güvenlik kontrollerini geliştirme hattına yerleştirin</h2>

<p>Güvenlik incelemesi yalnızca uzman ekibin takviminde bekleyen bir toplantı olmamalıdır. Çekme isteği şablonuna veri sınıflandırması, yetki kontrolü ve hassas günlükleme soruları ekleyin. Büyük değişiklikleri küçük parçalara bölmek, inceleyenin kritik davranışları fark etmesini kolaylaştırır.</p>

<ul>
  <li><strong>Birim testleri:</strong> Geçersiz kimlikleri, sınır değerlerini ve reddedilen işlemleri doğrulayın.</li>
  <li><strong>Entegrasyon testleri:</strong> İki farklı kullanıcı oluşturup birinin diğerinin faturasını okuyamadığını sınayın.</li>
  <li><strong>Statik analiz:</strong> Riskli kod kalıplarını erken yakalayın; bulguları bağlamıyla değerlendirin.</li>
  <li><strong>Bağımlılık taraması:</strong> Bilinen açıkları izleyin, düzeltmeleri test ederek uygulayın.</li>
  <li><strong>Sır taraması:</strong> Erişim anahtarlarının depoya girmesini engelleyin; sızıntıda anahtarı yenileyin.</li>
</ul>

<p>Araçların yeşil ışık yakması, uygulamanın tamamen güvenli olduğunu kanıtlamaz. Özellikle iş mantığı hataları, insan incelemesi ve kötüye kullanım senaryoları gerektirir.</p>

<h2 id="üretimde-de-savunmayı-sürdürün">Üretimde de savunmayı sürdürün</h2>

<p>TLS kullanın, üretim hesaplarının yetkilerini daraltın ve hassas işlemlere uygun hız sınırlaması uygulayın. Günlüklere parola, oturum belirteci veya gereksiz kişisel veri yazmayın. Güvenlik olaylarını araştırmaya yetecek bağlamı, erişimi kısıtlanmış kayıtlarda tutun.</p>

<p>Son olarak bağımlılık güncellemeleri, olay müdahalesi ve yedekten dönüş için sorumlular belirleyin. Yedek almak kadar geri yüklemeyi denemek de önemlidir. Güvenlik, kapıya asılan bir kilit değil; tasarımdan işletime kadar çalışan bir alışkanlıklar sistemidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="güvenli kod" /><category term="yazılım güvenliği" /><category term="devsecops" /><category term="tehdit modelleme" /><category term="python" /><category term="güvenli geliştirme" /><summary type="html"><![CDATA[Bir uygulamanın güvenliğini yayına çıkmadan önce yapılan son kontrole bırakmak, evi bitirdikten sonra temeline bakmaya benzer. Güvenli kod geliştirme, yalnızca saldırıları engelleyen birkaç koşul yazmak değildir; gereksinimlerden mimariye, kod incelemesinden dağıtıma kadar uzanan bir düşünme biçimidir. İyi haber: Bu yaklaşım, doğru alışkanlıklarla günlük geliştirme akışına yerleşebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/guvenli-kod-gelistirme-41.png" /><media:content medium="image" url="https://program.sonsuz.us/img/guvenli-kod-gelistirme-41.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">IDS ve IPS: Ağın Dedektifi ile Kapıdaki Güvenlik Görevlisi</title><link href="https://program.sonsuz.us/posts/ids-ve-ips-agin-dedektifi-ile-kapidaki-guvenlik-gorevlisi/" rel="alternate" type="text/html" title="IDS ve IPS: Ağın Dedektifi ile Kapıdaki Güvenlik Görevlisi" /><published>2026-11-13T00:00:00+00:00</published><updated>2026-11-13T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ids-ve-ips-agin-dedektifi-ile-kapidaki-guvenlik-gorevlisi</id><content type="html" xml:base="https://program.sonsuz.us/posts/ids-ve-ips-agin-dedektifi-ile-kapidaki-guvenlik-gorevlisi/"><![CDATA[<p>Bir sunucunun gece üçte binlerce bağlantı başlatması güncelleme işleminden de kaynaklanabilir, ele geçirilmiş olmasından da. Ağ güvenliğinin eğlenceli ve zor tarafı burada başlar: Hareketi görmek yetmez, anlamlandırmak gerekir. IDS ve IPS, bu dijital mahallede şüpheli davranışları araştıran iki farklı güvenlik rolünü üstlenir.</p>

<p>``</p>

<h2 id="ids-izler-ips-müdahale-eder">IDS izler, IPS müdahale eder</h2>

<p><strong>IDS</strong>, yani Saldırı Tespit Sistemi, trafiği inceleyerek şüpheli olaylar için alarm üretir. Genellikle ağın kopyalanmış trafiğini dinler. <strong>IPS</strong>, yani Saldırı Önleme Sistemi ise çoğunlukla trafik yoluna yerleşir; kurallara göre paket düşürebilir veya bağlantıyı engelleyebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>IDS</th>
      <th>IPS</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tipik konum</td>
      <td>Trafiğin kopyasında</td>
      <td>Trafik yolunda</td>
    </tr>
    <tr>
      <td>Temel çıktı</td>
      <td>Alarm ve kayıt</td>
      <td>Alarm ve engelleme</td>
    </tr>
    <tr>
      <td>Yanlış kararın etkisi</td>
      <td>Analist yükü</td>
      <td>Meşru hizmetin kesilmesi</td>
    </tr>
  </tbody>
</table>

<p>Kısacası dedektifin yanılması zaman kaybettirir; kapıdaki görevlinin yanılması müşteriyi dışarıda bırakabilir. Bu yüzden aynı tespit kuralı, IDS ve IPS üzerinde farklı operasyonel sonuçlar doğurur.</p>

<h2 id="i̇mza-tabanlı-tespit-tanıdık-izleri-aramak">İmza tabanlı tespit: Tanıdık izleri aramak</h2>

<p>İmza, bilinen bir saldırıyla ilişkilendirilmiş örüntüdür. Belirli bayt dizileri, protokol alanları veya bağlantı davranışları eşleştirilebilir. Ancak iyi bir imza yalnızca kelime aramaz; yön, oturum durumu ve protokol bağlamını da değerlendirir.</p>

<p>Aşağıdaki Suricata kuralı, laboratuvarda belirli bir HTTP yolunu ziyaret ettiğinizde alarm üretir. <strong>Gerçek saldırı imzası değildir</strong>; eşleştirme mantığını güvenli biçimde gösterir:</p>

<pre><code class="language-suricata">alert http any any -&gt; $HOME_NET any (msg:"LAB test URI"; flow:established,to_server; http.uri; content:"/ids-lab-test"; sid:1000001; rev:1;)
</code></pre>

<p>Burada <code class="language-plaintext highlighter-rouge">$HOME_NET</code>, yapılandırmada tanımlanan korunan ağı temsil eder. <code class="language-plaintext highlighter-rouge">http.uri</code>, aramayı HTTP URI alanına sınırlar; <code class="language-plaintext highlighter-rouge">flow</code> ise kurulmuş bağlantıda sunucuya giden yönü seçer. <code class="language-plaintext highlighter-rouge">sid</code>, kuralın kimliğidir. Üretimde yalnızca bir metin parçasına dayanmak yerine bağlamı daraltmak, yanlış alarmları azaltır.</p>

<p>İmzalar bilinen tehditlerde açıklanabilir sonuçlar verir. Buna karşılık yeni saldırılar, farklı kodlamalar ve görünürlük eksikliği eşleştirmeyi boşa çıkarabilir. Şifreli HTTP içeriği de uygun çözümleme olmadan bu şekilde incelenemez.</p>

<h2 id="anomali-tabanlı-tespit-normalden-sapmayı-ölçmek">Anomali tabanlı tespit: Normalden sapmayı ölçmek</h2>

<p>Anomali yaklaşımı önce normal davranışın profilini çıkarır. Dakikadaki bağlantı sayısı, hedef çeşitliliği veya gönderilen veri miktarı bu profilin özellikleri olabilir. Ardından yeni gözlemin geçmişten ne kadar uzaklaştığı ölçülür.</p>

<p>Basit bir yöntem, standartlaştırılmış uzaklıktır:</p>

\[z = \frac{x-\mu}{\sigma}\]

<p>Burada $x$ yeni ölçüm, $\mu$ geçmiş ortalama, $\sigma$ standart sapmadır. Aşağıdaki Python örneği, aynı kaynak için dakikalık bağlantı sayılarını değerlendirir:</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="c1"># Ayrı bir eğitim döneminden, temiz kabul edilen ölçümler.
</span><span class="n">baseline</span> <span class="o">=</span> <span class="p">[</span><span class="mi">90</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">95</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">110</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">102</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">103</span><span class="p">,</span> <span class="mi">100</span><span class="p">]</span>
<span class="n">mu</span> <span class="o">=</span> <span class="nf">mean</span><span class="p">(</span><span class="n">baseline</span><span class="p">)</span>
<span class="n">sigma</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="nf">pstdev</span><span class="p">(</span><span class="n">baseline</span><span class="p">),</span> <span class="mf">1.0</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">evaluate</span><span class="p">(</span><span class="n">connections</span><span class="p">):</span>
    <span class="n">z</span> <span class="o">=</span> <span class="p">(</span><span class="n">connections</span> <span class="o">-</span> <span class="n">mu</span><span class="p">)</span> <span class="o">/</span> <span class="n">sigma</span>
    <span class="k">return</span> <span class="p">{</span><span class="sh">"</span><span class="s">z_score</span><span class="sh">"</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="sh">"</span><span class="s">alert</span><span class="sh">"</span><span class="p">:</span> <span class="n">z</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">}</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">evaluate</span><span class="p">(</span><span class="mi">180</span><span class="p">))</span>
</code></pre></div></div>

<p>Kod, eğitim verisini mevcut gözlemden ayırır; standart sapmaya alt sınır koyarak sıfıra bölünmeyi önler. Ancak <code class="language-plaintext highlighter-rouge">3</code> evrensel güvenlik sabiti değildir. Trafik dağılımı, zaman bağımlılığı ve iş yükü nedeniyle eşik gerçek veride doğrulanmalıdır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü tarafı</th>
      <th>Temel riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İmza</td>
      <td>Bilinen örüntüyü açıklamak</td>
      <td>Yeni varyantı kaçırmak</td>
    </tr>
    <tr>
      <td>Anomali</td>
      <td>Bilinmeyen sapmayı yakalamak</td>
      <td>Meşru değişimi saldırı sanmak</td>
    </tr>
  </tbody>
</table>

<h2 id="alarmı-karara-dönüştürmek">Alarmı karara dönüştürmek</h2>

<p>Anomali, saldırı demek değildir. Yedekleme işleri ve kampanyalar da trafiği sıçratır. Bu yüzden profilleri sunucu rolü, saat ve ağ bölgesi bazında ayırmak gerekir. Zamanla değişen normale <strong>kavram kayması</strong> denir; kontrolsüz öğrenme ise saldırgan davranışını normalleştirebilir.</p>

<p>Başarıyı yalnızca alarm sayısıyla ölçmeyin. $Precision = TP/(TP+FP)$, alarmların ne kadarının doğru olduğunu; $Recall = TP/(TP+FN)$ ise gerçek saldırıların ne kadarının yakalandığını gösterir. Burada TP doğru alarm, FP yanlış alarm, FN kaçırılan saldırıdır.</p>

<p>Pratik başlangıç, kuralları önce izleme modunda çalıştırmak, alarmları doğrulamak ve yalnızca yüksek güvenli durumlarda engellemeye geçmektir. IPS için gecikme, kapasite ve arıza anında trafiğin geçirilmesi veya durdurulması kararı da planlanmalıdır. En iyi sonuç, imza ile anomaliyi yarıştırmak değil; ikisini varlık bilgisi ve analist değerlendirmesiyle birleştirmektir.</p>

<p><img src="/img/ids-ve-ips-48.svg" alt="ids-ve-ips-48" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="siber güvenlik" /><category term="ids" /><category term="ips" /><category term="ağ güvenliği" /><category term="anomali tespiti" /><category term="suricata" /><summary type="html"><![CDATA[Bir sunucunun gece üçte binlerce bağlantı başlatması güncelleme işleminden de kaynaklanabilir, ele geçirilmiş olmasından da. Ağ güvenliğinin eğlenceli ve zor tarafı burada başlar: Hareketi görmek yetmez, anlamlandırmak gerekir. IDS ve IPS, bu dijital mahallede şüpheli davranışları araştıran iki farklı güvenlik rolünü üstlenir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ids-ve-ips-48.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ids-ve-ips-48.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Mektuplardan Ağlara: Tarihi Sosyal İlişkileri Graf Teorisiyle Haritalamak</title><link href="https://program.sonsuz.us/posts/mektuplardan-aglara-tarihi-sosyal-iliskileri-graf-teorisiyle-haritalamak/" rel="alternate" type="text/html" title="Mektuplardan Ağlara: Tarihi Sosyal İlişkileri Graf Teorisiyle Haritalamak" /><published>2026-11-13T00:00:00+00:00</published><updated>2026-11-13T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/mektuplardan-aglara-tarihi-sosyal-iliskileri-graf-teorisiyle-haritalamak</id><content type="html" xml:base="https://program.sonsuz.us/posts/mektuplardan-aglara-tarihi-sosyal-iliskileri-graf-teorisiyle-haritalamak/"><![CDATA[<p>Bir arşivdeki yüzlerce mektup, ilk bakışta yalnızca kâğıt yığınları gibi görünebilir. Oysa gönderenleri, alıcıları ve tarihleri bir araya getirdiğinizde geçmişin sosyal dokusu belirginleşir: Kim haber taşıyordu, kim farklı çevreleri buluşturuyordu? Ağ analizi, bu ilişkileri araştırılabilir bir modele dönüştürür. Ancak renkli noktaların cazibesine kapılmadan önce, belgenin ne söylediğini dikkatle anlamamız gerekir.</p>

<p>``</p>

<h2 id="önce-ilişkiyi-tanımlayalım">Önce ilişkiyi tanımlayalım</h2>

<p>Graf teorisinde bir ağ, $G=(V,E)$ biçiminde gösterilir. Burada $V$ kişiler kümesini, $E$ ise aralarındaki ilişkileri temsil eder. Bir mektupta gönderen ile alıcı arasında bağlantı kurabilirsiniz; fakat aynı belgede adı geçen herkesin birbirini tanıdığını varsayamazsınız. Aynı sayfada görünmek, aynı masada oturmak değildir!</p>

<p>İlişkinin anlamı, grafın yapısını belirler. Yazışma genellikle yönlüdür: Ayşe’nin Kemal’e yazması, Kemal’in cevap verdiğini kanıtlamaz. Ortak kurum üyeliği ise yönsüz modellenebilir. Farklı ilişki türlerini tek çizgide eritmek yerine ayrı katmanlarda tutmak, tarihsel anlamı korur.</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>Bağlantının anlamı</th>
      <th>Temel sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yönlü ağ</td>
      <td>Bir kişinin diğerine mektup göndermesi</td>
      <td>Karşılıklılık varsayılamaz</td>
    </tr>
    <tr>
      <td>Yönsüz ağ</td>
      <td>Ortak dernek üyeliği</td>
      <td>Yakın dostluk kanıtlanmaz</td>
    </tr>
    <tr>
      <td>Ağırlıklı ağ</td>
      <td>Belgelenen iletişim sıklığı</td>
      <td>Arşiv kayıplarından etkilenir</td>
    </tr>
    <tr>
      <td>Zamansal ağ</td>
      <td>Belirli dönemdeki ilişkiler</td>
      <td>Tarihlendirme belirsiz olabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="sayılar-bize-ne-anlatır">Sayılar bize ne anlatır?</h2>

<p>Derece merkeziliği, kişinin doğrudan bağlantılarını özetler. Yönlü ağlarda gelen ve giden bağlantılar ayrılır. Çok kişiye mektup gönderen biriyle çok kişiden mektup alan biri, aynı sosyal rolü üstlenmeyebilir.</p>

<p>Aradalık merkeziliği ise farklı kişiler arasındaki en kısa yollar üzerinde bulunmayı ölçer:</p>

\[C_B(v)=\sum_{s\ne v\ne t}\frac{\sigma_{st}(v)}{\sigma_{st}}\]

<p>Burada toplam, birbirinden farklı başlangıç ve hedef çiftleri üzerinde alınır. $\sigma_{st}$ en kısa yolların sayısı, $\sigma_{st}(v)$ ise bunlardan $v$ üzerinden geçenlerin sayısıdır. Yüksek değer, olası bir aracılık konumuna işaret eder; siyasi nüfuzun kesin kanıtı değildir.</p>

<p>Bağlantı ağırlığı mektup sayısıysa, güçlü ilişkiyi kısa mesafe olarak modellemek için $d_{ij}=1/w_{ij}$ kullanılabilir. Bu tercih bir varsayımdır: Yoğun yazışmanın iletişim maliyetini azalttığını kabul eder, gerçek mesafeyi ölçmez.</p>

<h2 id="belgeleri-küçük-bir-veri-hattına-sokalım">Belgeleri küçük bir veri hattına sokalım</h2>

<p>Pratik süreç; tarama, OCR, kişi adlarını çıkarma ve kimlik eşleştirme adımlarından oluşur. “A. Kemal”, “Kemal Bey” ve “Ahmed Kemal” aynı kişi olabilir; fakat otomatik birleştirme hatalı sonuçlar doğurabilir. Her ilişki kaydında belge kimliği, tarih, ilişki türü ve doğrulama durumu saklanmalıdır. Şüpheli eşleşmeler ayrıca işaretlenmeli, özgün görüntüyle denetlenmelidir.</p>

<p>Aşağıdaki tamamen kurgusal örnek, elle doğrulanmış kayıtları kullanır. Gerekli paketleri <code class="language-plaintext highlighter-rouge">pip install networkx matplotlib</code> komutuyla kurabilirsiniz.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">networkx</span> <span class="k">as</span> <span class="n">nx</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>

<span class="n">kayitlar</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Ayşe</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Kemal</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">1871-01-12</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">K1</span><span class="sh">"</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Ayşe</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Kemal</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">1871-02-03</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">K2</span><span class="sh">"</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Kemal</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Leyla</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">1871-03-08</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">K3</span><span class="sh">"</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Leyla</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Deniz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">1871-04-17</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">K4</span><span class="sh">"</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Deniz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Ayşe</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">1871-05-21</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">K5</span><span class="sh">"</span><span class="p">),</span>
<span class="p">]</span>

<span class="n">g</span> <span class="o">=</span> <span class="n">nx</span><span class="p">.</span><span class="nc">DiGraph</span><span class="p">()</span>
<span class="k">for</span> <span class="n">kaynak</span><span class="p">,</span> <span class="n">hedef</span><span class="p">,</span> <span class="n">tarih</span><span class="p">,</span> <span class="n">belge</span> <span class="ow">in</span> <span class="n">kayitlar</span><span class="p">:</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">g</span><span class="p">.</span><span class="nf">has_edge</span><span class="p">(</span><span class="n">kaynak</span><span class="p">,</span> <span class="n">hedef</span><span class="p">):</span>
        <span class="n">g</span><span class="p">.</span><span class="nf">add_edge</span><span class="p">(</span><span class="n">kaynak</span><span class="p">,</span> <span class="n">hedef</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
                   <span class="n">belgeler</span><span class="o">=</span><span class="p">[],</span> <span class="n">tarihler</span><span class="o">=</span><span class="p">[])</span>
    <span class="n">veri</span> <span class="o">=</span> <span class="n">g</span><span class="p">[</span><span class="n">kaynak</span><span class="p">][</span><span class="n">hedef</span><span class="p">]</span>
    <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">weight</span><span class="sh">"</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
    <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">belgeler</span><span class="sh">"</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="n">belge</span><span class="p">)</span>
    <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">tarihler</span><span class="sh">"</span><span class="p">].</span><span class="nf">append</span><span class="p">(</span><span class="n">tarih</span><span class="p">)</span>

<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">veri</span> <span class="ow">in</span> <span class="n">g</span><span class="p">.</span><span class="nf">edges</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
    <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">distance</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">/</span> <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">weight</span><span class="sh">"</span><span class="p">]</span>

<span class="n">aradalik</span> <span class="o">=</span> <span class="n">nx</span><span class="p">.</span><span class="nf">betweenness_centrality</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="sh">"</span><span class="s">distance</span><span class="sh">"</span><span class="p">)</span>
<span class="n">konum</span> <span class="o">=</span> <span class="n">nx</span><span class="p">.</span><span class="nf">spring_layout</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">seed</span><span class="o">=</span><span class="mi">42</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="sh">"</span><span class="s">weight</span><span class="sh">"</span><span class="p">)</span>
<span class="n">boyutlar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">700</span> <span class="o">+</span> <span class="mi">3000</span> <span class="o">*</span> <span class="n">aradalik</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">g</span><span class="p">.</span><span class="n">nodes</span><span class="p">]</span>

<span class="n">nx</span><span class="p">.</span><span class="nf">draw_networkx</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">konum</span><span class="p">,</span> <span class="n">node_size</span><span class="o">=</span><span class="n">boyutlar</span><span class="p">,</span>
                 <span class="n">node_color</span><span class="o">=</span><span class="sh">"</span><span class="s">lightblue</span><span class="sh">"</span><span class="p">,</span> <span class="n">arrows</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">etiketler</span> <span class="o">=</span> <span class="n">nx</span><span class="p">.</span><span class="nf">get_edge_attributes</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="sh">"</span><span class="s">weight</span><span class="sh">"</span><span class="p">)</span>
<span class="n">nx</span><span class="p">.</span><span class="nf">draw_networkx_edge_labels</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">konum</span><span class="p">,</span> <span class="n">edge_labels</span><span class="o">=</span><span class="n">etiketler</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">axis</span><span class="p">(</span><span class="sh">"</span><span class="s">off</span><span class="sh">"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>
</code></pre></div></div>

<p>Kod, tekrarlanan yazışmaları tek bağlantıda toplar; belge ve tarih bilgilerini kaybetmez. Oklar iletişimin yönünü, kenar etiketleri mektup sayısını gösterir. Düğüm boyutu aradalığa bağlıdır. Sabit rastgelelik tohumu, yerleşimin tekrar üretilebilir olmasını sağlar. Ancak bu konumlar coğrafi koordinat değildir.</p>

<h2 id="güzel-grafik-sağlam-tarih-demek-değildir">Güzel grafik, sağlam tarih demek değildir</h2>

<p>Eksik arşivler, bazı kişileri gerçekte olduklarından daha önemsiz gösterebilir. Üstelik belgeyi saklanan kişi ile toplumda etkili kişi her zaman aynı değildir. Bu nedenle farklı dönemleri ayrı inceleyin, belirsiz kayıtları çıkararak sonuçların değişip değişmediğini kontrol edin ve merkezilik sıralamalarını belgelerle karşılaştırın.</p>

<p>Topluluk tespiti de araştırma sorusu üretir; otomatik bulunan kümeler doğrudan siyasi hizip veya dost çevresi sayılamaz. En verimli yaklaşım, grafı bir hüküm makinesi değil, arşive geri dönmeyi sağlayan bir pusula olarak kullanmaktır. Geçmişi noktalar ve çizgilerle sadeleştiririz; insanların hikâyelerini ise o çizgilerin arkasındaki belgeler anlatır.</p>

<p><img src="/img/mektuplardan-aglara-tarihi-69.svg" alt="mektuplardan-aglara-tarihi-69" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ağ analizi" /><category term="graf teorisi" /><category term="dijital beşeri bilimler" /><category term="python" /><category term="tarih" /><category term="veri görselleştirme" /><summary type="html"><![CDATA[Bir arşivdeki yüzlerce mektup, ilk bakışta yalnızca kâğıt yığınları gibi görünebilir. Oysa gönderenleri, alıcıları ve tarihleri bir araya getirdiğinizde geçmişin sosyal dokusu belirginleşir: Kim haber taşıyordu, kim farklı çevreleri buluşturuyordu? Ağ analizi, bu ilişkileri araştırılabilir bir modele dönüştürür. Ancak renkli noktaların cazibesine kapılmadan önce, belgenin ne söylediğini dikkatle anlamamız gerekir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/mektuplardan-aglara-tarihi-69.png" /><media:content medium="image" url="https://program.sonsuz.us/img/mektuplardan-aglara-tarihi-69.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>