<?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-01T18: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">Akıllı Hastanelerde Kaynak Optimizasyonu: Yatak, Personel ve Ekipmanı Aynı Ritme Sokmak</title><link href="https://program.sonsuz.us/posts/akilli-hastanelerde-kaynak-optimizasyonu-yatak-personel-ve-ekipmani-ayni-ritme-sokmak/" rel="alternate" type="text/html" title="Akıllı Hastanelerde Kaynak Optimizasyonu: Yatak, Personel ve Ekipmanı Aynı Ritme Sokmak" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-hastanelerde-kaynak-optimizasyonu-yatak-personel-ve-ekipmani-ayni-ritme-sokmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-hastanelerde-kaynak-optimizasyonu-yatak-personel-ve-ekipmani-ayni-ritme-sokmak/"><![CDATA[<p>Bir hastaneyi yalnızca boş yatakları sayarak yönetmek, restoranı sadece masa sayısına göre işletmeye benzer: Masalar hazırdır ama aşçı yoksa işler karışır! Hastanelerde de yatak, personel ve ekipman birlikte planlanmalıdır. Akıllı yönetim sistemleri, bu kaynaklar arasındaki bağı algoritmalarla görünür kılar; amaç yalnızca doluluğu artırmak değil, güvenli hizmeti doğru zamanda sunmaktır.</p>

<p><img src="/img/akilli-hastanelerde-kaynak-93.svg" alt="akilli-hastanelerde-kaynak-93" /></p>

<p>``</p>

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

<p>Kaynak optimizasyonunun temelinde <strong>yöneylem araştırması</strong> bulunur. Sistem; karar değişkenlerini, kısıtları ve hedefleri matematiksel bir modele dönüştürür. Örneğin karar, uygun bir elektif yatışın belirli bir güne planlanıp planlanmayacağı olabilir. Kısıtlar ise kullanılabilir yatakları, bakım saatlerini ve cihaz kapasitesini temsil eder.</p>

<p>Ancak kaynaklar birbirinin yerine geçmez. Boş bir servis yatağı, yoğun bakım yatağının alternatifi değildir; müsait bir çalışan da her uzmanlık görevini üstlenemez. Bu nedenle toplam kapasiteden önce <strong>klinik uygunluk ve yetkinlik</strong> kontrol edilir.</p>

<table>
  <thead>
    <tr>
      <th>Kaynak</th>
      <th>Basit kapasite ölçüsü</th>
      <th>Kritik ek kısıt</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yatak</td>
      <td>Kullanılabilir yatak sayısı</td>
      <td>Servis türü, izolasyon, temizlik</td>
    </tr>
    <tr>
      <td>Personel</td>
      <td>Vardiyadaki çalışma saati</td>
      <td>Yetkinlik, dinlenme, bakım oranı</td>
    </tr>
    <tr>
      <td>Ekipman</td>
      <td>Kullanılabilir cihaz saati</td>
      <td>Cihaz türü, bakım, eşzamanlı kullanım</td>
    </tr>
  </tbody>
</table>

<h2 id="matematik-kapasiteyi-aşmadan-değer-üretmek">Matematik: Kapasiteyi aşmadan değer üretmek</h2>

<p>Basitleştirilmiş bir günlük modelde $x_i$, aday yatış planlanırsa $1$, aksi durumda $0$ olsun. $u_i$ klinik ekipçe belirlenen öncelik puanını, $a_{ir}$ adayın kaynak tüketimini, $C_r$ ise kapasiteyi göstersin:</p>

\[\max \sum_i u_i x_i\]

\[\sum_i a_{ir}x_i \leq C_r \quad \forall r, \qquad x_i\in\{0,1\}\]

<p>Bu yapı, çok boyutlu sırt çantası problemine benzer: Çantamız hastane, bölmeleri ise kaynaklardır. Gerçek modeller ayrıca bekleme süresi, fazla mesai ve iş yükü dengesizliğini ele alır. Bu hedeflerin ağırlıkları gelişigüzel seçilmemeli; klinik yönetişimle belirlenmelidir. Güvenlik şartları, birkaç puan uğruna esnetilen tercihler değil, zorunlu kısıtlardır.</p>

<h2 id="hangi-algoritma-hangi-iş-için">Hangi algoritma, hangi iş için?</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü tarafı</th>
      <th>Sınırı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Karma tamsayılı programlama</td>
      <td>Doğrusal maliyet ve kapasite modelleri</td>
      <td>Büyük modellerde çözüm süresi</td>
    </tr>
    <tr>
      <td>CP-SAT</td>
      <td>Mantıksal kurallar ve ayrık çizelgeleme</td>
      <td>Doğru modelleme gerektirir</td>
    </tr>
    <tr>
      <td>Açgözlü sezgiseller</td>
      <td>Hızlı başlangıç planı</td>
      <td>En iyi çözümü garanti etmez</td>
    </tr>
  </tbody>
</table>

<p>Önceliği en yüksek hastayı sırayla yerleştirmek caziptir. Fakat bu hasta kıt bir cihazın çoğunu kullanıyorsa, başka uygun kombinasyonlar toplamda daha iyi sonuç verebilir. Optimizasyonun farkı, kararları tek tek değil, birbirleriyle etkileşimleri içinde değerlendirmesidir.</p>

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

<p>Aşağıdaki örnek, OR-Tools üzerinden günlük elektif yatış adaylarını seçer. Kurulum için <code class="language-plaintext highlighter-rouge">pip install ortools</code> kullanılabilir. Her satır sırasıyla yatak, hemşirelik saati, cihaz saati ve öncelik puanı içerir; değerler tamamen örnektir.</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="n">adaylar</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">9</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
           <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">)]</span>
<span class="n">kapasiteler</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mi">16</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">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">model</span><span class="p">.</span><span class="nf">new_bool_var</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">aday_</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="nf">len</span><span class="p">(</span><span class="n">adaylar</span><span class="p">))]</span>

<span class="k">for</span> <span class="n">r</span><span class="p">,</span> <span class="n">kapasite</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">kapasiteler</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="nf">sum</span><span class="p">(</span><span class="n">adaylar</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">r</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</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="nf">len</span><span class="p">(</span><span class="n">adaylar</span><span class="p">)))</span> <span class="o">&lt;=</span> <span class="n">kapasite</span><span class="p">)</span>

<span class="n">model</span><span class="p">.</span><span class="nf">maximize</span><span class="p">(</span><span class="nf">sum</span><span class="p">(</span><span class="n">adaylar</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</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="nf">len</span><span class="p">(</span><span class="n">adaylar</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="mf">2.0</span>
<span class="n">sonuc</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">sonuc</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="nf">print</span><span class="p">([</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">adaylar</span><span class="p">))</span> <span class="k">if</span> <span class="n">solver</span><span class="p">.</span><span class="nf">value</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">])])</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Süre içinde uygulanabilir plan bulunamadı.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu veride en iyi seçim, sıfırdan başlayan indekslerle <code class="language-plaintext highlighter-rouge">[0, 1, 3]</code> olur. Toplam tüketim üç yatak, 22 hemşirelik saati ve 14 cihaz saatidir. <code class="language-plaintext highlighter-rouge">FEASIBLE</code>, uygulanabilir çözüm bulunduğunu söyler; <code class="language-plaintext highlighter-rouge">OPTIMAL</code> ise en iyiliğin kanıtlandığını belirtir.</p>

<p>Önemli ayrıntı: Günlük saat toplamı, aynı anda yeterli personel veya cihaz bulunduğunu garanti etmez. Gerçek çizelgelemede zaman aralıkları tanımlanır; <code class="language-plaintext highlighter-rouge">NoOverlap</code> tek cihazdaki çakışmaları, <code class="language-plaintext highlighter-rouge">Cumulative</code> eşzamanlı kapasite kullanımını sınırlar. Personel yetkinliği ve hasta bakım oranları ayrıca modellenir.</p>

<h2 id="planı-yaşayan-bir-sisteme-dönüştürmek">Planı yaşayan bir sisteme dönüştürmek</h2>

<p>Acil başvurular, geciken taburculuklar ve cihaz arızaları planı değiştirir. Bu yüzden tahminler senaryolarla sınanmalı, beklenmedik talep için kapasite tamponu bırakılmalı ve plan düzenli güncellenmelidir. Her değişimde tüm vardiyayı dağıtmak yerine, mevcut plana sadakati gözeten cezalar kullanılabilir.</p>

<p>Başarıyı yalnızca yatak doluluğuyla ölçmeyin: Bekleme süresi, fazla mesai, iptaller, bakım güvenliği ve çalışan yükü birlikte izlenmelidir. Sistem karar desteğidir; acil bakımın reddini otomatikleştirmez. Klinik onay, insan müdahalesi, erişim kontrolü ve denetlenebilir karar kayıtları korunmalıdır. İyi algoritma, hastaneyi bir elektronik tabloya değil, daha uyumlu çalışan bir ekibe dönüştürür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kaynak optimizasyonu" /><category term="hastane yönetimi" /><category term="algoritmalar" /><category term="yöneylem araştırması" /><category term="python" /><category term="çizelgeleme" /><summary type="html"><![CDATA[Bir hastaneyi yalnızca boş yatakları sayarak yönetmek, restoranı sadece masa sayısına göre işletmeye benzer: Masalar hazırdır ama aşçı yoksa işler karışır! Hastanelerde de yatak, personel ve ekipman birlikte planlanmalıdır. Akıllı yönetim sistemleri, bu kaynaklar arasındaki bağı algoritmalarla görünür kılar; amaç yalnızca doluluğu artırmak değil, güvenli hizmeti doğru zamanda sunmaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-hastanelerde-kaynak-93.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-hastanelerde-kaynak-93.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Battle Royale’ın Yükselişi: Daralan Harita Oyuncuları Nasıl Yönlendiriyor?</title><link href="https://program.sonsuz.us/posts/battle-royalein-yukselisi-daralan-harita-oyunculari-nasil-yonlendiriyor/" rel="alternate" type="text/html" title="Battle Royale’ın Yükselişi: Daralan Harita Oyuncuları Nasıl Yönlendiriyor?" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/battle-royalein-yukselisi-daralan-harita-oyunculari-nasil-yonlendiriyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/battle-royalein-yukselisi-daralan-harita-oyunculari-nasil-yonlendiriyor/"><![CDATA[<p><img src="/img/battle-royalein-yukselisi-82.svg" alt="battle-royalein-yukselisi-82" /></p>

<p>Battle Royale oyunlarında asıl rakibiniz bazen karşınızdaki oyuncu değil, arkanızdan yaklaşan çemberdir. Daralan harita, devasa bir oyun alanını giderek küçülen bir karar kutusuna dönüştürür. Oyuncuya görünmez bir yönetmen gibi seslenir: “Eşyalarını topladın mı? Güzel, şimdi biraz hareket zamanı!” Peki bu basit geometrik fikir, davranışları nasıl bu kadar güçlü biçimde şekillendiriyor?</p>

<p>``</p>

<h2 id="büyük-haritadan-ortak-finale">Büyük Haritadan Ortak Finale</h2>

<p>PUBG ve Fortnite gibi oyunların popülerleşmesini yalnızca daralan haritaya bağlamak eksik olur. Erişilebilirlik, sosyal oyun deneyimi ve yayın kültürü de önemli etkenlerdir. Ancak güvenli bölge, bu türün seyir zevkini ve maç ritmini taşıyan temel mekaniklerden biridir.</p>

<p>Başlangıçta oyuncular farklı noktalara dağılır; keşif, ekipman toplama ve çatışmadan kaçınma mümkündür. Bölge daraldıkça bu özgürlük azalır. Böylece birbirinden bağımsız küçük hikâyeler, ortak bir final sahnesinde birleşir. Tasarımcı her karşılaşmayı senaryolaştırmadan gerilimi artırabilir.</p>

<h2 id="teorik-temel-alan-azalınca-ne-değişir">Teorik Temel: Alan Azalınca Ne Değişir?</h2>

<p>Dairesel güvenli bölgenin alanı $A(t)=πr(t)^2$ olarak ifade edilir. Burada $r(t)$, zamana bağlı yarıçaptır. Yarıçap yarıya indiğinde alan dörtte bire düşer. Yani harita küçülmesi, oyuncunun gözünde göründüğünden daha sert bir alan kaybı yaratabilir.</p>

<p>Yaşayan oyuncu sayısını $N(t)$ ile gösterirsek ortalama yoğunluk $ρ(t)=N(t)/A(t)$ olur. Oyuncu sayısı azalmasına rağmen alan daha hızlı küçülüyorsa yoğunluk artabilir. Bunun karşılaşma ihtimalini yükseltmesi beklenir; fakat oyuncular eşit dağılmadığından bu, kesin bir çatışma formülü değildir. Binalar, görüş çizgileri ve yüksek araziler sonucu değiştirir.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Baskın karar</th>
      <th>Başlıca risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Geniş güvenli alan</td>
      <td>Ekipman toplamak</td>
      <td>Hazırlıksız yakalanmak</td>
    </tr>
    <tr>
      <td>Daralma yaklaşırken</td>
      <td>Rotayı planlamak</td>
      <td>Geç hareket etmek</td>
    </tr>
    <tr>
      <td>Küçük güvenli alan</td>
      <td>Konum üstünlüğü kurmak</td>
      <td>Kolay fark edilmek</td>
    </tr>
    <tr>
      <td>Son çember</td>
      <td>Zamanlama ve siper seçmek</td>
      <td>Kaçış seçeneğinin kalmaması</td>
    </tr>
  </tbody>
</table>

<h2 id="çemberin-davranışsal-etkisi">Çemberin Davranışsal Etkisi</h2>

<p>Daralan bölge, hareketsiz kalmanın maliyetini yükseltir. Normalde güvenli görünen bir bina, birkaç dakika sonra tehlikeli bir tuzağa dönüşebilir. Böylece oyun, oyuncuyu zorunlu hareket ile taktiksel bekleme arasında seçim yapmaya iter.</p>

<p>Erken hareket eden oyuncu uygun siper bulabilir; fakat merkezde daha fazla yönden tehdit alabilir. Kenarda kalan oyuncu arkasını daha kolay kontrol edebilir, ancak sonraki bölgeye uzun yol katetmek zorunda kalabilir. Dolayısıyla “merkeze koşmak” her durumda en iyi strateji değildir.</p>

<p>Bu yapı karar teorisiyle okunabilir: Oyuncu beklenen kazancı, hasar riskini ve zaman maliyetini birlikte değerlendirir. Çember bu maliyetleri sürekli değiştirerek aynı taktiğin bütün maç boyunca işe yaramasını engeller.</p>

<h2 id="küçük-bir-python-davranış-modeli">Küçük Bir Python Davranış Modeli</h2>

<p>Aşağıdaki örnek, botun olası hedef noktalarını yolculuk süresi, bölge dışında kalma ve görünürlük riski üzerinden puanlar. Düşük puanlı hedef tercih edilir:</p>

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


<span class="k">def</span> <span class="nf">radius_at</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="mi">250</span><span class="p">,</span> <span class="n">delay</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span> <span class="n">duration</span><span class="o">=</span><span class="mi">120</span><span class="p">):</span>
    <span class="n">progress</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="p">(</span><span class="n">t</span> <span class="o">-</span> <span class="n">delay</span><span class="p">)</span> <span class="o">/</span> <span class="n">duration</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">start</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="n">progress</span>


