<?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-09T14:05:46+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">Arşivin Kilidini Birlikte Açmak: Tarihi Belge Transkripsiyonu Platformlarının Mimarisi</title><link href="https://program.sonsuz.us/posts/arsivin-kilidini-birlikte-acmak-tarihi-belge-transkripsiyonu-platformlarinin-mimarisi/" rel="alternate" type="text/html" title="Arşivin Kilidini Birlikte Açmak: Tarihi Belge Transkripsiyonu Platformlarının Mimarisi" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/arsivin-kilidini-birlikte-acmak-tarihi-belge-transkripsiyonu-platformlarinin-mimarisi</id><content type="html" xml:base="https://program.sonsuz.us/posts/arsivin-kilidini-birlikte-acmak-tarihi-belge-transkripsiyonu-platformlarinin-mimarisi/"><![CDATA[<p>Yüzyıllık bir mektuptaki kıvrımlı harfleri çözmek, bazen dedektiflikten daha zordur. Crowdsourcing platformları bu bulmacayı binlerce gönüllüye dağıtır: biri satırı okur, diğeri düzeltir, üçüncüsü tartışmalı kelimeyi değerlendirir. Ancak başarılı bir sistem, yalnızca görselin yanına metin kutusu koymaz. Katkıları izler, belirsizliği korur ve insan emeğini güvenilir dijital kayıtlara dönüştürür. Gelin bu kolektif arşiv dedektifliğinin yazılım tarafını tasarlayalım.</p>

<p>``</p>

<h2 id="1-temel-fikir-belgeyi-değil-işi-bölmek">1. Temel fikir: Belgeyi değil, işi bölmek</h2>

<p>Crowdsourcing, büyük bir görevi bağımsız katkılara ayırarak dağıtılmış insan emeğinden yararlanır. Buradaki çalışma birimi genellikle belgenin tamamı değil, sayfa veya satır bölgesidir. Küçük görevler katılım eşiğini düşürür; aşırı küçük görevler ise bağlamı kaybettirir. Bir kelimenin doğru okunuşu bazen önceki cümlede saklıdır.</p>

<p>Bu nedenle görev ekranı hedef satırı vurgularken komşu satırları da göstermelidir. Gönüllü, okunamayan karakteri işaretleyebilmeli ve tahminini kesin bilgi gibi sunmaya zorlanmamalıdır. Diplomatik transkripsiyon özgün yazımı korurken, normalleştirilmiş metin aramayı kolaylaştırır. Bunları ayrı alanlarda tutmak, geçmişi modern imlaya yanlışlıkla boyamayı önler.</p>

<h2 id="2-mimari-her-parçanın-kendi-sorumluluğu">2. Mimari: Her parçanın kendi sorumluluğu</h2>

<p>Başlangıçta modüler bir monolit yeterlidir. Kullanıcı, görev, transkripsiyon ve inceleme modülleri belirgin sınırlara sahip olduğunda, gerektiğinde ayrı servislere taşınabilir. İlk günden mikroservis kurmak, tek mektubu okumak için küçük bir uzay üssü işletmeye benzeyebilir.</p>

<table>
  <thead>
    <tr>
      <th>Bileşen</th>
      <th>Sorumluluk</th>
      <th>Uygun çözüm</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Görsel deposu</td>
      <td>Yüksek çözünürlüklü taramalar</td>
      <td>S3 uyumlu nesne depolama</td>
    </tr>
    <tr>
      <td>İşlemsel veritabanı</td>
      <td>Görevler, katkılar, sürümler</td>
      <td>PostgreSQL</td>
    </tr>
    <tr>
      <td>Arka plan işçisi</td>
      <td>Küçük görsel ve dışa aktarım üretimi</td>
      <td>Görev kuyruğu</td>
    </tr>
    <tr>
      <td>Web arayüzü</td>
      <td>Yakınlaştırma, düzenleme, inceleme</td>
      <td>Erişilebilir istemci uygulaması</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/arsivin-kilidini-birlikte-97.svg" alt="arsivin-kilidini-birlikte-97" /></p>

<p>IIIF uyumlu görsel sunumu, büyük taramaların yalnızca gereken bölümlerini yüklemeyi kolaylaştırır. PostgreSQL ise görsel dosyalarını değil, dosya adreslerini ve ilgili kayıtları saklar.</p>

<h2 id="3-veri-modeli-ve-görev-yaşam-döngüsü">3. Veri modeli ve görev yaşam döngüsü</h2>

<p>Temel ilişkiler şöyle kurulabilir: koleksiyon belgeyi, belge sayfayı, sayfa koordinatlarla tanımlanmış bölgeleri içerir. Her transkripsiyon; bölge kimliği, katkıcı kimliği, metin, zaman ve sürüm numarası taşır. Onaylanan metin, katkı geçmişinden ayrı bir yayın kaydıdır.</p>

<p>Görevler bekliyor, düzenleniyor, incelemede ve yayımlandı durumlarından geçebilir. Düzenleme sırasında süreli rezervasyon kullanılır; tarayıcısını kapatan gönüllü görevi sonsuza kadar kilitlemez. Aynı bölgeye bağımsız okumalar atanacaksa rezervasyon bölgeye değil, ilgili görev atamasına uygulanır.</p>

<p>Eşzamanlı güncellemelerde iyimser kilitleme işe yarar: istemci mevcut sürümü gönderir, sunucu sürüm değişmişse üzerine yazmak yerine çatışma bildirir. Katkı kaydıyla kuyruk olayını aynı veritabanı işleminde yazan outbox deseni de kaybolan bildirimleri azaltır.</p>

<h2 id="4-uzlaşma-çoğunluk-her-zaman-haklı-mı">4. Uzlaşma: Çoğunluk her zaman haklı mı?</h2>

<p>Aynı satırı bağımsız gönüllülere okutmak hataları yakalamaya yardımcı olur. Fakat herkes aynı yanıltıcı harfi yanlış okuyabilir. Dolayısıyla uzlaşma, doğruluğun kanıtı değil, inceleme önceliği belirleyen bir sinyaldir.</p>

<p>Bir aday metnin ağırlıklı desteğini şöyle hesaplayabiliriz:</p>

\[S(t)=\frac{\sum_{u\in U}w_u I(t_u=t)}{\sum_{u\in U}w_u}\]

<p>Burada $w_u$ katkıcının ağırlığı, $I$ ise eşleşmede bir, diğer durumda sıfırdır. Başlangıçta eşit ağırlıklar kullanılabilir; sonradan doğrulanmış örneklerle kalibrasyon yapılır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tek katkıyı kabul etmek</td>
      <td>Hızlı ilerleme</td>
      <td>Görünmeyen hatalar</td>
    </tr>
    <tr>
      <td>Bağımsız çoğunluk</td>
      <td>Daha güçlü kontrol</td>
      <td>Ortak yanılgılar</td>
    </tr>
    <tr>
      <td>Uzman incelemesi</td>
      <td>Bağlamsal değerlendirme</td>
      <td>Darboğaz oluşması</td>
    </tr>
  </tbody>
</table>

<h2 id="5-python-ile-küçük-bir-uzlaşma-çekirdeği">5. Python ile küçük bir uzlaşma çekirdeği</h2>

<p>Aşağıdaki fonksiyon, aynı kullanıcının tekrar oy vermesini reddeder. Unicode normalizasyonu uygular; ancak tarihsel yazımı değiştirebilecek küçük harfe dönüştürme veya noktalama temizliği yapmaz.</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">defaultdict</span>
<span class="kn">from</span> <span class="n">unicodedata</span> <span class="kn">import</span> <span class="n">normalize</span>


<span class="k">def</span> <span class="nf">consensus</span><span class="p">(</span><span class="n">votes</span><span class="p">):</span>
    <span class="n">scores</span> <span class="o">=</span> <span class="nf">defaultdict</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span>
    <span class="n">users</span> <span class="o">=</span> <span class="nf">set</span><span class="p">()</span>
    <span class="k">for</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">weight</span> <span class="ow">in</span> <span class="n">votes</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">user_id</span> <span class="ow">in</span> <span class="n">users</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">Tekrarlanan katkıcı</span><span class="sh">'</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">weight</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">Geçersiz ağırlık</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">users</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">user_id</span><span class="p">)</span>
        <span class="n">scores</span><span class="p">[</span><span class="nf">normalize</span><span class="p">(</span><span class="sh">'</span><span class="s">NFC</span><span class="sh">'</span><span class="p">,</span> <span class="n">text</span><span class="p">)]</span> <span class="o">+=</span> <span class="n">weight</span>

    <span class="k">if</span> <span class="ow">not</span> <span class="n">scores</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="bp">False</span>

    <span class="n">candidate</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">scores</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">scores</span><span class="p">.</span><span class="n">get</span><span class="p">)</span>
    <span class="n">support</span> <span class="o">=</span> <span class="n">scores</span><span class="p">[</span><span class="n">candidate</span><span class="p">]</span> <span class="o">/</span> <span class="nf">sum</span><span class="p">(</span><span class="n">scores</span><span class="p">.</span><span class="nf">values</span><span class="p">())</span>
    <span class="n">ready</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">users</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">3</span> <span class="ow">and</span> <span class="n">support</span> <span class="o">&gt;=</span> <span class="mf">0.85</span>
    <span class="k">return</span> <span class="n">candidate</span><span class="p">,</span> <span class="n">support</span><span class="p">,</span> <span class="n">ready</span>
</code></pre></div></div>

<p>Fonksiyon aday metni, destek oranını ve incelemeye hazır olma durumunu döndürür. Üç bağımsız katkı ve yüzde 85 destek, örnek politika değerleridir; olasılıksal doğruluk garantisi değildir. Ağırlıklar istemciden değil, sunucudaki güvenilir kayıtlardan alınmalıdır.</p>

<h2 id="6-yayına-giden-son-kilometre">6. Yayına giden son kilometre</h2>

<p>Katkıcıları birbirinin cevabını görmeden çalıştırmak bağımsızlığı güçlendirir. Yetkilendirme, hız sınırlama ve denetim kayıtları kötüye kullanımı azaltır. Tekrarlanan kuyruk mesajları için idempotent işçiler gerekir.</p>

