<?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-03T06:05:48+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Akıllı Sözleşmeler Nasıl Çalışır? Blok Zincirde Koşullu Ödemelerin Kodla Yönetimi</title><link href="https://program.sonsuz.us/posts/akilli-sozlesmeler-nasil-calisir-blok-zincirde-kosullu-odemelerin-kodla-yonetimi/" rel="alternate" type="text/html" title="Akıllı Sözleşmeler Nasıl Çalışır? Blok Zincirde Koşullu Ödemelerin Kodla Yönetimi" /><published>2026-11-03T00:00:00+00:00</published><updated>2026-11-03T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-sozlesmeler-nasil-calisir-blok-zincirde-kosullu-odemelerin-kodla-yonetimi</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-sozlesmeler-nasil-calisir-blok-zincirde-kosullu-odemelerin-kodla-yonetimi/"><![CDATA[<p>Bir alışverişte paranın yalnızca teslimat onaylandıktan sonra satıcıya gönderildiğini düşünün. Normalde bu süreci bir aracı yönetir. Akıllı sözleşmelerde ise kurallar kodla tanımlanır, para sözleşmenin adresinde tutulur ve uygun işlem geldiğinde ödeme gerçekleştirilir. Ancak bu dijital kasanın neyi gerçekten bildiğini anlamak, en az kilidini tasarlamak kadar önemlidir.</p>

<p>``</p>

<h2 id="temel-fikir-paylaşılan-bir-durum-makinesi">Temel fikir: Paylaşılan bir durum makinesi</h2>

<p>Akıllı sözleşme, blok zincire yerleştirilmiş programdır. Ethereum gibi ağlarda kod, Ethereum Sanal Makinesi üzerinde yürütülür. Sözleşmenin bakiyesi, yetkili adresleri ve ödeme durumu kalıcı veriler olarak saklanır.</p>

<p>Bunu bir durum makinesi gibi düşünebiliriz: Sözleşme başlangıçta <strong>ödeme bekliyor</strong>, ardından <strong>fonlandı</strong>, son olarak <strong>ödendi</strong> durumuna geçer. Her geçişin koşulları vardır. Yetkisiz bir kullanıcı düğmeye bassa bile programın kontrollerini geçemez. Güven, tarafların iyi niyetinden çok, kodun doğruluğuna ve ağın güvenlik varsayımlarına dayanır.</p>

<h2 id="otomatik-ödeme-hangi-adımlarla-gerçekleşir">“Otomatik” ödeme hangi adımlarla gerçekleşir?</h2>

<ol>
  <li><strong>İşlem oluşturulur:</strong> Kullanıcı, sözleşmenin bir fonksiyonunu çağıran işlemi özel anahtarıyla imzalar.</li>
  <li><strong>Kod yürütülür:</strong> İşlemi işleyen düğümler, ilgili blok bağlamında aynı kuralları uygulayarak sonucu hesaplar.</li>
  <li><strong>Durum güncellenir:</strong> Koşullar sağlanırsa bakiye ve kayıtlar değişir. Bir kontrol başarısız olursa işlem geri alınır; harcanan işlem ücretleri genellikle yine ödenir.</li>
</ol>

<p>Buradaki kritik ayrıntı şudur: Sözleşmeler kendiliğinden uyanıp çalışmaz. Bir işlemle tetiklenmeleri gerekir. Zamanlanmış işler için harici otomasyon hizmetleri kullanılabilir; bunlar da sonuçta zincire işlem gönderir.</p>

<p>Ödeme kuralını şöyle özetleyebiliriz:</p>

\[T = B \cdot \mathbf{1}_{A \land \neg K}\]

<p>Burada $B$ emanetteki tutar, $A$ yetkili alıcının onayı, $K$ ise sözleşmenin kapanmış olmasıdır. Gösterge fonksiyonu, koşul doğruysa bir, yanlışsa sıfır üretir. Yani onay yoksa veya ödeme zaten yapıldıysa transfer gerçekleşmez.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Merkezi ödeme sistemi</th>
      <th>Akıllı sözleşme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kurallar</td>
      <td>Sunucu uygulamasında</td>
      <td>Zincirdeki kodda</td>
    </tr>
    <tr>
      <td>İşlemi yürütme</td>
      <td>İşletmeci altyapısı</td>
      <td>Ağın işlem yürütme mekanizması</td>
    </tr>
    <tr>
      <td>Değişiklik</td>
      <td>İşletmeci güncelleyebilir</td>
      <td>Tasarıma bağlı, çoğunlukla sınırlı</td>
    </tr>
    <tr>
      <td>Dış dünya bilgisi</td>
      <td>API ve kurum kayıtları</td>
      <td>Oracle veya taraf beyanı</td>
    </tr>
  </tbody>
</table>

<h2 id="solidity-ile-küçük-bir-emanet-kasası">Solidity ile küçük bir emanet kasası</h2>

<p>Aşağıdaki örnek, alıcının sözleşmeyi oluştururken yatırdığı ETH’yi saklar. Yalnızca aynı alıcı onay verdiğinde satıcıya ödeme yapar.</p>

<pre><code class="language-solidity">// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract Emanet {
    address public immutable alici;
    address payable public immutable satici;
    uint256 public immutable tutar;
    bool public kapandi;

    constructor(address payable _satici) payable {
        require(msg.value &gt; 0, "Bos emanet");
        require(_satici != address(0), "Gecersiz satici");
        alici = msg.sender;
        satici = _satici;
        tutar = msg.value;
    }

    function teslimatiOnayla() external {
        require(msg.sender == alici, "Yetkisiz kullanici");
        require(!kapandi, "Zaten odendi");

        kapandi = true;
        (bool basarili, ) = satici.call{value: tutar}("");
        require(basarili, "Transfer basarisiz");
    }
}
</code></pre>

<p><code class="language-plaintext highlighter-rouge">payable</code>, oluşturma sırasında ETH kabul edilmesini sağlar. <code class="language-plaintext highlighter-rouge">msg.sender</code> çağıranın adresidir; <code class="language-plaintext highlighter-rouge">msg.value</code> gönderilen tutarı belirtir. <code class="language-plaintext highlighter-rouge">immutable</code> alanlar oluşturulduktan sonra değiştirilemez. <code class="language-plaintext highlighter-rouge">require</code> ifadeleri ise geçersiz işlemleri durdurur.</p>

<p>Önemli güvenlik ayrıntısı, <code class="language-plaintext highlighter-rouge">kapandi</code> değişkeninin dış adrese para gönderilmeden önce güncellenmesidir. Bu, <strong>kontroller–etkiler–etkileşimler</strong> düzenidir: Önce koşulları denetle, sonra iç durumu değiştir, en son dış çağrı yap. Transfer başarısızsa <code class="language-plaintext highlighter-rouge">require</code> tüm bu durum değişikliklerini geri alır.</p>

<h2 id="blok-zincir-kargonun-geldiğini-nereden-bilir">Blok zincir kargonun geldiğini nereden bilir?</h2>

<p>Bilmez! Örnekte “teslimat”, alıcının onayı anlamına gelir; fiziksel teslimatın bağımsız kanıtı değildir. Kargo şirketinden bilgi alınacaksa oracle gerekir. Oracle, dış veriyi zincire taşıyan bir mekanizmadır ve sisteme yeni güven varsayımları ekler.</p>

<p>Bu yüzden “kod aracıları tamamen kaldırır” sözü her senaryoda doğru değildir. Özellikle fiyat, hava durumu veya teslimat gibi verilerde kaynağın doğruluğu, güncelliği ve manipülasyona dayanıklılığı ayrıca değerlendirilmelidir.</p>

<h2 id="gerçek-kullanımda-eksik-parçalar">Gerçek kullanımda eksik parçalar</h2>

<p>Bu örnekte alıcı hiç onay vermezse para kilitli kalır. Üretim tasarımında süreli iade, anlaşmazlık çözümü, olay kayıtları ve kapsamlı testler düşünülmelidir. Yeniden giriş saldırıları, erişim yetkileri ve yükseltme mekanizmaları ayrıca incelenmelidir.</p>

<p>İşlem ücretleri küçük ödemeleri pahalılaştırabilir; blokta görünmek de her ağda aynı kesinlik düzeyini sağlamaz. Akıllı sözleşme sihirli noter değildir: Açıkça tanımlanmış koşulları uygular. Başarılı tasarımın sırrı, yalnızca mutlu ödeme yolunu değil, herkesin fikrini değiştirdiği ve sistemlerin aksadığı günleri de kodlamaktır.</p>