<span class="k">def</span> <span class="nf">choose_target</span><span class="p">(</span><span class="n">position</span><span class="p">,</span> <span class="n">candidates</span><span class="p">,</span> <span class="n">center</span><span class="p">,</span> <span class="n">radius</span><span class="p">,</span> <span class="n">speed</span><span class="o">=</span><span class="mi">6</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">cost</span><span class="p">(</span><span class="n">point</span><span class="p">):</span>
        <span class="n">travel_time</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">dist</span><span class="p">(</span><span class="n">position</span><span class="p">,</span> <span class="n">point</span><span class="p">)</span> <span class="o">/</span> <span class="n">speed</span>
        <span class="n">outside</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">math</span><span class="p">.</span><span class="nf">dist</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="n">center</span><span class="p">)</span> <span class="o">-</span> <span class="n">radius</span><span class="p">)</span>
        <span class="n">exposure</span> <span class="o">=</span> <span class="n">candidates</span><span class="p">[</span><span class="n">point</span><span class="p">]</span>
        <span class="k">return</span> <span class="n">travel_time</span> <span class="o">+</span> <span class="mf">0.4</span> <span class="o">*</span> <span class="n">outside</span> <span class="o">+</span> <span class="mi">12</span> <span class="o">*</span> <span class="n">exposure</span>

    <span class="k">return</span> <span class="nf">min</span><span class="p">(</span><span class="n">candidates</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">cost</span><span class="p">)</span>


<span class="n">candidates</span> <span class="o">=</span> <span class="p">{(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">):</span> <span class="mf">0.8</span><span class="p">,</span> <span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">50</span><span class="p">):</span> <span class="mf">0.2</span><span class="p">,</span> <span class="p">(</span><span class="mi">600</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span> <span class="mf">0.1</span><span class="p">}</span>
<span class="n">future_radius</span> <span class="o">=</span> <span class="nf">radius_at</span><span class="p">(</span><span class="mi">120</span><span class="p">)</span>
<span class="n">target</span> <span class="o">=</span> <span class="nf">choose_target</span><span class="p">((</span><span class="mi">500</span><span class="p">,</span> <span class="mi">100</span><span class="p">),</span> <span class="n">candidates</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">future_radius</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">radius_at</code>, bekleme süresinden sonra yarıçapı doğrusal küçültür. <code class="language-plaintext highlighter-rouge">choose_target</code> ise adayların görünürlük değerlerini kullanır; bu değerler burada elle verilmiştir. Katsayılar farklı maliyetleri ortak bir tercih puanına dönüştüren tasarım ağırlıklarıdır, fiziksel hasar hesabı değildir.</p>

<p>Bu model engelleri ve hareket sırasında değişen çemberi hesaba katmaz. Gerçek bir oyunda yol bulma, takım bilgisi ve bölge hasarı da değerlendirmeye eklenmelidir.</p>

<h2 id="i̇yi-baskı-kötü-sürprizden-nasıl-ayrılır">İyi Baskı, Kötü Sürprizden Nasıl Ayrılır?</h2>

<p>Başarılı bir çember sistemi oyuncuyu sıkıştırırken karar verecek zaman bırakır. Belirsizlik heyecan yaratır; okunamayan veya ulaşılması aşırı zor bölgeler ise sonucu beceriden çok şansa bağlayabilir.</p>

<p>Geliştiriciler daralma hızını, uyarı süresini ve dışarıda alınan hasarı birlikte ayarlamalıdır. Çok yavaş çember temposuzluk, çok hızlı çember ise sürekli koşu üretir. Telemetride bölge kaynaklı ölümler, hareketin başlama zamanı ve çatışmaların konumu izlenebilir; ancak bu ölçümler oyuncu deneyimiyle birlikte yorumlanmalıdır.</p>

<p>Sonuçta daralan harita yalnızca oyuncuları yaklaştırmaz: Kaynakların değerini, risk algısını ve zamanın önemini değiştirir. Battle Royale’ın güçlü numarası budur; basit bir geometrik kural, her maçta farklı bir stratejik hikâye üretir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="battle royale" /><category term="oyun tasarımı" /><category term="oyuncu davranışı" /><category term="python" /><category term="oyun mekaniği" /><category term="karar teorisi" /><summary type="html"><![CDATA[Battle Royale oyunlarında asıl rakibiniz bazen karşınızdaki oyuncu değil, arkanızdan yaklaşan çemberdir. Daralan harita, devasa bir oyun alanını giderek küçülen bir karar kutusuna dönüştürür. Oyuncuya görünmez bir yönetmen gibi seslenir: “Eşyalarını topladın mı? Güzel, şimdi biraz hareket zamanı!” Peki bu basit geometrik fikir, davranışları nasıl bu kadar güçlü biçimde şekillendiriyor?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/battle-royalein-yukselisi-82.png" /><media:content medium="image" url="https://program.sonsuz.us/img/battle-royalein-yukselisi-82.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Standart Kütüphanesi: Matematik, Metin ve Bellek İçin Hazır Araçlar</title><link href="https://program.sonsuz.us/posts/c-standart-kutuphanesi-matematik-metin-ve-bellek-icin-hazir-araclar/" rel="alternate" type="text/html" title="C Standart Kütüphanesi: Matematik, Metin ve Bellek İçin Hazır Araçlar" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-standart-kutuphanesi-matematik-metin-ve-bellek-icin-hazir-araclar</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-standart-kutuphanesi-matematik-metin-ve-bellek-icin-hazir-araclar/"><![CDATA[<p>C programlamak, her vidayı kendiniz üretmeniz gerektiği anlamına gelmez. Standart kütüphane; matematik hesaplarından metin karşılaştırmaya, dinamik bellek ayırmadan hata bildirimine kadar hazır araçlar sunar. Ancak bu araçları güvenli kullanmak için yalnızca isimlerini değil, çalışma sözleşmelerini de bilmek gerekir.</p>

<p>``</p>

<h2 id="önce-mantık-başlık-dosyası-ne-sağlar">Önce mantık: Başlık dosyası ne sağlar?</h2>

<p><code class="language-plaintext highlighter-rouge">#include</code>, ilgili başlık dosyasını programa dahil eder. Başlıklar, fonksiyon bildirimlerini, türleri ve gerekli makroları sunar; fonksiyonların gerçek uygulamaları ise kütüphanelerdedir. Derleyici çağrının türlerini denetler, bağlayıcı gerekli uygulamaları birleştirir. Kısacası başlık dosyası menüdür; yemeği hazırlayan mutfak, kütüphanenin uygulamasıdır. Bu ayrım, derleme hatasıyla bağlama hatasını birbirinden ayırmayı kolaylaştırır.</p>

<table>
  <thead>
    <tr>
      <th>Başlık</th>
      <th>Temel görev</th>
      <th>Örnek fonksiyonlar</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;math.h&gt;</code></td>
      <td>Matematiksel hesaplama</td>
      <td><code class="language-plaintext highlighter-rouge">sqrt</code>, <code class="language-plaintext highlighter-rouge">pow</code>, <code class="language-plaintext highlighter-rouge">sin</code>, <code class="language-plaintext highlighter-rouge">fabs</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;string.h&gt;</code></td>
      <td>Metin ve bayt işlemleri</td>
      <td><code class="language-plaintext highlighter-rouge">strlen</code>, <code class="language-plaintext highlighter-rouge">strcmp</code>, <code class="language-plaintext highlighter-rouge">memcpy</code>, <code class="language-plaintext highlighter-rouge">memmove</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;stdlib.h&gt;</code></td>
      <td>Bellek ve dönüşüm</td>
      <td><code class="language-plaintext highlighter-rouge">malloc</code>, <code class="language-plaintext highlighter-rouge">calloc</code>, <code class="language-plaintext highlighter-rouge">realloc</code>, <code class="language-plaintext highlighter-rouge">free</code>, <code class="language-plaintext highlighter-rouge">strtol</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;ctype.h&gt;</code></td>
      <td>Karakter sınıflandırma</td>
      <td><code class="language-plaintext highlighter-rouge">isdigit</code>, <code class="language-plaintext highlighter-rouge">isspace</code>, <code class="language-plaintext highlighter-rouge">toupper</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;stdio.h&gt;</code></td>
      <td>Girdi ve çıktı</td>
      <td><code class="language-plaintext highlighter-rouge">printf</code>, <code class="language-plaintext highlighter-rouge">fgets</code>, <code class="language-plaintext highlighter-rouge">fputs</code></td>
    </tr>
  </tbody>
</table>

<h2 id="matematik-formülü-yeniden-icat-etmeyin">Matematik: Formülü yeniden icat etmeyin</h2>

<p><code class="language-plaintext highlighter-rouge">&lt;math.h&gt;</code>, kayan noktalı hesaplamalar için temel araç kutusudur. <code class="language-plaintext highlighter-rouge">sqrt(x)</code> karekök, <code class="language-plaintext highlighter-rouge">pow(x, y)</code> üs, <code class="language-plaintext highlighter-rouge">fabs(x)</code> mutlak değer hesaplar. Tamsayılar için kullanılan <code class="language-plaintext highlighter-rouge">abs</code> ise <code class="language-plaintext highlighter-rouge">&lt;stdlib.h&gt;</code> içindedir. <code class="language-plaintext highlighter-rouge">floor</code>, <code class="language-plaintext highlighter-rouge">ceil</code> ve <code class="language-plaintext highlighter-rouge">round</code> farklı yuvarlama kurallarına sahiptir; özellikle negatif sayılarda birbirlerinin yerine kullanılmamalıdır.</p>

<p>İki noktanın uzaklığı şu bağıntıyla bulunur:</p>

\[d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}\]

<p>Bu hesap için <code class="language-plaintext highlighter-rouge">hypot(dx, dy)</code>, ara işlemlerde taşma ve aşırı küçülme riskini azaltabilir. Trigonometrik fonksiyonlar radyan bekler. Ayrıca kayan nokta sonuçları yaklaşık olabilir; matematikteki eşitlik, bilgisayarda her zaman birebir eşitlik değildir. Negatif bir değerin karekökü gibi tanım dışı girdilerin hata davranışı da kontrol edilmelidir.</p>

<h2 id="metin-işleme-sonlandırıcı-karakteri-unutmayın">Metin işleme: Sonlandırıcı karakteri unutmayın</h2>

<p>C dizeleri, <code class="language-plaintext highlighter-rouge">\0</code> karakteriyle biten karakter dizileridir. <code class="language-plaintext highlighter-rouge">strlen</code>, bu sonlandırıcıdan önceki baytların sayısını verir; UTF-8 metindeki görünen harf sayısını garanti etmez. <code class="language-plaintext highlighter-rouge">strcmp</code> eşitlik durumunda sıfır döndürür, diğer durumlarda işaretine bakılır; yalnızca <code class="language-plaintext highlighter-rouge">-1</code> veya <code class="language-plaintext highlighter-rouge">1</code> döneceğini varsaymayın.</p>

<p><code class="language-plaintext highlighter-rouge">memcpy</code>, belirtilen sayıda baytı kopyalar ve bölgeler örtüşmemelidir. Örtüşme ihtimali varsa <code class="language-plaintext highlighter-rouge">memmove</code> kullanılır. <code class="language-plaintext highlighter-rouge">strncpy</code> ise her durumda sonlandırıcı eklemez; adı güvenlik garantisi değildir. Dize fonksiyonları sonlandırıcıya, bellek fonksiyonları verilen uzunluğa güvenir.</p>

<p><code class="language-plaintext highlighter-rouge">&lt;ctype.h&gt;</code> fonksiyonlarına sıradan bir <code class="language-plaintext highlighter-rouge">char</code> verirken <code class="language-plaintext highlighter-rouge">(unsigned char)</code> dönüşümü yapmak önemlidir; negatif karakter değerleri tanımsız davranışa neden olabilir.</p>

<h2 id="bellek-yönetimi-alanın-sahibi-sizsiniz">Bellek yönetimi: Alanın sahibi sizsiniz</h2>

<p>Dinamik bellek, boyutu çalışma sırasında belirlenen verileri saklamaya yarar. Ayırdığınız alanın kapasitesi ile içine koyduğunuz verinin uzunluğu farklı kavramlardır. Dize için gereken kapasite genellikle $uzunluk + 1$ bayttır; fazladan bayt sonlandırıcı içindir. Ayırma işleminin başarısız olabileceğini de unutmamak gerekir.</p>

<table>
  <thead>
    <tr>
      <th>Fonksiyon</th>
      <th>Davranış</th>
      <th>Dikkat noktası</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">malloc</code></td>
      <td>Alan ayırır</td>
      <td>İçerik başlatılmaz</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">calloc</code></td>
      <td>Alan ayırıp baytları sıfırlar</td>
      <td>Eleman sayısı ve boyut verilir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">realloc</code></td>
      <td>Alanın boyutunu değiştirir</td>
      <td>Adres değişebilir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">free</code></td>
      <td>Alanı serbest bırakır</td>
      <td>Aynı alan iki kez bırakılmaz</td>
    </tr>
  </tbody>
</table>

<h2 id="birlikte-çalışan-küçük-bir-örnek">Birlikte çalışan küçük bir örnek</h2>

<p>Aşağıdaki program bir metni dinamik belleğe kopyalar, kapasitesini artırır ve matematik fonksiyonlarıyla sonuç üretir. Böylece üç araç kutusunu aynı yerde görürüz.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;math.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">kaynak</span> <span class="o">=</span> <span class="s">"Merhaba C"</span><span class="p">;</span>
    <span class="kt">size_t</span> <span class="n">kapasite</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">kaynak</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
    <span class="kt">char</span> <span class="o">*</span><span class="n">metin</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">kapasite</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">metin</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">EXIT_FAILURE</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">memcpy</span><span class="p">(</span><span class="n">metin</span><span class="p">,</span> <span class="n">kaynak</span><span class="p">,</span> <span class="n">kapasite</span><span class="p">);</span>
    <span class="kt">char</span> <span class="o">*</span><span class="n">yeni</span> <span class="o">=</span> <span class="n">realloc</span><span class="p">(</span><span class="n">metin</span><span class="p">,</span> <span class="n">kapasite</span> <span class="o">+</span> <span class="mi">16</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">yeni</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">free</span><span class="p">(</span><span class="n">metin</span><span class="p">);</span>
        <span class="k">return</span> <span class="n">EXIT_FAILURE</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">metin</span> <span class="o">=</span> <span class="n">yeni</span><span class="p">;</span>
    <span class="n">strcat</span><span class="p">(</span><span class="n">metin</span><span class="p">,</span> <span class="s">"!"</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"%s | Uzunluk: %zu | Kok: %.2f | Us: %.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>
           <span class="n">metin</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">metin</span><span class="p">),</span> <span class="n">sqrt</span><span class="p">(</span><span class="mi">9</span><span class="p">.</span><span class="mi">0</span><span class="p">),</span> <span class="n">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">.</span><span class="mi">0</span><span class="p">));</span>
    <span class="n">free</span><span class="p">(</span><span class="n">metin</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">EXIT_SUCCESS</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">memcpy</code>, sonlandırıcı dahil bütün diziyi kopyalar. Eklenen kapasite, ünlem ve sonlandırıcı için yeterlidir. <code class="language-plaintext highlighter-rouge">realloc</code> sonucu geçici işaretçide tutulur: Sıfırdan büyük boyutla yapılan çağrı başarısız olursa eski alan geçerliliğini korur. Sonucu doğrudan <code class="language-plaintext highlighter-rouge">metin</code> üzerine yazmak, eski adresi kaybettirebilir.</p>

<p>Birçok Unix benzeri ortamda matematik kütüphanesini ayrıca bağlamak gerekir:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cc <span class="nt">-std</span><span class="o">=</span>c11 <span class="nt">-Wall</span> <span class="nt">-Wextra</span> main.c <span class="nt">-o</span> uygulama <span class="nt">-lm</span>
</code></pre></div></div>

<p>Son kontrol listesi basittir: Kapasiteleri doğrulayın, dönüş değerlerini inceleyin ve ayırdığınız belleği bırakın. Genel boyut hesaplarında <code class="language-plaintext highlighter-rouge">n * sizeof(eleman)</code> çarpımının taşmasını önceden denetleyin. Serbest bırakılmış belleğe erişmeyin. Hazır fonksiyonlar işi hızlandırır; güvenli kullanım ise hâlâ programcının sorumluluğudur.</p>

<p><img src="/img/c-standart-kutuphanesi-29.svg" alt="c-standart-kutuphanesi-29" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="standart kütüphane" /><category term="matematik" /><category term="metin işleme" /><category term="bellek yönetimi" /><summary type="html"><![CDATA[C programlamak, her vidayı kendiniz üretmeniz gerektiği anlamına gelmez. Standart kütüphane; matematik hesaplarından metin karşılaştırmaya, dinamik bellek ayırmadan hata bildirimine kadar hazır araçlar sunar. Ancak bu araçları güvenli kullanmak için yalnızca isimlerini değil, çalışma sözleşmelerini de bilmek gerekir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-standart-kutuphanesi-29.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-standart-kutuphanesi-29.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++’ta Otomatik Kopyalama: Derleyicinin İyi Niyeti Ne Zaman Tehlikeli Olur?</title><link href="https://program.sonsuz.us/posts/cta-otomatik-kopyalama-derleyicinin-iyi-niyeti-ne-zaman-tehlikeli-olur/" rel="alternate" type="text/html" title="C++’ta Otomatik Kopyalama: Derleyicinin İyi Niyeti Ne Zaman Tehlikeli Olur?" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/cta-otomatik-kopyalama-derleyicinin-iyi-niyeti-ne-zaman-tehlikeli-olur</id><content type="html" xml:base="https://program.sonsuz.us/posts/cta-otomatik-kopyalama-derleyicinin-iyi-niyeti-ne-zaman-tehlikeli-olur/"><![CDATA[<p>C++ derleyicisi, yazmadığınız bazı özel üye fonksiyonlarını sizin yerinize hazırlayabilir. Kopyalama kurucusu ve kopyalama atama operatörü de bu yardımcılar arasındadır. Ancak derleyici, bir işaretçinin yalnızca adres tuttuğunu bilir; o adresin arkasındaki belleğin kime ait olduğunu bilmez. Tehlike tam da bu sahiplik belirsizliğinde başlar.</p>

<p>``</p>

<h2 id="önce-mantık-nesne-mi-kaynak-mı-kopyalanıyor">Önce mantık: Nesne mi, kaynak mı kopyalanıyor?</h2>

<p>Kopyalama kurucusu yeni bir nesneyi mevcut nesneden oluşturur: <code class="language-plaintext highlighter-rouge">Buffer b = a;</code>. Kopyalama atama operatörü ise zaten yaşayan bir nesnenin değerini değiştirir: <code class="language-plaintext highlighter-rouge">b = a;</code>. İkinci durumda hedefin önceki kaynakları da hesaba katılmalıdır.</p>

<p>Derleyicinin ürettiği işlemler, taban sınıfları ve üyeleri kendi kopyalama davranışlarıyla kopyalar. Bu nedenle otomatik kopyalama, her zaman “sığ kopyalama” demek değildir: <code class="language-plaintext highlighter-rouge">std::vector</code> kendi elemanlarını kopyalar. Fakat ham işaretçi üyesinde yalnızca adres kopyalanır:</p>

\[p_a = p_b\]

<p>İki farklı nesne artık aynı kaynağa bakmaktadır. Bunun doğru olup olmadığı, sınıfın sahiplik sözleşmesine bağlıdır.</p>

<table>
  <thead>
    <tr>
      <th>Üye türü</th>
      <th>Otomatik kopyalamanın sonucu</th>
      <th>Değerlendirme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">int</code>, <code class="language-plaintext highlighter-rouge">double</code></td>
      <td>Değer kopyalanır</td>
      <td>Genellikle güvenli</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::string</code>, <code class="language-plaintext highlighter-rouge">std::vector</code></td>
      <td>Üyenin değer semantiği uygulanır</td>
      <td>Genellikle güvenli</td>
    </tr>
    <tr>
      <td>Sahip olan ham işaretçi</td>
      <td>Aynı adres paylaşılır</td>
      <td>Tehlikeli</td>
    </tr>
    <tr>
      <td>Sahip olmayan ham işaretçi</td>
      <td>Aynı nesneye bakılır</td>
      <td>Yaşam süresi kontrol edilmeli</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::unique_ptr</code></td>
      <td>Kopyalama işlemi silinir</td>
      <td>Hatalı kopyalama engellenir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/cta-otomatik-kopyalama-49.svg" alt="cta-otomatik-kopyalama-49" /></p>

<h2 id="tehlikenin-klasik-hali-i̇ki-sahip-tek-bellek">Tehlikenin klasik hali: İki sahip, tek bellek</h2>

<p>Aşağıdaki sınıf belleği kendisi ayırıyor ve yok edilirken serbest bırakıyor. Dolayısıyla işaretçinin sahibi olduğunu varsayıyor:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">BadBuffer</span> <span class="p">{</span>
    <span class="kt">char</span><span class="o">*</span> <span class="n">data</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">char</span><span class="p">[</span><span class="mi">16</span><span class="p">];</span>

    <span class="o">~</span><span class="n">BadBuffer</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">delete</span><span class="p">[]</span> <span class="n">data</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="nf">example</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">BadBuffer</span> <span class="n">a</span><span class="p">;</span>
    <span class="n">BadBuffer</span> <span class="n">b</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span> <span class="c1">// Yalnızca adres kopyalanır.</span>

    <span class="n">BadBuffer</span> <span class="n">c</span><span class="p">;</span>
    <span class="n">c</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span>          <span class="c1">// c'nin eski belleği kaybolur.</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Kopyalama kurucusu burada iki nesneye aynı adresi verir. Nesneler yok edildiğinde aynı bellek tekrar serbest bırakılmaya çalışılır: <strong>tanımsız davranış</strong> ortaya çıkar. Program çökebilir, sessizce bozulabilir veya şimdilik çalışıyor gibi görünebilir.</p>

<p>Atama daha da sinsidir: <code class="language-plaintext highlighter-rouge">c</code> kendi eski adresini kaybettiği için bellek sızıntısı oluşturur; ardından ortak adres nedeniyle aynı serbest bırakma sorununa katılır. Derleyici fotokopi çekmiştir, ama herkes belgenin tek sahibi olduğunu sanmaktadır!</p>

<p>Benzer riskler dosya tanıtıcıları ve işletim sistemi tutamaçlarında da vardır. Ayrıca başka bir üyeye işaret eden iç işaretçiler kopyalandığında, yeni nesne yanlışlıkla eski nesnenin içine bakabilir. Sorun yalnızca <code class="language-plaintext highlighter-rouge">delete</code> değildir; sınıfın değişmezlerinin bozulmasıdır.</p>

<h2 id="elle-çözüm-derin-kopyalama-ve-güvenli-atama">Elle çözüm: Derin kopyalama ve güvenli atama</h2>

<p>Bağımsız sahiplik istiyorsak, yeni bellek ayırıp içeriği kopyalamalıyız. Atamada ise mevcut kaynağı koruyarak ilerlemek önemlidir. Aşağıdaki <strong>copy-and-swap</strong> yaklaşımı, önce kopyayı hazırlar; başarılı olursa kaynakları değiş tokuş eder:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstddef&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;utility&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">Buffer</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">size_</span><span class="p">;</span>
    <span class="kt">char</span><span class="o">*</span> <span class="n">data_</span><span class="p">;</span>

<span class="nl">public:</span>
    <span class="k">explicit</span> <span class="n">Buffer</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">size</span><span class="p">)</span>
        <span class="o">:</span> <span class="n">size_</span><span class="p">(</span><span class="n">size</span><span class="p">),</span> <span class="n">data_</span><span class="p">(</span><span class="k">new</span> <span class="kt">char</span><span class="p">[</span><span class="n">size</span><span class="p">]{})</span> <span class="p">{}</span>

    <span class="n">Buffer</span><span class="p">(</span><span class="k">const</span> <span class="n">Buffer</span><span class="o">&amp;</span> <span class="n">other</span><span class="p">)</span>
        <span class="o">:</span> <span class="n">Buffer</span><span class="p">(</span><span class="n">other</span><span class="p">.</span><span class="n">size_</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">copy_n</span><span class="p">(</span><span class="n">other</span><span class="p">.</span><span class="n">data_</span><span class="p">,</span> <span class="n">size_</span><span class="p">,</span> <span class="n">data_</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="o">~</span><span class="n">Buffer</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">delete</span><span class="p">[]</span> <span class="n">data_</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="nf">swap</span><span class="p">(</span><span class="n">Buffer</span><span class="o">&amp;</span> <span class="n">other</span><span class="p">)</span> <span class="k">noexcept</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">size_</span><span class="p">,</span> <span class="n">other</span><span class="p">.</span><span class="n">size_</span><span class="p">);</span>
        <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">data_</span><span class="p">,</span> <span class="n">other</span><span class="p">.</span><span class="n">data_</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="n">Buffer</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="n">Buffer</span> <span class="n">other</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">swap</span><span class="p">(</span><span class="n">other</span><span class="p">);</span>
        <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Değerle alınan <code class="language-plaintext highlighter-rouge">other</code>, bağımsız kopyadır. Bellek ayırma başarısız olursa hedef nesne değişmez. Takastan sonra hedefin eski belleğini <code class="language-plaintext highlighter-rouge">other</code> temizler. Bu yaklaşım kendine atamayı da güvenle karşılar; ancak gereksiz bir kopyalama yapabilir.</p>

<p>$n$ baytlık veri için derin kopyalamanın zaman ve ek bellek maliyeti yaklaşık $O(n)$ düzeyindedir. Doğruluk bedava değildir, fakat tanımsız davranış çok daha pahalıdır.</p>

<h2 id="daha-iyi-seçenek-rule-of-zero">Daha iyi seçenek: Rule of Zero</h2>

<p><strong>Rule of Three</strong>, yıkıcı, kopyalama kurucusu veya kopyalama atamasını özelleştiriyorsanız diğerlerini de değerlendirin der. Modern C++’ta taşıma işlemleriyle birlikte <strong>Rule of Five</strong> gündeme gelir. Yukarıdaki sınıf güvenli kopyalanır, fakat özel taşıma işlemleri sağlamaz; taşıma beklenen bazı durumlarda kopyalama yapılabilir.</p>

<p>Çoğu uygulamada en temiz çözüm, kaynak yönetimini hazır türlere devretmektir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="nc">Buffer</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span> <span class="n">data</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Bu tasarımda <strong>Rule of Zero</strong> uygulanır: özel yıkıcı veya kopyalama işlemleri yazmanız gerekmez. <code class="language-plaintext highlighter-rouge">std::unique_ptr</code> ise tek sahipliği ifade eder; onu içeren sınıfın otomatik kopyalama işlemleri genellikle silinir.</p>

<p>Son kontrol sorusu şudur: <strong>Bu nesneyi kopyaladığımda kaynak paylaşılmalı mı, çoğaltılmalı mı, yoksa kopyalama yasaklanmalı mı?</strong> Cevap açık değilse, otomatik üretilen işlemlere güvenmeden önce sahiplik modelini netleştirin.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="kopyalama-kurucusu" /><category term="atama-operatörü" /><category term="bellek-yönetimi" /><category term="raii" /><category term="rule-of-zero" /><summary type="html"><![CDATA[C++ derleyicisi, yazmadığınız bazı özel üye fonksiyonlarını sizin yerinize hazırlayabilir. Kopyalama kurucusu ve kopyalama atama operatörü de bu yardımcılar arasındadır. Ancak derleyici, bir işaretçinin yalnızca adres tuttuğunu bilir; o adresin arkasındaki belleğin kime ait olduğunu bilmez. Tehlike tam da bu sahiplik belirsizliğinde başlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/cta-otomatik-kopyalama-49.png" /><media:content medium="image" url="https://program.sonsuz.us/img/cta-otomatik-kopyalama-49.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Ev Asistanı Sizi Sesinizden Nasıl Tanır? Konuşmacı Kimlik Doğrulamanın Perde Arkası</title><link href="https://program.sonsuz.us/posts/ev-asistani-sizi-sesinizden-nasil-tanir-konusmaci-kimlik-dogrulamanin-perde-arkasi/" rel="alternate" type="text/html" title="Ev Asistanı Sizi Sesinizden Nasıl Tanır? Konuşmacı Kimlik Doğrulamanın Perde Arkası" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ev-asistani-sizi-sesinizden-nasil-tanir-konusmaci-kimlik-dogrulamanin-perde-arkasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/ev-asistani-sizi-sesinizden-nasil-tanir-konusmaci-kimlik-dogrulamanin-perde-arkasi/"><![CDATA[<p><img src="/img/ev-asistani-sizi-93.svg" alt="ev-asistani-sizi-93" /></p>

<p>Evde herkes aynı asistana “En sevdiğim şarkıyı aç” dediğinde farklı listelerin çalması küçük bir sihir gibi görünür. Oysa asistanın içinde aile albümü değil, seslerden çıkarılmış matematiksel temsiller vardır. Peki babanın sabah mahmurluğunu, annenin fısıltısını ve kardeşinizin taklidini nasıl değerlendirir? Gelin bu dijital kulakların çalışma mantığını keşfedelim.</p>

<p>``</p>

<h2 id="ne-söylendiği-ile-kimin-söylediği-farklı-sorulardır">Ne söylendiği ile kimin söylediği farklı sorulardır</h2>

<p>Otomatik konuşma tanıma, sesi metne dönüştürür. Konuşmacı tanıma ise sesin sahibini araştırır. Burada iki ayrı görev bulunur: <strong>kimlik belirleme</strong>, kayıtlı kişiler arasından konuşmacıyı seçer; <strong>kimlik doğrulama</strong>, öne sürülen bir kimliğin doğru olup olmadığını sınar.</p>

<p>Dolayısıyla kişisel müzik listesini seçmek ile “Ben Ayşe’yim, hesabıma erişmek istiyorum” iddiasını değerlendirmek aynı problem değildir. Üstelik sistem her duyduğu sesi aileden birine zorla eşlememelidir; misafirler de kapıyı çalabilir!</p>

<table>
  <thead>
    <tr>
      <th>Görev</th>
      <th>Temel soru</th>
      <th>Örnek çıktı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Konuşmayı metne çevirme</td>
      <td>Ne söylendi?</td>
      <td>“Işığı aç”</td>
    </tr>
    <tr>
      <td>Konuşmacı belirleme</td>
      <td>Kim konuşuyor?</td>
      <td>Ayşe veya bilinmeyen</td>
    </tr>
    <tr>
      <td>Konuşmacı doğrulama</td>
      <td>Gerçekten Ayşe mi?</td>
      <td>Kabul veya ret</td>
    </tr>
  </tbody>
</table>

<h2 id="ses-nasıl-matematiksel-bir-profile-dönüşür">Ses nasıl matematiksel bir profile dönüşür?</h2>

<p>İlk adım, konuşma etkinliği algılama ile sessizlikleri ayıklamaktır. Ardından ses uygun örnekleme hızına getirilir; modelin beklediği biçimde log-Mel spektrogram gibi özellikler hazırlanır. Bunlar, frekans içeriğinin zaman boyunca nasıl değiştiğini gösterir.</p>

<p>ECAPA-TDNN gibi eğitilmiş modeller bu özelliklerden <strong>konuşmacı gömmesi</strong>, yani sabit uzunluklu bir vektör üretir. Eğitim sırasında amaç, aynı kişinin farklı kayıtlarını yakın; farklı kişilerin kayıtlarını uzak konumlandırmaktır. Model yalnızca sesin kalınlığına bakmaz; konuşmacıya özgü çeşitli akustik örüntüleri birlikte değerlendirir.</p>

<p>Kayıt aşamasında farklı cümleler, günler ve makul mikrofon uzaklıkları kullanmak faydalıdır. Normalize edilmiş örneklerin ortalaması, yeniden normalize edilerek kişinin referans profiline dönüştürülebilir. Böylece tek bir hapşırık profilin başrol oyuncusu olmaz.</p>

<p>İki temsil arasındaki yakınlık için kosinüs benzerliği kullanılabilir:</p>

\[s(\mathbf{x},\mathbf{p})=\frac{\mathbf{x}\cdot\mathbf{p}}{\\vert \mathbf{x}\\vert \\vert \mathbf{p}\\vert }\]

<p>Bu ölçü, vektörlerin büyüklüğünden çok yönlerinin benzerliğini değerlendirir. Ancak yüksek benzerlik, tek başına kesin kimlik kanıtı değildir.</p>

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

<p>Aşağıdaki kod ham sesi işlemez; önceden eğitilmiş bir modelin ürettiği, aynı boyuttaki gömme vektörlerini kullanır. <code class="language-plaintext highlighter-rouge">profiller</code>, kişi adlarını referans vektörlerine bağlayan bir sözlüktür. Örnek, en az iki kayıtlı kişi varsayar.</p>

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


<span class="k">def</span> <span class="nf">birim</span><span class="p">(</span><span class="n">v</span><span class="p">):</span>
    <span class="n">v</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">asarray</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
    <span class="n">norm</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">norm</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">norm</span> <span class="o">&lt;</span> <span class="mf">1e-8</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 temsil</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">v</span> <span class="o">/</span> <span class="n">norm</span>


<span class="k">def</span> <span class="nf">profil_olustur</span><span class="p">(</span><span class="n">ornekler</span><span class="p">):</span>
    <span class="n">ortalama</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">mean</span><span class="p">([</span><span class="nf">birim</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">ornekler</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
    <span class="k">return</span> <span class="nf">birim</span><span class="p">(</span><span class="n">ortalama</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">tanila</span><span class="p">(</span><span class="n">vektor</span><span class="p">,</span> <span class="n">profiller</span><span class="p">,</span> <span class="n">esik</span><span class="o">=</span><span class="mf">0.75</span><span class="p">,</span> <span class="n">marj</span><span class="o">=</span><span class="mf">0.08</span><span class="p">):</span>
    <span class="n">sorgu</span> <span class="o">=</span> <span class="nf">birim</span><span class="p">(</span><span class="n">vektor</span><span class="p">)</span>
    <span class="n">puanlar</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">(</span>
        <span class="p">((</span><span class="n">ad</span><span class="p">,</span> <span class="nf">float</span><span class="p">(</span><span class="n">sorgu</span> <span class="o">@</span> <span class="nf">birim</span><span class="p">(</span><span class="n">p</span><span class="p">)))</span>
         <span class="k">for</span> <span class="n">ad</span><span class="p">,</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">profiller</span><span class="p">.</span><span class="nf">items</span><span class="p">()),</span>
        <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">sonuc</span><span class="p">:</span> <span class="n">sonuc</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span>
    <span class="p">)</span>
    <span class="p">(</span><span class="n">ad</span><span class="p">,</span> <span class="n">en_iyi</span><span class="p">),</span> <span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="n">ikinci</span><span class="p">)</span> <span class="o">=</span> <span class="n">puanlar</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
    <span class="k">if</span> <span class="n">en_iyi</span> <span class="o">&lt;</span> <span class="n">esik</span> <span class="ow">or</span> <span class="n">en_iyi</span> <span class="o">-</span> <span class="n">ikinci</span> <span class="o">&lt;</span> <span class="n">marj</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Bilinmeyen</span><span class="sh">"</span>
    <span class="k">return</span> <span class="n">ad</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">profil_olustur</code>, birden fazla kaydı tek referansa indirger. <code class="language-plaintext highlighter-rouge">tanila</code> ise en güçlü eşleşmeyi bulur. İkinci adayla fark küçükse karar vermekten kaçınır. Buradaki sayılar yalnızca gösterim içindir; her model için geçerli güvenlik sınırları değildir.</p>

<h2 id="eşik-seçimi-fazla-şüpheci-mi-fazla-misafirperver-mi">Eşik seçimi: Fazla şüpheci mi, fazla misafirperver mi?</h2>

<p>Doğrulamada karar genellikle $s \geq \tau$ koşuluna dayanır. Eşik yükseldikçe yabancıları kabul etmek zorlaşır; fakat gerçek kullanıcıları reddetmek de kolaylaşabilir. Bu dengeyi ölçmek için yanlış kabul oranı ve yanlış ret oranı birlikte izlenir.</p>

<p>Eşikler, aile üyeleriyle birlikte kayıtlı olmayan kişilerden alınmış izinli test verileriyle ayarlanmalıdır. Kayıt ve test oturumlarını ayırmak önemlidir: aynı kaydı iki tarafta kullanmak, sınavdan önce cevap anahtarını dağıtmaya benzer. Gürültü, hastalık ve kısa komutlar ayrıca sınanmalıdır.</p>

<h2 id="gerçek-evlerde-güvenlik-ve-mahremiyet">Gerçek evlerde güvenlik ve mahremiyet</h2>

<p>Televizyon sesi, üst üste konuşmalar ve uzaktaki mikrofon performansı düşürebilir. Sistem emin olmadığında yeniden konuşma istemeli veya kişiselleştirmeden devam etmelidir. Ses kayıtları ve gömmeler hassas biyometrik verilerdir; açık onay, şifreleme, silme seçeneği ve mümkünse cihaz üzerinde işleme gerekir.</p>

<p>Kayıt oynatma ve sentetik ses saldırıları da unutulmamalıdır. Canlılık kontrolleri riski azaltabilir ama kusursuz değildir. Kapı açma veya ödeme gibi işlemlerde ses, tek doğrulama faktörü olmamalıdır. Akıllı asistanın en değerli becerisi bazen doğru kişiyi tanımak değil, “Emin değilim” diyebilmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ses tanıma" /><category term="konuşmacı doğrulama" /><category term="yapay zeka" /><category term="python" /><category term="ses işleme" /><category term="mahremiyet" /><summary type="html"><![CDATA[Evde herkes aynı asistana “En sevdiğim şarkıyı aç” dediğinde farklı listelerin çalması küçük bir sihir gibi görünür. Oysa asistanın içinde aile albümü değil, seslerden çıkarılmış matematiksel temsiller vardır. Peki babanın sabah mahmurluğunu, annenin fısıltısını ve kardeşinizin taklidini nasıl değerlendirir? Gelin bu dijital kulakların çalışma mantığını keşfedelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ev-asistani-sizi-93.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ev-asistani-sizi-93.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Evdeki Kamera Sizi Nasıl Tanır? Nesne ve Yüz Tanımanın Perde Arkası</title><link href="https://program.sonsuz.us/posts/evdeki-kamera-sizi-nasil-tanir-nesne-ve-yuz-tanimanin-perde-arkasi/" rel="alternate" type="text/html" title="Evdeki Kamera Sizi Nasıl Tanır? Nesne ve Yüz Tanımanın Perde Arkası" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/evdeki-kamera-sizi-nasil-tanir-nesne-ve-yuz-tanimanin-perde-arkasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/evdeki-kamera-sizi-nasil-tanir-nesne-ve-yuz-tanimanin-perde-arkasi/"><![CDATA[<p>Kapı açıldı: İçeri giren siz misiniz, misafiriniz mi, yoksa kameranın insan sandığı askılık mı? Ev içi güvenlik kameraları bu soruları tek bir sihirli algoritmayla yanıtlamaz. Nesne algılama, yüz tespiti ve kimlik eşleştirme birlikte çalışır. Gelin, bu dijital kapıcının karar mekanizmasını ve neden bazen tereddüt etmesi gerektiğini inceleyelim.</p>

<p><img src="/img/evdeki-kamera-sizi-18.svg" alt="evdeki-kamera-sizi-18" /></p>

<p>``</p>

<h2 id="önce-nesneyi-bul-sonra-kimliği-araştır">Önce nesneyi bul, sonra kimliği araştır</h2>

<p>Görüntü, bilgisayar açısından piksel değerlerinden oluşan bir matristir. Derin öğrenme modelleri bu değerlerden kenar, doku, biçim ve daha karmaşık görsel örüntüler çıkarır. Ancak <strong>bir insanı bulmak</strong>, <strong>yüzünü bulmak</strong> ve <strong>kim olduğunu belirlemek</strong> farklı problemlerdir. Kamera önce sahneyi anlamalı, sonra uygun yüz görüntülerini incelemelidir. Böylece koltuk desenini aile üyesi olarak kaydetme gibi komik ama maliyetli hatalar azalır.</p>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Yanıtladığı soru</th>
      <th>Tipik çıktı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Nesne algılama</td>
      <td>Görüntüde ne var?</td>
      <td>İnsan, kedi, paket ve kutu koordinatları</td>
    </tr>
    <tr>
      <td>Yüz tespiti</td>
      <td>Yüz nerede?</td>
      <td>Yüz kutusu ve belirgin noktalar</td>
    </tr>
    <tr>
      <td>Yüz tanıma</td>
      <td>Kayıtlı kişilerden biri mi?</td>
      <td>Kimlik adayı veya bilinmiyor</td>
    </tr>
  </tbody>
</table>

<h2 id="kameradan-karşılaştırmaya-uzanan-yol">Kameradan karşılaştırmaya uzanan yol</h2>

<p>İlk adımda YOLO benzeri bir nesne algılayıcı insanları işaretleyebilir. Ardından ayrı bir yüz tespit modeli, insan bölgelerinde yüz arar. Göz ve burun gibi referans noktalarıyla yapılan <strong>hizalama</strong>, başın eğikliğinin karşılaştırmayı gereksiz yere bozmasını azaltır.</p>

<p>Kırpılan yüz, modelin beklediği boyuta ve renk düzenine dönüştürülür. Bulanık, çok küçük veya aşırı karanlık görüntüler elenebilir. Bu kalite kontrolü önemlidir: Algoritmaya belirsiz bir görüntü verip kesin cevap beklemek, buğulu gözlükle kimlik kontrolü yapmaya benzer. Her karede işlem yapmak yerine takip algoritmalarıyla aynı kişiyi izlemek de hesaplama yükünü azaltabilir.</p>

<h2 id="yüzün-sayısal-özeti-embedding">Yüzün sayısal özeti: embedding</h2>

<p>Yüz tanıma modeli, görüntüyü çoğunlukla yüzlerce bileşenden oluşan bir <strong>özellik vektörüne</strong>, yani embedding’e dönüştürür. Eğitim sırasında aynı kişinin görüntülerinin birbirine yakın, farklı kişilerin görüntülerinin daha uzak temsil edilmesi hedeflenir. Bu vektör doğrudan isim içermez; isim, izinle oluşturulmuş kayıtlı örneklerle eşleştirme sonucunda bulunur.</p>

<p>İki vektör arasındaki kosinüs benzerliği şöyle hesaplanabilir:</p>

\[s(a,b)=\frac{a\cdot b}{\lVert a\rVert\lVert b\rVert}\]

<p>Birim uzunluğa normalize edilmiş vektörlerde hesap, yalnızca iç çarpıma dönüşür. Yüksek benzerlik aynı kişiye işaret edebilir; fakat skor, kendiliğinden bir doğruluk olasılığı değildir. Örneğin $0.80$, otomatik olarak “yüzde 80 kesinlik” anlamına gelmez.</p>

<h2 id="tanıdık-mı-yoksa-sadece-benziyor-mu">Tanıdık mı, yoksa sadece benziyor mu?</h2>

<p>Ev ortamında sistem <strong>açık küme tanıma</strong> yapmalıdır: Görülen herkesin kayıtlı kişilerden biri olduğunu varsayamaz. En yüksek benzerlik bile belirlenen eşikten düşükse sonuç “bilinmiyor” olmalıdır.</p>

<p>Eşik düşürülürse tanıdıkları kaçırma azalabilir, ancak yabancıları yanlış kabul etme artabilir. Eşik yükseltilirse bunun tersi yaşanabilir. Doğru değer; kamera açısı, ışık, model ve kayıt kalitesiyle değişir. Bu nedenle yanlış kabul ve yanlış ret oranları, farklı koşullarda toplanmış doğrulama örnekleriyle birlikte değerlendirilmelidir.</p>

<h2 id="python-ile-küçük-bir-eşleştirme-katmanı">Python ile küçük bir eşleştirme katmanı</h2>

<p>Aşağıdaki kod yüzü görüntüden çıkarmaz; aynı modelden alınmış embedding’leri karşılaştırır. <code class="language-plaintext highlighter-rouge">kayitlar</code>, kişi adlarını referans vektörlerine bağlayan bir sözlüktür.</p>

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

<span class="k">def</span> <span class="nf">birim</span><span class="p">(</span><span class="n">vektor</span><span class="p">):</span>
    <span class="n">v</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">asarray</span><span class="p">(</span><span class="n">vektor</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
    <span class="n">uzunluk</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">norm</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">uzunluk</span> <span class="o">&lt;</span> <span class="mf">1e-12</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 embedding</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">v</span> <span class="o">/</span> <span class="n">uzunluk</span>

<span class="k">def</span> <span class="nf">eslestir</span><span class="p">(</span><span class="n">yuz</span><span class="p">,</span> <span class="n">kayitlar</span><span class="p">,</span> <span class="n">esik</span><span class="o">=</span><span class="mf">0.65</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">kayitlar</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">bilinmiyor</span><span class="sh">"</span><span class="p">,</span> <span class="bp">None</span>
    <span class="n">sorgu</span> <span class="o">=</span> <span class="nf">birim</span><span class="p">(</span><span class="n">yuz</span><span class="p">)</span>
    <span class="n">skorlar</span> <span class="o">=</span> <span class="p">{</span>
        <span class="n">kisi</span><span class="p">:</span> <span class="nf">float</span><span class="p">(</span><span class="n">sorgu</span> <span class="o">@</span> <span class="nf">birim</span><span class="p">(</span><span class="n">referans</span><span class="p">))</span>
        <span class="k">for</span> <span class="n">kisi</span><span class="p">,</span> <span class="n">referans</span> <span class="ow">in</span> <span class="n">kayitlar</span><span class="p">.</span><span class="nf">items</span><span class="p">()</span>
    <span class="p">}</span>
    <span class="n">aday</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">skorlar</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">skorlar</span><span class="p">.</span><span class="n">get</span><span class="p">)</span>
    <span class="n">skor</span> <span class="o">=</span> <span class="n">skorlar</span><span class="p">[</span><span class="n">aday</span><span class="p">]</span>
    <span class="n">sonuc</span> <span class="o">=</span> <span class="n">aday</span> <span class="k">if</span> <span class="n">skor</span> <span class="o">&gt;=</span> <span class="n">esik</span> <span class="k">else</span> <span class="sh">"</span><span class="s">bilinmiyor</span><span class="sh">"</span>
    <span class="k">return</span> <span class="n">sonuc</span><span class="p">,</span> <span class="n">skor</span>
</code></pre></div></div>

<p>Buradaki <code class="language-plaintext highlighter-rouge">0.65</code> yalnızca örnektir; başka modellerde güvenilir olmayabilir. Gerçek uygulamada kişi başına farklı ışıklarda birkaç referans tutulabilir. Yakın skorlu iki aday varsa karar ertelenebilir. Ayrıca birkaç ardışık karede tutarlı eşleşme aramak, tek karelik hataları azaltır; ancak hataları tamamen ortadan kaldırmaz.</p>

<h2 id="güvenlik-mahremiyet-ve-son-karar">Güvenlik, mahremiyet ve son karar</h2>

<p>Yüz embedding’leri biyometrik veri niteliği taşıyabilir; zararsız sayı dizileri gibi görülmemelidir. Ev sakinlerinin bilgilendirilmesi, uygun izinlerin alınması, yerel işleme, şifreleme, erişim kısıtlamaları ve kısa saklama süreleri önemlidir. Gereksiz görüntüler tutulmamalı, misafirler için mahremiyet seçenekleri sunulmalıdır.</p>

<p>Fotoğraf veya ekranla kandırılmaya karşı canlılık kontrolleri eklenebilir; bunlar da kusursuz değildir. “Bilinmiyor” etiketi yalnızca güvenilir eşleşme bulunamadığını söyler, kötü niyet göstermez. En iyi dijital kapıcı, herkesi tanıdığını iddia eden değil; emin olmadığında bunu söyleyen ve önemli kararları insana bırakan sistemdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="görüntü işleme" /><category term="yüz tanıma" /><category term="nesne algılama" /><category term="yapay zeka" /><category term="ev güvenliği" /><category term="python" /><summary type="html"><![CDATA[Kapı açıldı: İçeri giren siz misiniz, misafiriniz mi, yoksa kameranın insan sandığı askılık mı? Ev içi güvenlik kameraları bu soruları tek bir sihirli algoritmayla yanıtlamaz. Nesne algılama, yüz tespiti ve kimlik eşleştirme birlikte çalışır. Gelin, bu dijital kapıcının karar mekanizmasını ve neden bazen tereddüt etmesi gerektiğini inceleyelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/evdeki-kamera-sizi-18.png" /><media:content medium="image" url="https://program.sonsuz.us/img/evdeki-kamera-sizi-18.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Finansın Dijital Laboratuvarı: Python ile Senaryoları Simüle Etmek</title><link href="https://program.sonsuz.us/posts/finansin-dijital-laboratuvari-python-ile-senaryolari-simule-etmek/" rel="alternate" type="text/html" title="Finansın Dijital Laboratuvarı: Python ile Senaryoları Simüle Etmek" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/finansin-dijital-laboratuvari-python-ile-senaryolari-simule-etmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/finansin-dijital-laboratuvari-python-ile-senaryolari-simule-etmek/"><![CDATA[<p><img src="/img/finansin-dijital-laboratuvari-66.svg" alt="finansin-dijital-laboratuvari-66" /></p>

<p>Bir yatırımın geleceğini tek hücrelik Excel tahminine bağlamak, hava durumuna bakmadan pikniğe çıkmaya benzer: Bazen güneş açar, bazen sandviçler yüzer. Bilgisayar destekli finansal modelleme, gelirleri, maliyetleri ve belirsizlikleri açık varsayımlara dönüştürür. Böylece yalnızca “Ne kadar kazanırız?” sorusunu değil, “Hangi koşullarda zarar ederiz?” sorusunu da araştırabiliriz. Üstelik farklı kararları aynı deney düzeneğinde karşılaştırabiliriz.</p>

<p>``</p>

<h2 id="önce-teori-paranın-zaman-makinesi">Önce teori: Paranın zaman makinesi</h2>

<p>Bugünkü 100 lira ile beş yıl sonraki 100 lira aynı ekonomik değere sahip değildir. Enflasyon, alternatif yatırım getirileri ve risk nedeniyle gelecekteki nakit akışlarını bugüne indirgeriz. Net bugünkü değer, yani NPV, bu yaklaşımın temel araçlarından biridir:</p>

\[NPV=-I_0+\sum_{t=1}^{T}\frac{CF_t}{(1+r)^t}\]

<p>Burada $I_0$ başlangıç yatırımı, $CF_t$ ilgili yılın nakit akışı, $r$ iskonto oranı ve $T$ modelin süresidir. Pozitif NPV, kullanılan iskonto oranı ve varsayımlar altında yatırımın değer yaratabileceğini gösterir; kesin kazanç sözü vermez.</p>

<p>Örneğimizde başlangıç yatırımı bir milyon lira, başlangıç yıllık gelir seviyesi 800 bin liradır. Değişken maliyetleri gelir üzerinden, sabit giderleri ayrı hesaplayacağız. Vergileri, işletme sermayesini, ek yatırımları ve terminal değeri dışarıda bırakıyoruz. Dolayısıyla bu, gerçek yatırım kararına hazır bir değerleme değil, öğretici bir prototiptir.</p>

<h2 id="senaryodan-olasılık-dağılımına">Senaryodan olasılık dağılımına</h2>

<p>Önce üç anlaşılır senaryo tanımlayalım. Bu tablo, değişkenlerin etkisini sezmek içindir; simülasyonun yüzdelik sonuçlarını temsil etmez.</p>

<table>
  <thead>
    <tr>
      <th>Varsayım</th>
      <th style="text-align: right">Kötümser</th>
      <th style="text-align: right">Temel</th>
      <th style="text-align: right">İyimser</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yıllık gelir büyümesi</td>
      <td style="text-align: right">%0</td>
      <td style="text-align: right">%8</td>
      <td style="text-align: right">%14</td>
    </tr>
    <tr>
      <td>Değişken maliyet / gelir</td>
      <td style="text-align: right">%65</td>
      <td style="text-align: right">%55</td>
      <td style="text-align: right">%45</td>
    </tr>
    <tr>
      <td>İskonto oranı</td>
      <td style="text-align: right">%16</td>
      <td style="text-align: right">%12</td>
      <td style="text-align: right">%9</td>
    </tr>
  </tbody>
</table>

<p>Monte Carlo yöntemi, bu üç fotoğraf yerine binlerce olası kombinasyon üretir. Her kombinasyonda nakit akışları ve NPV yeniden hesaplanır. Sonuç, tek bir tahmin değil, varsayımlara bağlı bir sonuç dağılımıdır. Bilgisayarın yaptığı sihir değil; sistematik biçimde çok sayıda “ya şöyle olursa?” sorusu sormaktır.</p>

<h2 id="python-ile-finansal-deney-düzeneği">Python ile finansal deney düzeneği</h2>

<p>Önce <code class="language-plaintext highlighter-rouge">pip install numpy</code> komutuyla NumPy’ı kurun. Aşağıdaki kod 10.000 senaryo oluşturur. Büyüme ve iskonto oranlarını sınırlandırılmış normal dağılımlardan, maliyet oranını ise minimum, en olası ve maksimum değerleri tanımlanabilen üçgensel dağılımdan örnekler:</p>

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

<span class="n">rng</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">default_rng</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="n">n</span> <span class="o">=</span> <span class="mi">10_000</span>
<span class="n">years</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>

<span class="n">growth</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">clip</span><span class="p">(</span>
    <span class="n">rng</span><span class="p">.</span><span class="nf">normal</span><span class="p">(</span><span class="mf">0.08</span><span class="p">,</span> <span class="mf">0.04</span><span class="p">,</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">)),</span> <span class="o">-</span><span class="mf">0.08</span><span class="p">,</span> <span class="mf">0.22</span>
<span class="p">)</span>
<span class="n">cost_ratio</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="nf">triangular</span><span class="p">(</span><span class="mf">0.45</span><span class="p">,</span> <span class="mf">0.55</span><span class="p">,</span> <span class="mf">0.65</span><span class="p">,</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
<span class="n">discount</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">clip</span><span class="p">(</span>
    <span class="n">rng</span><span class="p">.</span><span class="nf">normal</span><span class="p">(</span><span class="mf">0.12</span><span class="p">,</span> <span class="mf">0.02</span><span class="p">,</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">)),</span> <span class="mf">0.05</span><span class="p">,</span> <span class="mf">0.20</span>
<span class="p">)</span>

<span class="n">revenue</span> <span class="o">=</span> <span class="mi">800_000</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">growth</span><span class="p">)</span> <span class="o">**</span> <span class="n">years</span>
<span class="n">fixed_cost</span> <span class="o">=</span> <span class="mi">170_000</span> <span class="o">*</span> <span class="mf">1.04</span> <span class="o">**</span> <span class="n">years</span>
<span class="n">cash_flow</span> <span class="o">=</span> <span class="n">revenue</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">cost_ratio</span><span class="p">)</span> <span class="o">-</span> <span class="n">fixed_cost</span>

<span class="n">npv</span> <span class="o">=</span> <span class="p">(</span>
    <span class="n">cash_flow</span> <span class="o">/</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">discount</span><span class="p">)</span> <span class="o">**</span> <span class="n">years</span>
<span class="p">).</span><span class="nf">sum</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1_000_000</span>

<span class="n">p5</span><span class="p">,</span> <span class="n">median</span><span class="p">,</span> <span class="n">p95</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">quantile</span><span class="p">(</span><span class="n">npv</span><span class="p">,</span> <span class="p">[</span><span class="mf">0.05</span><span class="p">,</span> <span class="mf">0.50</span><span class="p">,</span> <span class="mf">0.95</span><span class="p">])</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">NPV yüzdelikleri: </span><span class="si">{</span><span class="n">p5</span><span class="si">:</span><span class="p">,.</span><span class="mi">0</span><span class="n">f</span><span class="si">}</span><span class="s">, </span><span class="si">{</span><span class="n">median</span><span class="si">:</span><span class="p">,.</span><span class="mi">0</span><span class="n">f</span><span class="si">}</span><span class="s">, </span><span class="si">{</span><span class="n">p95</span><span class="si">:</span><span class="p">,.</span><span class="mi">0</span><span class="n">f</span><span class="si">}</span><span class="s"> TL</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Negatif NPV oranı: </span><span class="si">{</span><span class="n">np</span><span class="p">.</span><span class="nf">mean</span><span class="p">(</span><span class="n">npv</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span><span class="si">:</span><span class="p">.</span><span class="mi">1</span><span class="o">%</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Rastgele sayı üretecindeki <code class="language-plaintext highlighter-rouge">42</code>, deneyin tekrarlanabilmesini sağlar. <code class="language-plaintext highlighter-rouge">(n, 1)</code> biçimindeki diziler, beş yıllık zaman dizisiyle yayınlama sayesinde birleşir; Python döngüsü yazmadan bütün senaryolar hesaplanır. Her senaryoda seçilen büyüme, maliyet ve iskonto oranı beş yıl boyunca sabittir. Yani burada yıllık şokları değil, model parametrelerindeki belirsizliği örnekliyoruz. Ayrıca 800 bin lira başlangıç seviyesidir; ilk yıl geliri büyüme uygulanarak bulunur.</p>

<h2 id="sonuçları-doğru-okumak">Sonuçları doğru okumak</h2>

<p>Medyan, sonuçların ortasındaki değerdir. Beşinci yüzdelik, simülasyon sonuçlarının yaklaşık %5’inin altında kaldığı eşiği gösterir. Beşinci ve doksan beşinci yüzdelikler arasındaki bölge, model sonuçlarının merkezdeki yaklaşık %90’ını kapsar; medyan için bir güven aralığı değildir.</p>

<p>Negatif NPV oranı da şirketin iflas olasılığı değildir. Yalnızca seçilen dağılımlar altında yatırımın iskonto edilmiş değerinin başlangıç maliyetini karşılamama sıklığıdır. Modeli bir kristal küre değil, varsayımlarınızı sorgulayan bir laboratuvar olarak düşünün.</p>

<h2 id="modeli-gerçek-hayata-yaklaştırmak">Modeli gerçek hayata yaklaştırmak</h2>

<ul>
  <li><strong>Veriyle kalibre edin:</strong> Dağılımları geçmiş satışlar, maliyetler ve piyasa verileriyle gerekçelendirin. Kırpma işlemi sınır noktalarında olasılık yığılması oluşturur.</li>
  <li><strong>Bağımlılıkları modelleyin:</strong> Örnekte değişkenler bağımsızdır. Gerçekte yüksek büyüme, yüksek maliyet veya farklı risk primiyle birlikte gelebilir.</li>
  <li><strong>Tutarlılığı koruyun:</strong> Nominal nakit akışlarını nominal iskonto oranıyla değerlendirin. Sabit giderlerin yıllık %4 artması açık bir varsayımdır.</li>
  <li><strong>Duyarlılığı ölçün:</strong> Bir varsayımı değiştirip diğerlerini sabit tutarak NPV’nin hangi girdiye daha hassas olduğunu inceleyin.</li>
  <li><strong>Nakit ile kârı ayırın:</strong> Tahsilat gecikmeleri, vergiler ve stok finansmanı eklenmeden muhasebe kârını nakit akışı sanmayın.</li>
</ul>

<p>Son olarak senaryo sayısını artırıp yüzdeliklerin kararlı olup olmadığını kontrol edin. Daha fazla simülasyon örnekleme gürültüsünü azaltır; yanlış varsayımları düzeltmez. Finansal modellemenin asıl gücü geleceği bilmek değil, belirsizliği görünür ve tartışılabilir hâle getirmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="finansal-modelleme" /><category term="python" /><category term="monte-carlo" /><category term="risk-analizi" /><category term="simülasyon" /><summary type="html"><![CDATA[Bir yatırımın geleceğini tek hücrelik Excel tahminine bağlamak, hava durumuna bakmadan pikniğe çıkmaya benzer: Bazen güneş açar, bazen sandviçler yüzer. Bilgisayar destekli finansal modelleme, gelirleri, maliyetleri ve belirsizlikleri açık varsayımlara dönüştürür. Böylece yalnızca “Ne kadar kazanırız?” sorusunu değil, “Hangi koşullarda zarar ederiz?” sorusunu da araştırabiliriz. Üstelik farklı kararları aynı deney düzeneğinde karşılaştırabiliriz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/finansin-dijital-laboratuvari-66.png" /><media:content medium="image" url="https://program.sonsuz.us/img/finansin-dijital-laboratuvari-66.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">IFTTT ve Otomasyon Zincirleri: Dijital Domino Taşları Nasıl Dizilir?</title><link href="https://program.sonsuz.us/posts/ifttt-ve-otomasyon-zincirleri-dijital-domino-taslari-nasil-dizilir/" rel="alternate" type="text/html" title="IFTTT ve Otomasyon Zincirleri: Dijital Domino Taşları Nasıl Dizilir?" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ifttt-ve-otomasyon-zincirleri-dijital-domino-taslari-nasil-dizilir</id><content type="html" xml:base="https://program.sonsuz.us/posts/ifttt-ve-otomasyon-zincirleri-dijital-domino-taslari-nasil-dizilir/"><![CDATA[<p>Telefonunuz yağmur başlayınca sizi uyarsa, önemli bir GitHub kaydı açıldığında cebinize bildirim düşse nasıl olurdu? IFTTT, farklı servisleri birbirine bağlayarak bu küçük dijital yardımcıları kurmanızı sağlar. Ancak iyi otomasyon, yalnızca uygulamaları eşleştirmek değildir: olayların, koşulların ve yan etkilerin nasıl çalıştığını anlamaktır. Haydi domino taşlarını devirmeden önce doğru sıraya dizelim!</p>

<p><img src="/img/ifttt-ve-otomasyon-71.svg" alt="ifttt-ve-otomasyon-71" /></p>

<p>``</p>

<h2 id="temel-mantık-olay-koşul-ve-eylem">Temel Mantık: Olay, Koşul ve Eylem</h2>

<p>IFTTT adı, “If This Then That” ifadesinden gelir: “Bu olursa, şunu yap.” Platformdaki otomasyon tariflerine <strong>Applet</strong> denir. Basit bir Applet, bir servisin tetikleyicisini başka bir servisin eylemine bağlar.</p>

<p>Burada üç kavramı ayırmak önemlidir. <strong>Olay</strong>, sistemde gerçekleşen değişikliktir. <strong>Koşul</strong>, olayın işlenmeye değer olup olmadığını belirler. <strong>Eylem</strong> ise başka bir sistemde oluşturulan sonuçtur. Örneğin yeni bir kayıt olaydır; kaydın acil olması koşuldur; bildirim göndermek eylemdir.</p>

<p>Bu ilişkiyi şöyle gösterebiliriz:</p>

\[A = E \land C\]

<p>Burada $E$, ilgili olayın gerçekleşmesini; $C$, ek koşulun sağlanmasını; $A$ ise eylemin çalıştırılmasını temsil eder. Yalnızca tetikleyici kullanan basit tariflerde ek koşulu sürekli doğru kabul edebilirsiniz.</p>

<table>
  <thead>
    <tr>
      <th>Bileşen</th>
      <th>Cevapladığı soru</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tetikleyici</td>
      <td>Ne gerçekleşti?</td>
      <td>Yeni GitHub issue kaydı</td>
    </tr>
    <tr>
      <td>Koşul</td>
      <td>İşlem yapılmalı mı?</td>
      <td><code class="language-plaintext highlighter-rouge">urgent</code> etiketi var mı?</td>
    </tr>
    <tr>
      <td>Eylem</td>
      <td>Ne yapılacak?</td>
      <td>Telefona bildirim gönder</td>
    </tr>
  </tbody>
</table>

<p>Önemli ayrıntı: İki bağımsız tetikleyiciyi otomatik olarak “VE” mantığıyla birleştiremezsiniz. Ek filtreler, çoklu eylemler ve kullanılabilir servisler hesap planına veya entegrasyona göre değişebilir. Karmaşık kararlar için araya kendi küçük uygulamanızı koyabilirsiniz.</p>

<h2 id="zincirler-neden-asenkron-çalışır">Zincirler Neden Asenkron Çalışır?</h2>

<p>Servisler aynı programın fonksiyonları değildir. Aralarında ağ bağlantıları, kimlik doğrulama ve bekleme süreleri bulunur. Bazı tetikleyiciler değişiklikleri belirli aralıklarla kontrol eder; bazıları ise olay geldiğinde doğrudan haber verir. Bu ikinci yaklaşımın yaygın araçlarından biri <strong>webhook</strong> mekanizmasıdır.</p>

<p>Webhook, kabaca “Bir şey olduğunda şu adrese HTTP isteği gönder” anlaşmasıdır. Kapıyı sürekli kontrol etmek yerine zil takmak gibi düşünün. Yine de zilin çalması, içerideki herkesin işini tamamladığı anlamına gelmez!</p>

<p>Bir zincirin yaklaşık gecikmesi şöyle modellenebilir:</p>

\[T_{toplam} \approx \sum_{i=1}^{n}(T_{bekleme,i} + T_{işlem,i})\]

<p>Bu yüzden bildirim otomasyonları için uygun bir zincir, milisaniyelik tepki gerektiren kontrol sistemleri için uygun olmayabilir.</p>

<h2 id="uygulama-acil-github-kaydını-telefona-taşıyalım">Uygulama: Acil GitHub Kaydını Telefona Taşıyalım</h2>

<p>Örnek mimarimiz şöyle olsun: <strong>GitHub webhook → Python uygulaması → IFTTT Webhooks → telefon bildirimi</strong>. GitHub olayını alan uygulama, issue verisini inceler; yalnızca <code class="language-plaintext highlighter-rouge">urgent</code> etiketli kayıtları IFTTT’ye iletir.</p>

<p>IFTTT tarafında önce Webhooks servisindeki <strong>Receive a web request</strong> tetikleyicisini seçin. Olay adını <code class="language-plaintext highlighter-rouge">urgent_issue</code> yapın. Ardından Notifications servisindeki bildirim eylemini seçerek mesajda <code class="language-plaintext highlighter-rouge">Value1</code> ve <code class="language-plaintext highlighter-rouge">Value2</code> alanlarını kullanın. Webhooks anahtarınızı ortam değişkenine kaydedin; kaynak koduna veya herkese açık depoya koymayın.</p>

<p>Aşağıdaki fonksiyon, sunucunuzun doğruladığı webhook içeriğindeki <code class="language-plaintext highlighter-rouge">issue</code> nesnesini işler. <code class="language-plaintext highlighter-rouge">requests</code> paketinin kurulu olması gerekir:</p>

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

<span class="n">processed</span> <span class="o">=</span> <span class="nf">set</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">route_issue</span><span class="p">(</span><span class="n">issue</span><span class="p">):</span>
    <span class="n">issue_id</span> <span class="o">=</span> <span class="nf">str</span><span class="p">(</span><span class="n">issue</span><span class="p">[</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">])</span>
    <span class="n">labels</span> <span class="o">=</span> <span class="p">{</span><span class="n">item</span><span class="p">[</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">]</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">issue</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">labels</span><span class="sh">"</span><span class="p">,</span> <span class="p">[])}</span>

    <span class="k">if</span> <span class="sh">"</span><span class="s">urgent</span><span class="sh">"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">labels</span> <span class="ow">or</span> <span class="n">issue_id</span> <span class="ow">in</span> <span class="n">processed</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">atlandı</span><span class="sh">"</span>

    <span class="n">key</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">[</span><span class="sh">"</span><span class="s">IFTTT_WEBHOOK_KEY</span><span class="sh">"</span><span class="p">]</span>
    <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">https://maker.ifttt.com/trigger/urgent_issue/with/key/</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="sh">"</span>
    <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span>
        <span class="n">url</span><span class="p">,</span>
        <span class="n">json</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">value1</span><span class="sh">"</span><span class="p">:</span> <span class="n">issue</span><span class="p">[</span><span class="sh">"</span><span class="s">title</span><span class="sh">"</span><span class="p">],</span> <span class="sh">"</span><span class="s">value2</span><span class="sh">"</span><span class="p">:</span> <span class="n">issue</span><span class="p">[</span><span class="sh">"</span><span class="s">html_url</span><span class="sh">"</span><span class="p">]},</span>
        <span class="n">timeout</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
    <span class="p">)</span>
    <span class="n">response</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
    <span class="n">processed</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">issue_id</span><span class="p">)</span>
    <span class="k">return</span> <span class="sh">"</span><span class="s">iletildi</span><span class="sh">"</span>
</code></pre></div></div>

<p>Fonksiyon etiketi denetler, başlık ve bağlantıyı gönderir, başarılı HTTP yanıtından sonra kaydı işaretler. Bu yanıt, telefon bildiriminin kesin teslim edildiğini kanıtlamaz. GitHub webhook imzasının doğrulanması ve ilgili olay türlerinin seçilmesi, bu fonksiyonu çağıran sunucunun sorumluluğudur.</p>

<h2 id="sağlam-zincirin-görünmeyen-kuralları">Sağlam Zincirin Görünmeyen Kuralları</h2>

<p>Örnekteki bellek kümesi yalnızca prototip içindir: uygulama yeniden başladığında temizlenir ve eşzamanlı çağrılarda yarış koşullarını engellemez. Üretimde kalıcı kayıtlar ve atomik kontroller kullanın. Aynı girdinin tekrar işlenmesinin istenmeyen ek sonuç üretmemesine <strong>idempotent davranış</strong> denir.</p>

<table>
  <thead>
    <tr>
      <th>Risk</th>
      <th>Sonuç</th>
      <th>Önlem</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tekrarlanan olay</td>
      <td>Çift bildirim</td>
      <td>Kalıcı tekilleştirme</td>
    </tr>
    <tr>
      <td>Geçici bağlantı hatası</td>
      <td>Eksik işlem</td>
      <td>Gecikmeli yeniden deneme</td>
    </tr>
    <tr>
      <td>Servis kotası</td>
      <td>Reddedilen istek</td>
      <td>Kuyruk ve hız sınırı</td>
    </tr>
    <tr>
      <td>Döngüsel tetikleme</td>
      <td>Bitmeyen zincir</td>
      <td>Kaynak veya derinlik kontrolü</td>
    </tr>
  </tbody>
</table>

<p>Son olarak her adımı kaydedin, ancak anahtarları ve hassas verileri loglardan çıkarın. Başarısızlıkları görünür kılın ve yeniden denemeleri sınırlayın. İyi otomasyon, her şeyi körlemesine yapan değil; ne zaman duracağını da bilen dijital yardımcıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ifttt" /><category term="otomasyon" /><category term="webhook" /><category term="api" /><category term="olay-tabanlı-mimari" /><summary type="html"><![CDATA[Telefonunuz yağmur başlayınca sizi uyarsa, önemli bir GitHub kaydı açıldığında cebinize bildirim düşse nasıl olurdu? IFTTT, farklı servisleri birbirine bağlayarak bu küçük dijital yardımcıları kurmanızı sağlar. Ancak iyi otomasyon, yalnızca uygulamaları eşleştirmek değildir: olayların, koşulların ve yan etkilerin nasıl çalıştığını anlamaktır. Haydi domino taşlarını devirmeden önce doğru sıraya dizelim!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ifttt-ve-otomasyon-71.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ifttt-ve-otomasyon-71.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Konut Fiyat Tahmini: Konum ve Altyapı Verileriyle Emlak Değerini Öğrenmek</title><link href="https://program.sonsuz.us/posts/konut-fiyat-tahmini-konum-ve-altyapi-verileriyle-emlak-degerini-ogrenmek/" rel="alternate" type="text/html" title="Konut Fiyat Tahmini: Konum ve Altyapı Verileriyle Emlak Değerini Öğrenmek" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/konut-fiyat-tahmini-konum-ve-altyapi-verileriyle-emlak-degerini-ogrenmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/konut-fiyat-tahmini-konum-ve-altyapi-verileriyle-emlak-degerini-ogrenmek/"><![CDATA[<p>Aynı büyüklükteki iki daire neden bambaşka fiyatlara satılır? Cevap çoğu zaman duvarların içinde değil, mahallenin sokaklarında gizlidir. Metro erişimi, okul yakınlığı, altyapı kalitesi ve merkeze uzaklık, emlak değerini birlikte etkiler. Makine öğrenmesiyle bu ilişkileri veriden öğrenebiliriz; ancak modelimize yalnızca hesap makinesi değil, biraz şehircilik gözlüğü de takmalıyız.</p>

<p>``</p>

<h2 id="önce-mantık-fiyat-hangi-ilişkiden-doğar">Önce mantık: Fiyat hangi ilişkiden doğar?</h2>

<p>Konut fiyat tahmini, hedef değişkeni sayısal olan bir <strong>regresyon</strong> problemidir. Her konut bir gözlem; alan, bina yaşı ve ulaşım mesafeleri ise özelliklerdir. Temel düşünce şöyledir:</p>

\[y = f(X) + e\]

<p>Burada $y$ satış fiyatını, $X$ özellikleri, $f$ öğrenilen ilişkiyi, $e$ ise açıklanamayan etkileri temsil eder. Manzara, pazarlık veya ölçülmeyen yapı kalitesi bu hata payına katkıda bulunabilir.</p>

<p>Doğrusal regresyon, özelliklerin katkılarını ağırlıklı toplamla açıklar. Ağaç tabanlı modeller ise eşikler ve etkileşimler öğrenir: Metro yakınlığı, merkezdeki küçük bir daireyle çeperdeki büyük bir ev için aynı anlamı taşımayabilir. Ancak <strong>tahmin ilişkisi nedensellik değildir</strong>; metroya yakın evlerin pahalı olması, farkın tamamını metronun yarattığını kanıtlamaz.</p>

<h2 id="veriyi-şehrin-haritasıyla-buluşturmak">Veriyi şehrin haritasıyla buluşturmak</h2>

<p>Başlangıçta gerçekleşmiş satış kayıtlarını bina özellikleriyle birleştirin. İlan fiyatları kullanılabilir, fakat bunlar satış fiyatıyla aynı hedef değildir. Koordinatlardan ulaşım duraklarına, okullara ve hizmet noktalarına mesafe üretilebilir. Kuş uçuşu mesafe kolaydır; yol ağı üzerinden seyahat süresi ise günlük yaşamı daha iyi temsil edebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Temsil ettiği bilgi</th>
      <th>Dikkat noktası</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Alan ve bina yaşı</td>
      <td>Fiziksel nitelikler</td>
      <td>Eksik veya hatalı kayıtlar</td>
    </tr>
    <tr>
      <td>Metroya mesafe</td>
      <td>Ulaşım erişimi</td>
      <td>Yürüme güzergâhı önemlidir</td>
    </tr>
    <tr>
      <td>Merkeze mesafe</td>
      <td>Merkezi konum</td>
      <td>Şehirde birden çok merkez olabilir</td>
    </tr>
    <tr>
      <td>Altyapı puanı</td>
      <td>Hizmetlerin yeterliliği</td>
      <td>Kaynak ve ölçek açıklanmalı</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/konut-fiyat-tahmini-85.svg" alt="konut-fiyat-tahmini-85" /></p>

<p>Altyapı puanını ulaşım, internet ve belediye hizmetleri gibi bileşenlerden oluşturabilirsiniz. Bileşenleri ortak ölçeğe getirip ağırlıkları gerekçelendirin. Satış tarihinden sonra açılan metro hattını geçmiş satışa eklemeyin: Modelin geleceği görmesi başarı değil, <strong>veri sızıntısıdır</strong>. Farklı tarihlerdeki fiyatları da uygun bir endeksle ortak döneme taşımayı değerlendirin.</p>

<h2 id="hangi-modelle-başlayalım">Hangi modelle başlayalım?</h2>

<p>Önce basit bir referans model kurun; ardından karmaşıklığın gerçekten fayda sağlayıp sağlamadığını ölçün.</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>Güçlü tarafı</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ridge regresyon</td>
      <td>Hızlı, anlaşılır başlangıç</td>
      <td>Karmaşık ilişkileri kaçırabilir</td>
    </tr>
    <tr>
      <td>Random Forest</td>
      <td>Etkileşimleri yakalar</td>
      <td>Eğitim aralığı dışına zayıf geneller</td>
    </tr>
    <tr>
      <td>Gradient Boosting</td>
      <td>Tablo verilerinde güçlü aday</td>
      <td>Ayarlara ve doğrulamaya duyarlıdır</td>
    </tr>
  </tbody>
</table>

<p>Ridge için sayısal özellikleri ölçeklemek yararlıdır. Ağaçlar genellikle buna ihtiyaç duymaz. Hiçbir modelin bütün şehirlerde kazanacağına dair garanti yoktur; yarışmanın hakemi doğrulama verisidir, modelin havalı adı değil.</p>

<h2 id="python-ile-bölgesel-test">Python ile bölgesel test</h2>

<p>Aşağıdaki örnek, belirtilen sütunları içeren bir CSV dosyası bekler. Mahalleleri eğitim ve test arasında ayırarak modelin görmediği bölgelerdeki başarısını sınar. Mahalle kodu tahmin özelliği değil, ayırma grubu olarak kullanılır.</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.preprocessing</span> <span class="kn">import</span> <span class="n">OneHotEncoder</span>
<span class="kn">from</span> <span class="n">sklearn.pipeline</span> <span class="kn">import</span> <span class="n">Pipeline</span>
<span class="kn">from</span> <span class="n">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">RandomForestRegressor</span>
<span class="kn">from</span> <span class="n">sklearn.model_selection</span> <span class="kn">import</span> <span class="n">GroupShuffleSplit</span>
<span class="kn">from</span> <span class="n">sklearn.metrics</span> <span class="kn">import</span> <span class="n">mean_absolute_error</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">konutlar.csv</span><span class="sh">"</span><span class="p">).</span><span class="nf">dropna</span><span class="p">(</span>
    <span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">fiyat_tl</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">mahalle_kodu</span><span class="sh">"</span><span class="p">]</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">alan_m2</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">bina_yasi</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">merkeze_km</span><span class="sh">"</span><span class="p">,</span>
       <span class="sh">"</span><span class="s">metroya_m</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">okula_m</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">altyapi_puani</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">yapi_tipi</span><span class="sh">"</span><span class="p">]</span>
<span class="n">X</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">num</span> <span class="o">+</span> <span class="n">cat</span><span class="p">],</span> <span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">fiyat_tl</span><span class="sh">"</span><span class="p">]</span>

<span class="n">categorical</span> <span class="o">=</span> <span class="nc">Pipeline</span><span class="p">([</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">fill</span><span class="sh">"</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="p">(</span><span class="sh">"</span><span class="s">encode</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="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">numeric</span><span class="sh">"</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="n">num</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">categorical</span><span class="sh">"</span><span class="p">,</span> <span class="n">categorical</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="nc">Pipeline</span><span class="p">([</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">prep</span><span class="sh">"</span><span class="p">,</span> <span class="n">prep</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">forest</span><span class="sh">"</span><span class="p">,</span> <span class="nc">RandomForestRegressor</span><span class="p">(</span>
        <span class="n">n_estimators</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span> <span class="n">min_samples_leaf</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
        <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=-</span><span class="mi">1</span><span class="p">))</span>
<span class="p">])</span>
<span class="n">split</span> <span class="o">=</span> <span class="nc">GroupShuffleSplit</span><span class="p">(</span><span class="n">test_size</span><span class="o">=</span><span class="mf">0.2</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">)</span>
<span class="n">train</span><span class="p">,</span> <span class="n">test</span> <span class="o">=</span> <span class="nf">next</span><span class="p">(</span><span class="n">split</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">mahalle_kodu</span><span class="sh">"</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">X</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">train</span><span class="p">],</span> <span class="n">y</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">train</span><span class="p">])</span>
<span class="n">pred</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="n">X</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">test</span><span class="p">])</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">MAE (TL):</span><span class="sh">"</span><span class="p">,</span> <span class="nf">mean_absolute_error</span><span class="p">(</span><span class="n">y</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">test</span><span class="p">],</span> <span class="n">pred</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Pipeline</code>, eksik değer doldurma ve kategori kodlama işlemlerini yalnızca eğitim verisinden öğrenir. Böylece test verisi hazırlık aşamasına sızmaz. <code class="language-plaintext highlighter-rouge">min_samples_leaf</code>, çok küçük örnek gruplarına aşırı uyumu sınırlar.</p>

<h2 id="sonucu-doğru-okumak">Sonucu doğru okumak</h2>

<p>Ortalama mutlak hata, tahminlerin fiyatlardan ortalama ne kadar saptığını gösterir:</p>

\[MAE = \frac{1}{n}\sum_{i=1}^{n}\vert y_i-\hat{y}_i\vert\]

<p>MAE’yi testte, eğitim fiyatlarının medyanını sürekli tahmin eden basit referansla karşılaştırın. Bölge ve fiyat dilimi bazında hataları da inceleyin; genel ortalama, pahalı konutlardaki başarısızlığı gizleyebilir.</p>

<p>Komşu mahalleler hâlâ birbirine benzeyebilir. Daha güçlü değerlendirme için coğrafi tamponlar, birden fazla bölgesel bölme ve gelecekteki satışları sınayan zamansal test kullanın. Hiperparametreleri eğitim içindeki doğrulamayla seçin; nihai testi saklı tutun.</p>

<p>Sonuçta model, otomatik ekspertiz sertifikası değil, karar destek aracıdır. Güvenilir tahmin; temiz veri, gerçekçi test ve açıklanabilir hata analiziyle gelir. Şehrin ritmini öğrenmek, yalnızca daha büyük bir algoritma çalıştırmaktan önemlidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="makine öğrenmesi" /><category term="konut fiyatları" /><category term="konum verisi" /><category term="veri bilimi" /><category term="python" /><category term="scikit-learn" /><summary type="html"><![CDATA[Aynı büyüklükteki iki daire neden bambaşka fiyatlara satılır? Cevap çoğu zaman duvarların içinde değil, mahallenin sokaklarında gizlidir. Metro erişimi, okul yakınlığı, altyapı kalitesi ve merkeze uzaklık, emlak değerini birlikte etkiler. Makine öğrenmesiyle bu ilişkileri veriden öğrenebiliriz; ancak modelimize yalnızca hesap makinesi değil, biraz şehircilik gözlüğü de takmalıyız.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/konut-fiyat-tahmini-85.png" /><media:content medium="image" url="https://program.sonsuz.us/img/konut-fiyat-tahmini-85.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kredi Skorlama Algoritmaları: Bilgisayar Kredi Riskinizi Nasıl Hesaplıyor?</title><link href="https://program.sonsuz.us/posts/kredi-skorlama-algoritmalari-bilgisayar-kredi-riskinizi-nasil-hesapliyor/" rel="alternate" type="text/html" title="Kredi Skorlama Algoritmaları: Bilgisayar Kredi Riskinizi Nasıl Hesaplıyor?" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kredi-skorlama-algoritmalari-bilgisayar-kredi-riskinizi-nasil-hesapliyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/kredi-skorlama-algoritmalari-bilgisayar-kredi-riskinizi-nasil-hesapliyor/"><![CDATA[<p>Bilgisayar kredi başvurunuzu değerlendirirken geleceği gören dijital bir falcıya dönüşmez. Geçmiş verilerdeki örüntülerden yararlanarak belirli bir sürede borcun geri ödenmeme olasılığını tahmin eder. Yani yaptığı şey, karakterinizi puanlamak değil; belirsizliği sayıya çevirmektir. Peki bu sayı nasıl üretilir ve neden bazen yanıltıcı olabilir?</p>

<p><img src="/img/kredi-skorlama-algoritmalari-88.svg" alt="kredi-skorlama-algoritmalari-88" /></p>

<p>``</p>

<h2 id="önce-hedef-hangi-riski-ölçüyoruz">Önce hedef: Hangi riski ölçüyoruz?</h2>

<p>Kredi skorlama genellikle bir <strong>ikili sınıflandırma</strong> problemidir. Örneğin hedef, kredi açıldıktan sonraki 12 ay içinde müşterinin temerrüde düşüp düşmeyeceğini tahmin etmektir. Temerrüdün tanımı baştan belirlenmelidir; örneğin ödemenin 90 günü aşan gecikmesi kullanılabilir.</p>

<p>Modelin çıktısı çoğunlukla <strong>temerrüt olasılığıdır</strong>, yani PD. Lojistik regresyonda önce özelliklerin ağırlıklı toplamı hesaplanır, ardından sonuç sigmoid fonksiyonuyla olasılığa dönüştürülür:</p>

\[z=b+w_1x_1+w_2x_2+\cdots+w_nx_n\]

\[PD=\frac{1}{1+e^{-z}}\]

<p>Burada $x_i$ müşteri özelliklerini, $w_i$ öğrenilen ağırlıkları, $b$ ise sabit terimi temsil eder. Sigmoid, herhangi bir gerçek sayıyı sıfır ile bir arasına sıkıştırır. Ancak bu çıktının güvenilir bir olasılık olması, modelin ayrıca değerlendirilmesini ve gerektiğinde kalibre edilmesini gerektirir.</p>

<h2 id="her-risk-aynı-parasal-kayıp-değildir">Her risk aynı parasal kayıp değildir</h2>

<p>Temerrüt olasılığı tek başına bankanın kaybını anlatmaz. Beklenen kayıp için üç bileşen kullanılır:</p>

\[EL=PD\times LGD\times EAD\]

<p><strong>LGD</strong>, temerrüt halinde kaybedilecek pay; <strong>EAD</strong>, temerrüt anındaki risk tutarıdır. Örneğin PD yüzde 4, LGD yüzde 50 ve EAD 100.000 TL ise beklenen kayıp 2.000 TL olur. Bu, belirli bir müşterinin kesin kaybı değil, benzer durumların ortalamasına ilişkin tahmindir.</p>

<h2 id="modelin-masasına-hangi-veriler-gelir">Modelin masasına hangi veriler gelir?</h2>

<p>Önemli olan yalnızca veri toplamak değil, başvuru anında gerçekten bilinen verileri kullanmaktır. Gelecekteki bir gecikmeyi özelliklere eklemek, sınavdan önce cevap anahtarını görmek gibidir: Buna <strong>veri sızıntısı</strong> denir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Ne anlatır?</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Borç/gelir oranı</td>
      <td>Ödeme yükünün gelire oranı</td>
      <td>Gelirin doğruluğu önemlidir</td>
    </tr>
    <tr>
      <td>Geçmiş gecikmeler</td>
      <td>Önceki ödeme davranışı</td>
      <td>Yalnızca geçmiş kayıtlar kullanılmalıdır</td>
    </tr>
    <tr>
      <td>Limit kullanım oranı</td>
      <td>Kullanılan limitin toplam limite oranı</td>
      <td>Dönemsel dalgalanmalar yanıltabilir</td>
    </tr>
  </tbody>
</table>

<p>Düşük gelir otomatik olarak yüksek risk demek değildir. Borç yükü, ödeme düzeni ve ürün özellikleri birlikte değerlendirilir. Ayrıca eğitim verisi yalnızca geçmişte kredi verilen kişilerden oluşuyorsa, reddedilen başvurular hakkında modelin bilgisi sınırlıdır.</p>

<h2 id="hangi-algoritma-daha-iyi">Hangi algoritma daha iyi?</h2>

<p>Tek bir şampiyon yoktur. Seçim, tahmin başarısı kadar açıklanabilirlik ve bakım maliyetine de bağlıdır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü yönü</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Puan kartı</td>
      <td>Kararları açıklamak kolaydır</td>
      <td>Karmaşık ilişkileri sınırlı yakalar</td>
    </tr>
    <tr>
      <td>Lojistik regresyon</td>
      <td>Basit, güçlü bir başlangıçtır</td>
      <td>Etkileşimler ayrıca modellenebilir</td>
    </tr>
    <tr>
      <td>Gradyan artırmalı ağaçlar</td>
      <td>Doğrusal olmayan örüntüleri yakalar</td>
      <td>Açıklama ve kalibrasyon dikkat ister</td>
    </tr>
  </tbody>
</table>

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

<p>Aşağıdaki örnek, varsayımsal bir CSV dosyasındaki sayısal özelliklerle model kurar. <code class="language-plaintext highlighter-rouge">temerrut_12ay</code> hedefi 0 veya 1 olmalıdır. Satırlar başvuru tarihine göre sıralanarak daha yeni dönem test için ayrılır.</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.pipeline</span> <span class="kn">import</span> <span class="n">make_pipeline</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.preprocessing</span> <span class="kn">import</span> <span class="n">StandardScaler</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">roc_auc_score</span><span class="p">,</span> <span class="n">brier_score_loss</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">kredi_ornek.csv</span><span class="sh">"</span><span class="p">,</span> <span class="n">parse_dates</span><span class="o">=</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">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">sort_values</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">features</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">borc_gelir</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">gecikme_sayisi</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">limit_kullanimi</span><span class="sh">"</span><span class="p">]</span>
<span class="n">cut</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">df</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.8</span><span class="p">)</span>
<span class="n">train</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">iloc</span><span class="p">[:</span><span class="n">cut</span><span class="p">],</span> <span class="n">df</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="n">cut</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="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="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="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">temerrut_12ay</span><span class="sh">"</span><span class="p">])</span>
<span class="n">pd_hat</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">ROC-AUC:</span><span class="sh">"</span><span class="p">,</span> <span class="nf">roc_auc_score</span><span class="p">(</span><span class="n">test</span><span class="p">[</span><span class="sh">"</span><span class="s">temerrut_12ay</span><span class="sh">"</span><span class="p">],</span> <span class="n">pd_hat</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Brier:</span><span class="sh">"</span><span class="p">,</span> <span class="nf">brier_score_loss</span><span class="p">(</span><span class="n">test</span><span class="p">[</span><span class="sh">"</span><span class="s">temerrut_12ay</span><span class="sh">"</span><span class="p">],</span> <span class="n">pd_hat</span><span class="p">))</span>
</code></pre></div></div>

<p>Pipeline, eksik değer doldurma ve ölçekleme parametrelerini yalnızca eğitim verisinden öğrenir. ROC-AUC sıralama başarısını, Brier skoru olasılık tahminlerinin hatasını ölçer. Gerçek uygulamada eğitim etiketlerinin test dönemi başlamadan olgunlaşması ve aynı müşterinin tekrarlarının sızıntı yaratmaması ayrıca kontrol edilmelidir.</p>

<h2 id="skor-kararın-tamamı-değildir">Skor kararın tamamı değildir</h2>

<p>Temerrüt nadirse doğruluk yanıltabilir: Herkese “öder” diyen model bile başarılı görünebilir. PR-AUC, kalibrasyon ve farklı müşteri gruplarındaki hata oranları da incelenmelidir. Kredi verme eşiği ise maliyetler, risk politikası ve mevzuatla belirlenir.</p>

<p>Hassas özellikleri çıkarmak tek başına adaleti garanti etmez; diğer değişkenler bunların vekili olabilir. Veri gizliliği, anlaşılır gerekçeler ve itiraz süreçleri önemlidir. Ekonomi değiştikçe model de izlenmelidir. Kısacası iyi skorlama, yalnızca akıllı algoritma değil; temiz veri, dürüst ölçüm ve sorumlu karar sürecidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kredi skorlama" /><category term="makine öğrenmesi" /><category term="finans" /><category term="lojistik regresyon" /><category term="veri bilimi" /><category term="algoritmik adalet" /><summary type="html"><![CDATA[Bilgisayar kredi başvurunuzu değerlendirirken geleceği gören dijital bir falcıya dönüşmez. Geçmiş verilerdeki örüntülerden yararlanarak belirli bir sürede borcun geri ödenmeme olasılığını tahmin eder. Yani yaptığı şey, karakterinizi puanlamak değil; belirsizliği sayıya çevirmektir. Peki bu sayı nasıl üretilir ve neden bazen yanıltıcı olabilir?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kredi-skorlama-algoritmalari-88.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kredi-skorlama-algoritmalari-88.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>