<p>Son olarak TEI-XML gibi bir formatla dışa aktarım sunun; belirsizlikleri, alternatif okumaları ve kaynak koordinatlarını koruyun. Başarıyı yalnızca tamamlanan satır sayısıyla değil, uzmanların bulduğu hata oranı ve gönüllülerin devamlılığıyla ölçün. Böylece arşiv yalnızca dijitalleşmez; güvenilir, izlenebilir ve yeniden kullanılabilir hale gelir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="crowdsourcing" /><category term="yazılım mimarisi" /><category term="dijital arşiv" /><category term="transkripsiyon" /><category term="python" /><category term="veri kalitesi" /><summary type="html"><![CDATA[Yüzyıllık bir mektuptaki kıvrımlı harfleri çözmek, bazen dedektiflikten daha zordur. Crowdsourcing platformları bu bulmacayı binlerce gönüllüye dağıtır: biri satırı okur, diğeri düzeltir, üçüncüsü tartışmalı kelimeyi değerlendirir. Ancak başarılı bir sistem, yalnızca görselin yanına metin kutusu koymaz. Katkıları izler, belirsizliği korur ve insan emeğini güvenilir dijital kayıtlara dönüştürür. Gelin bu kolektif arşiv dedektifliğinin yazılım tarafını tasarlayalım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/arsivin-kilidini-birlikte-97.png" /><media:content medium="image" url="https://program.sonsuz.us/img/arsivin-kilidini-birlikte-97.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bir Dokunuşun Arkasında: Mobil Ödeme Sistemlerinin Güvenli Arka Uç Mimarisi</title><link href="https://program.sonsuz.us/posts/bir-dokunusun-arkasinda-mobil-odeme-sistemlerinin-guvenli-arka-uc-mimarisi/" rel="alternate" type="text/html" title="Bir Dokunuşun Arkasında: Mobil Ödeme Sistemlerinin Güvenli Arka Uç Mimarisi" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bir-dokunusun-arkasinda-mobil-odeme-sistemlerinin-guvenli-arka-uc-mimarisi</id><content type="html" xml:base="https://program.sonsuz.us/posts/bir-dokunusun-arkasinda-mobil-odeme-sistemlerinin-guvenli-arka-uc-mimarisi/"><![CDATA[<p><img src="/img/bir-dokunusun-arkasinda-55.svg" alt="bir-dokunusun-arkasinda-55" /></p>

<p>Telefonunuzda “Öde” düğmesine dokunuyorsunuz; birkaç saniye sonra yeşil bir onay beliriyor. Görünürde tek hareket, arka planda ise kimlik doğrulama, risk değerlendirmesi, banka iletişimi ve muhasebe kayıtlarından oluşan koordineli bir operasyon var. Üstelik internet bağlantınız tam o anda kesilebilir! Peki sistem, hem hızlı davranıp hem de paranızı yanlışlıkla iki kez göndermemeyi nasıl başarıyor?</p>

<p>``</p>

<h2 id="önce-kavramları-ayıralım">Önce kavramları ayıralım</h2>

<p>Bir ödeme, yalnızca veritabanındaki bakiyeyi azaltmak değildir. Kartlı işlemlerde <strong>yetkilendirme</strong>, tutarın kullanılabilirliğinin onaylanmasıdır; <strong>tahsilat</strong> ve <strong>mutabakat</strong> ise farklı aşamalardır. Kullanıcının gördüğü başarı mesajı, bankalar arasındaki nihai hesaplaşmanın tamamlandığı anlamına gelmeyebilir.</p>

<p>Temel tasarım hedefi, dağıtık bileşenler arasında para hareketinin anlamını korumaktır. Bunun için ödeme durumu açıkça modellenir: <code class="language-plaintext highlighter-rouge">pending → authorized → captured</code>; başarısızlık, iptal ve iade ayrı geçişlerdir. Her işlem bütün aşamalardan geçmez; örneğin uygulama içi cüzdan transferi farklı bir akış kullanabilir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Ne ifade eder?</th>
      <th>Ne değildir?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yetkilendirme</td>
      <td>Ödeme için onay alınması</td>
      <td>Nihai hesaplaşma</td>
    </tr>
    <tr>
      <td>Tahsilat</td>
      <td>Yetkilendirilen tutarın çekilmesi</td>
      <td>İade</td>
    </tr>
    <tr>
      <td>Mutabakat</td>
      <td>İç kayıtlarla dış kayıtların karşılaştırılması</td>
      <td>Kullanıcıya anlık bildirim</td>
    </tr>
    <tr>
      <td>Idempotency</td>
      <td>Tekrarlanan isteğin aynı sonucu üretmesi</td>
      <td>İstekleri hiç tekrarlamamak</td>
    </tr>
  </tbody>
</table>

<h2 id="bir-isteğin-saniyelik-yolculuğu">Bir isteğin saniyelik yolculuğu</h2>

<ol>
  <li><strong>API katmanı</strong>, erişim belirtecini doğrular; tutar, para birimi ve alıcı gibi alanları denetler. Kimliği doğrulanmış olmak, her hesaptan ödeme yapabilmek demek değildir: yetki kontrolü ayrıca gerekir.</li>
  <li><strong>Ödeme servisi</strong>, isteği benzersiz bir anahtarla kaydeder. Böylece yeniden denemeler aynı işlemle ilişkilendirilir.</li>
  <li><strong>Risk motoru</strong>, cihaz geçmişi, işlem sıklığı ve alışılmadık tutarlar gibi sinyalleri değerlendirir. Gerektiğinde ek doğrulama ister.</li>
  <li><strong>Sağlayıcı adaptörü</strong>, banka veya ödeme kuruluşuyla konuşur. Zaman aşımı, kesin başarısızlık sayılmaz; karşı taraf işlemi kabul etmiş olabilir.</li>
  <li><strong>Durum makinesi</strong>, yanıtı veya doğrulanmış webhook bildirimini işler. Mobil uygulama güncel durumu sorgulayabilir ya da bildirim alabilir.</li>
</ol>

<p>Toplam gecikmeyi kabaca $L = L_{ağ} + L_{risk} + L_{sağlayıcı} + L_{kayıt}$ şeklinde düşünebiliriz. Bağımsız kontroller paralelleştirilebilir; ancak güvenlik kontrolleri sırf hız uğruna atlanamaz.</p>

<h2 id="paranın-hafızası-çift-taraflı-defter">Paranın hafızası: çift taraflı defter</h2>

<p>Muhasebe defteri, yalnızca güncel bakiyeyi değil, bakiyeyi oluşturan hareketleri saklar. Çift taraflı kayıtta her hareketin karşılığı bulunur. Aynı para birimindeki dengeli bir muhasebe işlemi için:</p>

\[\sum_{i=1}^{n} e_i = 0\]

<p>Burada $e_i$, işaretli kayıt tutarıdır. Ücretler de ayrı hesaplarla dengelenir. Para, kayan noktalı sayılarla değil, kuruş gibi en küçük birimin tamsayı karşılığıyla veya uygun sabit hassasiyetli türlerle tutulmalıdır. Farklı para birimleri doğrudan toplanmaz; kur dönüşümü ayrıca modellenir.</p>

<h2 id="çift-tıklamaya-dayanıklı-işlem-başlatma">Çift tıklamaya dayanıklı işlem başlatma</h2>

<p>Aşağıdaki Python örneği, PostgreSQL ve Psycopg kullanarak ödeme kaydıyla iş kuyruğu kaydını aynı yerel transaction içinde oluşturur. Örnek yalnızca TRY işlemlerini varsayar; tutar ve alıcı doğrulaması önceden yapılmıştır. <code class="language-plaintext highlighter-rouge">payments.id</code> otomatik üretilir ve <code class="language-plaintext highlighter-rouge">(user_id, idem_key)</code> üzerinde benzersiz kısıt bulunur.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">baslat</span><span class="p">(</span><span class="n">conn</span><span class="p">,</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
    <span class="k">with</span> <span class="n">conn</span><span class="p">.</span><span class="nf">transaction</span><span class="p">():</span>
        <span class="n">row</span> <span class="o">=</span> <span class="n">conn</span><span class="p">.</span><span class="nf">execute</span><span class="p">(</span>
            <span class="sh">"</span><span class="s">INSERT INTO payments </span><span class="sh">"</span>
            <span class="sh">"</span><span class="s">(user_id, idem_key, amount_minor, target_id, status) </span><span class="sh">"</span>
            <span class="sh">"</span><span class="s">VALUES (%s, %s, %s, %s, </span><span class="sh">'</span><span class="s">pending</span><span class="sh">'</span><span class="s">) </span><span class="sh">"</span>
            <span class="sh">"</span><span class="s">ON CONFLICT (user_id, idem_key) DO NOTHING RETURNING id</span><span class="sh">"</span><span class="p">,</span>
            <span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span>
        <span class="p">).</span><span class="nf">fetchone</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">row</span><span class="p">:</span>
            <span class="n">conn</span><span class="p">.</span><span class="nf">execute</span><span class="p">(</span>
                <span class="sh">"</span><span class="s">INSERT INTO outbox (payment_id, event_type) </span><span class="sh">"</span>
                <span class="sh">"</span><span class="s">VALUES (%s, </span><span class="sh">'</span><span class="s">payment_requested</span><span class="sh">'</span><span class="s">)</span><span class="sh">"</span><span class="p">,</span> <span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="mi">0</span><span class="p">],)</span>
            <span class="p">)</span>
            <span class="k">return</span> <span class="n">row</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="sh">"</span><span class="s">pending</span><span class="sh">"</span>
        <span class="n">old</span> <span class="o">=</span> <span class="n">conn</span><span class="p">.</span><span class="nf">execute</span><span class="p">(</span>
            <span class="sh">"</span><span class="s">SELECT id, amount_minor, target_id, status FROM payments </span><span class="sh">"</span>
            <span class="sh">"</span><span class="s">WHERE user_id = %s AND idem_key = %s</span><span class="sh">"</span><span class="p">,</span> <span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
        <span class="p">).</span><span class="nf">fetchone</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">old</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span> <span class="o">!=</span> <span class="p">(</span><span class="n">amount</span><span class="p">,</span> <span class="n">target</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">Anahtar farklı bir istekle kullanılmış</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">old</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">old</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
</code></pre></div></div>

<p><strong>Outbox deseni</strong>, kaydedilmiş ödemenin gönderim işinin kaybolmasını önler. Çalışan süreç olayı tekrar gönderebileceğinden tüketici ve sağlayıcı çağrısı da idempotent olmalıdır. Yerel transaction, bankayı kapsayan küresel bir transaction değildir.</p>

<h2 id="güvenlik-ve-toparlanma">Güvenlik ve toparlanma</h2>

<p>TLS, tokenizasyon, sır yönetimi ve hassas verilerin loglardan çıkarılması temel önlemlerdir. Webhook imzası doğrulanmalı, tekrar gönderimleri ayıklanmalıdır. Periyodik mutabakat, eksik bildirimleri ve tutarsız kayıtları yakalar.</p>

<p>Sonuç: hızlı ödeme, her şeyi tek seferde bitirmek değil; belirsizlikleri güvenle yönetmektir. Yeşil tikin arkasındaki gerçek kahramanlar, sağlam kayıtlar ve kontrollü yeniden denemelerdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ödeme-sistemleri" /><category term="arka-uç" /><category term="idempotency" /><category term="veritabanı" /><category term="güvenlik" /><category term="dağıtık-sistemler" /><summary type="html"><![CDATA[Telefonunuzda “Öde” düğmesine dokunuyorsunuz; birkaç saniye sonra yeşil bir onay beliriyor. Görünürde tek hareket, arka planda ise kimlik doğrulama, risk değerlendirmesi, banka iletişimi ve muhasebe kayıtlarından oluşan koordineli bir operasyon var. Üstelik internet bağlantınız tam o anda kesilebilir! Peki sistem, hem hızlı davranıp hem de paranızı yanlışlıkla iki kez göndermemeyi nasıl başarıyor?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bir-dokunusun-arkasinda-55.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bir-dokunusun-arkasinda-55.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bloklardan Algoritmalara: Scratch ile Çocuklara Kodlama Mantığı Öğretmek</title><link href="https://program.sonsuz.us/posts/bloklardan-algoritmalara-scratch-ile-cocuklara-kodlama-mantigi-ogretmek/" rel="alternate" type="text/html" title="Bloklardan Algoritmalara: Scratch ile Çocuklara Kodlama Mantığı Öğretmek" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bloklardan-algoritmalara-scratch-ile-cocuklara-kodlama-mantigi-ogretmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/bloklardan-algoritmalara-scratch-ile-cocuklara-kodlama-mantigi-ogretmek/"><![CDATA[<p>Bir kediyi dans ettirmek, uzay gemisini hareket ettirmek veya kendi oyununu tasarlamak… Çocuklar için programlamaya giriş, noktalı virgüllerle mücadele etmek zorunda değil. Scratch gibi blok tabanlı araçlar, komutları renkli yapboz parçalarına dönüştürerek dikkati yazım kurallarından problem çözmeye taşır. Ancak asıl kazanım, ekrandaki karakterin hareket etmesi değil, çocuğun bu hareketi nasıl planladığıdır.</p>

<p><img src="/img/bloklardan-algoritmalara-scratch-84.svg" alt="bloklardan-algoritmalara-scratch-84" /></p>

<p>``</p>

<h2 id="blokların-arkasındaki-düşünme-biçimi">Blokların arkasındaki düşünme biçimi</h2>

<p>Algoritma, bir hedefe ulaşmak için tanımlanan, sıralı ve yeterince açık adımlar bütünüdür. “Karakteri kazandır” bir hedef belirtir; fakat nasıl kazanacağını açıklamaz. “Yıldızı bul, üzerine tıkla, puanı artır; beş puanda oyunu bitir” ise uygulanabilir bir yol tarif eder.</p>

<p>Algoritmik düşünme; problemi küçük parçalara ayırmayı, tekrarları fark etmeyi, koşullara göre karar vermeyi ve çözümü sınamayı içerir. Scratch, bu soyut kavramlara görülebilen sonuçlar kazandırır. Yanlış sıraya yerleştirilen bir blok, karakterin beklenmedik davranışıyla hemen kendini belli eder.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Günlük yaşam karşılığı</th>
      <th>Kodlama karşılığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sıralama</td>
      <td>Önce çorabı, sonra ayakkabıyı giy</td>
      <td>Komutları sırayla çalıştır</td>
    </tr>
    <tr>
      <td>Koşul</td>
      <td>Yağmur varsa şemsiye al</td>
      <td>Eğer koşul doğruysa işlem yap</td>
    </tr>
    <tr>
      <td>Döngü</td>
      <td>Her basamakta aynı hareketi yap</td>
      <td>İşlemi tekrar et</td>
    </tr>
    <tr>
      <td>Değişken</td>
      <td>Kumbaradaki para miktarı</td>
      <td>Değişen değeri sakla</td>
    </tr>
  </tbody>
</table>

<p>Bu eşleştirmeler, çocuğun yeni kavramı bildiği bir deneyime bağlamasını sağlar. Bilgisayarın “niyetimizi” değil, verdiğimiz talimatları uyguladığını anlamak da önemli bir keşiftir.</p>

<h2 id="görsel-araçlar-neyi-kolaylaştırır">Görsel araçlar neyi kolaylaştırır?</h2>

<p>Blokların şekilleri, hangi parçaların birleşebileceğini gösterir. Böylece birçok sözdizimi hatası daha oluşmadan engellenir. Çocuk, parantez aramak yerine “Bu koşul neden gerçekleşmedi?” sorusuna odaklanabilir.</p>

<p>Yine de görsellik, programın mutlaka doğru olduğu anlamına gelmez. Yanlış koşullar, sonsuz döngüler ve hatalı değişken güncellemeleri bloklarla da mümkündür. Bu nedenle araç, düşünmenin yerine geçmez; düşünmeyi görünür hale getirir.</p>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Öne çıkan yaklaşım</th>
      <th>Uygun başlangıç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ScratchJr</td>
      <td>Daha sade, simge ağırlıklı bloklar</td>
      <td>Kısa hareketli hikâyeler</td>
    </tr>
    <tr>
      <td>Scratch</td>
      <td>Olaylar, değişkenler ve etkileşim</td>
      <td>Oyunlar ve animasyonlar</td>
    </tr>
    <tr>
      <td>MakeCode</td>
      <td>Bloklarla cihaz veya simülasyon kontrolü</td>
      <td>Donanım odaklı etkinlikler</td>
    </tr>
  </tbody>
</table>

<p>Seçim yaparken yalnızca yaşa değil; okuma becerisine, ilgi alanına ve kullanılacak cihazlara da bakmak gerekir.</p>

<h2 id="mini-proje-beş-yıldızı-yakala">Mini proje: Beş yıldızı yakala!</h2>

<p>Scratch’te bir yıldız kuklası ve <code class="language-plaintext highlighter-rouge">puan</code> değişkeni oluşturalım. Oyuncu yıldızın üzerine tıkladıkça puan kazansın; yıldız başka bir konuma taşınsın. Beş puana ulaşınca oyun sona ersin.</p>

<p>Aşağıdaki örnek, Scratch bloklarının akışını anlatan sözde koddur; metin olarak doğrudan çalıştırılmaz. Yıldız kuklasının betiği şöyle kurulabilir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Yeşil bayrak tıklandığında:
    puanı 0 yap
    puan = 5 olana kadar tekrarla:
        x: rastgele(-200, 200)
        y: rastgele(-140, 140) konumuna git
        fare basılı VE fare imlecine değiyor olana kadar bekle
        puanı 1 artır
        fare basılı değil olana kadar bekle
    "Tebrikler, kazandın!" de