<p><img src="/img/akilli-sozlesmeler-nasil-98.svg" alt="akilli-sozlesmeler-nasil-98" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="blok zincir" /><category term="akıllı sözleşmeler" /><category term="solidity" /><category term="ethereum" /><category term="finans" /><category term="otomasyon" /><summary type="html"><![CDATA[Bir alışverişte paranın yalnızca teslimat onaylandıktan sonra satıcıya gönderildiğini düşünün. Normalde bu süreci bir aracı yönetir. Akıllı sözleşmelerde ise kurallar kodla tanımlanır, para sözleşmenin adresinde tutulur ve uygun işlem geldiğinde ödeme gerçekleştirilir. Ancak bu dijital kasanın neyi gerçekten bildiğini anlamak, en az kilidini tasarlamak kadar önemlidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-sozlesmeler-nasil-98.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-sozlesmeler-nasil-98.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dalgalara Rağmen Doğru Rota: İnsansız Deniz Araçlarında Otonom Navigasyon</title><link href="https://program.sonsuz.us/posts/dalgalara-ragmen-dogru-rota-insansiz-deniz-araclarinda-otonom-navigasyon/" rel="alternate" type="text/html" title="Dalgalara Rağmen Doğru Rota: İnsansız Deniz Araçlarında Otonom Navigasyon" /><published>2026-11-03T00:00:00+00:00</published><updated>2026-11-03T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dalgalara-ragmen-dogru-rota-insansiz-deniz-araclarinda-otonom-navigasyon</id><content type="html" xml:base="https://program.sonsuz.us/posts/dalgalara-ragmen-dogru-rota-insansiz-deniz-araclarinda-otonom-navigasyon/"><![CDATA[<p>Karada çizdiğiniz rota genellikle yerinde durur; denizde ise yolun kendisi sizi yana doğru taşır! İnsansız bir deniz aracının hedefe ulaşması, yalnızca pusulayı doğru yöne çevirmek değildir. Dalga, akıntı ve rüzgâr altında konumunu anlaması, sapmayı hesaplaması ve fiziksel sınırlarına uygun düzeltmeler yapması gerekir.</p>

<p><img src="/img/dalgalara-ragmen-dogru-90.svg" alt="dalgalara-ragmen-dogru-90" /></p>

<p>``</p>

<h2 id="navigasyonun-üç-katmanı">Navigasyonun üç katmanı</h2>

<p>Otonom navigasyonu üç çalışanı olan küçük bir köprüüstü gibi düşünün: durum kestirici nerede olduğunuzu söyler, rota planlayıcı güvenli yolu seçer, kontrolcü ise dümen ve itkiyi yönetir. Bu görevleri ayırmak, hem yazılımı test etmeyi hem de arızaların kaynağını bulmayı kolaylaştırır.</p>

<p>GNSS konumu ve yer üzerindeki hızı sağlar. IMU ivme ve açısal hareketleri ölçer; pusula baş açısına yardımcı olur. Ancak hiçbiri kusursuz değildir. GNSS kesilebilir, pusula manyetik etkilerden sapabilir, IMU hataları zamanla birikebilir. Genişletilmiş Kalman filtresi gibi yöntemler, hareket modeliyle ölçümleri birleştirerek daha tutarlı bir durum tahmini üretir. Zaman damgalarının uyumu da en az sensör seçimi kadar önemlidir.</p>

<table>
  <thead>
    <tr>
      <th>Kaynak</th>
      <th>Güçlü tarafı</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GNSS</td>
      <td>Mutlak konum</td>
      <td>Kesinti ve ölçüm sıçraması</td>
    </tr>
    <tr>
      <td>IMU</td>
      <td>Hızlı hareket takibi</td>
      <td>Biriken hata</td>
    </tr>
    <tr>
      <td>Pusula</td>
      <td>Baş açısı desteği</td>
      <td>Manyetik bozulma</td>
    </tr>
    <tr>
      <td>Hareket modeli</td>
      <td>Ölçümler arasında tahmin</td>
      <td>Parametre belirsizliği</td>
    </tr>
  </tbody>
</table>

<h2 id="baş-açısı-ile-rota-açısı-aynı-değildir">Baş açısı ile rota açısı aynı değildir</h2>

<p>Aracın burnunun baktığı yön, baş açısı $ψ$; yer üzerindeki hareket yönü ise rota açısı $χ$ olsun. Akıntı varsa bu iki açı farklı olabilir. Burnunu kuzeye çevirmiş bir araç, doğuya akan su nedeniyle kuzeydoğuya ilerleyebilir.</p>

<p>Basitleştirilmiş yatay düzlem modeli şöyledir:</p>

\[\mathbf{v}_g=R(ψ)\mathbf{v}_b+\mathbf{v}_c\]

<p>Burada $\mathbf{v}<em>b$ suya göre hızı, $\mathbf{v}_c$ akıntıyı, $R(ψ)$ gövde koordinatlarından dünya koordinatlarına dönüşümü temsil eder. Yer hızından $χ=\operatorname{atan2}(v</em>{g,y},v_{g,x})$ hesaplanır. Dolayısıyla yalnızca baş açısını sabitlemek, çizilen rotayı korumaya yetmez.</p>

<h2 id="rotayı-kovalamak-yerine-önüne-bakmak">Rotayı kovalamak yerine önüne bakmak</h2>

<p>Yaygın çözümlerden biri, görüş hattı anlamına gelen LOS yönlendirmesidir. Sistem, rota üzerinde ileride bulunan hayali bir noktaya yönelir. Böylece küçük sapmalarda sert dönüşler yerine yumuşak yaklaşmalar üretir.</p>

<p>Düz bir rota parçasında yanal hata $e$, rota yönü $γ$ ve ileri bakış mesafesi $Δ$ için:</p>

\[χ_d=γ-\arctan(e/Δ),\qquad ψ_d=χ_d-β\]

<p>Buradaki $β$, süzülmüş $χ-ψ$ farkıyla yaklaşık olarak kestirilebilen sürüklenme açısıdır. Küçük $Δ$ daha çevik fakat daha salınımlı davranış yaratabilir. Büyük $Δ$ ise dönüşleri yumuşatırken rotaya dönüşü yavaşlatır. Çok düşük hızlarda rota açısı güvenilir olmadığından sürüklenme kestirimi sınırlandırılmalıdır.</p>

<h2 id="python-ile-yönlendirme-ve-dümen-kontrolü">Python ile yönlendirme ve dümen kontrolü</h2>

<p>Aşağıdaki örnek, LOS hedefini hesaplar ve baş açısı hatasını PI kontrolcüyle dümen komutuna dönüştürür. Koordinatlar metre cinsinden yerel düzlemde, açılar radyan cinsindedir. İntegral terimi kalıcı sapmayı azaltırken koşullu güncelleme, dümen doygunluğunda gereksiz birikimi önler.</p>

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


<span class="k">def</span> <span class="nf">wrap</span><span class="p">(</span><span class="n">angle</span><span class="p">):</span>
    <span class="nf">return </span><span class="p">(</span><span class="n">angle</span> <span class="o">+</span> <span class="n">math</span><span class="p">.</span><span class="n">pi</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="n">pi</span><span class="p">)</span> <span class="o">-</span> <span class="n">math</span><span class="p">.</span><span class="n">pi</span>


<span class="k">def</span> <span class="nf">los_heading</span><span class="p">(</span><span class="n">position</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">beta</span><span class="p">,</span> <span class="n">lookahead</span><span class="o">=</span><span class="mf">15.0</span><span class="p">):</span>
    <span class="n">dx</span><span class="p">,</span> <span class="n">dy</span> <span class="o">=</span> <span class="n">end</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">start</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">end</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">start</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
    <span class="n">length</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">hypot</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">length</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">lookahead</span> <span class="o">&lt;=</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">Geçersiz rota veya bakış mesafesi</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">px</span><span class="p">,</span> <span class="n">py</span> <span class="o">=</span> <span class="n">position</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">start</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">position</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">start</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
    <span class="n">error</span> <span class="o">=</span> <span class="p">(</span><span class="n">dx</span> <span class="o">*</span> <span class="n">py</span> <span class="o">-</span> <span class="n">dy</span> <span class="o">*</span> <span class="n">px</span><span class="p">)</span> <span class="o">/</span> <span class="n">length</span>
    <span class="n">course</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">atan2</span><span class="p">(</span><span class="n">dy</span><span class="p">,</span> <span class="n">dx</span><span class="p">)</span> <span class="o">-</span> <span class="n">math</span><span class="p">.</span><span class="nf">atan2</span><span class="p">(</span><span class="n">error</span><span class="p">,</span> <span class="n">lookahead</span><span class="p">)</span>
    <span class="k">return</span> <span class="nf">wrap</span><span class="p">(</span><span class="n">course</span> <span class="o">-</span> <span class="n">beta</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">steering</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">heading</span><span class="p">,</span> <span class="n">integral</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">dt</span> <span class="o">&lt;=</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">dt pozitif olmalı</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">error</span> <span class="o">=</span> <span class="nf">wrap</span><span class="p">(</span><span class="n">target</span> <span class="o">-</span> <span class="n">heading</span><span class="p">)</span>
    <span class="n">raw</span> <span class="o">=</span> <span class="mf">1.2</span> <span class="o">*</span> <span class="n">error</span> <span class="o">+</span> <span class="mf">0.04</span> <span class="o">*</span> <span class="n">integral</span>
    <span class="n">command</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="o">-</span><span class="mf">0.6</span><span class="p">,</span> <span class="nf">min</span><span class="p">(</span><span class="mf">0.6</span><span class="p">,</span> <span class="n">raw</span><span class="p">))</span>
    <span class="k">if</span> <span class="nf">abs</span><span class="p">(</span><span class="n">raw</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mf">0.6</span> <span class="ow">or</span> <span class="n">raw</span> <span class="o">*</span> <span class="n">error</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">integral</span> <span class="o">+=</span> <span class="n">error</span> <span class="o">*</span> <span class="n">dt</span>
    <span class="k">return</span> <span class="n">command</span><span class="p">,</span> <span class="n">integral</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">wrap</code>, açı sınırında yanlışlıkla tam tur dönülmesini engeller. İntegral değeri kontrol döngüleri arasında korunmalıdır. Katsayılar yalnızca örnektir; gerçek araçta hız, gövde dinamiği ve dümen sınırlarına göre ayarlanır. Ayrıca dümen işaretinin modelle uyumu doğrulanmalıdır. Bu kod, waypoint geçişlerini veya engelden kaçınmayı kapsamaz.</p>

<h2 id="her-dalgayla-kavga-etmeyin">Her dalgayla kavga etmeyin</h2>

<p>Dalga kaynaklı hızlı salınımları sürekli dümenle düzeltmek enerji tüketir ve mekanizmayı yorar. Uygun filtreleme ve kontrol bant genişliği, yavaş rota sapmalarını hızlı yalpalamadan ayırmaya yardımcı olur. Ancak aşırı filtreleme gecikme yaratır; bu yüzden kontrolcü, sensör ve gövde birlikte değerlendirilmelidir.</p>

<p>İtki kontrolü de önemlidir: birçok dümenli araç düşük hızda yönlendirme otoritesini kaybeder. Akıntı aracın kapasitesini aşıyorsa hiçbir yazılım istenen rotayı garanti edemez. Sistem güvenli bekleme, alternatif rota veya operatöre devretme davranışına geçmelidir. Trafikte ise çarpışma riski ve uygulanabilir COLREG kuralları ayrıca ele alınmalıdır.</p>

<p>Başarılı otonomi, denizi yenmek değil, etkilerini ölçüp yönetmektir. Önce simülasyonda akıntı, sensör kesintisi ve aktüatör sınırlarını deneyin; ardından kontrollü deniz testlerinde yanal hata, enerji tüketimi ve güvenlik davranışlarını karşılaştırın.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="otonom navigasyon" /><category term="insansız deniz araçları" /><category term="kontrol teorisi" /><category term="robotik" /><category term="sensör füzyonu" /><category term="python" /><summary type="html"><![CDATA[Karada çizdiğiniz rota genellikle yerinde durur; denizde ise yolun kendisi sizi yana doğru taşır! İnsansız bir deniz aracının hedefe ulaşması, yalnızca pusulayı doğru yöne çevirmek değildir. Dalga, akıntı ve rüzgâr altında konumunu anlaması, sapmayı hesaplaması ve fiziksel sınırlarına uygun düzeltmeler yapması gerekir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dalgalara-ragmen-dogru-90.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dalgalara-ragmen-dogru-90.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Elektrikli Araç Şarjında Yük Dengeleme: Herkese Enerji, Şebekeye Nefes</title><link href="https://program.sonsuz.us/posts/elektrikli-arac-sarjinda-yuk-dengeleme-herkese-enerji-sebekeye-nefes/" rel="alternate" type="text/html" title="Elektrikli Araç Şarjında Yük Dengeleme: Herkese Enerji, Şebekeye Nefes" /><published>2026-11-03T00:00:00+00:00</published><updated>2026-11-03T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/elektrikli-arac-sarjinda-yuk-dengeleme-herkese-enerji-sebekeye-nefes</id><content type="html" xml:base="https://program.sonsuz.us/posts/elektrikli-arac-sarjinda-yuk-dengeleme-herkese-enerji-sebekeye-nefes/"><![CDATA[<p>Bir otoparkta sekiz elektrikli aracın aynı anda prize bağlandığını düşünün. Her sürücü hızlı şarj ister; bina ise asansörleri, klimaları ve aydınlatmasıyla zaten enerji tüketmektedir. İşte yük dengeleme, bu elektrikli açık büfede herkesin tabağını doldururken mutfağın sigortasını attırmamayı sağlar. Üstelik mesele yalnızca gücü kısmak değil, mevcut kapasiteyi akıllıca paylaşmaktır.</p>

<p>``</p>

<h2 id="önce-temel-mantık-güç-bütçesi">Önce temel mantık: Güç bütçesi</h2>

<p>Şarj istasyonlarının etiket güçlerini toplamak, altyapının gerçek ihtiyacını anlamak için yeterli değildir. Önemli olan, tesisin bağlantı kapasitesiyle o anda tüketilen diğer yükler arasındaki farktır. Dinamik yük dengeleme, ölçüm cihazlarından aldığı verilerle bu farkı düzenli olarak hesaplar ve araçlara ayrılabilecek toplam gücü günceller.</p>

<p>Basitleştirilmiş aktif güç modeli şöyledir:</p>

\[P_{EV}(t)=\max(0, P_{tesis}-P_{diger}(t)-P_{pay})\]

<p>Burada $P_{pay}$ güvenlik rezervidir. Her aracın aldığı güç için de şu sınırlar geçerlidir:</p>

\[\sum_i p_i(t) \le P_{EV}(t), \qquad 0 \le p_i(t) \le P_{i,max}\]

<p>Örneğin tesis sınırı 120 kW, diğer tüketimler 45 kW ve rezerv 10 kW ise araçlara 65 kW kalır. Sekiz aracın her biri 11 kW isterse toplam talep 88 kW olur. Eşit paylaşımda araç başına yaklaşık 8,125 kW ayrılır; böylece toplam tüketim rezerv dahil belirlenen sınırı aşmaz.</p>

<h2 id="statik-mi-dinamik-mi-öngörülü-mü">Statik mi, dinamik mi, öngörülü mü?</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Nasıl çalışır?</th>
      <th>Güçlü yanı</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Statik</td>
      <td>Şarja sabit bir üst sınır koyar</td>
      <td>Basit ve öngörülebilir</td>
      <td>Boş kapasiteyi kullanamayabilir</td>
    </tr>
    <tr>
      <td>Dinamik</td>
      <td>Anlık bina tüketimine göre bütçeyi değiştirir</td>
      <td>Kapasiteyi daha verimli kullanır</td>
      <td>Güvenilir ölçüm ve iletişim ister</td>
    </tr>
    <tr>
      <td>Öngörülü</td>
      <td>Tüketim, tarife ve ayrılış tahminleriyle planlar</td>
      <td>Maliyet ve zaman hedeflerini birlikte yönetir</td>
      <td>Tahmin hatalarından etkilenir</td>
    </tr>
  </tbody>
</table>

<p>Statik sistem, restoranın her akşam aynı sayıda masa açmasına benzer. Dinamik sistem müşteri yoğunluğunu izler; öngörülü sistem ise rezervasyon defterini de okur. Ancak hiçbir yöntem fiziksel bağlantı sınırını sihirli biçimde büyütmez.</p>

<h2 id="gücü-adil-dağıtmak-ağırlıklı-paylaşım">Gücü adil dağıtmak: Ağırlıklı paylaşım</h2>

<p>Eşit paylaşım anlaşılırdır, fakat ihtiyaçlar eşit olmayabilir. Yarım saat sonra ayrılacak servis aracı, gece boyunca park edecek araçtan daha yüksek öncelik alabilir. Ağırlıklı paylaşımda öncelikler sayısallaştırılır; araçların kabul edebileceği güç sınırları da korunur.</p>

<p>Aşağıdaki Python fonksiyonu bütçeyi ağırlıklara göre dağıtır. Sınırına ulaşan aracın kullanamadığı pay, sonraki turda diğerlerine aktarılır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">paylastir</span><span class="p">(</span><span class="n">butce</span><span class="p">,</span> <span class="n">araclar</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">any</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="sh">'</span><span class="s">max_kw</span><span class="sh">'</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">a</span><span class="p">[</span><span class="sh">'</span><span class="s">agirlik</span><span class="sh">'</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">araclar</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">Güç negatif, ağırlık sıfır veya negatif olamaz.</span><span class="sh">'</span><span class="p">)</span>

    <span class="n">kalan</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">butce</span><span class="p">)</span>
    <span class="n">sonuc</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">]</span> <span class="o">*</span> <span class="nf">len</span><span class="p">(</span><span class="n">araclar</span><span class="p">)</span>
    <span class="n">aktif</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">araclar</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span><span class="p">[</span><span class="sh">'</span><span class="s">max_kw</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">]</span>

    <span class="k">while</span> <span class="n">aktif</span> <span class="ow">and</span> <span class="n">kalan</span> <span class="o">&gt;</span> <span class="mf">1e-6</span><span class="p">:</span>
        <span class="n">toplam_agirlik</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">araclar</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="sh">'</span><span class="s">agirlik</span><span class="sh">'</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">aktif</span><span class="p">)</span>
        <span class="n">tur_butcesi</span> <span class="o">=</span> <span class="n">kalan</span>

        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">aktif</span><span class="p">:</span>
            <span class="n">arac</span> <span class="o">=</span> <span class="n">araclar</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="n">pay</span> <span class="o">=</span> <span class="n">tur_butcesi</span> <span class="o">*</span> <span class="n">arac</span><span class="p">[</span><span class="sh">'</span><span class="s">agirlik</span><span class="sh">'</span><span class="p">]</span> <span class="o">/</span> <span class="n">toplam_agirlik</span>
            <span class="n">ek</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">pay</span><span class="p">,</span> <span class="n">arac</span><span class="p">[</span><span class="sh">'</span><span class="s">max_kw</span><span class="sh">'</span><span class="p">]</span> <span class="o">-</span> <span class="n">sonuc</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
            <span class="n">sonuc</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">ek</span>
            <span class="n">kalan</span> <span class="o">-=</span> <span class="n">ek</span>

        <span class="n">aktif</span> <span class="o">=</span> <span class="p">[</span>
            <span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">aktif</span>
            <span class="k">if</span> <span class="n">araclar</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="sh">'</span><span class="s">max_kw</span><span class="sh">'</span><span class="p">]</span> <span class="o">-</span> <span class="n">sonuc</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mf">1e-6</span>
        <span class="p">]</span>

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

<span class="n">araclar</span> <span class="o">=</span> <span class="p">[{</span><span class="sh">'</span><span class="s">max_kw</span><span class="sh">'</span><span class="p">:</span> <span class="mf">11.0</span><span class="p">,</span> <span class="sh">'</span><span class="s">agirlik</span><span class="sh">'</span><span class="p">:</span> <span class="mf">1.0</span><span class="p">}</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">8</span><span class="p">)]</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">paylastir</span><span class="p">(</span><span class="mf">65.0</span><span class="p">,</span> <span class="n">araclar</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu örnek sekiz araç için yaklaşık 8,125 kW üretir. <code class="language-plaintext highlighter-rouge">max_kw</code>, yalnızca istasyonun etiketini değil, aracın ve bağlantının güncel sınırını temsil etmelidir. Fonksiyon sürekli güç paylaşımını gösterir; üretim sistemindeki haberleşme, hata yönetimi ve minimum akım koşullarını uygulamaz.</p>

<h2 id="sahada-matematiğin-yanına-mühendislik-koyun">Sahada matematiğin yanına mühendislik koyun</h2>

<p>Gerçek tesislerde toplam kW sınırı tek başına yeterli değildir. Özellikle tek fazlı araçlar, toplam kapasite uygun görünürken bir fazı aşırı yükleyebilir. Bu nedenle faz akımları, kablo sınırları, koruma elemanları ve gerektiğinde görünür güç de izlenmelidir. Yazılım, elektriksel korumanın yerine geçmez.</p>

<p>AC şarjda izin verilen minimum akımın altında kesintisiz paylaşım mümkün olmayabilir. Böyle durumlarda bazı oturumları sırayla bekletmek gerekir. Ölçüm gecikmesine karşı rezerv bırakmak, komut değişimlerini yumuşatmak ve iletişim kesildiğinde güvenli sınırlara dönmek de önemlidir.</p>

<h2 id="optimizasyonun-gerçek-hedefi">Optimizasyonun gerçek hedefi</h2>

<p>Güç, anlık hızdır; enerji ise zaman boyunca biriken miktardır. Sabit güçte bataryaya aktarılan yaklaşık enerji $E=\eta P\Delta t$ ile hesaplanır. Burada $\eta$ verim, $\Delta t$ saat cinsinden süredir. Ayrılış zamanına kadar gereken enerjiyi tamamlamak, her aracı sürekli maksimum güçte tutmaktan daha anlamlıdır.</p>

<p>Ucuz saatlere kaydırma, güneş üretimini değerlendirme ve tesisin tepe talebini azaltma aynı planın parçaları olabilir. Fakat düşük öncelikli araçların sürekli beklememesi için bekleme süresi de hesaba katılmalıdır. Başarılı yük dengeleme, en yüksek anlık gücü değil; güvenli, adil ve zamanında tamamlanan şarjı hedefler.</p>

<p><img src="/img/elektrikli-arac-sarjinda-28.svg" alt="elektrikli-arac-sarjinda-28" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="elektrikli araç" /><category term="yük dengeleme" /><category term="şarj altyapısı" /><category term="akıllı şebeke" /><category term="python" /><category term="enerji yönetimi" /><summary type="html"><![CDATA[Bir otoparkta sekiz elektrikli aracın aynı anda prize bağlandığını düşünün. Her sürücü hızlı şarj ister; bina ise asansörleri, klimaları ve aydınlatmasıyla zaten enerji tüketmektedir. İşte yük dengeleme, bu elektrikli açık büfede herkesin tabağını doldururken mutfağın sigortasını attırmamayı sağlar. Üstelik mesele yalnızca gücü kısmak değil, mevcut kapasiteyi akıllıca paylaşmaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/elektrikli-arac-sarjinda-28.png" /><media:content medium="image" url="https://program.sonsuz.us/img/elektrikli-arac-sarjinda-28.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kripto Borsalarının Kalbi: Emir Eşleştirme Motoru Nasıl Çalışır?</title><link href="https://program.sonsuz.us/posts/kripto-borsalarinin-kalbi-emir-eslestirme-motoru-nasil-calisir/" rel="alternate" type="text/html" title="Kripto Borsalarının Kalbi: Emir Eşleştirme Motoru Nasıl Çalışır?" /><published>2026-11-03T00:00:00+00:00</published><updated>2026-11-03T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kripto-borsalarinin-kalbi-emir-eslestirme-motoru-nasil-calisir</id><content type="html" xml:base="https://program.sonsuz.us/posts/kripto-borsalarinin-kalbi-emir-eslestirme-motoru-nasil-calisir/"><![CDATA[<p>Bir kripto borsasında “Al” düğmesine bastığınızda, arka planda dijital bir müzayede başlar. Ancak tokmak tutan bir görevli yoktur: Binlerce emri sıralayan, uygun karşı tarafı bulan ve işlemleri kaydeden bir eşleştirme motoru vardır. Bu motorun sırrı yalnızca hız değil, herkes için aynı kuralları uygulamasıdır.
``</p>

<h2 id="önce-mantık-emir-defteri-nedir">Önce Mantık: Emir Defteri Nedir?</h2>

<p>Emir defteri, gerçekleşmeyi bekleyen alış ve satış emirlerini tutar. Alış tarafındaki en yüksek fiyat <strong>en iyi alış</strong>, satış tarafındaki en düşük fiyat ise <strong>en iyi satış</strong> olarak adlandırılır. Aralarındaki fark, yani spread:</p>

\[s = P_{satış} - P_{alış}\]

<p>Bir limit alış emri, ödemeye razı olduğunuz azami fiyatı belirtir. Limit satış emri ise kabul edeceğiniz asgari fiyatı söyler. Alıcının limiti satıcının fiyatına eşit veya yüksekse eşleşme mümkündür. Piyasa emri fiyat sınırı koymadan mevcut likiditeyi tüketir; büyük emirlerde bu nedenle kayma oluşabilir.</p>

<p>Örneğin satış defterinde 100 USDT’den iki, 101 USDT’den üç token bulunsun. Dört tokenlık, 101 USDT limitli alış emri önce iki tokenı 100’den, sonra iki tokenı 101’den alır. İşlem fiyatı, bu modelde defterde bekleyen emrin fiyatıdır.</p>

<h2 id="kim-önce-i̇şlem-görür">Kim Önce İşlem Görür?</h2>

<p>Yaygın yaklaşım <strong>fiyat-zaman önceliğidir</strong>: Daha iyi fiyat önce gelir; aynı fiyatta daha önce kabul edilen emir önceliklidir. Bu yüzden her fiyat seviyesinde bir FIFO kuyruğu tutulabilir.</p>

<table>
  <thead>
    <tr>
      <th>Veri yapısı</th>
      <th>Seviye ekleme/silme</th>
      <th>Temel karşılık</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sıralı dizi</td>
      <td>$O(L)$</td>
      <td>Basit yapı, kaydırma maliyeti</td>
    </tr>
    <tr>
      <td>Dengeli arama ağacı</td>
      <td>$O(\log L)$</td>
      <td>Dinamik fiyat seviyelerinde verimlilik</td>
    </tr>
    <tr>
      <td>Sırasız sözlük</td>
      <td>Ortalama $O(1)$</td>
      <td>En iyi fiyatı ayrıca bulmak gerekir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/kripto-borsalarinin-kalbi-33.svg" alt="kripto-borsalarinin-kalbi-33" /></p>

<p>Burada $L$, fiyat seviyesi sayısıdır. Ağaç kullanılan bir tasarımda en iyi seviyeye işaretçi tutulabilir; seviyenin içindeki kuyruk başını kaldırmak ise $O(1)$ maliyetlidir.</p>

<p>Fiyat ve miktarlar genellikle kayan noktalı sayılar yerine tam sayı olarak saklanır:</p>

\[P = p \times tick, \qquad Q = q \times lot\]

<p>Böylece yuvarlama sürprizleri yerine açık fiyat adımları ve miktar kuralları kullanılır.</p>

<h2 id="milisaniyelik-i̇şlem-hattı">Milisaniyelik İşlem Hattı</h2>

<p>Tipik akış şu istasyonlardan geçer:</p>

<ol>
  <li><strong>Ağ geçidi:</strong> Kimlik doğrulama, mesaj biçimi ve hız sınırları kontrol edilir.</li>
  <li><strong>Risk kontrolü:</strong> Bakiye, minimum miktar ve fiyat adımı doğrulanır; gerekli varlık rezerve edilir.</li>
  <li><strong>Sıralayıcı:</strong> Kabul edilen emir ve iptal komutlarına kesin bir sıra numarası atanır.</li>
  <li><strong>Motor:</strong> Komutlar bu sırayla uygulanır; gerçekleşmeler ve defter değişiklikleri üretilir.</li>
</ol>

<p>Aynı defteri birçok iş parçacığının gelişigüzel değiştirmesi yarış koşulları yaratır. Yaygın çözüm, her defter için tek yazarlı deterministik işlemektir. Ölçekleme farklı işlem çiftlerine dağıtılarak yapılabilir; birden fazla defter aynı süreçte de çalışabilir.</p>

<p>Önceliğin hakemi istemci saati değil, sunucunun kabul sırasıdır. Aksi hâlde bilgisayarının saatini değiştiren kullanıcı sırada öne geçmeye çalışabilir!</p>

<h2 id="küçük-bir-eşleştirme-prototipi">Küçük Bir Eşleştirme Prototipi</h2>

<p>Aşağıdaki Python kodu, önceden doğrulanmış bir limit alış emrini satış kuyruklarıyla eşleştirir:</p>

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

<span class="nd">@dataclass</span>
<span class="k">class</span> <span class="nc">Order</span><span class="p">:</span>
    <span class="n">oid</span><span class="p">:</span> <span class="nb">int</span>
    <span class="n">price</span><span class="p">:</span> <span class="nb">int</span>
    <span class="n">qty</span><span class="p">:</span> <span class="nb">int</span>

<span class="k">def</span> <span class="nf">match_buy</span><span class="p">(</span><span class="n">limit</span><span class="p">,</span> <span class="n">qty</span><span class="p">,</span> <span class="n">asks</span><span class="p">):</span>
    <span class="n">trades</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">while</span> <span class="n">qty</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">asks</span><span class="p">:</span>
        <span class="n">price</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">asks</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">price</span> <span class="o">&gt;</span> <span class="n">limit</span><span class="p">:</span>
            <span class="k">break</span>
        <span class="n">queue</span> <span class="o">=</span> <span class="n">asks</span><span class="p">[</span><span class="n">price</span><span class="p">]</span>
        <span class="n">maker</span> <span class="o">=</span> <span class="n">queue</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
        <span class="n">filled</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">qty</span><span class="p">,</span> <span class="n">maker</span><span class="p">.</span><span class="n">qty</span><span class="p">)</span>
        <span class="n">trades</span><span class="p">.</span><span class="nf">append</span><span class="p">((</span><span class="n">maker</span><span class="p">.</span><span class="n">oid</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="n">filled</span><span class="p">))</span>
        <span class="n">qty</span> <span class="o">-=</span> <span class="n">filled</span>
        <span class="n">maker</span><span class="p">.</span><span class="n">qty</span> <span class="o">-=</span> <span class="n">filled</span>
        <span class="k">if</span> <span class="n">maker</span><span class="p">.</span><span class="n">qty</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">queue</span><span class="p">.</span><span class="nf">popleft</span><span class="p">()</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">queue</span><span class="p">:</span>
            <span class="k">del</span> <span class="n">asks</span><span class="p">[</span><span class="n">price</span><span class="p">]</span>
    <span class="k">return</span> <span class="n">trades</span><span class="p">,</span> <span class="n">qty</span>

<span class="n">asks</span> <span class="o">=</span> <span class="p">{</span>
    <span class="mi">10000</span><span class="p">:</span> <span class="nf">deque</span><span class="p">([</span><span class="nc">Order</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10000</span><span class="p">,</span> <span class="mi">2</span><span class="p">)]),</span>
    <span class="mi">10100</span><span class="p">:</span> <span class="nf">deque</span><span class="p">([</span><span class="nc">Order</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">10100</span><span class="p">,</span> <span class="mi">3</span><span class="p">)]),</span>
<span class="p">}</span>
<span class="n">trades</span><span class="p">,</span> <span class="n">remaining</span> <span class="o">=</span> <span class="nf">match_buy</span><span class="p">(</span><span class="mi">10100</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="n">asks</span><span class="p">)</span>
</code></pre></div></div>

<p>Fiyat adımı 0,01 USDT kabul edilirse <code class="language-plaintext highlighter-rouge">10000</code>, 100 USDT’yi temsil eder. Kod kısmi gerçekleşmeleri işler ve boş seviyeleri kaldırır. Ancak <code class="language-plaintext highlighter-rouge">min(asks)</code> her turda seviyeleri tarar: Bu bir öğretim örneğidir, üretim motoru değildir. Eşleşmeyen miktar, GTC limit emrinde alış defterine eklenir; IOC emrinde iptal edilir.</p>

<h2 id="hız-yetmez-çökünce-ne-olacak">Hız Yetmez: Çökünce Ne Olacak?</h2>

<p>Motorun bellekte çalışması, kayıtların unutulabileceği anlamına gelmez. Komut günlüğü ve periyodik snapshot kullanılarak durum yeniden oluşturulur. Dışarıya kesin kabul veya işlem sonucu bildirilmeden önce gereken kalıcılık garantisi sağlanmalıdır. Günlük senkronizasyonu ve çoğaltma tercihleri gecikmeyi etkiler.</p>

<p>Yeniden oynatma aynı komutlardan aynı sonucu üretmelidir. Emir kimlikleriyle yinelenen istekler ayıklanır; piyasa verisi sıra numaralarıyla yayınlanır, kayıp mesajlar snapshot üzerinden tamamlanır. Bakiye muhasebesi de gerçekleşme olaylarını güvenilir biçimde işlemelidir.</p>

<p>Son olarak yalnızca ortalama gecikmeyi ölçmeyin: <strong>p99 gecikmesi</strong>, yoğunluk altında kuyruk büyümesi ve iptal performansı da önemlidir. İyi motor, hızlı bir çöpçatan olduğu kadar, sırası şaşmayan titiz bir muhasebecidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kripto" /><category term="emir-eşleştirme" /><category term="sistem-mimarisi" /><category term="algoritmalar" /><category term="düşük-gecikme" /><summary type="html"><![CDATA[Bir kripto borsasında “Al” düğmesine bastığınızda, arka planda dijital bir müzayede başlar. Ancak tokmak tutan bir görevli yoktur: Binlerce emri sıralayan, uygun karşı tarafı bulan ve işlemleri kaydeden bir eşleştirme motoru vardır. Bu motorun sırrı yalnızca hız değil, herkes için aynı kuralları uygulamasıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kripto-borsalarinin-kalbi-33.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kripto-borsalarinin-kalbi-33.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Mikro Öğrenmenin Zamanlama Motoru: Doğru İçerik, Doğru An</title><link href="https://program.sonsuz.us/posts/mikro-ogrenmenin-zamanlama-motoru-dogru-icerik-dogru-an/" rel="alternate" type="text/html" title="Mikro Öğrenmenin Zamanlama Motoru: Doğru İçerik, Doğru An" /><published>2026-11-03T00:00:00+00:00</published><updated>2026-11-03T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/mikro-ogrenmenin-zamanlama-motoru-dogru-icerik-dogru-an</id><content type="html" xml:base="https://program.sonsuz.us/posts/mikro-ogrenmenin-zamanlama-motoru-dogru-icerik-dogru-an/"><![CDATA[<p><img src="/img/mikro-ogrenmenin-zamanlama-29.svg" alt="mikro-ogrenmenin-zamanlama-29" /></p>

<p>Telefonunuza gelen üç dakikalık bir ders, rastgele seçilmiş küçük bir bilgi paketi olmak zorunda değil. İyi bir mikro öğrenme platformu, neyi bildiğinizi ve neyi unutmak üzere olduğunuzu tahmin ederek içerik dağıtır. İşin sırrı yalnızca dersleri küçültmek değil, onları zihninizin ritmine göre zamanlamaktır.
``</p>

<h2 id="kısa-içerik-neden-tek-başına-yeterli-değil">Kısa içerik neden tek başına yeterli değil?</h2>

<p>Mikro öğrenme, bir öğrenme hedefini kısa ve odaklı etkinliklere böler. Ancak kısa olmak, otomatik olarak öğretici olmak anlamına gelmez. Bir dakikalık videoyu izlemekle aynı bilgiyi yardım almadan hatırlamak farklı şeylerdir.</p>

<p>Burada iki eğriyi ayırmak gerekir: <strong>Öğrenme eğrisi</strong>, pratik arttıkça performansın nasıl geliştiğini; <strong>unutma eğrisi</strong>, tekrar yapılmadığında hatırlamanın zamanla nasıl azaldığını gösterir. Dağıtım algoritması ikisini birlikte değerlendirmelidir.</p>

<p>Örneğin kullanıcı döngü sorularını hızla çözüyorsa daha zor bir uygulamaya geçebilir. Aynı kullanıcı önceki sözdizimini unutuyorsa yeni konu yerine kısa bir hatırlama sorusu daha faydalı olabilir. Hedef, sürekli yeni içerik sunmak değil, kullanılabilir bilgiyi büyütmektir.</p>

<h2 id="hafızayı-basit-bir-modelle-temsil-etmek">Hafızayı basit bir modelle temsil etmek</h2>

<p>Başlangıç için hatırlama olasılığını şu yaklaşık modelle düşünebiliriz:</p>

\[P(t)=e^{-t/S}\]

<p>Burada $t$, son tekrardan beri geçen süre; $S$ ise bilginin hafızadaki dayanıklılığıdır. İkisi aynı zaman birimini kullanmalıdır. Büyük $S$, daha yavaş unutma anlamına gelir. Gerçek hafıza bundan karmaşıktır; bu denklem evrensel yasa değil, anlaşılır bir mühendislik yaklaşımıdır.</p>

<p>Tekrarı hedef olasılık $p_*$ seviyesinde yapmak istersek:</p>

\[t_*=-S\ln(p_*)\]

<p>Örneğin $S=6$ gün ve $p_*=0.85$ için tekrar yaklaşık $0.98$ gün sonra planlanır. Hedef olasılık yükseldikçe tekrarlar sıklaşır; öğrenme yükü de artar. Yani algoritmanın elinde bedava bir hafıza sihirbazı yoktur!</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Zamanlama mantığı</th>
      <th>Temel sınır</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sabit takvim</td>
      <td>Her gün aynı aralık</td>
      <td>Bireysel farkları kaçırır</td>
    </tr>
    <tr>
      <td>Aralıklı tekrar</td>
      <td>Hatırlama tahminine göre</td>
      <td>İyi ölçüm gerektirir</td>
    </tr>
    <tr>
      <td>Uyarlanabilir akış</td>
      <td>Hafıza, zorluk ve bütçe birlikte</td>
      <td>Daha karmaşıktır</td>
    </tr>
  </tbody>
</table>

<h2 id="dağıtım-algoritmasının-karar-zinciri">Dağıtım algoritmasının karar zinciri</h2>

<p>Platform, yalnızca içerik değil, <strong>kullanıcı–beceri–içerik ilişkisi</strong> tutmalıdır. Aynı kullanıcı iki konuda farklı dayanıklılığa sahip olabilir.</p>

<ol>
  <li><strong>Ölç:</strong> İzleme tamamlanmasını değil, kısa bir geri çağırma sorusunu değerlendir.</li>
  <li><strong>Güncelle:</strong> Doğruluk, önceki tekrarlar ve geçen süreyle hafıza tahminini yenile.</li>
  <li><strong>Filtrele:</strong> Ön koşulları karşılanmamış veya erişilebilir olmayan içerikleri çıkar.</li>
  <li><strong>Sırala:</strong> Tekrarı gelen kartları, öğrenme hedeflerini ve beklenen kazanımı birlikte değerlendir.</li>
  <li><strong>Paketle:</strong> Seçimi günlük süre bütçesine sığdır; örneğin sekiz dakikaya.</li>
</ol>

<p>Tepki süresi yardımcı sinyaldir, fakat tek başına başarı ölçüsü değildir. Yavaş okuyan kullanıcıyı bilgisiz saymak, algoritmanın kendi sınavından kalmasıdır.</p>

<h2 id="python-ile-küçük-bir-zamanlama-motoru">Python ile küçük bir zamanlama motoru</h2>

<p>Aşağıdaki fonksiyon, soru sonucundan sonra dayanıklılığı günceller ve sonraki tekrar zamanını üretir. <code class="language-plaintext highlighter-rouge">kart</code>, gün cinsinden <code class="language-plaintext highlighter-rouge">S</code> değerini içeren bir sözlüktür; <code class="language-plaintext highlighter-rouge">simdi</code> ise bir <code class="language-plaintext highlighter-rouge">datetime</code> nesnesidir.</p>

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


<span class="k">def</span> <span class="nf">tekrar_planla</span><span class="p">(</span><span class="n">kart</span><span class="p">,</span> <span class="n">dogru</span><span class="p">,</span> <span class="n">simdi</span><span class="p">,</span> <span class="n">hedef</span><span class="o">=</span><span class="mf">0.85</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="mi">0</span> <span class="o">&lt;</span> <span class="n">hedef</span> <span class="o">&lt;</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">Hedef 0 ile 1 arasında olmalı</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">katsayi</span> <span class="o">=</span> <span class="mf">1.35</span> <span class="k">if</span> <span class="n">dogru</span> <span class="k">else</span> <span class="mf">0.60</span>
    <span class="n">yeni_s</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="mf">180.0</span><span class="p">,</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">kart</span><span class="p">[</span><span class="sh">"</span><span class="s">S</span><span class="sh">"</span><span class="p">]</span> <span class="o">*</span> <span class="n">katsayi</span><span class="p">))</span>
    <span class="n">aralik</span> <span class="o">=</span> <span class="o">-</span><span class="n">yeni_s</span> <span class="o">*</span> <span class="n">math</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="n">hedef</span><span class="p">)</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="o">**</span><span class="n">kart</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">S</span><span class="sh">"</span><span class="p">:</span> <span class="n">yeni_s</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">son_tekrar</span><span class="sh">"</span><span class="p">:</span> <span class="n">simdi</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">sonraki_tekrar</span><span class="sh">"</span><span class="p">:</span> <span class="n">simdi</span> <span class="o">+</span> <span class="nf">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="n">aralik</span><span class="p">),</span>
    <span class="p">}</span>
</code></pre></div></div>

<p>Doğru cevap aralığı büyütür; yanlış cevap küçültür. Alt ve üst sınırlar aşırı değerleri engeller. Ancak katsayılar <strong>örnek sezgisellerdir</strong>; bilimsel olarak doğrulanmış kişisel parametreler değildir. Üretimde geçmiş denemelerle kalibre edilmelidir. Yanlış cevaptan sonra açıklayıcı geri bildirim hemen verilmeli, sonraki kalıcı tekrar ayrıca planlanmalıdır.</p>

<h2 id="başarıyı-tıklamayla-karıştırmayın">Başarıyı tıklamayla karıştırmayın</h2>

<p>Zamanı gelen bütün kartları aynı anda göndermek kullanıcıyı bildirim yağmuruna tutar. Bu nedenle zamanlayıcı, tekrar ihtiyacını belirlerken dağıtım katmanı sessiz saatleri, günlük bütçeyi ve konu çeşitliliğini gözetmelidir. Geciken içerikler kuyrukta önceliklendirilebilir; hatırlama tahmini geçen süreyle yeniden hesaplanır.</p>

<p>Başarı ölçümü de uzun vadeli olmalıdır: Bir hafta sonraki hatırlama, yeni sorulara transfer, tamamlanan hedefler ve kullanıcı yükü birlikte izlenebilir. A/B testlerinde yalnızca tıklama oranına bakmak, eğlenceli ama öğretmeyen içerikleri ödüllendirebilir. Kullanıcı verilerini gereğinden fazla toplamak da kişiselleştirmenin zorunlu bedeli değildir.</p>

<p>Kısacası iyi mikro öğrenme, bilgiyi küçük lokmalara bölmekten fazlasıdır: Her lokmayı doğru zamanda sunar, gerçekten sindirilip sindirilmediğini ölçer ve menüyü buna göre değiştirir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="mikro öğrenme" /><category term="algoritmalar" /><category term="aralıklı tekrar" /><category term="python" /><category term="kişiselleştirme" /><category term="eğitim teknolojileri" /><summary type="html"><![CDATA[Telefonunuza gelen üç dakikalık bir ders, rastgele seçilmiş küçük bir bilgi paketi olmak zorunda değil. İyi bir mikro öğrenme platformu, neyi bildiğinizi ve neyi unutmak üzere olduğunuzu tahmin ederek içerik dağıtır. İşin sırrı yalnızca dersleri küçültmek değil, onları zihninizin ritmine göre zamanlamaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/mikro-ogrenmenin-zamanlama-29.png" /><media:content medium="image" url="https://program.sonsuz.us/img/mikro-ogrenmenin-zamanlama-29.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">AlphaGo ve Pekiştirmeli Öğrenme: Yapay Zekâ Go Tahtasında Nasıl Ustalaştı?</title><link href="https://program.sonsuz.us/posts/alphago-ve-pekistirmeli-ogrenme-yapay-zeka-go-tahtasinda-nasil-ustalasti/" rel="alternate" type="text/html" title="AlphaGo ve Pekiştirmeli Öğrenme: Yapay Zekâ Go Tahtasında Nasıl Ustalaştı?" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/alphago-ve-pekistirmeli-ogrenme-yapay-zeka-go-tahtasinda-nasil-ustalasti</id><content type="html" xml:base="https://program.sonsuz.us/posts/alphago-ve-pekistirmeli-ogrenme-yapay-zeka-go-tahtasinda-nasil-ustalasti/"><![CDATA[<p>Bir bilgisayarın Go tahtasında dünya şampiyonuna meydan okuması, yalnızca hızlı hesaplama meselesi değildi. Asıl devrim, deneyimden öğrenmek ve kendi hatalarını yeni derslere dönüştürmekti. AlphaGo bu dönüşümün simgesi oldu; AlphaGo Zero ise insan oyunlarını başlangıç noktası olarak kullanmadan aynı yolculuğu daha ileri taşıdı. Peki bu dijital ustalık nasıl doğdu?</p>

<p><img src="/img/alphago-ve-pekistirmeli-78.svg" alt="alphago-ve-pekistirmeli-78" /></p>

<p>``</p>

<h2 id="go-neden-böylesine-zor">Go neden böylesine zor?</h2>

<p>Go, siyah ve beyaz taşlarla alan kontrolü kurmaya dayanan bir strateji oyunudur. Kurallar görece basittir, ancak 19×19 tahtadaki olası yasal konumların sayısı yaklaşık $10^{170}$ mertebesindedir. Bütün olasılıkları taramak, okyanusu çay kaşığıyla boşaltmaya benzer.</p>

<p>Üstelik iyi bir hamle hemen ödül getirmeyebilir. Bugün yapılan küçük bir fedakârlık, onlarca hamle sonra büyük bir bölge kazandırabilir. Dolayısıyla sistemin yalnızca mevcut taşları değil, gelecekteki sonuçları değerlendirmesi gerekir.</p>

<h2 id="pekiştirmeli-öğrenmenin-temel-mantığı">Pekiştirmeli öğrenmenin temel mantığı</h2>

<p>Pekiştirmeli öğrenmede bir <strong>ajan</strong>, çevreyle etkileşerek karar vermeyi öğrenir. Go için durum $s$ tahta konumunu, eylem $a$ taş yerleştirmeyi veya pas geçmeyi temsil eder. Politika $\pi(a\vert s)$, hangi durumda hangi hamlenin seçileceğini belirler.</p>

<p>Amaç, beklenen toplam ödülü büyütmektir:</p>

\[J(\theta)=\mathbb{E}_{\pi_\theta}\left[\sum_{t=0}^{T}\gamma^t r_t\right]\]

<p>Burada $\theta$ model parametreleri, $r_t$ ödül, $\gamma$ gelecekteki ödüllerin ağırlığıdır. Sonlu Go karşılaşmalarında $\gamma=1$ kullanılabilir. Basitleştirilmiş bir düzende ara hamleler ödülsüzdür; sonuç, ilgili oyuncunun açısından galibiyette $+1$, yenilgide $-1$ olur.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Go karşılığı</th>
      <th>Öğrenmedeki görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Durum</td>
      <td>Tahta ve oyun bağlamı</td>
      <td>Karara temel sağlar</td>
    </tr>
    <tr>
      <td>Politika</td>
      <td>Hamle olasılıkları</td>
      <td>Aday hamleleri önerir</td>
    </tr>
    <tr>
      <td>Değer</td>
      <td>Beklenen oyun sonucu</td>
      <td>Konumun geleceğini değerlendirir</td>
    </tr>
    <tr>
      <td>Ödül</td>
      <td>Maç sonucu</td>
      <td>Öğrenmenin hedefini belirler</td>
    </tr>
  </tbody>
</table>

<h2 id="alphago-ile-alphago-zero-aynı-şey-değil">AlphaGo ile AlphaGo Zero aynı şey değil</h2>

<p>2016’da Lee Sedol’u 4–1 yenen AlphaGo, önce insan uzmanların oyunlarından öğrenmişti. Ardından kendi kendine oynayarak politikasını geliştirdi; değer ağı da öz-oyun verilerinden yararlandı. Yani orijinal başarıyı tamamen insan verisinden bağımsızmış gibi anlatmak yanlış olur.</p>

<p>2017’de tanıtılan AlphaGo Zero ise insan oyunlarını kullanmadan, oyun kuralları ve öz-oyun üzerinden öğrendi. Politika ve değer tahminlerini tek sinir ağında birleştirdi.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>AlphaGo</th>
      <th>AlphaGo Zero</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Başlangıç verisi</td>
      <td>İnsan oyunları</td>
      <td>İnsan oyunları yok</td>
    </tr>
    <tr>
      <td>Ağ yapısı</td>
      <td>Ayrı politika ve değer ağları</td>
      <td>Birleşik politika-değer ağı</td>
    </tr>
    <tr>
      <td>Gelişim</td>
      <td>İnsan verisi ve öz-oyun</td>
      <td>Öz-oyun</td>
    </tr>
  </tbody>
</table>

<h2 id="arama-sezgiyi-nasıl-güçlendirir">Arama, sezgiyi nasıl güçlendirir?</h2>

<p>Sinir ağı tek başına son sözü söylemez. <strong>Monte Carlo Ağaç Araması</strong>, yani MCTS, aday hamlelerin devamlarını araştırır. Politika tahmini aramayı umut verici dallara yönlendirirken değer tahmini ulaşılan konumları değerlendirir.</p>

<p>Arama, daha önce başarılı görünen hamleleri kullanmak ile yeterince incelenmemiş hamleleri keşfetmek arasında denge kurar. Sonunda ziyaret sayılarından bir hamle dağılımı elde edilir. Ağın ilk önerisi böylece aramayla iyileştirilir; bu dağılım, sonraki eğitimin hedefi olur. Öğrenci kendi analizlerinden ders çıkarır!</p>

<h2 id="python-ile-öz-oyun-iskeleti">Python ile öz-oyun iskeleti</h2>

<p>Aşağıdaki kod, hazır bir Go ortamı ve MCTS ajanı varsayar. Tam AlphaGo uygulaması değildir; eğitim örneklerinin nasıl toplandığını gösterir. <code class="language-plaintext highlighter-rouge">search</code>, pas dâhil yasal hamleler üzerinde normalize edilmiş olasılıklar döndürmelidir.</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="k">def</span> <span class="nf">self_play</span><span class="p">(</span><span class="n">env</span><span class="p">,</span> <span class="n">agent</span><span class="p">):</span>
    <span class="n">env</span><span class="p">.</span><span class="nf">reset</span><span class="p">()</span>
    <span class="n">history</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">while</span> <span class="ow">not</span> <span class="n">env</span><span class="p">.</span><span class="n">done</span><span class="p">:</span>
        <span class="n">player</span> <span class="o">=</span> <span class="n">env</span><span class="p">.</span><span class="n">current_player</span>  <span class="c1"># +1 veya -1
</span>        <span class="n">state</span> <span class="o">=</span> <span class="n">env</span><span class="p">.</span><span class="nf">canonical_state</span><span class="p">().</span><span class="nf">copy</span><span class="p">()</span>
        <span class="n">policy</span> <span class="o">=</span> <span class="n">agent</span><span class="p">.</span><span class="nf">search</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
        <span class="n">history</span><span class="p">.</span><span class="nf">append</span><span class="p">((</span><span class="n">state</span><span class="p">,</span> <span class="n">policy</span><span class="p">.</span><span class="nf">copy</span><span class="p">(),</span> <span class="n">player</span><span class="p">))</span>

        <span class="n">action</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span>
            <span class="n">env</span><span class="p">.</span><span class="n">action_size</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="n">policy</span>
        <span class="p">)</span>
        <span class="n">env</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>

    <span class="n">winner</span> <span class="o">=</span> <span class="n">env</span><span class="p">.</span><span class="nf">winner</span><span class="p">()</span>  <span class="c1"># +1, -1 veya beraberlikte 0
</span>    <span class="k">return</span> <span class="p">[</span>
        <span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">policy</span><span class="p">,</span> <span class="nf">float</span><span class="p">(</span><span class="n">winner</span> <span class="o">*</span> <span class="n">player</span><span class="p">))</span>
        <span class="k">for</span> <span class="n">state</span><span class="p">,</span> <span class="n">policy</span><span class="p">,</span> <span class="n">player</span> <span class="ow">in</span> <span class="n">history</span>
    <span class="p">]</span>
</code></pre></div></div>

<p>Her kayıt, bir konumu, aramanın hamle dağılımını ve o konumdaki oyuncunun sonucunu saklar. <code class="language-plaintext highlighter-rouge">canonical_state</code>, tahtayı sıradaki oyuncunun bakış açısından kodlar. Sonucun oyuncuyla çarpılması önemlidir: aynı maç, kazanan için olumlu, kaybeden için olumsuz örnektir.</p>

<h2 id="deneyimden-ustalığa">Deneyimden ustalığa</h2>

<p>AlphaGo Zero yaklaşımında eğitim kaybı üç parçayı birleştirir:</p>

\[L=(z-v)^2-\sum_a\pi(a)\log p(a)+c\lVert\theta\rVert^2\]

<p>İlk terim değer tahminini gerçek sonuca yaklaştırır. İkinci terim ağ politikasını MCTS dağılımına yaklaştırır. Son terim ağırlıkları düzenler. Oyunlar üretildikçe ağ güncellenir, güçlenen ağ daha kaliteli aramalar yapar ve döngü sürer.</p>

<p>Ancak başarı sınırsız değildir: Go’nun kuralları açık, sonuçları ölçülebilirdir ve deneyim üretmek hesaplama ister. AlphaGo’nun dersi, bütün problemleri çözen sihirli bir formül değil; <strong>öğrenme, arama ve geri bildirimin birlikte insan uzmanlığını aşabilecek kadar güçlü olabilmesidir</strong>.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="alphago" /><category term="pekiştirmeli öğrenme" /><category term="yapay zekâ" /><category term="go" /><category term="derin öğrenme" /><category term="mcts" /><summary type="html"><![CDATA[Bir bilgisayarın Go tahtasında dünya şampiyonuna meydan okuması, yalnızca hızlı hesaplama meselesi değildi. Asıl devrim, deneyimden öğrenmek ve kendi hatalarını yeni derslere dönüştürmekti. AlphaGo bu dönüşümün simgesi oldu; AlphaGo Zero ise insan oyunlarını başlangıç noktası olarak kullanmadan aynı yolculuğu daha ileri taşıdı. Peki bu dijital ustalık nasıl doğdu?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/alphago-ve-pekistirmeli-78.png" /><media:content medium="image" url="https://program.sonsuz.us/img/alphago-ve-pekistirmeli-78.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Çapraz Sevkiyat Yazılımları: Depoyu Bekleme Salonundan Aktarma Merkezine Dönüştürmek</title><link href="https://program.sonsuz.us/posts/capraz-sevkiyat-yazilimlari-depoyu-bekleme-salonundan-aktarma-merkezine-donusturmek/" rel="alternate" type="text/html" title="Çapraz Sevkiyat Yazılımları: Depoyu Bekleme Salonundan Aktarma Merkezine Dönüştürmek" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/capraz-sevkiyat-yazilimlari-depoyu-bekleme-salonundan-aktarma-merkezine-donusturmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/capraz-sevkiyat-yazilimlari-depoyu-bekleme-salonundan-aktarma-merkezine-donusturmek/"><![CDATA[<p>Bir kamyon depoya yanaşıyor, paletler indiriliyor ve ürünler raflara yerleşmeden başka bir kamyona yükleniyor. Kulağa lojistik sihirbazlığı gibi geliyor, değil mi? Çapraz sevkiyat, yani cross-docking, tam olarak bu akışı hedefler. Ancak gösterinin yıldızı forklift değil; doğru ürünü, doğru zamanda, doğru çıkış aracına yönlendiren yazılımdır.
``</p>

<h2 id="temel-mantık-depolamak-yerine-akışı-yönetmek">Temel Mantık: Depolamak Yerine Akışı Yönetmek</h2>

<p>Geleneksel depolamada ürün kabul edilir, stok alanına taşınır, sipariş geldiğinde toplanır ve sevk edilir. Çapraz sevkiyatta ise gelen ürünün çıkış planı mümkün olduğunca önceden bellidir. Yazılım, giriş sevkiyatlarını müşteri siparişleriyle veya dağıtım noktalarıyla eşleştirir.</p>

<p>Buradaki “bekletilmeden” ifadesi mutlak sıfır bekleme anlamına gelmez. Kontrol, ayrıştırma ve araç senkronizasyonu için kısa süreli tampon alanlar gerekebilir. Amaç, uzun süreli stoklamayı ortadan kaldırmaktır. Bazı operasyonlarda palet doğrudan aktarılırken bazılarında koliler farklı mağazalar için yeniden gruplanır.</p>

<table>
  <thead>
    <tr>
      <th>Boyut</th>
      <th>Geleneksel depo</th>
      <th>Çapraz sevkiyat</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ana odak</td>
      <td>Stok yönetimi</td>
      <td>Zaman ve akış yönetimi</td>
    </tr>
    <tr>
      <td>Ürün hareketi</td>
      <td>Raflama ve toplama</td>
      <td>Ayrıştırma ve aktarma</td>
    </tr>
    <tr>
      <td>Kritik bilgi</td>
      <td>Stok konumu</td>
      <td>Varış ve kalkış zamanı</td>
    </tr>
    <tr>
      <td>Temel risk</td>
      <td>Stok doğruluğu hatası</td>
      <td>Bağlantının kaçırılması</td>
    </tr>
  </tbody>
</table>

<h2 id="teorik-altyapı-bir-eşleştirme-ve-çizelgeleme-problemi">Teorik Altyapı: Bir Eşleştirme ve Çizelgeleme Problemi</h2>

<p>Operasyon, iki taraflı bir eşleştirme problemi gibi düşünülebilir: Bir tarafta gelen ürün partileri, diğer tarafta çıkış araçları vardır. Fakat hedef adresin uyuşması tek başına yetmez. Araç kapasitesi, yükleme süresi, kapı müsaitliği ve ürünün sıcaklık gereksinimi de hesaba katılmalıdır.</p>

<p>Basitleştirilmiş bir optimizasyon hedefi şöyle yazılabilir:</p>

\[\min C = \alpha \sum_i W_i + \beta \sum_i L_i\]

<p>Burada $W_i$ partinin aktarmaya hazır olduktan sonraki bekleme süresi, $L_i$ ise hedeflenen çıkış zamanına göre gecikmesidir. $\alpha$ ve $\beta$, bu süreleri ortak bir maliyet ölçeğine dönüştüren ağırlıklardır. Gecikmenin ticari bedeli yüksekse ikinci ağırlık artırılır. Ancak kapasite ve güvenlik gibi sert kısıtlar, maliyet düşsün diye ihlal edilemez.</p>

<h2 id="yazılım-sahada-nasıl-çalışır">Yazılım Sahada Nasıl Çalışır?</h2>

<p><strong>Ön bildirim:</strong> Tedarikçiden ASN, yani ön sevkiyat bildirimi alınır. Ürün, miktar, taşıma birimi ve tahmini varış bilgileri sisteme girer.</p>

<p><strong>Planlama:</strong> WMS depo içi hareketleri, TMS ise taşıma planını yönetir. Entegrasyon katmanı bunları birleştirerek ürünleri uygun çıkış seferlerine ve aktarma kapılarına atar.</p>

<p><strong>Doğrulama:</strong> Kabul sırasında barkod veya RFID okutulur. Beklenen miktarla fiziksel miktar karşılaştırılır; eksik, hasarlı ya da yanlış ürünler istisna akışına alınır.</p>

<p><strong>Yönlendirme:</strong> El terminali operatöre aktarım alanını gösterir. Yükleme okutması tamamlanınca sevkiyat kaydı güncellenir ve ilgili sistemlere olay gönderilir. Böylece dijital planın sahada gerçekten uygulanıp uygulanmadığı anlaşılır.</p>

<h2 id="python-ile-küçük-bir-planlayıcı">Python ile Küçük Bir Planlayıcı</h2>

<p>Aşağıdaki örnek, hazır partileri aynı hedefe giden, zaman penceresine uyan ve yeterli ağırlık kapasitesi bulunan araçlara atar. <code class="language-plaintext highlighter-rouge">hazir</code>, <code class="language-plaintext highlighter-rouge">kalkis</code> ve <code class="language-plaintext highlighter-rouge">son_kalkis</code> değerleri aynı zaman dilimindeki <code class="language-plaintext highlighter-rouge">datetime</code> nesneleri olmalıdır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">eslestir</span><span class="p">(</span><span class="n">partiler</span><span class="p">,</span> <span class="n">araclar</span><span class="p">):</span>
    <span class="n">kalan</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</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">a</span><span class="p">[</span><span class="sh">"</span><span class="s">kapasite_kg</span><span class="sh">"</span><span class="p">]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">araclar</span><span class="p">}</span>
    <span class="n">plan</span><span class="p">,</span> <span class="n">istisnalar</span> <span class="o">=</span> <span class="p">[],</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">parti</span> <span class="ow">in</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">partiler</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">p</span><span class="p">:</span> <span class="n">p</span><span class="p">[</span><span class="sh">"</span><span class="s">hazir</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">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">araclar</span>
            <span class="k">if</span> <span class="n">a</span><span class="p">[</span><span class="sh">"</span><span class="s">hedef</span><span class="sh">"</span><span class="p">]</span> <span class="o">==</span> <span class="n">parti</span><span class="p">[</span><span class="sh">"</span><span class="s">hedef</span><span class="sh">"</span><span class="p">]</span>
            <span class="ow">and</span> <span class="n">parti</span><span class="p">[</span><span class="sh">"</span><span class="s">hazir</span><span class="sh">"</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">a</span><span class="p">[</span><span class="sh">"</span><span class="s">kalkis</span><span class="sh">"</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">parti</span><span class="p">[</span><span class="sh">"</span><span class="s">son_kalkis</span><span class="sh">"</span><span class="p">]</span>
            <span class="ow">and</span> <span class="n">kalan</span><span class="p">[</span><span class="n">a</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">&gt;=</span> <span class="n">parti</span><span class="p">[</span><span class="sh">"</span><span class="s">kg</span><span class="sh">"</span><span class="p">]</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="n">istisnalar</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">parti</span><span class="p">[</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">])</span>
            <span class="k">continue</span>

        <span class="n">arac</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="k">lambda</span> <span class="n">a</span><span class="p">:</span> <span class="n">a</span><span class="p">[</span><span class="sh">"</span><span class="s">kalkis</span><span class="sh">"</span><span class="p">])</span>
        <span class="n">kalan</span><span class="p">[</span><span class="n">arac</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">parti</span><span class="p">[</span><span class="sh">"</span><span class="s">kg</span><span class="sh">"</span><span class="p">]</span>
        <span class="n">plan</span><span class="p">.</span><span class="nf">append</span><span class="p">((</span><span class="n">parti</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">arac</span><span class="p">[</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">]))</span>

    <span class="k">return</span> <span class="n">plan</span><span class="p">,</span> <span class="n">istisnalar</span>
</code></pre></div></div>

<p>Bu, en erken uygun kalkışı seçen açgözlü bir sezgiseldir; küresel optimumu garanti etmez. <code class="language-plaintext highlighter-rouge">hazir</code> zamanı, gerekli kontrol ve hazırlık işlemlerinin tamamlanmasını temsil eder. Atanamayan partileri gizlemek yerine istisna listesinde döndürmesi önemlidir: Operatör alternatif sefer planlayabilir.</p>

<p>Gerçek sistemde hacim, palet pozisyonu, kapı çakışmaları ve yükleme süreleri de modellenmelidir. Daha karmaşık senaryolarda karma tamsayılı programlama veya kısıt programlama kullanılabilir.</p>

<h2 id="üretimde-asıl-sınav-gecikmeler-ve-veri-tutarlılığı">Üretimde Asıl Sınav: Gecikmeler ve Veri Tutarlılığı</h2>

<p>Giriş kamyonu geciktiğinde yazılım kalan bağlantıları yeniden değerlendirmelidir. Ancak her güncellemede bütün planı değiştirmek, sahayı dijital sandalye kapmacaya çevirebilir. Başlamış yüklemeleri sabitlemek ve yalnızca etkilenen partileri yeniden planlamak daha kontrollü bir yaklaşımdır.</p>

<p>Aynı barkodun tekrar okutulması stok hareketini iki kez oluşturmamalıdır. Olay kimlikleriyle idempotent işlem yapmak, eşzamanlı kapasite rezervasyonlarını veritabanı işlemleriyle korumak ve değişiklikleri denetim kaydına yazmak temel gereksinimlerdir.</p>

<p>Başarıyı ortalama bekleme süresi, zamanında çıkış oranı, yanlış yükleme oranı ve araç doluluğuyla ölçün. Yalnızca hızlanmak yetmez; yanlış kamyona hızlı yüklenen palet, sonuçta daha hızlı kaybolmuş sayılmaz. İyi çapraz sevkiyat yazılımı, hızı doğrulukla birlikte yönetir.</p>

<p><img src="/img/capraz-sevkiyat-yazilimlari-29.svg" alt="capraz-sevkiyat-yazilimlari-29" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="çapraz sevkiyat" /><category term="cross-docking" /><category term="lojistik" /><category term="python" /><category term="wms" /><category term="tms" /><summary type="html"><![CDATA[Bir kamyon depoya yanaşıyor, paletler indiriliyor ve ürünler raflara yerleşmeden başka bir kamyona yükleniyor. Kulağa lojistik sihirbazlığı gibi geliyor, değil mi? Çapraz sevkiyat, yani cross-docking, tam olarak bu akışı hedefler. Ancak gösterinin yıldızı forklift değil; doğru ürünü, doğru zamanda, doğru çıkış aracına yönlendiren yazılımdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/capraz-sevkiyat-yazilimlari-29.png" /><media:content medium="image" url="https://program.sonsuz.us/img/capraz-sevkiyat-yazilimlari-29.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Çarpışma Tespiti: Oyun Dünyasının Görünmez Trafik Polisi</title><link href="https://program.sonsuz.us/posts/carpisma-tespiti-oyun-dunyasinin-gorunmez-trafik-polisi/" rel="alternate" type="text/html" title="Çarpışma Tespiti: Oyun Dünyasının Görünmez Trafik Polisi" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/carpisma-tespiti-oyun-dunyasinin-gorunmez-trafik-polisi</id><content type="html" xml:base="https://program.sonsuz.us/posts/carpisma-tespiti-oyun-dunyasinin-gorunmez-trafik-polisi/"><![CDATA[<p><img src="/img/carpisma-tespiti-oyun-43.svg" alt="carpisma-tespiti-oyun-43" /></p>

<p>Karakteriniz duvardan geçiyor, mermiler hedefi delmeden kayboluyor veya kutular birbirinin içine yerleşiyorsa, oyun dünyanızın trafik polisi biraz uyukluyor olabilir. Çarpışma tespiti, nesnelerin geometrik olarak temas edip etmediğini belirler. İşin püf noktası yalnızca doğru cevabı bulmak değil, bunu her karede binlerce nesne için yeterince hızlı yapabilmektir.</p>

<p>``</p>

<h2 id="önce-geometri-sonra-performans">Önce Geometri, Sonra Performans</h2>

<p>Bir nesnenin ekranda görünen şekliyle çarpışma geometrisi aynı olmak zorunda değildir. Karmaşık bir karakter modeli yerine daire, kutu veya kapsül kullanabilirsiniz. Bu temsil, hesaplama maliyetini düşürür; ancak görünür şekle göre yaklaşık sonuçlar üretebilir. Dolayısıyla ilk kararınız, oyunun ne kadar geometrik hassasiyet gerektirdiğidir.</p>

<p>Her nesneyi diğerleriyle karşılaştırırsanız test sayısı $n(n-1)/2$ olur. Bu, $O(n^2)$ büyüme demektir: nesne sayısını ikiye katlamak, iş yükünü yaklaşık dört katına çıkarır.</p>

<table>
  <thead>
    <tr>
      <th>Temsil</th>
      <th>Güçlü yanı</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Daire / küre</td>
      <td>Hızlı mesafe testi</td>
      <td>Uzun nesnelerde kaba yaklaşım</td>
    </tr>
    <tr>
      <td>AABB</td>
      <td>Basit karşılaştırmalar</td>
      <td>Dönmüş nesnelerde boşluk bırakır</td>
    </tr>
    <tr>
      <td>Dışbükey çokgen</td>
      <td>Daha hassas sınırlar</td>
      <td>Daha fazla geometrik işlem</td>
    </tr>
  </tbody>
</table>

<h2 id="aabb-kutularla-hızlı-başlangıç">AABB: Kutularla Hızlı Başlangıç</h2>

<p><strong>Axis-Aligned Bounding Box</strong>, kenarları koordinat eksenlerine paralel bir sınırlayıcı kutudur. İki kutunun çarpışması için hem yatay hem dikey aralıklarının örtüşmesi gerekir. Bir eksende ayrılıyorlarsa, diğer eksene bakmadan sonucu söyleyebilirsiniz.</p>

<p>Aşağıdaki Python kodu, dünya koordinatlarındaki iki kutuyu test eder. Sınırların doğru sıralandığını, yani minimum değerlerin maksimumlardan büyük olmadığını varsayar:</p>

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

<span class="nd">@dataclass</span><span class="p">(</span><span class="n">frozen</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">AABB</span><span class="p">:</span>
    <span class="n">min_x</span><span class="p">:</span> <span class="nb">float</span>
    <span class="n">min_y</span><span class="p">:</span> <span class="nb">float</span>
    <span class="n">max_x</span><span class="p">:</span> <span class="nb">float</span>
    <span class="n">max_y</span><span class="p">:</span> <span class="nb">float</span>

<span class="k">def</span> <span class="nf">intersects</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">AABB</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">AABB</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
    <span class="n">separated_x</span> <span class="o">=</span> <span class="n">a</span><span class="p">.</span><span class="n">max_x</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">min_x</span> <span class="ow">or</span> <span class="n">b</span><span class="p">.</span><span class="n">max_x</span> <span class="o">&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">min_x</span>
    <span class="n">separated_y</span> <span class="o">=</span> <span class="n">a</span><span class="p">.</span><span class="n">max_y</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">.</span><span class="n">min_y</span> <span class="ow">or</span> <span class="n">b</span><span class="p">.</span><span class="n">max_y</span> <span class="o">&lt;</span> <span class="n">a</span><span class="p">.</span><span class="n">min_y</span>
    <span class="k">return</span> <span class="ow">not</span> <span class="p">(</span><span class="n">separated_x</span> <span class="ow">or</span> <span class="n">separated_y</span><span class="p">)</span>

<span class="n">player</span> <span class="o">=</span> <span class="nc">AABB</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">wall</span> <span class="o">=</span> <span class="nc">AABB</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">intersects</span><span class="p">(</span><span class="n">player</span><span class="p">,</span> <span class="n">wall</span><span class="p">))</span>  <span class="c1"># True: kenarlar temas ediyor
</span></code></pre></div></div>

<p>Burada kenar teması çarpışma sayılır. Yalnızca pozitif alanlı örtüşme istiyorsanız ayırma karşılaştırmalarını <code class="language-plaintext highlighter-rouge">&lt;=</code> yapabilirsiniz. Bu küçük tercih, platform oyunlarında zeminde durma davranışını bile etkileyebilir!</p>

<h2 id="daireler-karekökü-emekliye-ayırın">Daireler: Karekökü Emekliye Ayırın</h2>

<p>İki dairenin merkezleri arasındaki uzaklık, yarıçaplarının toplamından büyük değilse daireler çarpışır. Ancak uzaklığı hesaplamak için karekök almak şart değildir:</p>

\[(x_1-x_2)^2 + (y_1-y_2)^2 \le (r_1+r_2)^2\]

<p>Her iki taraf da negatif olmadığından, karelerini karşılaştırmak eşdeğerdir. Böylece gereksiz karekök işleminden kaçınırsınız. Bu yöntem toplar, basit düşmanlar ve yakınlık kontrolleri için kullanışlıdır. Üç boyutta aynı mantık kürelere uygulanır; yalnızca $z$ farkının karesi eklenir.</p>

<h2 id="sat-dönen-nesnelerin-dedektifi">SAT: Dönen Nesnelerin Dedektifi</h2>

<p><strong>Separating Axis Theorem</strong>, iki dışbükey çokgenin çarpışmadığını göstermek için onları ayıran bir eksen arar. İki boyutta her iki çokgenin kenarlarına dik yönler aday eksenlerdir. Köşeleri bu yönlere izdüşürerek minimum ve maksimum değerlerden aralıklar oluşturursunuz.</p>

<p>İzdüşümün temel işlemi noktasal çarpımdır: $p = v \cdot a$. Herhangi bir eksende aralıklar ayrılıyorsa çarpışma yoktur. Bütün aday eksenlerde örtüşme varsa çokgenler kesişir; temasın dahil edilmesi yine karşılaştırma seçiminize bağlıdır.</p>

<p>SAT, dönen kutularda AABB’den daha hassastır. Ancak içbükey şekillere doğrudan uygulanmaz; önce dışbükey parçalara ayırmak gerekir. Ayrıca sıfır uzunluklu kenarlar gibi bozuk geometrileri temizlemelisiniz.</p>

<h2 id="asıl-kazanç-gereksiz-testleri-eleme">Asıl Kazanç: Gereksiz Testleri Eleme</h2>

<p>Pratik sistemler iki aşama kullanır. <strong>Broad phase</strong>, çarpışma ihtimali bulunan çiftleri seçer; <strong>narrow phase</strong>, bu adaylara kesin geometrik test uygular. AABB ilk aşamada kaba sınır, ikinci aşamada ise kutu biçimli nesnenin gerçek çarpışma şekli olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Uygun senaryo</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Uniform grid</td>
      <td>Benzer boyutlu nesneler</td>
      <td>Hücre boyutu seçimi</td>
    </tr>
    <tr>
      <td>Quadtree</td>
      <td>Bölgesel yoğunluğu değişen 2B dünya</td>
      <td>Güncelleme maliyeti</td>
    </tr>
    <tr>
      <td>Sweep and prune</td>
      <td>Hareketi görece tutarlı sahneler</td>
      <td>Yoğun örtüşen aralıklar</td>
    </tr>
  </tbody>
</table>

<p>Grid kullanırken nesneyi kapladığı bütün hücrelere ekleyin; yalnızca merkez hücresi yeterli değildir. Birden fazla hücrede bulunan çiftleri tekilleştirin. Bu yöntemler çoğu sahnede işi azaltır, fakat kötü dağılımlarda yine karesel maliyete yaklaşabilir.</p>

<h2 id="hızlı-mermiler-ve-son-kontroller">Hızlı Mermiler ve Son Kontroller</h2>

<p>Ayrık çarpışma tespiti yalnızca belirli zamanlardaki konumlara bakar. Hızlı bir mermi, iki kare arasında ince bir duvarı tamamen geçebilir: buna <strong>tünelleme</strong> denir. Sürekli çarpışma tespiti, hareket boyunca ilk temas zamanını araştırır; swept testler bunun için kullanılır.</p>

<p>Son olarak temas kurallarını tutarlı belirleyin, kayan nokta toleranslarını dünya ölçeğine göre seçin ve çarpışma şekillerini ekranda çizdirin. Görünmez trafik polisini denetlemenin en iyi yolu, ona görünür bir üniforma giydirmektir!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun geliştirme" /><category term="çarpışma tespiti" /><category term="algoritmalar" /><category term="python" /><category term="geometri" /><category term="performans" /><summary type="html"><![CDATA[Karakteriniz duvardan geçiyor, mermiler hedefi delmeden kayboluyor veya kutular birbirinin içine yerleşiyorsa, oyun dünyanızın trafik polisi biraz uyukluyor olabilir. Çarpışma tespiti, nesnelerin geometrik olarak temas edip etmediğini belirler. İşin püf noktası yalnızca doğru cevabı bulmak değil, bunu her karede binlerce nesne için yeterince hızlı yapabilmektir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/carpisma-tespiti-oyun-43.png" /><media:content medium="image" url="https://program.sonsuz.us/img/carpisma-tespiti-oyun-43.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">DICOM: MR ve Tomografi Görüntülerinin Dijital Anatomisi</title><link href="https://program.sonsuz.us/posts/dicom-mr-ve-tomografi-goruntulerinin-dijital-anatomisi/" rel="alternate" type="text/html" title="DICOM: MR ve Tomografi Görüntülerinin Dijital Anatomisi" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dicom-mr-ve-tomografi-goruntulerinin-dijital-anatomisi</id><content type="html" xml:base="https://program.sonsuz.us/posts/dicom-mr-ve-tomografi-goruntulerinin-dijital-anatomisi/"><![CDATA[<p>Bir tomografi görüntüsünü sıradan bir fotoğraf gibi saklasaydık ne kaybederdik? Pikselin hastanın neresine ait olduğunu, hangi cihazla üretildiğini ve parlaklığının fiziksel anlamını! DICOM, bu bilgileri görüntüyle birlikte taşıyan ortak dildir. Onu, yalnızca fotoğrafı değil, fotoğrafın teknik pasaportunu da saklayan bir zarf gibi düşünebilirsiniz.</p>

<p>``</p>

<h2 id="dicom-yalnızca-bir-dosya-uzantısı-değildir">DICOM yalnızca bir dosya uzantısı değildir</h2>

<p><strong>DICOM</strong>, “Digital Imaging and Communications in Medicine” ifadesinin kısaltmasıdır. Tıbbi görüntülerin saklanmasını, tanımlanmasını ve sistemler arasında aktarılmasını standartlaştırır. Dosyaların <code class="language-plaintext highlighter-rouge">.dcm</code> uzantısı taşıması yaygındır; ancak uzantı tek başına güvenilir bir format göstergesi değildir.</p>

<p>Bir DICOM nesnesi, görüntü verisiyle birlikte <strong>veri elemanları</strong> içerir. Her elemanın bir etiketi, veri türü ve değeri bulunur. Örneğin <code class="language-plaintext highlighter-rouge">(0010,0010)</code> hasta adını, <code class="language-plaintext highlighter-rouge">(0028,0030)</code> piksel aralığını belirtir. Böylece yazılım, sayıları rastgele yorumlamak yerine standart bir sözlüğe başvurur.</p>

<p>Organizasyon genellikle <strong>hasta → çalışma → seri → nesne</strong> şeklindedir. Bir MR incelemesindeki T1 ve T2 çekimleri farklı seriler olabilir. Üstelik bir nesne her zaman tek kesit değildir: çok kareli DICOM nesneleri birden fazla görüntü barındırabilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>DICOM</th>
      <th>Sıradan PNG/JPEG</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tıbbi metadata</td>
      <td>Standart etiketlerle taşınır</td>
      <td>Yerleşik DICOM yapısı yoktur</td>
    </tr>
    <tr>
      <td>Fiziksel geometri</td>
      <td>Konum, yön ve aralık bilgileri bulunabilir</td>
      <td>Genellikle yalnızca görüntü boyutu vardır</td>
    </tr>
    <tr>
      <td>Piksel anlamı</td>
      <td>Ölçekleme bilgileriyle yorumlanabilir</td>
      <td>Çoğunlukla gösterim değeridir</td>
    </tr>
    <tr>
      <td>Klinik aktarım</td>
      <td>Standart iletişim mekanizmaları vardır</td>
      <td>Genel dosya aktarımı kullanılır</td>
    </tr>
  </tbody>
</table>

<h2 id="piksel-değerleri-neden-doğrudan-görüntü-değildir">Piksel değerleri neden doğrudan görüntü değildir?</h2>

<p>Bilgisayarlı tomografide saklanan piksel değeri çoğu zaman doğrudan Hounsfield birimi değildir. Yaygın dönüşüm şöyledir:</p>

\[H = mP + b\]

<p>Burada $P$ saklanan değer, $m$ <code class="language-plaintext highlighter-rouge">RescaleSlope</code>, $b$ ise <code class="language-plaintext highlighter-rouge">RescaleIntercept</code> değeridir. Örneğin $P=1024$, $m=1$ ve $b=-1024$ için sonuç $0$ HU olur; bu, yaklaşık olarak suyun değeridir. Uygulanacak dönüşüm yine nesnenin etiketlerinden doğrulanmalıdır.</p>

<p>MR görüntülerinde ise tüm çekimler için geçerli bir HU ölçeği bulunmaz. Sinyal; sekansa, cihaz ayarlarına ve rekonstrüksiyona bağlıdır. Dolayısıyla BT için yazılan normalizasyonu MR’a kopyalamak, kahve makinesine çay tarifi yüklemek gibidir: çalışabilir, ama beklediğiniz sonucu vermeyebilir.</p>

<p><strong>Pencereleme</strong>, geniş yoğunluk aralığının seçilen bölümünü ekranda görünür yapar. Pencere merkezi $c$, genişliği $w$ ile gösterilir. Kemik ve yumuşak doku pencereleri aynı veriyi farklı aralıklarla sunar; alttaki ölçümler değişmez.</p>

<h2 id="python-ile-kontrollü-bir-ilk-okuma">Python ile kontrollü bir ilk okuma</h2>

<p>Aşağıdaki örnek için <code class="language-plaintext highlighter-rouge">pip install pydicom numpy</code> yeterlidir. Kod, tek kareli bir BT dosyasını okuyup modalite dönüşümünü uygular ve seçilen pencereyi 8 bitlik gösterim dizisine dönüş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">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">pydicom</span>
<span class="kn">from</span> <span class="n">pydicom.pixels</span> <span class="kn">import</span> <span class="n">apply_modality_lut</span>

<span class="n">ds</span> <span class="o">=</span> <span class="n">pydicom</span><span class="p">.</span><span class="nf">dcmread</span><span class="p">(</span><span class="sh">"</span><span class="s">ornek_bt.dcm</span><span class="sh">"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ds</span><span class="p">.</span><span class="n">Modality</span> <span class="o">!=</span> <span class="sh">"</span><span class="s">CT</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">Bu örnek yalnızca BT içindir.</span><span class="sh">"</span><span class="p">)</span>

<span class="n">pixels</span> <span class="o">=</span> <span class="n">ds</span><span class="p">.</span><span class="n">pixel_array</span>
<span class="k">if</span> <span class="n">pixels</span><span class="p">.</span><span class="n">ndim</span> <span class="o">!=</span> <span class="mi">2</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">Tek kareli görüntü bekleniyor.</span><span class="sh">"</span><span class="p">)</span>

<span class="n">hu</span> <span class="o">=</span> <span class="nf">apply_modality_lut</span><span class="p">(</span><span class="n">pixels</span><span class="p">,</span> <span class="n">ds</span><span class="p">).</span><span class="nf">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">float32</span><span class="p">)</span>
<span class="n">center</span><span class="p">,</span> <span class="n">width</span> <span class="o">=</span> <span class="mf">40.0</span><span class="p">,</span> <span class="mf">400.0</span>
<span class="n">scaled</span> <span class="o">=</span> <span class="p">(</span><span class="n">hu</span> <span class="o">-</span> <span class="p">(</span><span class="n">center</span> <span class="o">-</span> <span class="mf">0.5</span><span class="p">))</span> <span class="o">/</span> <span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="mf">0.5</span>
<span class="n">view</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">clip</span><span class="p">(</span><span class="n">scaled</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="o">*</span> <span class="mi">255</span><span class="p">).</span><span class="nf">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">uint8</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">view</span><span class="p">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">view</span><span class="p">.</span><span class="n">dtype</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">apply_modality_lut</code>, elle katsayı çarpmaktan daha güvenli biçimde ilgili dönüşüm etiketlerini kullanır. Pencere hesabı, $w&gt;1$ için DICOM’un <code class="language-plaintext highlighter-rouge">LINEAR</code> yaklaşımını izler. <code class="language-plaintext highlighter-rouge">view</code> gösterim içindir; nicel analizde pencereleme öncesindeki değerleri korumak gerekir. Sıkıştırılmış dosyalarda ayrıca uygun bir piksel çözücü gerekebilir.</p>

<h2 id="kesitleri-birleştirirken-geometriyi-unutmayın">Kesitleri birleştirirken geometriyi unutmayın</h2>

<p>Üç boyutlu hacim oluştururken dosya adına veya yalnızca <code class="language-plaintext highlighter-rouge">InstanceNumber</code> değerine göre sıralamak güvenilir değildir. <code class="language-plaintext highlighter-rouge">ImagePositionPatient</code> ve <code class="language-plaintext highlighter-rouge">ImageOrientationPatient</code>, kesitlerin hasta koordinatlarındaki konumunu ve yönünü belirlemeye yardımcı olur. Konumları kesit normaline izdüşürerek sıralamak daha sağlamdır.</p>

<p>Piksel aralığı ve gerçek kesit konumları da önemlidir. Yanlış eksen sırası, ters yön veya göz ardı edilen düzensiz aralıklar; hacim ölçümünü ve model eğitimini bozabilir. Modeliniz anatomiyi öğrenmek yerine veri hazırlama hatalarını ezberlemesin!</p>

<h2 id="saklama-paylaşma-ve-mahremiyet">Saklama, paylaşma ve mahremiyet</h2>

<p>Hastanelerde görüntüler çoğunlukla <strong>PACS</strong> sistemlerinde yönetilir. DICOM ağ hizmetleri ve DICOMweb, görüntülerin gönderilmesini, sorgulanmasını ve alınmasını sağlar. Ancak standarda uygun olmak, otomatik olarak güvenli olmak değildir; şifreli bağlantı, erişim kontrolü ve denetim kayıtları ayrıca tasarlanmalıdır.</p>

<p>Araştırma öncesinde yalnızca hasta adını silmek yeterli olmaz. Özel etiketler, tarihler, kimlikler ve görüntüye gömülü yazılar da kişisel bilgi taşıyabilir. Kimliksizleştirme, ilişkileri koruyan tutarlı UID eşlemeleriyle ve uygun gizlilik profilleriyle yapılmalıdır.</p>

<p>Kısacası DICOM’u doğru işlemek, piksel okumaktan fazlasıdır: <strong>anlamı, geometriyi ve mahremiyeti birlikte korumaktır.</strong> Klinik kullanımda ayrıca doğrulanmış araçlar ve uzman değerlendirmesi gerekir.</p>

<p><img src="/img/dicom-mr-ve-47.svg" alt="dicom-mr-ve-47" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="dicom" /><category term="tıbbi görüntüleme" /><category term="python" /><category term="pydicom" /><category term="manyetik rezonans" /><category term="bilgisayarlı tomografi" /><summary type="html"><![CDATA[Bir tomografi görüntüsünü sıradan bir fotoğraf gibi saklasaydık ne kaybederdik? Pikselin hastanın neresine ait olduğunu, hangi cihazla üretildiğini ve parlaklığının fiziksel anlamını! DICOM, bu bilgileri görüntüyle birlikte taşıyan ortak dildir. Onu, yalnızca fotoğrafı değil, fotoğrafın teknik pasaportunu da saklayan bir zarf gibi düşünebilirsiniz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dicom-mr-ve-47.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dicom-mr-ve-47.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital Kültürel Mirası Geleceğe Taşımak: Format Eskimesine Karşı Arşiv Stratejileri</title><link href="https://program.sonsuz.us/posts/dijital-kulturel-mirasi-gelecege-tasimak-format-eskimesine-karsi-arsiv-stratejileri/" rel="alternate" type="text/html" title="Dijital Kültürel Mirası Geleceğe Taşımak: Format Eskimesine Karşı Arşiv Stratejileri" /><published>2026-11-02T00:00:00+00:00</published><updated>2026-11-02T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-kulturel-mirasi-gelecege-tasimak-format-eskimesine-karsi-arsiv-stratejileri</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-kulturel-mirasi-gelecege-tasimak-format-eskimesine-karsi-arsiv-stratejileri/"><![CDATA[<p>Bir müzenin fotoğrafları, eski bir bilgisayar oyunu veya araştırmacının ses kayıtları… Hepsi dijital olabilir; fakat hiçbiri kendiliğinden ölümsüz değildir. Dosyanın diskte bulunması, gelecekte açılabileceği anlamına gelmez. Dijital arşivcilik, veriyi yalnızca saklamak değil, onu anlayacak geleceğe de hazırlamaktır. Kısacası mesele, dosyaya bir zaman makinesi bileti almaktır!</p>

<p><img src="/img/dijital-kulturel-mirasi-44.svg" alt="dijital-kulturel-mirasi-44" /></p>

<p>``</p>

<h2 id="dosya-yaşıyor-peki-anlamı">Dosya yaşıyor, peki anlamı?</h2>

<p>Uzun vadeli korumanın üç katmanı vardır: bitlerin bütünlüğü, içeriğin okunabilirliği ve bağlamın korunması. Bir belge değişmeden durabilir; ancak onu açan uygulama kaybolmuşsa okunabilirlik ortadan kalkar. Üstelik belgenin üreticisi, tarihi ve kullanım hakları bilinmiyorsa kültürel değeri de eksik aktarılır.</p>

<p>OAIS referans modeli bu süreci kavramsallaştırır: arşive teslim edilen paket, koruma bilgileriyle zenginleştirilmiş arşiv paketi ve kullanıcıya sunulan dağıtım paketi birbirinden ayrılır. OAIS hazır bir yazılım değil, sorumlulukları ve bilgi akışını tanımlayan bir çerçevedir.</p>

<p>Format eskimesi yalnızca dosya uzantısıyla ilgili değildir. Kodekler, yazı tipleri, eklentiler ve işletim sistemi bağımlılıkları da kaybolabilir. Bir video kapsayıcısının tanınması, içindeki görüntünün çözülebileceğini garanti etmez.</p>

<h2 id="göç-mü-emülasyon-mu">Göç mü, emülasyon mu?</h2>

<p>İki temel yaklaşım, içeriği yeni biçime taşımak ve eski çalışma ortamını yeniden oluşturmaktır. Bunlar rakip değil, tamamlayıcı araçlardır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Ne korunur?</th>
      <th>Güçlü tarafı</th>
      <th>Temel risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Format göçü</td>
      <td>İçerik yeni formata aktarılır</td>
      <td>Güncel araçlarla erişim</td>
      <td>Özellik veya görünüm kaybı</td>
    </tr>
    <tr>
      <td>Emülasyon</td>
      <td>Eski çalışma ortamı taklit edilir</td>
      <td>Etkileşimli deneyim</td>
      <td>Ortam ve lisans bağımlılığı</td>
    </tr>
    <tr>
      <td>Bit düzeyinde koruma</td>
      <td>Özgün dosyanın bitleri</td>
      <td>Bütünlük denetimi</td>
      <td>Okunabilirliği garanti etmez</td>
    </tr>
  </tbody>
</table>

<p>Metin belgelerinde uygun PDF/A profilleri, görüntülerde TIFF, seslerde WAV veya FLAC değerlendirilebilir. Ancak hiçbir format sihirli ölümsüzlük iksiri değildir. Seçim; açıklık, araç desteği, doğrulanabilirlik ve koleksiyonun ihtiyaçlarına dayanmalıdır. Dönüştürülen dosyaları doğrulayın; sayfa sayısı, renkler, metin katmanı ve ses süresi gibi önemli özellikleri karşılaştırın. Özgün dosyayı da mutlaka koruyun.</p>

<h2 id="depolama-tek-kopya-tek-macera">Depolama: Tek kopya, tek macera</h2>

<p>3-2-1 yaklaşımı iyi bir başlangıçtır: üç kopya, iki farklı ortam türü ve bir coğrafi olarak ayrı kopya. Fidye yazılımlarına karşı çevrimdışı veya değiştirilemez kopyalar da düşünülmelidir. Ancak yedekleme, tek başına dijital koruma değildir.</p>

<p>Bağımsız kopyaların belirli bir dönemde kaybolma olasılığı $p$ ise, $n$ kopyanın tamamının kaybolması teorik olarak:</p>

\[P_{\text{tam kayıp}} = p^n\]

<p>Bu ifade yalnızca kayıplar bağımsızsa geçerlidir. Aynı binadaki sunucular yangında birlikte kaybolabilir; aynı yönetici hesabına bağlı bulut kopyaları birlikte silinebilir. Kopya sayısı kadar hata alanlarını ayırmak da önemlidir.</p>

<h2 id="python-ile-bütünlük-kontrolü">Python ile bütünlük kontrolü</h2>

<p>Aşağıdaki örnek, Python 3.9 ve üzerinde dosyaların SHA-256 özetlerini kaydeder; sonraki çalıştırmalarda değişen, eksilen veya eklenen dosyaları bildirir. Büyük dosyalar belleğe bütünüyle alınmaz.</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="kn">import</span> <span class="n">sys</span>
<span class="kn">from</span> <span class="n">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>


<span class="k">def</span> <span class="nf">digest</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
    <span class="n">h</span> <span class="o">=</span> <span class="n">hashlib</span><span class="p">.</span><span class="nf">sha256</span><span class="p">()</span>
    <span class="k">with</span> <span class="n">path</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="sh">"</span><span class="s">rb</span><span class="sh">"</span><span class="p">)</span> <span class="k">as</span> <span class="n">stream</span><span class="p">:</span>
        <span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="nf">iter</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">stream</span><span class="p">.</span><span class="nf">read</span><span class="p">(</span><span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">),</span> <span class="sa">b</span><span class="sh">""</span><span class="p">):</span>
            <span class="n">h</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">h</span><span class="p">.</span><span class="nf">hexdigest</span><span class="p">()</span>


<span class="n">root</span> <span class="o">=</span> <span class="nc">Path</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]).</span><span class="nf">resolve</span><span class="p">()</span>
<span class="n">manifest</span> <span class="o">=</span> <span class="nc">Path</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]).</span><span class="nf">resolve</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">root</span><span class="p">.</span><span class="nf">is_dir</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">Koleksiyon klasörü bulunamadı.</span><span class="sh">"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">manifest</span><span class="p">.</span><span class="nf">is_relative_to</span><span class="p">(</span><span class="n">root</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">Manifesti koleksiyon dışında saklayın.</span><span class="sh">"</span><span class="p">)</span>

<span class="n">current</span> <span class="o">=</span> <span class="p">{</span>
    <span class="n">p</span><span class="p">.</span><span class="nf">relative_to</span><span class="p">(</span><span class="n">root</span><span class="p">).</span><span class="nf">as_posix</span><span class="p">():</span> <span class="nf">digest</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="nf">rglob</span><span class="p">(</span><span class="sh">"</span><span class="s">*</span><span class="sh">"</span><span class="p">))</span>
    <span class="k">if</span> <span class="n">p</span><span class="p">.</span><span class="nf">is_file</span><span class="p">()</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">p</span><span class="p">.</span><span class="nf">is_symlink</span><span class="p">()</span>
<span class="p">}</span>

<span class="k">if</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="sh">"</span><span class="s">init</span><span class="sh">"</span><span class="p">:</span>
    <span class="k">with</span> <span class="n">manifest</span><span class="p">.</span><span class="nf">open</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">encoding</span><span class="o">=</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">)</span> <span class="k">as</span> <span class="n">stream</span><span class="p">:</span>
        <span class="n">json</span><span class="p">.</span><span class="nf">dump</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="n">stream</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="n">expected</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="nf">loads</span><span class="p">(</span><span class="n">manifest</span><span class="p">.</span><span class="nf">read_text</span><span class="p">(</span><span class="n">encoding</span><span class="o">=</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">))</span>
    <span class="n">changes</span> <span class="o">=</span> <span class="p">[</span>
        <span class="n">name</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">expected</span><span class="p">.</span><span class="nf">keys</span><span class="p">()</span> <span class="o">|</span> <span class="n">current</span><span class="p">.</span><span class="nf">keys</span><span class="p">())</span>
        <span class="k">if</span> <span class="n">expected</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">!=</span> <span class="n">current</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
    <span class="p">]</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Değişen, eksik veya yeni dosyalar:</span><span class="sh">"</span><span class="p">,</span> <span class="n">changes</span><span class="p">)</span>
    <span class="n">sys</span><span class="p">.</span><span class="nf">exit</span><span class="p">(</span><span class="nf">bool</span><span class="p">(</span><span class="n">changes</span><span class="p">))</span>
</code></pre></div></div>

<p>İlk kayıt için <code class="language-plaintext highlighter-rouge">python kontrol.py koleksiyon manifest.json init</code>, denetim için son argümanı <code class="language-plaintext highlighter-rouge">check</code> yapın. Manifestin yanlışlıkla üzerine yazılması engellenir. Sembolik bağlantılar kapsam dışıdır. Özetler özgünlüğü tek başına kanıtlamaz; güvenilir manifesti ayrı, korumalı bir yerde tutun. Değişiklik saptandığında inceleme yapmadan başlangıç kaydını yenilemeyin.</p>

<h2 id="arşivi-yaşayan-bir-sisteme-dönüştürün">Arşivi yaşayan bir sisteme dönüştürün</h2>

<p>PREMIS gibi koruma metaverisiyle dönüşümleri, kullanılan araç sürümlerini, kontrol sonuçlarını ve sorumluları kaydedin. Dosyanın özgünüyle türevi arasındaki ilişkiyi açık tutun. Şifreleme kullanıyorsanız anahtarların korunmasını ve erişim yetkilerinin devrini de planlayın.</p>

<p>Düzenli bütünlük taramaları, geri yükleme tatbikatları ve format risk değerlendirmeleri için takvim oluşturun. Depolama ortamlarını gerektiğinde yenileyin; telif ve kişisel veri koşullarını erişim politikalarına yansıtın. Bütçe ve görev sahipleri belirlenmeden hiçbir teknik çözüm sürdürülebilir olmaz. Başarı, gelecekteki kullanıcının yalnızca dosyayı bulması değil, içeriği doğru biçimde anlayabilmesidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="dijital arşivleme" /><category term="kültürel miras" /><category term="veri koruma" /><category term="format eskimesi" /><category term="dijital koruma" /><category term="python" /><summary type="html"><![CDATA[Bir müzenin fotoğrafları, eski bir bilgisayar oyunu veya araştırmacının ses kayıtları… Hepsi dijital olabilir; fakat hiçbiri kendiliğinden ölümsüz değildir. Dosyanın diskte bulunması, gelecekte açılabileceği anlamına gelmez. Dijital arşivcilik, veriyi yalnızca saklamak değil, onu anlayacak geleceğe de hazırlamaktır. Kısacası mesele, dosyaya bir zaman makinesi bileti almaktır!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-kulturel-mirasi-44.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-kulturel-mirasi-44.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>