</code></pre></div></div>

<p>Burada başlangıç olayı, değişken, döngü ve birleşik koşul aynı projede buluşur. Fare düğmesinin bırakılmasını beklemek özellikle önemlidir: Tek bir uzun basışın birden fazla tıklama gibi değerlendirilmesini önler.</p>

<p>Puan güncellemesini matematikle de ifade edebiliriz:</p>

\[P_{yeni}=P_{eski}+1\]

<p>Başlangıçta $P=0$ olduğunda, beş başarılı yakalamadan sonra $P=5$ olur. Böylece çocuk, değişkenin yalnızca bir kutu olmadığını; programın ilerleyişini temsil eden bir durum bilgisi olduğunu görür.</p>

<h2 id="öğretirken-cevaptan-çok-soruya-odaklanın">Öğretirken cevaptan çok soruya odaklanın</h2>

<p>Önce çocuktan akışı kâğıda çizmesini isteyin. Ardından “Hangi adımlar tekrar ediyor?”, “Oyunu bitiren koşul hangisi?” ve “Puanı sıfırlamazsak ne olur?” sorularıyla tasarımını açıklamasına yardımcı olun. Blokları yetişkinin yerleştirmesi yerine, çocuğun karar vermesine alan açın.</p>

<p>Test aşamasında yalnızca başarılı tıklamaları denemeyin. Boş alana tıklamak, fareyi basılı tutmak ve oyunu yeniden başlatmak da değerlidir. Hata bulmak başarısızlık değil, algoritmanın eksik varsayımlarını keşfetmektir. Küçük değişiklikler yapıp sonucu gözlemlemek, rastgele blok değiştirmekten daha öğreticidir.</p>

<h2 id="metin-tabanlı-kodlamaya-köprü">Metin tabanlı kodlamaya köprü</h2>

<p>Bloklarla öğrenilen koşullar, döngüler ve değişkenler Python veya JavaScript’te de bulunur; değişen şey çoğunlukla ifade biçimidir. Bununla birlikte, aktarım kendiliğinden gerçekleşmeyebilir. Aynı algoritmanın iki ortamda karşılaştırılması, kavramların yeni sözdizimiyle ilişkilendirilmesini kolaylaştırır.</p>

<p>Son hedef, mümkün olduğunca erken metin yazdırmak değildir. Çocuğun çözümünü açıklayabilmesi, hatasını araştırabilmesi ve farklı bir probleme uyarlayabilmesidir. Dans eden kedi eğlenceli başlangıçtır; asıl başarı, onun neden dans ettiğini anlatabilen küçük programcıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="scratch" /><category term="görsel kodlama" /><category term="algoritmik düşünme" /><category term="programlama eğitimi" /><category term="çocuklar için kodlama" /><category term="blok tabanlı programlama" /><summary type="html"><![CDATA[Bir kediyi dans ettirmek, uzay gemisini hareket ettirmek veya kendi oyununu tasarlamak… Çocuklar için programlamaya giriş, noktalı virgüllerle mücadele etmek zorunda değil. Scratch gibi blok tabanlı araçlar, komutları renkli yapboz parçalarına dönüştürerek dikkati yazım kurallarından problem çözmeye taşır. Ancak asıl kazanım, ekrandaki karakterin hareket etmesi değil, çocuğun bu hareketi nasıl planladığıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bloklardan-algoritmalara-scratch-84.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bloklardan-algoritmalara-scratch-84.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital İkiz ile Tedarik Zinciri: Krizleri Gerçekte Yaşamadan Test Etmek</title><link href="https://program.sonsuz.us/posts/dijital-ikiz-ile-tedarik-zinciri-krizleri-gercekte-yasamadan-test-etmek/" rel="alternate" type="text/html" title="Dijital İkiz ile Tedarik Zinciri: Krizleri Gerçekte Yaşamadan Test Etmek" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-ikiz-ile-tedarik-zinciri-krizleri-gercekte-yasamadan-test-etmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-ikiz-ile-tedarik-zinciri-krizleri-gercekte-yasamadan-test-etmek/"><![CDATA[<p>Bir liman kapandığında, kritik tedarikçiniz üretimi durdurduğunda veya talep bir gecede yükseldiğinde ne yaparsınız? Gerçek tedarik zincirinde deneme yapmak pahalıdır; üstelik müşteriler deney faresi olmayı pek sevmez. Dijital ikiz, bu krizleri sanal ortamda prova etmenizi sağlar. Amaç geleceği kusursuz tahmin etmek değil, hangi kararların hangi koşullarda işe yaradığını anlamaktır.</p>

<p><img src="/img/dijital-ikiz-ile-94.svg" alt="dijital-ikiz-ile-94" /></p>

<p>``</p>

<h2 id="dijital-ikiz-süslü-bir-şema-değildir">Dijital ikiz, süslü bir şema değildir</h2>

<p>Tedarik ağını bir yönlü çizge olarak düşünebiliriz: düğümler tedarikçileri, depoları ve müşterileri; kenarlar malzeme akışlarını temsil eder. Her bağlantının kapasitesi, taşıma süresi ve maliyeti vardır. Stoklar, siparişler ve teslimatlar ise zamanla değişen durum değişkenleridir.</p>

<p>Klasik simülasyon belirli varsayımlarla çalışır. Dijital ikiz, gerçek sistemden gelen verilerle güncellenerek bu varsayımları mevcut operasyonla ilişkilendirir. Yani yalnızca harita değil, hareket eden bir haritadır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Veri ilişkisi</th>
      <th>Temel kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Statik ağ modeli</td>
      <td>Sabit varsayımlar</td>
      <td>Yapıyı anlamak</td>
    </tr>
    <tr>
      <td>Simülasyon</td>
      <td>Senaryoya özel girdiler</td>
      <td>Olasılıkları denemek</td>
    </tr>
    <tr>
      <td>Dijital ikiz</td>
      <td>Düzenli operasyonel güncelleme</td>
      <td>Güncel durumdan karar üretmek</td>
    </tr>
  </tbody>
</table>

<p>Depodaki akışın temel denklemi şöyledir:</p>

\[I_{t+1}=I_t+A_t-X_t\]

<p>Burada $I_t$ stok, $A_t$ gelen ürün, $X_t$ karşılanan taleptir. Bekleyen siparişleri $B_t$, yeni talebi $D_t$ ile gösterirsek, teslimat miktarı $X_t=\min(I_t+A_t,B_t+D_t)$ olur. Böylece ürün yokken hayali teslimat yapmayız!</p>

<h2 id="önce-veriyi-sonra-felaketi-hazırlayın">Önce veriyi, sonra felaketi hazırlayın</h2>

<p>ERP sisteminden stokları ve açık siparişleri; depo sisteminden kabul hareketlerini; taşıma sisteminden teslimat sürelerini alın. Ürün kodlarını, zaman damgalarını ve ölçü birimlerini eşleştirin. Koli ile adedi karıştıran bir ikiz, gerçeğin değil yanlış hesabın kopyasıdır.</p>

<p>Sonrasında normal koşullardaki çıktıları geçmiş operasyonlarla karşılaştırın. Model gerçek teslimat performansını açıklayamıyorsa, kriz tahminlerine güvenmek için henüz erkendir.</p>

<h2 id="python-ile-küçük-bir-kriz-laboratuvarı">Python ile küçük bir kriz laboratuvarı</h2>

<p>Aşağıdaki örnekte iki tedarikçi, bir depo ve müşteri talebi bulunuyor. Günlük adımlarla çalışan model, on günlük kesintiyi ve alternatif tedarikçi kapasitesini karşılaştırıyor.</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">defaultdict</span>
<span class="kn">from</span> <span class="n">random</span> <span class="kn">import</span> <span class="n">Random</span>


<span class="k">def</span> <span class="nf">simulate</span><span class="p">(</span><span class="n">crisis</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">backup</span><span class="o">=</span><span class="mi">25</span><span class="p">):</span>
    <span class="n">rng</span> <span class="o">=</span> <span class="nc">Random</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
    <span class="n">arrivals</span> <span class="o">=</span> <span class="nf">defaultdict</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
    <span class="n">stock</span><span class="p">,</span> <span class="n">backlog</span> <span class="o">=</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">0</span>
    <span class="n">total_demand</span><span class="p">,</span> <span class="n">total_served</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">day</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">30</span><span class="p">):</span>
        <span class="n">stock</span> <span class="o">+=</span> <span class="n">arrivals</span><span class="p">.</span><span class="nf">pop</span><span class="p">(</span><span class="n">day</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
        <span class="n">demand</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="n">rng</span><span class="p">.</span><span class="nf">gauss</span><span class="p">(</span><span class="mi">80</span><span class="p">,</span> <span class="mi">5</span><span class="p">)))</span>
        <span class="n">served</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">stock</span><span class="p">,</span> <span class="n">backlog</span> <span class="o">+</span> <span class="n">demand</span><span class="p">)</span>
        <span class="n">stock</span> <span class="o">-=</span> <span class="n">served</span>
        <span class="n">backlog</span> <span class="o">+=</span> <span class="n">demand</span> <span class="o">-</span> <span class="n">served</span>
        <span class="n">total_demand</span> <span class="o">+=</span> <span class="n">demand</span>
        <span class="n">total_served</span> <span class="o">+=</span> <span class="n">served</span>

        <span class="n">capacity_a</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">crisis</span> <span class="ow">and</span> <span class="mi">8</span> <span class="o">&lt;=</span> <span class="n">day</span> <span class="o">&lt;</span> <span class="mi">18</span> <span class="k">else</span> <span class="mi">70</span>
        <span class="c1"># Stok ve yoldaki ürünleri hedefe tamamla.
</span>        <span class="n">needed</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span>
            <span class="mi">0</span><span class="p">,</span> <span class="mi">240</span> <span class="o">+</span> <span class="n">backlog</span> <span class="o">-</span> <span class="n">stock</span> <span class="o">-</span> <span class="nf">sum</span><span class="p">(</span><span class="n">arrivals</span><span class="p">.</span><span class="nf">values</span><span class="p">())</span>
        <span class="p">)</span>
        <span class="k">for</span> <span class="n">capacity</span><span class="p">,</span> <span class="n">lead_time</span> <span class="ow">in</span> <span class="p">[(</span><span class="n">capacity_a</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="n">backup</span><span class="p">,</span> <span class="mi">5</span><span class="p">)]:</span>
            <span class="n">order</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">needed</span><span class="p">,</span> <span class="n">capacity</span><span class="p">)</span>
            <span class="n">arrivals</span><span class="p">[</span><span class="n">day</span> <span class="o">+</span> <span class="n">lead_time</span><span class="p">]</span> <span class="o">+=</span> <span class="n">order</span>
            <span class="n">needed</span> <span class="o">-=</span> <span class="n">order</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">fill_rate</span><span class="sh">"</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="n">total_served</span> <span class="o">/</span> <span class="n">total_demand</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">ending_backlog</span><span class="sh">"</span><span class="p">:</span> <span class="n">backlog</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">Normal:</span><span class="sh">"</span><span class="p">,</span> <span class="nf">simulate</span><span class="p">())</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Kesinti:</span><span class="sh">"</span><span class="p">,</span> <span class="nf">simulate</span><span class="p">(</span><span class="n">crisis</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Alternatif:</span><span class="sh">"</span><span class="p">,</span> <span class="nf">simulate</span><span class="p">(</span><span class="n">crisis</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">backup</span><span class="o">=</span><span class="mi">60</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">arrivals</code>, gelecekte ulaşacak sevkiyatları tutar; siparişler anında ışınlanmaz. <code class="language-plaintext highlighter-rouge">backlog</code>, karşılanamayan talebi sonraki güne taşır. Aynı rastgele tohum, üç çalıştırmada aynı talep dizisini üretir: böylece farkları talep şansından değil, senaryodan kaynaklanan etkiler üzerinden karşılaştırabiliriz. Alternatif kapasite, bu örnekte bütün dönem boyunca kullanılabilir.</p>

<h2 id="hangi-senaryoları-karşılaştırmalı">Hangi senaryoları karşılaştırmalı?</h2>

<table>
  <thead>
    <tr>
      <th>Senaryo</th>
      <th>Değişiklik</th>
      <th>İncelenecek sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Normal operasyon</td>
      <td>Kesinti yok</td>
      <td>Referans performans</td>
    </tr>
    <tr>
      <td>Tedarikçi kesintisi</td>
      <td>Ana kapasite on gün sıfır</td>
      <td>Biriken siparişler</td>
    </tr>
    <tr>
      <td>Alternatif kaynak</td>
      <td>İkinci kapasite 25 yerine 60</td>
      <td>Hizmet düzeyindeki iyileşme</td>
    </tr>
    <tr>
      <td>Talep şoku</td>
      <td>Ortalama talebi artırma</td>
      <td>Stok tamponunun dayanıklılığı</td>
    </tr>
  </tbody>
</table>

<p>Kod ilk üç senaryoyu çalıştırır; talep şoku için talep parametresini değiştirebilirsiniz. Buradaki <code class="language-plaintext highlighter-rouge">fill_rate</code>, dönem içindeki toplam teslimatın toplam talebe oranıdır; zamanında teslimat oranı değildir. Ayrıca maliyet hesaplanmadığından, yüksek kapasitenin ekonomik olarak en iyi seçenek olduğu söylenemez.</p>

<h2 id="güvenilir-karar-için-sınırlarınızı-bilin">Güvenilir karar için sınırlarınızı bilin</h2>

<p>Tek koşu yerine çok sayıda tohumla deney yapın; her tohumda politikaları aynı talep dizisiyle karşılaştırın. Ortalama sonuçla birlikte kötü durum yüzdeliklerini de raporlayın. Taşıma gecikmeleri, ortak tedarikçi bağımlılıkları ve kapasite sözleşmeleri sonuçları değiştirebilir.</p>

<p>Bu kod, veri bağlantısı olmayan basitleştirilmiş bir senaryo simülatörüdür. Gerçek dijital ikize dönüşmesi için operasyonel verilerle beslenmesi, doğrulanması ve güncel tutulması gerekir. İyi bir ikiz kahin değildir: kriz toplantısına sezgilerin yanında ölçülebilir kanıt getirir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="dijital ikiz" /><category term="tedarik zinciri" /><category term="simülasyon" /><category term="python" /><category term="senaryo analizi" /><summary type="html"><![CDATA[Bir liman kapandığında, kritik tedarikçiniz üretimi durdurduğunda veya talep bir gecede yükseldiğinde ne yaparsınız? Gerçek tedarik zincirinde deneme yapmak pahalıdır; üstelik müşteriler deney faresi olmayı pek sevmez. Dijital ikiz, bu krizleri sanal ortamda prova etmenizi sağlar. Amaç geleceği kusursuz tahmin etmek değil, hangi kararların hangi koşullarda işe yaradığını anlamaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-ikiz-ile-94.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-ikiz-ile-94.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Ezberlemek Yerine Deneyimlemek: Sanal Gerçeklikle Karmaşık Kavramları Öğretmek</title><link href="https://program.sonsuz.us/posts/ezberlemek-yerine-deneyimlemek-sanal-gerceklikle-karmasik-kavramlari-ogretmek/" rel="alternate" type="text/html" title="Ezberlemek Yerine Deneyimlemek: Sanal Gerçeklikle Karmaşık Kavramları Öğretmek" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ezberlemek-yerine-deneyimlemek-sanal-gerceklikle-karmasik-kavramlari-ogretmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/ezberlemek-yerine-deneyimlemek-sanal-gerceklikle-karmasik-kavramlari-ogretmek/"><![CDATA[<p><img src="/img/ezberlemek-yerine-deneyimlemek-94.svg" alt="ezberlemek-yerine-deneyimlemek-94" /></p>

<p>Bir molekülün içinde yürümek, elektrik alanını görünür çizgilerle incelemek veya bir kuvvetin cismi nasıl hızlandırdığını bizzat denemek… Sanal gerçeklik, ders kitabındaki soyut kavramları etkileşimli deneylere dönüştürebilir. Ancak etkili eğitim, öğrenciye yalnızca gözlük taktırmak değildir; doğru soruları, anlaşılır modelleri ve anlamlı geri bildirimleri aynı ortamda buluşturmaktır. Kısacası hedef, gösterişli bir dijital lunapark değil, düşünmeyi destekleyen bir laboratuvardır.
``</p>
<h2 id="deneyim-neden-öğrenmeyi-destekler">Deneyim neden öğrenmeyi destekler?</h2>

<p>Sanal gerçekliğin temel avantajı, öğrencinin bir sistemi farklı açılardan gözlemleyebilmesi ve değişkenlerine müdahale edebilmesidir. Uzamsal ilişkiler, özellikle anatomi, mekanik ve geometrik dönüşümler gibi konularda önemlidir. Öğrenci yalnızca açıklamayı okumaz; nesneyi döndürür, parçaları karşılaştırır ve yaptığı değişikliğin sonucunu görür.</p>

<p>Bu yaklaşım, deneyimsel öğrenmenin döngüsüyle uyumludur: deneyim yaşa, gözlemini değerlendir, bir açıklama oluştur ve açıklamanı yeni deneyle sınayarak geliştir. Örneğin öğrenci önce ağır cismin daha yavaş hızlanacağını tahmin eder, ardından aynı kuvveti farklı kütlelere uygular. Öğretmenin görevi, deneyimin hangi kavramı gösterdiğini görünür kılmaktır.</p>

<p>Yine de sürükleyicilik, otomatik olarak öğrenme anlamına gelmez. Gereksiz animasyonlar, karmaşık menüler ve sürekli bildirimler bilişsel yükü artırabilir. Tasarımda temel soru şudur: Bu unsur kavramı açıklıyor mu, yoksa yalnızca dikkat mi çekiyor?</p>

<h2 id="bir-fizik-kavramını-yaşanabilir-hâle-getirmek">Bir fizik kavramını yaşanabilir hâle getirmek</h2>

<p>Newton’un ikinci yasasını ele alalım:</p>

\[F = ma, \qquad a = F / m\]

<p>Burada $F$ net kuvveti, $m$ kütleyi, $a$ ise ivmeyi ifade eder. Sanal laboratuvarda öğrenci kuvveti sabit tutup kütleyi artırdığında ivmenin azaldığını gözlemleyebilir. Böylece formül, rastgele harflerden oluşan bir şifre olmaktan çıkar.</p>

<p>Deneyi önce sadeleştirmek yararlıdır: yerçekimi, sürtünme ve çarpışmalar devre dışı bırakılır. Sabit kuvvet altında hız değişimi de şu ilişkiyle tahmin edilir:</p>

\[\Delta v = F\Delta t / m\]

<p>Bu sadeleştirmelerin öğrenciye açıkça belirtilmesi gerekir. Aksi hâlde simülasyonun kuralları, gerçek dünyanın eksiksiz kuralları sanılabilir. Temel ilişki anlaşıldıktan sonra sürtünme eklenerek modelin kapsamı genişletilebilir.</p>

<h2 id="hangi-araç-hangi-öğrenme-amacı">Hangi araç, hangi öğrenme amacı?</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü tarafı</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kitap ve çizim</td>
      <td>Hızlı, erişilebilir kavramsal anlatım</td>
      <td>Uzamsal ilişkiler zor canlandırılabilir</td>
    </tr>
    <tr>
      <td>Masaüstü 3B simülasyon</td>
      <td>Değişkenleri kontrollü değiştirme</td>
      <td>Etkileşim fare ve ekranla sınırlıdır</td>
    </tr>
    <tr>
      <td>Sanal gerçeklik</td>
      <td>Çevreyi ölçekli ve bedensel keşfetme</td>
      <td>Donanım, erişilebilirlik ve konfor önemlidir</td>
    </tr>
  </tbody>
</table>

<p>Bu seçenekler rakip olmak zorunda değildir. Kısa bir açıklama, masaüstü alıştırma ve VR deneyi aynı öğrenme akışında birbirini tamamlayabilir. Özellikle üç boyutlu inceleme gerekmiyorsa, daha basit bir araç daha iyi seçim olabilir.</p>

<h2 id="unity-ile-kontrollü-bir-deney-kurmak">Unity ile kontrollü bir deney kurmak</h2>

<p>Aşağıdaki Unity 6 örneği, bir cisme sürekli yatay kuvvet uygular. Öğrenci arayüzdeki kaydırıcılarla kuvveti ve kütleyi değiştirir; sıfırlama düğmesi deneyi başlangıç durumuna döndürür.</p>

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

<span class="p">[</span><span class="nf">RequireComponent</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">Rigidbody</span><span class="p">))]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">ForceExperiment</span> <span class="p">:</span> <span class="n">MonoBehaviour</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="n">Rigidbody</span> <span class="n">body</span><span class="p">;</span>
    <span class="k">private</span> <span class="n">Vector3</span> <span class="n">origin</span><span class="p">;</span>
    <span class="k">private</span> <span class="kt">float</span> <span class="n">forceN</span><span class="p">;</span>

    <span class="k">void</span> <span class="nf">Awake</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">body</span> <span class="p">=</span> <span class="n">GetComponent</span><span class="p">&lt;</span><span class="n">Rigidbody</span><span class="p">&gt;();</span>
        <span class="n">origin</span> <span class="p">=</span> <span class="n">body</span><span class="p">.</span><span class="n">position</span><span class="p">;</span>
        <span class="n">body</span><span class="p">.</span><span class="n">useGravity</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
        <span class="n">body</span><span class="p">.</span><span class="n">linearDamping</span> <span class="p">=</span> <span class="m">0f</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">SetForce</span><span class="p">(</span><span class="kt">float</span> <span class="k">value</span><span class="p">)</span> <span class="p">=&gt;</span>
        <span class="n">forceN</span> <span class="p">=</span> <span class="n">Mathf</span><span class="p">.</span><span class="nf">Clamp</span><span class="p">(</span><span class="k">value</span><span class="p">,</span> <span class="m">0f</span><span class="p">,</span> <span class="m">20f</span><span class="p">);</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">SetMass</span><span class="p">(</span><span class="kt">float</span> <span class="k">value</span><span class="p">)</span> <span class="p">=&gt;</span>
        <span class="n">body</span><span class="p">.</span><span class="n">mass</span> <span class="p">=</span> <span class="n">Mathf</span><span class="p">.</span><span class="nf">Clamp</span><span class="p">(</span><span class="k">value</span><span class="p">,</span> <span class="m">0.2f</span><span class="p">,</span> <span class="m">10f</span><span class="p">);</span>

    <span class="k">void</span> <span class="nf">FixedUpdate</span><span class="p">()</span> <span class="p">=&gt;</span>
        <span class="n">body</span><span class="p">.</span><span class="nf">AddForce</span><span class="p">(</span><span class="n">Vector3</span><span class="p">.</span><span class="n">right</span> <span class="p">*</span> <span class="n">forceN</span><span class="p">,</span> <span class="n">ForceMode</span><span class="p">.</span><span class="n">Force</span><span class="p">);</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">ResetTrial</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">forceN</span> <span class="p">=</span> <span class="m">0f</span><span class="p">;</span>
        <span class="n">body</span><span class="p">.</span><span class="n">position</span> <span class="p">=</span> <span class="n">origin</span><span class="p">;</span>
        <span class="n">body</span><span class="p">.</span><span class="n">linearVelocity</span> <span class="p">=</span> <span class="n">Vector3</span><span class="p">.</span><span class="n">zero</span><span class="p">;</span>
        <span class="n">body</span><span class="p">.</span><span class="n">angularVelocity</span> <span class="p">=</span> <span class="n">Vector3</span><span class="p">.</span><span class="n">zero</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">FixedUpdate</code>, kuvvet uygulamasını fizik güncellemeleriyle eşleştirir. <code class="language-plaintext highlighter-rouge">ForceMode.Force</code>, kütleyi hesaba katar; sınırlandırılmış değerler ise kontrolsüz denemeleri azaltır. XR Interaction Toolkit ile hazırlanmış etkileşimli arayüz, bu metotlara bağlanabilir. Çarpışmasız bir deney alanı kullanın; ölçümleri aynı süre boyunca alarak karşılaştırın.</p>

<h2 id="başarıyı-gözlüğün-içinde-değil-öğrenmede-ölçün">Başarıyı gözlüğün içinde değil, öğrenmede ölçün</h2>

<p>Öğrenciden deney öncesinde tahmin, sonrasında gerekçe isteyin. Ardından farklı kütle ve kuvvet değerleriyle yeni bir problem verin. Başarı ölçütü, nesneyi hareket ettirmek değil; ilişkiyi açıklamak ve yeni duruma aktarabilmektir. Deneyden hemen sonraki başarıyı, daha sonraki bir hatırlama göreviyle tamamlamak da yararlıdır.</p>

<p>Konfor için kısa oturumlar, mola seçenekleri ve ani kamera hareketlerinden kaçınma önemlidir. VR kullanamayan öğrenciler için masaüstü alternatif sunun. Hareket ve performans kayıtlarında yalnızca gerekli verileri toplayın.</p>

<p>En iyi sürükleyici eğitim ortamı, öğrenciyi etkileyen değil, ona açıklama kurduran ortamdır. Gözlük çıkarıldığında geriye yalnızca “çok havalıydı” değil, “neden böyle olduğunu artık biliyorum” kalmalıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="sanal gerçeklik" /><category term="deneyimsel öğrenme" /><category term="3b simülasyon" /><category term="unity" /><category term="eğitim teknolojileri" /><summary type="html"><![CDATA[Bir molekülün içinde yürümek, elektrik alanını görünür çizgilerle incelemek veya bir kuvvetin cismi nasıl hızlandırdığını bizzat denemek… Sanal gerçeklik, ders kitabındaki soyut kavramları etkileşimli deneylere dönüştürebilir. Ancak etkili eğitim, öğrenciye yalnızca gözlük taktırmak değildir; doğru soruları, anlaşılır modelleri ve anlamlı geri bildirimleri aynı ortamda buluşturmaktır. Kısacası hedef, gösterişli bir dijital lunapark değil, düşünmeyi destekleyen bir laboratuvardır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ezberlemek-yerine-deneyimlemek-94.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ezberlemek-yerine-deneyimlemek-94.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kamyonu Tetris Gibi Yüklemek: Teslimat Rotasına Göre Kombinatorik Optimizasyon</title><link href="https://program.sonsuz.us/posts/kamyonu-tetris-gibi-yuklemek-teslimat-rotasina-gore-kombinatorik-optimizasyon/" rel="alternate" type="text/html" title="Kamyonu Tetris Gibi Yüklemek: Teslimat Rotasına Göre Kombinatorik Optimizasyon" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kamyonu-tetris-gibi-yuklemek-teslimat-rotasina-gore-kombinatorik-optimizasyon</id><content type="html" xml:base="https://program.sonsuz.us/posts/kamyonu-tetris-gibi-yuklemek-teslimat-rotasina-gore-kombinatorik-optimizasyon/"><![CDATA[<p>Bir kamyonu doldurmak, boşluklara kutu yerleştirmekten ibaret değildir. İlk müşterinin paleti en dipte kalırsa, teslimat sırasında bütün yükü dışarı çıkarmak gerekebilir. İşte kombinatorik optimizasyon, bu lojistik Tetris oyununda devreye girer: Teslimat rotasını, yüklerin erişilebilirliğini ve ağırlık dağılımını birlikte değerlendirerek daha uygulanabilir bir yükleme planı üretir.</p>

<p>``</p>

<h2 id="temel-fikir-son-teslimatı-önce-yükle">Temel fikir: Son teslimatı önce yükle</h2>

<p>Kamyonun yalnızca arka kapısından boşaltıldığını, paletlerin tek sıra halinde durduğunu ve üst üste konmadığını düşünelim. Rota $A \rightarrow B \rightarrow C$ ise doğal yükleme sırası $C \rightarrow B \rightarrow A$ olur. Böylece ilk müşterinin paleti kapıya en yakın konumda bulunur.</p>

<p>Bu düzen, yazılımdaki <strong>LIFO</strong>, yani son giren ilk çıkar mantığına benzer. Ancak yan kapılar, farklı boyutlar, kırılgan ürünler ve aks yükleri devreye girdiğinde ters sıralama tek başına yeterli değildir. Artık yalnızca liste çevirmiyoruz; kısıtlar altında çözüm arıyoruz.</p>

<h2 id="problemi-matematiksel-olarak-kurmak">Problemi matematiksel olarak kurmak</h2>

<p>Her palet için teslimat sırasını $d_i$, ağırlığı $w_i$, yerleşim konumunu $p_i$ ile gösterelim. Eş boyutlu paletlerde konumlar $0,\ldots,n-1$ olsun; sıfır kamyonun en derin noktasını, son konum arka kapıyı temsil etsin.</p>

<p>Erişilebilirlik kuralımız:</p>

\[d_i&gt;d_j \Rightarrow p_i&lt;p_j\]

<p>Yani daha geç teslim edilecek palet daha içeride bulunmalıdır. Ayrıca her palet farklı bir konuma atanır ve toplam ağırlık kapasiteyi aşmaz:</p>

\[\operatorname{AllDifferent}(p_1,\ldots,p_n),\qquad \sum_i w_i\leq Q\]

<p>Aynı müşteriye giden paletler arasında ise serbestlik vardır. Optimizasyon bu serbestliği kullanarak ağırlık dağılımını iyileştirebilir. Basitleştirilmiş hedefimiz, yükün ağırlık merkezini kasanın geometrik merkezine yaklaştırmaktır:</p>

\[\min\left\vert \sum_i w_i(2p_i+1)-n\sum_i w_i\right\vert\]

<p>Buradaki $2p_i+1$, palet merkezinin ikiyle ölçeklenmiş koordinatıdır. Böylece kesirli konumlar yerine tamsayılarla çalışabiliriz. Gerçek araçta ideal merkez, aks konumları ve izin verilen aks yüklerine göre belirlenmelidir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Sınırlama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rotayı ters sıralama</td>
      <td>Hızlı ve anlaşılır</td>
      <td>Fiziksel kısıtları tek başına çözmez</td>
    </tr>
    <tr>
      <td>Kısıt programlama</td>
      <td>Erişim ve dengeyi birlikte modeller</td>
      <td>Modelleme ve çözüm süresi gerektirir</td>
    </tr>
    <tr>
      <td>Rota ve yüklemeyi birlikte çözme</td>
      <td>Daha geniş iyileştirme alanı sunar</td>
      <td>Arama uzayı büyür</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/kamyonu-tetris-gibi-36.svg" alt="kamyonu-tetris-gibi-36" /></p>

<h2 id="python-ile-küçük-bir-optimizasyon-modeli">Python ile küçük bir optimizasyon modeli</h2>

<p>Aşağıdaki örnek, OR-Tools CP-SAT kullanır. Kurulum için <code class="language-plaintext highlighter-rouge">pip install ortools</code> yeterlidir. Beş eş boy paletimiz vardır; teslimat numarası büyüdükçe müşteri rotada daha sonra ziyaret edilir. Toplam ağırlığın araç kapasitesine uygun olduğu önceden kontrol edilmiş kabul edilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">ortools.sat.python</span> <span class="kn">import</span> <span class="n">cp_model</span>

<span class="c1"># Kimlik, teslimat sırası, ağırlık (kg)
</span><span class="n">pallets</span> <span class="o">=</span> <span class="p">[(</span><span class="sh">'</span><span class="s">C1</span><span class="sh">'</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">120</span><span class="p">),</span> <span class="p">(</span><span class="sh">'</span><span class="s">C2</span><span class="sh">'</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">80</span><span class="p">),</span>
           <span class="p">(</span><span class="sh">'</span><span class="s">B1</span><span class="sh">'</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span> <span class="p">(</span><span class="sh">'</span><span class="s">A1</span><span class="sh">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">110</span><span class="p">),</span> <span class="p">(</span><span class="sh">'</span><span class="s">A2</span><span class="sh">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">90</span><span class="p">)]</span>
<span class="n">n</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">pallets</span><span class="p">)</span>
<span class="n">W</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">pallets</span><span class="p">)</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">cp_model</span><span class="p">.</span><span class="nc">CpModel</span><span class="p">()</span>
<span class="n">p</span> <span class="o">=</span> <span class="p">[</span><span class="n">model</span><span class="p">.</span><span class="nf">new_int_var</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="sa">f</span><span class="sh">'</span><span class="s">p</span><span class="si">{</span><span class="n">i</span><span class="si">}</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="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span>
<span class="n">model</span><span class="p">.</span><span class="nf">add_all_different</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>

<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">pallets</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">pallets</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="mi">1</span><span class="p">]:</span>
            <span class="n">model</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">p</span><span class="p">[</span><span class="n">j</span><span class="p">])</span>

<span class="n">moment</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">pallets</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">2</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">p</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
<span class="n">error</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">new_int_var</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">W</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="sh">'</span><span class="s">sapma</span><span class="sh">'</span><span class="p">)</span>
<span class="n">model</span><span class="p">.</span><span class="nf">add_abs_equality</span><span class="p">(</span><span class="n">error</span><span class="p">,</span> <span class="n">moment</span> <span class="o">-</span> <span class="n">n</span> <span class="o">*</span> <span class="n">W</span><span class="p">)</span>
<span class="n">model</span><span class="p">.</span><span class="nf">minimize</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>

<span class="n">solver</span> <span class="o">=</span> <span class="n">cp_model</span><span class="p">.</span><span class="nc">CpSolver</span><span class="p">()</span>
<span class="n">solver</span><span class="p">.</span><span class="n">parameters</span><span class="p">.</span><span class="n">max_time_in_seconds</span> <span class="o">=</span> <span class="mi">5</span>
<span class="n">status</span> <span class="o">=</span> <span class="n">solver</span><span class="p">.</span><span class="nf">solve</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="k">if</span> <span class="n">status</span> <span class="ow">in</span> <span class="p">(</span><span class="n">cp_model</span><span class="p">.</span><span class="n">OPTIMAL</span><span class="p">,</span> <span class="n">cp_model</span><span class="p">.</span><span class="n">FEASIBLE</span><span class="p">):</span>
    <span class="n">order</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">(</span><span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">i</span><span class="p">:</span> <span class="n">solver</span><span class="p">.</span><span class="nf">value</span><span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Yükleme:</span><span class="sh">'</span><span class="p">,</span> <span class="p">[</span><span class="n">pallets</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">order</span><span class="p">])</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Durum:</span><span class="sh">'</span><span class="p">,</span> <span class="n">solver</span><span class="p">.</span><span class="nf">status_name</span><span class="p">(</span><span class="n">status</span><span class="p">))</span>
</code></pre></div></div>

<p>Kod, önce paletlere benzersiz konumlar atar. Ardından teslimat önceliklerini zorunlu kılar ve merkez sapmasını küçültür. Çıktı, derinden kapıya doğru yerleşimi gösterir; bu basitleştirilmiş düzende aynı sıra yükleme sırasıdır. <code class="language-plaintext highlighter-rouge">FEASIBLE</code>, uygulanabilir çözüm bulunduğunu; <code class="language-plaintext highlighter-rouge">OPTIMAL</code>, en iyi çözümün kanıtlandığını belirtir. Süre sınırı, optimum garantisi değildir.</p>

<h2 id="gerçek-depoya-geçerken">Gerçek depoya geçerken</h2>

<p>Modelimiz erişilebilirliği kesin kısıt olarak ele aldığı için yeniden elleçlemeye izin vermez. Gerçekte bazı durumlarda bir paleti geçici olarak indirmek kabul edilebilir; bunun işçilik ve gecikme maliyeti amaç fonksiyonuna eklenebilir.</p>

<p>Üretim ortamında ayrıca şu ayrıntılar gerekir:</p>

<ul>
  <li><strong>Geometri:</strong> Palet boyutları, yönleri ve kapı açıklığı kontrol edilmelidir.</li>
  <li><strong>Güvenlik:</strong> Aks yükleri, yük sabitleme ve istif dayanımı zorunlu kısıtlardır.</li>
  <li><strong>Operasyon:</strong> Forklift erişimi ve depo hazırlama sırası hesaba katılmalıdır.</li>
</ul>

<p>Sonuç olarak sabit rota ve basit erişim koşullarında ters sıralama iyi bir başlangıçtır. Kombinatorik optimizasyonun asıl değeri, birden fazla uygulanabilir yerleşim arasından operasyonel açıdan daha iyi olanı seçmesidir. Hedef yalnızca kamyonu doldurmak değil, her durakta doğru yükü güvenle ve zahmetsizce indirebilmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kombinatorik optimizasyon" /><category term="lojistik" /><category term="yükleme planlama" /><category term="python" /><category term="or-tools" /><summary type="html"><![CDATA[Bir kamyonu doldurmak, boşluklara kutu yerleştirmekten ibaret değildir. İlk müşterinin paleti en dipte kalırsa, teslimat sırasında bütün yükü dışarı çıkarmak gerekebilir. İşte kombinatorik optimizasyon, bu lojistik Tetris oyununda devreye girer: Teslimat rotasını, yüklerin erişilebilirliğini ve ağırlık dağılımını birlikte değerlendirerek daha uygulanabilir bir yükleme planı üretir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kamyonu-tetris-gibi-36.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kamyonu-tetris-gibi-36.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">RAM Dedektifliği: Bellek Adli Analiziyle Gizli Zararlıların İzini Sürmek</title><link href="https://program.sonsuz.us/posts/ram-dedektifligi-bellek-adli-analiziyle-gizli-zararlilarin-izini-surmek/" rel="alternate" type="text/html" title="RAM Dedektifliği: Bellek Adli Analiziyle Gizli Zararlıların İzini Sürmek" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ram-dedektifligi-bellek-adli-analiziyle-gizli-zararlilarin-izini-surmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/ram-dedektifligi-bellek-adli-analiziyle-gizli-zararlilarin-izini-surmek/"><![CDATA[<p>Bir bilgisayarın diski arşiv dolabıysa, RAM’i masanın üzerinde açık duran dosyalardır. Çalışan süreçler, bağlantılar ve henüz diske yazılmamış veriler burada bulunabilir. Bellek adli analizi, bu geçici sahnenin fotoğrafını çekerek görünürde normal çalışan bir sistemin arkasındaki şüpheli faaliyetleri araştırır. Haydi dijital dedektif şapkamızı takalım; fakat büyüteç yerine bellek imajı kullanacağız!</p>

<p>``</p>

<h2 id="ram-neden-güçlü-bir-delil-kaynağıdır">RAM neden güçlü bir delil kaynağıdır?</h2>

<p>İşletim sistemi, süreçlerin kodunu ve verilerini sanal adres alanlarında tutar. Sayfa tabloları, bu sanal adreslerin fiziksel bellekteki karşılıklarını belirler. Analiz araçları yalnızca okunabilir metin aramaz; işletim sisteminin veri yapılarını yorumlayarak süreçleri, bellek bölgelerini ve diğer nesneleri yeniden oluşturur.</p>

<p>Bu ayrım önemlidir: Diskte bulunmayan bir zararlı bile çalışan kodunu bellekte tutmak zorundadır. Ancak bellek imajı her şeyi kapsamayabilir. Diske taşınmış sayfalar, eksik yakalama veya korumalı bölgeler görünürlüğü azaltabilir.</p>

<p>Bazı rootkit’ler süreç kayıtlarını işletim sisteminin normal listelerinden çıkarır. Bu yaklaşım, <strong>DKOM</strong>, yani çekirdek nesnelerinin doğrudan değiştirilmesi olarak bilinir. Dolayısıyla tek bir süreç listesine güvenmek, saklambaç oyununda yalnızca kapının arkasına bakmaya benzer.</p>

<h2 id="önce-fotoğrafı-çek-sonra-incele">Önce fotoğrafı çek, sonra incele</h2>

<p>İlk hedef, yetkili olduğunuz sistemden güvenilir bir bellek imajı almaktır. Windows ortamında WinPmem, Linux tarafında uygun çekirdek desteğiyle LiME kullanılabilir. Araç seçimi; işletim sistemi sürümüne, güvenlik özelliklerine ve kurumun prosedürlerine bağlıdır.</p>

<p>Mümkünse sistemi kapatmadan yakalama yapın; kapanış uçucu verileri kaybettirir. Bununla birlikte, yakalama aracı da RAM’i değiştirir. Bu nedenle kullanılan araç, sürüm, zaman ve yapılan işlemler kaydedilmelidir. Bellek toplama, tamamen iz bırakmayan bir işlem değildir.</p>

<p>İmajın SHA-256 özetini alın, özgün dosyayı koruyun ve çalışma kopyasını inceleyin. Hash, dosyanın sonradan değişip değişmediğini denetler; yakalamanın eksiksiz olduğunu kanıtlamaz. RAM parola ve kişisel veri içerebildiğinden erişimi sınırlandırın.</p>

<h2 id="volatility-3-ile-ilk-tarama">Volatility 3 ile ilk tarama</h2>

<p>Volatility 3, bellek imajından işletim sistemi yapılarını çıkaran bir analiz çatısıdır. Aşağıdaki Bash betiği, araç deposundaki <code class="language-plaintext highlighter-rouge">vol.py</code> dosyasının bulunduğu dizinde çalıştırılır. İlk argüman çalışma kopyasının yoludur; raporlar ayrı dosyalara yazılır.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/env bash</span>
<span class="nb">set</span> <span class="nt">-euo</span> pipefail
<span class="nv">image</span><span class="o">=</span><span class="s2">"</span><span class="k">${</span><span class="nv">1</span>:?Kullanım:<span class="p"> bash incele.sh bellek.raw</span><span class="k">}</span><span class="s2">"</span>
<span class="nv">out</span><span class="o">=</span><span class="s2">"rapor-</span><span class="si">$(</span><span class="nb">date</span> +%Y%m%d-%H%M%S<span class="si">)</span><span class="s2">"</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="s2">"</span><span class="nv">$out</span><span class="s2">"</span>
<span class="nb">sha256sum</span> <span class="s2">"</span><span class="nv">$image</span><span class="s2">"</span> <span class="o">&gt;</span> <span class="s2">"</span><span class="nv">$out</span><span class="s2">/imaj.sha256"</span>
<span class="nv">plugins</span><span class="o">=(</span>windows.info windows.pslist windows.psscan
         windows.pstree windows.cmdline windows.netscan<span class="o">)</span>
<span class="k">for </span>plugin <span class="k">in</span> <span class="s2">"</span><span class="k">${</span><span class="nv">plugins</span><span class="p">[@]</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do
  </span>python3 vol.py <span class="nt">-f</span> <span class="s2">"</span><span class="nv">$image</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$plugin</span><span class="s2">"</span> <span class="se">\</span>
    <span class="o">&gt;</span> <span class="s2">"</span><span class="nv">$out</span><span class="s2">/</span><span class="k">${</span><span class="nv">plugin</span><span class="k">}</span><span class="s2">.txt"</span>
<span class="k">done</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">windows.info</code>, imajın yorumlanmasına ilişkin temel bilgileri verir. <code class="language-plaintext highlighter-rouge">pslist</code> normal süreç listesini, <code class="language-plaintext highlighter-rouge">psscan</code> ise bellekteki süreç nesnelerini tarar. <code class="language-plaintext highlighter-rouge">pstree</code> ebeveyn ilişkilerini, <code class="language-plaintext highlighter-rouge">cmdline</code> komut satırlarını, <code class="language-plaintext highlighter-rouge">netscan</code> ağ nesnelerini gösterir. Betik hata durumunda durur; başarısız eklentinin çıktısını tamamlanmış rapor sanmayın.</p>

<p>Eklenti desteği, semboller ve imaj uyumluluğu sonucu etkiler. Kullanılabilir seçenekleri <code class="language-plaintext highlighter-rouge">python3 vol.py -h</code> ile kontrol edin. Boş çıktı her zaman “tehdit yok” anlamına gelmez.</p>

<h2 id="gizlenmeyi-çapraz-bulgularla-yakalamak">Gizlenmeyi çapraz bulgularla yakalamak</h2>

<p>Asıl güç, farklı kaynakları karşılaştırmaktır. Tek bir anormallik alarm zili olabilir; mahkeme kararı değildir.</p>

<table>
  <thead>
    <tr>
      <th>İnceleme</th>
      <th>Şüpheli bulgu</th>
      <th>Masum açıklama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">pslist</code> / <code class="language-plaintext highlighter-rouge">psscan</code></td>
      <td>Yalnızca taramada görünen süreç</td>
      <td>Sonlanmış süreç kalıntısı</td>
    </tr>
    <tr>
      <td>Süreç ağacı</td>
      <td>Beklenmeyen ebeveyn ilişkisi</td>
      <td>Başlatıcı veya hizmet davranışı</td>
    </tr>
    <tr>
      <td>Bellek izinleri</td>
      <td>Yazılabilir ve yürütülebilir bölge</td>
      <td>JIT derleyicisi</td>
    </tr>
    <tr>
      <td>Ağ bağlantıları</td>
      <td>Alışılmadık uzak adres</td>
      <td>Güncelleme veya bulut hizmeti</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/ram-dedektifligi-bellek-58.svg" alt="ram-dedektifligi-bellek-58" /></p>

<p>Kod enjeksiyonunda saldırgan, başka bir sürecin adres alanına kod yerleştirebilir. Malfind türü eklentiler şüpheli yürütülebilir bölgeleri işaretlemeye yardımcı olur; kesin zararlı sınıflandırması yapmaz. Ayrıca her enjeksiyon yazılabilir-yürütülebilir sayfa bırakmaz.</p>

<p>Örneğin bir tarayıcıdaki yürütülebilir özel bellek bölgesi tek başına şaşırtıcı değildir. Aynı bölgede şüpheli kod, beklenmedik komut satırı ve açıklanamayan bağlantı birlikte görülüyorsa inceleme önceliği yükselir.</p>

<h2 id="bulgudan-sonuca-kanıt-zincirini-kurmak">Bulgudan sonuca: Kanıt zincirini kurmak</h2>

<p>Örnek bir önceliklendirme puanı şöyle tanımlanabilir:</p>

\[S = 2H + 2I + N + P\]

<p>Burada $H$ süreç listesi tutarsızlığını, $I$ enjeksiyon belirtisini, $N$ şüpheli ağ etkinliğini, $P$ beklenmedik ebeveyn ilişkisini temsil eden ikili göstergelerdir. Ağırlıklar tamamen örnektir; bu puan bir olasılık hesabı veya doğrulanmış tespit modeli değildir.</p>

<p>Yüksek puanlı süreçlerde ilgili bellek bölgelerini dışa aktarın; dizgiler, kod yapısı ve bilinen göstergeler üzerinden inceleyin. Ardından bulguları disk dosyaları, olay günlükleri ve ağ kayıtlarıyla ilişkilendirin.</p>

<p>Raporda PID’leri, zamanları, kullanılan komutları, dosya özetlerini ve alternatif açıklamaları belirtin. Bellek adli analizinin başarısı, “gizli zararlıyı buldum!” demekten çok, başka bir analistin aynı kanıtlarla aynı sonuca ulaşabilmesidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="bellek adli analizi" /><category term="siber güvenlik" /><category term="ram" /><category term="volatility" /><category term="zararlı yazılım analizi" /><summary type="html"><![CDATA[Bir bilgisayarın diski arşiv dolabıysa, RAM’i masanın üzerinde açık duran dosyalardır. Çalışan süreçler, bağlantılar ve henüz diske yazılmamış veriler burada bulunabilir. Bellek adli analizi, bu geçici sahnenin fotoğrafını çekerek görünürde normal çalışan bir sistemin arkasındaki şüpheli faaliyetleri araştırır. Haydi dijital dedektif şapkamızı takalım; fakat büyüteç yerine bellek imajı kullanacağız!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ram-dedektifligi-bellek-58.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ram-dedektifligi-bellek-58.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Şebekenin Nabzını Tutan Kod: Dengeleme Algoritmaları ve Frekans Kontrolü</title><link href="https://program.sonsuz.us/posts/sebekenin-nabzini-tutan-kod-dengeleme-algoritmalari-ve-frekans-kontrolu/" rel="alternate" type="text/html" title="Şebekenin Nabzını Tutan Kod: Dengeleme Algoritmaları ve Frekans Kontrolü" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/sebekenin-nabzini-tutan-kod-dengeleme-algoritmalari-ve-frekans-kontrolu</id><content type="html" xml:base="https://program.sonsuz.us/posts/sebekenin-nabzini-tutan-kod-dengeleme-algoritmalari-ve-frekans-kontrolu/"><![CDATA[<p>Elektrik şebekesi, milyonlarca cihazın aynı orkestrada çaldığı dev bir sistemdir. Bir fabrika aniden devreye girdiğinde tüketim yükselir; bir santral durduğunda üretim düşer. Orkestra şefi ise tek bir bilgisayar değildir: sensörler, yerel kontrolörler ve merkezi optimizasyon yazılımları birlikte çalışarak şebekenin ritmini, yani frekansını korur.</p>

<p>``</p>

<h2 id="frekans-neden-değişir">Frekans neden değişir?</h2>

<p>Türkiye gibi 50 Hz kullanan senkron şebekelerde frekans, üretim ve tüketim dengesinin önemli bir göstergesidir. Tüketim üretimi aşarsa senkron makinelerin dönme enerjisi azalır ve frekans düşer. Üretim fazlaysa tersi gerçekleşir. Ancak frekansın normal görünmesi, her hattın güvenli yükte olduğu anlamına gelmez; bölgesel darboğazlar ayrıca izlenmelidir.</p>

<p>Basitleştirilmiş toplu sistem modeli şöyledir:</p>

\[\frac{2H}{f_0}\frac{d\Delta f}{dt}=\Delta p_g-\Delta p_l-D\Delta f\]

<p>Burada $H$ eşdeğer atalet sabiti, $f_0$ nominal frekans, $\Delta p_g$ üretim değişimi ve $\Delta p_l$ tüketim değişimidir. Güçler ortak bir bazda birim değer olarak ifade edilir; $D$, frekansa bağlı yük tepkisini temsil eder.</p>

<p>Bu denklem kritik bir gerçeği anlatır: Yazılım enerji yaratmaz. Ölçümden hareketle santralleri, bataryaları veya esnek yükleri yönlendirir. İlk anda fiziksel atalet zaman kazandırır; kontrol algoritmaları bu zamanı değerlendirmek zorundadır.</p>

<h2 id="tek-kontrolör-değil-katmanlı-savunma">Tek kontrolör değil, katmanlı savunma</h2>

<p>Şebeke dengelemesini, taşan lavaboya verilen tepkiler gibi düşünün: önce akışı yavaşlatırsınız, sonra seviyeyi düzeltirsiniz, ardından tesisatın çalışma planını değiştirirsiniz.</p>

<table>
  <thead>
    <tr>
      <th>Katman</th>
      <th>Tipik zaman ölçeği</th>
      <th>Temel görev</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Birincil kontrol</td>
      <td>Saniyeler</td>
      <td>Frekans sapmasını sınırlamak</td>
    </tr>
    <tr>
      <td>İkincil kontrol</td>
      <td>Onlarca saniye–dakikalar</td>
      <td>Frekansı ve bölgesel alışverişi hedefe döndürmek</td>
    </tr>
    <tr>
      <td>Üçüncül kontrol</td>
      <td>Dakikalar ve sonrası</td>
      <td>Rezervleri yenilemek, üretimi yeniden dağıtmak</td>
    </tr>
  </tbody>
</table>

<p>Bu süreler sistem tasarımına göre değişir. Birincil kontrolde yaygın yaklaşım <strong>droop</strong>, yani frekans düştükçe güç artırma davranışıdır:</p>

\[\Delta P=-K_f\Delta f\]

<p>Birincil kontrol genellikle frekansı tam hedefe getirmez. İkincil kontrol, kalıcı hatayı gidermek için integral etkisinden yararlanır. Birden fazla kontrol bölgesinde yalnızca frekansa bakılmaz; planlanan ve gerçekleşen bağlantı hattı alışverişleri de hesaba katılır. Bu birleşik göstergeye <strong>alan kontrol hatası</strong>, yani ACE denir.</p>

<h2 id="python-ile-sınırlı-bir-pi-kontrolör">Python ile sınırlı bir PI kontrolör</h2>

<p>Aşağıdaki örnek, tek bölgenin frekansını izleyen öğretici bir PI kontrolörüdür. Üretim komutunu hesaplarken güç kapasitesini ve rampa hızını sınırlar. Gerçek bir AGC sisteminin tüm haberleşme, rezerv paylaşımı ve güvenlik işlevlerini içermez.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">komut</span><span class="p">(</span><span class="n">frekans</span><span class="p">,</span> <span class="n">dt</span><span class="p">,</span> <span class="n">durum</span><span class="p">,</span> <span class="n">temel</span><span class="o">=</span><span class="mf">100.0</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">hata</span> <span class="o">=</span> <span class="mf">50.0</span> <span class="o">-</span> <span class="n">frekans</span>
    <span class="n">ham</span> <span class="o">=</span> <span class="n">temel</span> <span class="o">+</span> <span class="mf">40.0</span> <span class="o">*</span> <span class="n">hata</span> <span class="o">+</span> <span class="n">durum</span><span class="p">[</span><span class="sh">"</span><span class="s">integral</span><span class="sh">"</span><span class="p">]</span>

    <span class="c1"># Kapasite: 0–200 MW; rampa: 5 MW/s
</span>    <span class="n">hedef</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="nf">min</span><span class="p">(</span><span class="mf">200.0</span><span class="p">,</span> <span class="n">ham</span><span class="p">))</span>
    <span class="n">adim</span> <span class="o">=</span> <span class="mf">5.0</span> <span class="o">*</span> <span class="n">dt</span>
    <span class="n">guc</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">durum</span><span class="p">[</span><span class="sh">"</span><span class="s">guc</span><span class="sh">"</span><span class="p">]</span> <span class="o">-</span> <span class="n">adim</span><span class="p">,</span>
              <span class="nf">min</span><span class="p">(</span><span class="n">durum</span><span class="p">[</span><span class="sh">"</span><span class="s">guc</span><span class="sh">"</span><span class="p">]</span> <span class="o">+</span> <span class="n">adim</span><span class="p">,</span> <span class="n">hedef</span><span class="p">))</span>

    <span class="c1"># Anti-windup: uygulanamayan komutu geri besle
</span>    <span class="n">durum</span><span class="p">[</span><span class="sh">"</span><span class="s">integral</span><span class="sh">"</span><span class="p">]</span> <span class="o">+=</span> <span class="p">(</span>
        <span class="mf">8.0</span> <span class="o">*</span> <span class="n">hata</span> <span class="o">+</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">guc</span> <span class="o">-</span> <span class="n">ham</span><span class="p">)</span>
    <span class="p">)</span> <span class="o">*</span> <span class="n">dt</span>
    <span class="n">durum</span><span class="p">[</span><span class="sh">"</span><span class="s">guc</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">guc</span>
    <span class="k">return</span> <span class="n">guc</span>

 <span class="n">durum</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">integral</span><span class="sh">"</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">,</span> <span class="sh">"</span><span class="s">guc</span><span class="sh">"</span><span class="p">:</span> <span class="mf">100.0</span><span class="p">}</span>
</code></pre></div></div>

<p>Örneği çalıştırırken son satırın başındaki boşluğu kaldırarak başlangıç durumunu tanımlayın; ardından <code class="language-plaintext highlighter-rouge">komut(49.90, 1.0, durum)</code> çağrısını yapın. İlk komut 104 MW olur: 0,10 Hz eksik frekans, oransal terim üzerinden 4 MW artış ister.</p>

<p>Oransal kazancın birimi MW/Hz, integral kazancının birimi MW/(Hz·s) olarak düşünülebilir. İntegral terimi geçmiş hatayı biriktirir. <strong>Anti-windup</strong>, kapasite veya rampa sınırları yüzünden uygulanamayan isteğin integrali aşırı büyütmesini önler. Buradaki kazançlar örnektir; saha ayarı değildir.</p>

<h2 id="algoritmayı-sahaya-hazırlamak">Algoritmayı sahaya hazırlamak</h2>

<p>İyi bir dengeleme yazılımı yalnızca doğru formülü kullanmaz. Zaman damgalarını doğrular, bozuk ölçümleri ayıklar ve haberleşme gecikmelerini hesaba katar. Gürültüyü filtrelemek yararlıdır; fakat aşırı filtreleme müdahaleyi geciktirir. Hız ile güvenilirlik arasında gerçek bir mühendislik pazarlığı vardır.</p>

<p>Komutlar kaynakların fiziksel sınırlarına uymalıdır. Bataryanın doluluk oranı, türbinin rampa kapasitesi ve kullanılabilir rezerv miktarı sürekli izlenir. Ekonomik optimizasyon daha ucuz kaynakları seçebilir; ancak hat akış limitleri ve güvenlik koşulları maliyetten önce gelir.</p>

<p>Üretime geçmeden önce yük sıçramaları, kaynak kayıpları, ölçüm kesintileri ve gecikmeler simülasyonda denenmelidir. Başarı yalnızca frekansı düzeltmek değildir: bunu salınım üretmeden, rezervleri tüketmeden ve ekipmanı zorlamadan yapmaktır. Şebekenin iyi yazılımı, en gösterişli kod değil, en sakin çalışan koddur.</p>

<p><img src="/img/sebekenin-nabzini-tutan-97.svg" alt="sebekenin-nabzini-tutan-97" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="şebeke-dengeleme" /><category term="frekans-kontrolü" /><category term="kontrol-teorisi" /><category term="python" /><category term="enerji-sistemleri" /><summary type="html"><![CDATA[Elektrik şebekesi, milyonlarca cihazın aynı orkestrada çaldığı dev bir sistemdir. Bir fabrika aniden devreye girdiğinde tüketim yükselir; bir santral durduğunda üretim düşer. Orkestra şefi ise tek bir bilgisayar değildir: sensörler, yerel kontrolörler ve merkezi optimizasyon yazılımları birlikte çalışarak şebekenin ritmini, yani frekansını korur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/sebekenin-nabzini-tutan-97.png" /><media:content medium="image" url="https://program.sonsuz.us/img/sebekenin-nabzini-tutan-97.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Tedarik Zincirinin Kristal Küresi: Makine Öğrenmesiyle Tedarikçi Riskini Tahmin Etmek</title><link href="https://program.sonsuz.us/posts/tedarik-zincirinin-kristal-kuresi-makine-ogrenmesiyle-tedarikci-riskini-tahmin-etmek/" rel="alternate" type="text/html" title="Tedarik Zincirinin Kristal Küresi: Makine Öğrenmesiyle Tedarikçi Riskini Tahmin Etmek" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/tedarik-zincirinin-kristal-kuresi-makine-ogrenmesiyle-tedarikci-riskini-tahmin-etmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/tedarik-zincirinin-kristal-kuresi-makine-ogrenmesiyle-tedarikci-riskini-tahmin-etmek/"><![CDATA[<p>Bir fabrikanın üretimini bazen dev bir makine değil, zamanında gelmeyen küçücük bir vida durdurur. Tedarik zinciri risk analizi, bu sürprizleri azaltmayı hedefler. Makine öğrenmesi ise geçmiş teslimatları, kalite kayıtlarını ve operasyonel göstergeleri inceleyerek hangi tedarikçilerde sorun çıkabileceğine dair erken uyarılar üretir. Ancak bu kristal kürenin pili veri kalitesidir!</p>

<p>``</p>

<h2 id="önce-riski-ölçülebilir-hale-getirin">Önce riski ölçülebilir hale getirin</h2>

<p>“Tedarikçi riskli mi?” sorusu fazla geniştir. Bunun yerine hedefi şöyle tanımlayabiliriz: <strong>Önümüzdeki 90 gün içinde, planlanan teslimatlardan en az biri yedi günden fazla gecikecek mi?</strong> Böylece her tedarikçi ve değerlendirme tarihi için bir gözlem oluştururuz.</p>

<p>Bu olay gerçekleşirse etiket $y=1$, gerçekleşmezse $y=0$ olur. Gelecek dönemde teslimatı bulunmayan tedarikçiler bu hedef açısından ayrıca ele alınmalıdır; sipariş verilmemesi, güvenilirlik kanıtı değildir. Kalite problemi veya iflas gibi farklı riskler de farklı etiketlerle modellenmelidir. Tek bir puana her şeyi doldurmak, çorbaya tatlı eklemek gibidir.</p>

<h2 id="geçmişi-özelliklere-dönüştürmek">Geçmişi özelliklere dönüştürmek</h2>

<p>Model, ham sipariş listesinden çok anlamlı özetlerle çalışır. Örneğin son 180 gündeki gecikme oranı, teslimat sürelerinin standart sapması ve kapasite kullanımı davranış örüntülerini görünür kılar.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Yakalamaya çalıştığı sinyal</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Geçmiş gecikme oranı</td>
      <td>Teslimat güvenilirliği</td>
      <td>Az siparişte oynak olabilir</td>
    </tr>
    <tr>
      <td>Teslimat süresi sapması</td>
      <td>Operasyonel belirsizlik</td>
      <td>Ürün türüne göre değişebilir</td>
    </tr>
    <tr>
      <td>Kapasite kullanımı</td>
      <td>Aşırı yüklenme</td>
      <td>Güncelliği önemlidir</td>
    </tr>
    <tr>
      <td>Bölgesel kesintiler</td>
      <td>Dışsal maruziyet</td>
      <td>Sonradan öğrenilen bilgi kullanılmamalıdır</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/tedarik-zincirinin-kristal-38.svg" alt="tedarik-zincirinin-kristal-38" /></p>

<p>Temel kural şudur: Tahmin gününde bilinmeyen hiçbir bilgi modele giremez. Gelecekteki gecikmeden sonra güncellenen bir performans puanını kullanmak <strong>veri sızıntısıdır</strong>. Sonuçlar harika görünür, gerçek hayatta ise modelin sihri kaybolur.</p>

<h2 id="model-aslında-ne-öğrenir">Model aslında ne öğrenir?</h2>

<p>Lojistik regresyon, özellikleri ağırlıklı olarak birleştirir: $z=b+\sum_i w_i x_i$. Ardından $p=1/(1+e^{-z})$ dönüşümüyle sıfır ile bir arasında bir skor üretir. Bu skorun amaçlanan yorumu, tanımladığımız olayın gerçekleşme olasılığıdır.</p>

<p>Ağaç tabanlı gradyan artırma modelleri daha karmaşık etkileşimleri yakalayabilir. Örneğin yüksek kapasite kullanımı yalnızca belirli ürün gruplarında güçlü bir uyarı olabilir. Yine de basit, açıklanabilir bir başlangıç modeli karşılaştırma yapmak için değerlidir.</p>

<h2 id="python-ile-zaman-duyarlı-başlangıç">Python ile zaman duyarlı başlangıç</h2>

<p>Aşağıdaki örnek, önceden hazırlanmış haftalık özellik tablosunu kullanır. Eksikleri tamamlar, kategorileri kodlar ve geçmiş gözlemlerle lojistik regresyon eğitir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">from</span> <span class="n">sklearn.compose</span> <span class="kn">import</span> <span class="n">ColumnTransformer</span>
<span class="kn">from</span> <span class="n">sklearn.impute</span> <span class="kn">import</span> <span class="n">SimpleImputer</span>
<span class="kn">from</span> <span class="n">sklearn.linear_model</span> <span class="kn">import</span> <span class="n">LogisticRegression</span>
<span class="kn">from</span> <span class="n">sklearn.metrics</span> <span class="kn">import</span> <span class="n">average_precision_score</span><span class="p">,</span> <span class="n">recall_score</span>
<span class="kn">from</span> <span class="n">sklearn.pipeline</span> <span class="kn">import</span> <span class="n">make_pipeline</span>
<span class="kn">from</span> <span class="n">sklearn.preprocessing</span> <span class="kn">import</span> <span class="n">OneHotEncoder</span><span class="p">,</span> <span class="n">StandardScaler</span>

<span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">read_csv</span><span class="p">(</span><span class="sh">"</span><span class="s">tedarikci_haftalik.csv</span><span class="sh">"</span><span class="p">)</span>
<span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">tarih</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">to_datetime</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">tarih</span><span class="sh">"</span><span class="p">])</span>
<span class="n">cutoff</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">Timestamp</span><span class="p">(</span><span class="sh">"</span><span class="s">2025-01-01</span><span class="sh">"</span><span class="p">)</span>

<span class="n">num</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">gecikme_orani_180g</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">teslimat_std_180g</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">kapasite_kullanimi</span><span class="sh">"</span><span class="p">]</span>
<span class="n">cat</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">ulke</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">urun_grubu</span><span class="sh">"</span><span class="p">]</span>
<span class="n">features</span> <span class="o">=</span> <span class="n">num</span> <span class="o">+</span> <span class="n">cat</span>

<span class="n">train</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">tarih</span><span class="sh">"</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">cutoff</span> <span class="o">-</span> <span class="n">pd</span><span class="p">.</span><span class="nc">Timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">90</span><span class="p">)]</span>
<span class="n">test</span> <span class="o">=</span> <span class="n">df</span><span class="p">[(</span><span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">tarih</span><span class="sh">"</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">cutoff</span><span class="p">)</span> <span class="o">&amp;</span>
          <span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">tarih</span><span class="sh">"</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">cutoff</span> <span class="o">+</span> <span class="n">pd</span><span class="p">.</span><span class="nc">Timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">90</span><span class="p">))]</span>

<span class="n">prep</span> <span class="o">=</span> <span class="nc">ColumnTransformer</span><span class="p">([</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">num</span><span class="sh">"</span><span class="p">,</span> <span class="nf">make_pipeline</span><span class="p">(</span><span class="nc">SimpleImputer</span><span class="p">(</span><span class="n">strategy</span><span class="o">=</span><span class="sh">"</span><span class="s">median</span><span class="sh">"</span><span class="p">),</span>
                         <span class="nc">StandardScaler</span><span class="p">()),</span> <span class="n">num</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">cat</span><span class="sh">"</span><span class="p">,</span> <span class="nf">make_pipeline</span><span class="p">(</span><span class="nc">SimpleImputer</span><span class="p">(</span><span class="n">strategy</span><span class="o">=</span><span class="sh">"</span><span class="s">most_frequent</span><span class="sh">"</span><span class="p">),</span>
                         <span class="nc">OneHotEncoder</span><span class="p">(</span><span class="n">handle_unknown</span><span class="o">=</span><span class="sh">"</span><span class="s">ignore</span><span class="sh">"</span><span class="p">)),</span> <span class="n">cat</span><span class="p">)</span>
<span class="p">])</span>
<span class="n">model</span> <span class="o">=</span> <span class="nf">make_pipeline</span><span class="p">(</span><span class="n">prep</span><span class="p">,</span> <span class="nc">LogisticRegression</span><span class="p">(</span><span class="n">max_iter</span><span class="o">=</span><span class="mi">1000</span><span class="p">))</span>
<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">train</span><span class="p">[</span><span class="n">features</span><span class="p">],</span> <span class="n">train</span><span class="p">[</span><span class="sh">"</span><span class="s">gecikme_90g</span><span class="sh">"</span><span class="p">])</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict_proba</span><span class="p">(</span><span class="n">test</span><span class="p">[</span><span class="n">features</span><span class="p">])[:,</span> <span class="mi">1</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">AP:</span><span class="sh">"</span><span class="p">,</span> <span class="nf">average_precision_score</span><span class="p">(</span><span class="n">test</span><span class="p">[</span><span class="sh">"</span><span class="s">gecikme_90g</span><span class="sh">"</span><span class="p">],</span> <span class="n">p</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Recall:</span><span class="sh">"</span><span class="p">,</span> <span class="nf">recall_score</span><span class="p">(</span><span class="n">test</span><span class="p">[</span><span class="sh">"</span><span class="s">gecikme_90g</span><span class="sh">"</span><span class="p">],</span> <span class="n">p</span> <span class="o">&gt;=</span> <span class="mf">0.30</span><span class="p">))</span>
</code></pre></div></div>

<p>Aradaki 90 günlük boşluk, eğitim etiketlerinin test başlangıcından önce tamamlanmasını sağlar. Test etiketlerinin de değerlendirme anında olgunlaşmış olması gerekir. Ön işleme yalnızca eğitim verisinde öğrenilir. Buradaki 0,30 eşiği örnektir; gerçek eşik ayrı, zaman sıralı doğrulama döneminde seçilmelidir.</p>

<h2 id="başarı-doğruluktan-fazlasıdır">Başarı, doğruluktan fazlasıdır</h2>

<p>Riskli olaylar nadirse her tedarikçiye “sorunsuz” diyen model yüksek doğruluk gösterebilir. Bu yüzden ortalama kesinlik (AP), kesinlik ve duyarlılık birlikte incelenmelidir. Duyarlılık, gerçek risklerin ne kadarını yakaladığımızı; kesinlik, uyarıların ne kadarının isabetli olduğunu gösterir.</p>

<p>Olasılık kalibrasyonu da önemlidir: Yüzde 30 risk verilen gözlemlerin yaklaşık yüzde 30’unda olay gerçekleşmelidir. Basitleştirilmiş hata maliyetleriyle karar eşiği $t=C_{FP}/(C_{FP}+C_{FN})$ olabilir. Yanlış alarm maliyeti $C_{FP}$, kaçırılan risk maliyeti $C_{FN}$ büyüdükçe farklı kararlar doğurur. Bu hesap kalibre edilmiş olasılık gerektirir.</p>

<h2 id="tahmini-operasyona-bağlamak">Tahmini operasyona bağlamak</h2>

<p>Yüksek risk puanı otomatik tedarikçi eleme kararı olmamalıdır. Uyarı; ek denetim, güvenlik stoğu veya alternatif kaynak araştırmasını tetikleyebilir. Açıklamalar nedensellik kanıtı değildir; ülke gibi değişkenlerin haksız genellemelere dönüşmesi denetlenmelidir.</p>

<p>Son olarak veri kaymasını, uyarı isabetini ve gerçekleşen kayıpları düzenli izleyin. Modelin görevi geleceği kesin bilmek değil, satın alma ekibine daha erken ve daha ölçülü hareket etme fırsatı vermektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="makine öğrenmesi" /><category term="tedarik zinciri" /><category term="risk analizi" /><category term="python" /><category term="tahmine dayalı analitik" /><summary type="html"><![CDATA[Bir fabrikanın üretimini bazen dev bir makine değil, zamanında gelmeyen küçücük bir vida durdurur. Tedarik zinciri risk analizi, bu sürprizleri azaltmayı hedefler. Makine öğrenmesi ise geçmiş teslimatları, kalite kayıtlarını ve operasyonel göstergeleri inceleyerek hangi tedarikçilerde sorun çıkabileceğine dair erken uyarılar üretir. Ancak bu kristal kürenin pili veri kalitesidir!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/tedarik-zincirinin-kristal-38.png" /><media:content medium="image" url="https://program.sonsuz.us/img/tedarik-zincirinin-kristal-38.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Zaman Makinesini Takın: Sanal Gerçeklikle Kayıp Tarihi Yapıları Yeniden Keşfetmek</title><link href="https://program.sonsuz.us/posts/zaman-makinesini-takin-sanal-gerceklikle-kayip-tarihi-yapilari-yeniden-kesfetmek/" rel="alternate" type="text/html" title="Zaman Makinesini Takın: Sanal Gerçeklikle Kayıp Tarihi Yapıları Yeniden Keşfetmek" /><published>2026-11-09T00:00:00+00:00</published><updated>2026-11-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/zaman-makinesini-takin-sanal-gerceklikle-kayip-tarihi-yapilari-yeniden-kesfetmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/zaman-makinesini-takin-sanal-gerceklikle-kayip-tarihi-yapilari-yeniden-kesfetmek/"><![CDATA[<p><img src="/img/zaman-makinesini-takin-55.svg" alt="zaman-makinesini-takin-55" /></p>

<p>Yüzyıllar önce yıkılmış bir sarayın kapısından geçtiğinizi düşünün. Tavandaki bezemelere bakıyor, avludaki çeşmenin sesini duyuyorsunuz. Üstelik ortada gerçek bir saray yok! Sanal gerçeklik, kayıp tarihi yapıları dijital ortamda yeniden kurarak ziyaretçiyi pasif izleyiciden mekânın içinde dolaşan bir araştırmacıya dönüştürüyor. Peki bu zaman makinesinin kaputunun altında neler var?</p>

<p>``</p>

<h2 id="yeniden-inşa-mı-tarihsel-tahmin-mi">Yeniden inşa mı, tarihsel tahmin mi?</h2>

<p>Dijital rekonstrüksiyon, eski bir binanın güzel görünen kopyasını üretmekten fazlasıdır. Amaç, arkeolojik bulgular ve tarihsel belgeler üzerinden savunulabilir bir mekân modeli oluşturmaktır. Eski planlar, gravürler, fotoğraflar ve kazı raporları aynı bulmacanın farklı parçalarıdır.</p>

<p>Buradaki temel ayrım, <strong>kanıt ile yorum</strong> arasındadır. Bir duvarın konumu temelden biliniyor olabilir; çatının biçimi ise benzer dönem yapılarından çıkarılabilir. İkisini aynı kesinlikle sunmak, ziyaretçiye yanlış bir tarih anlatır. Bu nedenle modelin hangi bölümlerinin belgeli, hangilerinin varsayımsal olduğu açıkça gösterilmelidir.</p>

<h2 id="arşivden-üç-boyutlu-dünyaya">Arşivden üç boyutlu dünyaya</h2>

<p>Üretim hattını dört adımda düşünebiliriz:</p>

<ol>
  <li><strong>Veriyi toplayın:</strong> Belgelerin tarihini, kaynağını ve ölçeğini kaydedin. Farklı dönemlere ait planları yanlışlıkla birleştirmeyin.</li>
  <li><strong>Geometriyi oluşturun:</strong> Mevcut kalıntıları fotogrametri veya lazer taramayla ölçün. Fotogrametri, örtüşen fotoğraflardaki ortak noktalar üzerinden yüzey geometrisini hesaplar; kayıp bölümleri tek başına geri getiremez.</li>
  <li><strong>Eksikleri yorumlayın:</strong> Blender gibi araçlarda duvarları, çatıyı ve bezemeleri modelleyin. Arkeolog ve mimarlık tarihçisiyle alternatifleri değerlendirin.</li>
  <li><strong>Deneyime aktarın:</strong> Modeli glTF gibi bir biçimde dışa aktararak Unity, Unreal Engine veya WebXR tabanlı bir uygulamada kullanın.</li>
</ol>

<p>Modeli tek bir dosya olarak değil, kaynaklarla bağlantılı parçalardan oluşan bir veri kümesi olarak saklamak sonraki düzeltmeleri kolaylaştırır.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Güçlü tarafı</th>
      <th>Temel sınırı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Fotogrametri</td>
      <td>Gerçek yüzey ayrıntıları</td>
      <td>Mevcut görüntülere bağımlıdır</td>
    </tr>
    <tr>
      <td>Lazer tarama</td>
      <td>Hassas geometrik ölçüm</td>
      <td>Yok olmuş bölümleri ölçemez</td>
    </tr>
    <tr>
      <td>Belge tabanlı modelleme</td>
      <td>Kayıp mekânları tamamlar</td>
      <td>Yorum ve belirsizlik içerir</td>
    </tr>
  </tbody>
</table>

<h2 id="gerçekçi-görünmek-yetmez-akıcı-çalışmalı">Gerçekçi görünmek yetmez, akıcı çalışmalı</h2>

<p>VR başlığı, baş hareketlerine gecikmeden tepki vermelidir. Hedef yenileme hızı $f$ ise yaklaşık kare süresi bütçesi şöyle hesaplanır:</p>

\[t_{\text{kare}} = \frac{1000}{f}\ \text{ms}\]

<p>Örneğin $90$ Hz için yaklaşık $11{,}1$ milisaniye vardır. Bu bütçeye sahne çizimi ve uygulama işlemleri sığmalıdır. Çok ayrıntılı taş süslemeler bu nedenle yakında yüksek, uzakta düşük ayrıntıyla gösterilebilir. Buna LOD denir. Önceden hesaplanmış aydınlatma ve sıkıştırılmış dokular da performansa yardım eder. Ölçüm yapmadan optimizasyon ise biraz gözler kapalı restorasyona benzer!</p>

<h2 id="webxr-ile-küçük-bir-prototip">WebXR ile küçük bir prototip</h2>

<p>Aşağıdaki örnek, Three.js kullanarak tarihi yapı modelini yükler ve desteklenen cihazlarda VR oturumunu başlatan düğmeyi ekler. Kod, <code class="language-plaintext highlighter-rouge">three</code> paketinin kurulu olduğu Vite benzeri bir projede çalıştırılabilir. Modelin metre ölçeğinde ve başlangıç noktasının ziyaret edilebilir bir alanda olması beklenir.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="o">*</span> <span class="nx">as</span> <span class="nx">THREE</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">three</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">VRButton</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">three/addons/webxr/VRButton.js</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">GLTFLoader</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">three/addons/loaders/GLTFLoader.js</span><span class="dl">'</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">scene</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Scene</span><span class="p">();</span>
<span class="nx">scene</span><span class="p">.</span><span class="nx">background</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">Color</span><span class="p">(</span><span class="mh">0xdce5ed</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">camera</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">PerspectiveCamera</span><span class="p">(</span>
  <span class="mi">70</span><span class="p">,</span> <span class="nx">innerWidth</span> <span class="o">/</span> <span class="nx">innerHeight</span><span class="p">,</span> <span class="mf">0.1</span><span class="p">,</span> <span class="mi">500</span>
<span class="p">);</span>
<span class="nx">camera</span><span class="p">.</span><span class="nx">position</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">1.6</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>

<span class="kd">const</span> <span class="nx">renderer</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">WebGLRenderer</span><span class="p">({</span> <span class="na">antialias</span><span class="p">:</span> <span class="kc">true</span> <span class="p">});</span>
<span class="nx">renderer</span><span class="p">.</span><span class="nf">setSize</span><span class="p">(</span><span class="nx">innerWidth</span><span class="p">,</span> <span class="nx">innerHeight</span><span class="p">);</span>
<span class="nx">renderer</span><span class="p">.</span><span class="nx">xr</span><span class="p">.</span><span class="nx">enabled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">renderer</span><span class="p">.</span><span class="nx">domElement</span><span class="p">);</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">VRButton</span><span class="p">.</span><span class="nf">createButton</span><span class="p">(</span><span class="nx">renderer</span><span class="p">));</span>

<span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nc">HemisphereLight</span><span class="p">(</span><span class="mh">0xffffff</span><span class="p">,</span> <span class="mh">0x665544</span><span class="p">,</span> <span class="mi">2</span><span class="p">));</span>
<span class="kd">const</span> <span class="nx">loader</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">GLTFLoader</span><span class="p">();</span>
<span class="nx">loader</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="dl">'</span><span class="s1">/models/kayip-yapi.glb</span><span class="dl">'</span><span class="p">,</span> <span class="p">({</span> <span class="na">scene</span><span class="p">:</span> <span class="nx">model</span> <span class="p">})</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">scene</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">model</span><span class="p">);</span>
<span class="p">},</span> <span class="kc">undefined</span><span class="p">,</span> <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">);</span>

<span class="nx">renderer</span><span class="p">.</span><span class="nf">setAnimationLoop</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">renderer</span><span class="p">.</span><span class="nf">render</span><span class="p">(</span><span class="nx">scene</span><span class="p">,</span> <span class="nx">camera</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">GLTFLoader</code> geometriyi ve malzemeleri getirir; <code class="language-plaintext highlighter-rouge">setAnimationLoop</code> çizimi WebXR oturumuyla uyumlu yürütür. Bu, tamamlanmış bir müze uygulaması değil, başlangıç iskeletidir. Yürüme, ışınlanma, çarpışma denetimi ve bilgi panoları ayrıca geliştirilmelidir. WebXR için HTTPS veya yerel geliştirmede localhost gerekir; cihaz ve tarayıcı desteği de kontrol edilmelidir.</p>

<h2 id="ziyaretçiye-yalnızca-duvar-göstermeyin">Ziyaretçiye yalnızca duvar göstermeyin</h2>

<p>İyi deneyim, mimariyi günlük yaşamla ilişkilendirir: Bu avluyu kim kullanıyordu? Bu kapı neden dardı? Mekânsal ses ve kısa anlatılar, ayrıntıların anlamını görünür kılar.</p>

<p>Belirsiz bölümler açılıp kapatılabilen renk katmanlarıyla gösterilebilir. Böylece ziyaretçi hem yapıyı gezer hem de araştırmanın nasıl ilerlediğini görür. Renkler, açıklama metinleriyle desteklenmelidir; herkes renkleri aynı biçimde ayırt etmez.</p>

<p>Konfor için ışınlanarak hareket, oturarak kullanım ve kısa oturum seçenekleri sunun. Başlığa erişemeyenler için ekran üzerinden gezinme de sağlayın. Başarı, yalnızca etkileyici grafikler değildir: Ziyaretçinin tarihsel bilgiyi doğru anlaması, rahat hissetmesi ve merakla yeni sorular sormasıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="sanal gerçeklik" /><category term="dijital miras" /><category term="webxr" /><category term="fotogrametri" /><category term="three.js" /><category term="üç boyutlu modelleme" /><summary type="html"><![CDATA[Yüzyıllar önce yıkılmış bir sarayın kapısından geçtiğinizi düşünün. Tavandaki bezemelere bakıyor, avludaki çeşmenin sesini duyuyorsunuz. Üstelik ortada gerçek bir saray yok! Sanal gerçeklik, kayıp tarihi yapıları dijital ortamda yeniden kurarak ziyaretçiyi pasif izleyiciden mekânın içinde dolaşan bir araştırmacıya dönüştürüyor. Peki bu zaman makinesinin kaputunun altında neler var?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/zaman-makinesini-takin-55.png" /><media:content medium="image" url="https://program.sonsuz.us/img/zaman-makinesini-takin-55.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>