<?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-10-30T18:05:53+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">Açık Veri Portalları: Şehir Verisi Vatandaşla Nasıl Buluşur?</title><link href="https://program.sonsuz.us/posts/acik-veri-portallari-sehir-verisi-vatandasla-nasil-bulusur/" rel="alternate" type="text/html" title="Açık Veri Portalları: Şehir Verisi Vatandaşla Nasıl Buluşur?" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/acik-veri-portallari-sehir-verisi-vatandasla-nasil-bulusur</id><content type="html" xml:base="https://program.sonsuz.us/posts/acik-veri-portallari-sehir-verisi-vatandasla-nasil-bulusur/"><![CDATA[<p>Bir şehir her gün devasa miktarda veri üretir: otobüslerin konumu, hava kalitesi, yol çalışmaları, bütçe harcamaları, park doluluk oranları ve hatta hangi mahallede kaç ağaç bulunduğu… Belediyeler bu verileri yalnızca kurum içinde saklamak yerine açık veri portalları ve API’ler aracılığıyla paylaşabilir. Böylece vatandaşlar, araştırmacılar ve yazılımcılar şehrin dijital hazinesinden yararlanarak yeni uygulamalar geliştirebilir.</p>

<p><img src="/img/acik-veri-portallari-40.svg" alt="acik-veri-portallari-40" /></p>

<p>``</p>

<h2 id="açık-veri-nedir">Açık veri nedir?</h2>

<p>Açık veri; herkesin erişebildiği, kullanabildiği, değiştirebildiği ve uygun lisans koşullarıyla yeniden paylaşabildiği veridir. Bir Excel dosyasını belediyenin sitesine yüklemek başlangıç sayılabilir, ancak gerçek anlamda kullanılabilir veri için makine tarafından okunabilir formatlar gerekir.</p>

<p>Bir veri kümesinin faydasını basitçe şöyle düşünebiliriz:</p>

\[F = E \times G \times A\]

<p>Burada $E$ erişilebilirliği, $G$ güncelliği, $A$ ise anlaşılabilirliği temsil eder. Çarpanlardan biri sıfıra yaklaşırsa toplam fayda da düşer. Örneğin güncel olmayan otobüs konumları, teknik olarak erişilebilir olsa bile yolcuyu yanlış durağa koşturabilir!</p>

<table>
  <thead>
    <tr>
      <th>Paylaşım yöntemi</th>
      <th style="text-align: right">Güncellik</th>
      <th style="text-align: right">Yazılımla kullanım</th>
      <th>Uygun senaryo</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>PDF raporu</td>
      <td style="text-align: right">Düşük</td>
      <td style="text-align: right">Zor</td>
      <td>Yıllık faaliyet raporları</td>
    </tr>
    <tr>
      <td>CSV dosyası</td>
      <td style="text-align: right">Orta</td>
      <td style="text-align: right">Kolay</td>
      <td>Bütçe ve istatistik verileri</td>
    </tr>
    <tr>
      <td>REST API</td>
      <td style="text-align: right">Yüksek</td>
      <td style="text-align: right">Çok kolay</td>
      <td>Ulaşım ve sensör verileri</td>
    </tr>
    <tr>
      <td>GeoJSON</td>
      <td style="text-align: right">Yüksek</td>
      <td style="text-align: right">Çok kolay</td>
      <td>Harita ve konum uygulamaları</td>
    </tr>
  </tbody>
</table>

<h2 id="belediye-apisi-nasıl-çalışır">Belediye API’si nasıl çalışır?</h2>

<p>API, belediyenin veri sistemleri ile dışarıdaki uygulamalar arasında kontrollü bir köprü kurar. İstemci belirli bir adrese HTTP isteği gönderir; sunucu çoğunlukla JSON biçiminde yanıt verir. Örneğin <code class="language-plaintext highlighter-rouge">/api/v1/otobusler</code> adresi araç listesini, <code class="language-plaintext highlighter-rouge">/api/v1/otobusler/34</code> adresi ise belirli bir aracı döndürebilir.</p>

<p>Arka planda tipik akış şu şekildedir:</p>

<ol>
  <li>Sensörler veya belediye birimleri ham veriyi üretir.</li>
  <li>ETL süreci veriyi temizler, standartlaştırır ve doğrular.</li>
  <li>Kişisel ya da hassas alanlar anonimleştirilir.</li>
  <li>API katmanı yalnızca paylaşılması uygun alanları sunar.</li>
  <li>Portal; açıklama, lisans, güncelleme tarihi ve örnek sorgular yayımlar.</li>
</ol>

<p>Bir geliştirici, durak verisini Python ile şöyle kullanabilir:</p>

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

<span class="n">url</span> <span class="o">=</span> <span class="sh">'</span><span class="s">https://veri.ornek.bel.tr/api/v1/duraklar</span><span class="sh">'</span>
<span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="sh">'</span><span class="s">ilce</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">merkez</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">limit</span><span class="sh">'</span><span class="p">:</span> <span class="mi">10</span><span class="p">}</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</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="k">for</span> <span class="n">durak</span> <span class="ow">in</span> <span class="n">response</span><span class="p">.</span><span class="nf">json</span><span class="p">()[</span><span class="sh">'</span><span class="s">results</span><span class="sh">'</span><span class="p">]:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">durak</span><span class="p">[</span><span class="sh">'</span><span class="s">ad</span><span class="sh">'</span><span class="p">],</span> <span class="n">durak</span><span class="p">[</span><span class="sh">'</span><span class="s">konum</span><span class="sh">'</span><span class="p">])</span>
</code></pre></div></div>

<p>Bu kod API’ye filtreli bir GET isteği gönderir, bağlantı hatalarını denetler ve dönen ilk on durağın adını ve konumunu yazdırır. Gerçek projelerde sayfalama, önbellekleme ve istek sınırı bilgileri de dikkate alınmalıdır.</p>

<h2 id="şeffaflık-kadar-mahremiyet-de-önemli">Şeffaflık kadar mahremiyet de önemli</h2>

<p>Her belediye verisi açılmamalıdır. Kişilerin adresleri, sağlık bilgileri, araç plakaları veya hareket geçmişleri doğrudan paylaşılırsa açık veri faydadan çok zarar üretebilir. Bu nedenle isim kaldırma tek başına yeterli değildir; farklı veri kümeleri birleştirildiğinde kişinin yeniden tanınması mümkün olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Açılabilecek veri</th>
      <th>Korunması gereken veri</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mahalle bazlı nüfus istatistiği</td>
      <td>Kişi ve açık adres listesi</td>
    </tr>
    <tr>
      <td>Anlık toplu taşıma konumu</td>
      <td>Bireysel seyahat geçmişi</td>
    </tr>
    <tr>
      <td>Toplam belediye harcaması</td>
      <td>Personelin banka bilgileri</td>
    </tr>
    <tr>
      <td>Ölçüm istasyonu hava kalitesi</td>
      <td>Vatandaşa ait sağlık kaydı</td>
    </tr>
  </tbody>
</table>

<p>API anahtarları, hız sınırlama, anonimleştirme ve erişim kayıtları güvenliğin temel araçlarıdır. Ayrıca veri lisansı açıkça belirtilmelidir; “internette bulunuyor” ifadesi, verinin sınırsızca kullanılabileceği anlamına gelmez.</p>

<h2 id="vatandaş-için-gerçek-değer">Vatandaş için gerçek değer</h2>

<p>İyi tasarlanmış bir portal yalnızca dosya deposu değildir. Veri sözlüğü, sürüm bilgisi, API dokümantasyonu, hata bildirim kanalı ve örnek projeler sunar. Bunun sonucunda erişilebilir rota uygulamaları, mahalle bütçesi panoları, hava kalitesi uyarıları veya boş otopark haritaları geliştirilebilir.</p>

<p>Kısacası şehir verisi paylaşıldığında belediye tek üretici olmaktan çıkar; vatandaşlar da çözüm ortağına dönüşür. Doğru standartlar, güncel API’ler ve güçlü mahremiyet kuralları sayesinde açık veri, dijital şehrin vitrini değil çalışan motoru olabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="açık veri" /><category term="api" /><category term="belediye" /><category term="akıllı şehir" /><category term="veri güvenliği" /><category term="şehircilik" /><summary type="html"><![CDATA[Bir şehir her gün devasa miktarda veri üretir: otobüslerin konumu, hava kalitesi, yol çalışmaları, bütçe harcamaları, park doluluk oranları ve hatta hangi mahallede kaç ağaç bulunduğu… Belediyeler bu verileri yalnızca kurum içinde saklamak yerine açık veri portalları ve API’ler aracılığıyla paylaşabilir. Böylece vatandaşlar, araştırmacılar ve yazılımcılar şehrin dijital hazinesinden yararlanarak yeni uygulamalar geliştirebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/acik-veri-portallari-40.png" /><media:content medium="image" url="https://program.sonsuz.us/img/acik-veri-portallari-40.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Akıllı Aydınlatmada Scene Programlama: Tek Komutla Işık Orkestrası</title><link href="https://program.sonsuz.us/posts/akilli-aydinlatmada-scene-programlama-tek-komutla-isik-orkestrasi/" rel="alternate" type="text/html" title="Akıllı Aydınlatmada Scene Programlama: Tek Komutla Işık Orkestrası" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-aydinlatmada-scene-programlama-tek-komutla-isik-orkestrasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-aydinlatmada-scene-programlama-tek-komutla-isik-orkestrasi/"><![CDATA[<p><img src="/img/akilli-aydinlatmada-scene-22.svg" alt="akilli-aydinlatmada-scene-22" /></p>

<p>Bir odadaki beş farklı lambayı film izlemeye uygun hâle getirmek için her birini ayrı ayrı ayarladığınızı düşünün: tavan ışığını kıs, lambaderi mora çevir, LED şeridi yak… Akıllı aydınlatma sistemlerindeki <strong>scene</strong>, yani sahne yaklaşımı, bu küçük kumanda maratonunu tek komuta indirir. “Sinema” sahnesini çağırdığınızda bütün ışıklar önceden belirlenen renk, parlaklık ve geçiş sürelerine senkronize biçimde ulaşır.</p>

<p>``</p>

<h2 id="scene-tam-olarak-nedir">Scene tam olarak nedir?</h2>

<p>Scene, bir veya daha fazla cihazın hedef durumlarını saklayan mantıksal bir anlık görüntüdür. Bir sahne çalıştırıldığında sistem ilgili cihazlara <code class="language-plaintext highlighter-rouge">açık/kapalı</code>, parlaklık, renk sıcaklığı veya RGB değeri gibi komutlar gönderir.</p>

<p>Bir ışığın basitleştirilmiş durumu şöyle gösterilebilir:</p>

\[L_i = (p_i, b_i, r_i, g_i, b_i', t_i)\]

<p>Burada $p_i$ güç durumunu, $b_i$ parlaklığı, $(r_i,g_i,b_i’)$ renk bileşenlerini, $t_i$ ise geçiş süresini temsil eder. Bir sahne de $n$ adet ışığın durum kümesidir:</p>

\[S = \{L_1, L_2, \ldots, L_n\}\]

<p>Yani scene komutu sihir değil; önceden tanımlanmış durumların topluca uygulanmasıdır. Yine de salon bir anda bilim kurgu filmine dönüşünce biraz sihirli görünebilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th style="text-align: right">Komut sayısı</th>
      <th>Tutarlılık</th>
      <th>Kullanım örneği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tekil kontrol</td>
      <td style="text-align: right">Her ışık için ayrı</td>
      <td>Kullanıcıya bağlı</td>
      <td>Okuma lambasını açmak</td>
    </tr>
    <tr>
      <td>Scene</td>
      <td style="text-align: right">Genellikle tek</td>
      <td>Yüksek</td>
      <td>Sinema veya yemek modu</td>
    </tr>
    <tr>
      <td>Otomasyon</td>
      <td style="text-align: right">Koşula bağlı</td>
      <td>Kurallara bağlı</td>
      <td>Gün batınca sahneyi çağırmak</td>
    </tr>
  </tbody>
</table>

<h2 id="senkronizasyon-nasıl-sağlanır">Senkronizasyon nasıl sağlanır?</h2>

<p>Merkezî sistem önce sahne tanımını okur, ardından komutları ağ üzerinden ampullere veya köprüye iletir. Zigbee gibi ağlarda grup adresleme kullanılıyorsa tek yayın mesajı aynı gruptaki cihazlara ulaşabilir. Wi-Fi tabanlı sistemlerde ise komutlar çoğunlukla ayrı ayrı gönderilir.</p>

<p>Gerçek dünyada “aynı anda” ifadesi yaklaşık bir hedeftir. Cihaz $i$ için toplam gecikme şöyle modellenebilir:</p>

\[T_i = T_{işleme} + T_{ağ} + T_{cihaz}\]

<p>Işıklar arasındaki fark $\Delta T = \max(T_i)-\min(T_i)$ küçüldükçe geçiş daha senkron görünür. Grup mesajları, yerel ağ kullanımı ve ortak geçiş süresi bu farkı azaltır. Bulut üzerinden çalışan çözümlerde internet gecikmesi, orkestraya geç kalan bir trompetçi ekleyebilir.</p>

<h2 id="home-assistant-ile-örnek-sahne">Home Assistant ile örnek sahne</h2>

<p>Aşağıdaki YAML tanımı, üç ışığın hedef özelliklerini saklar. <code class="language-plaintext highlighter-rouge">transition</code> alanı değişimin iki saniyede yumuşak biçimde yapılmasını sağlar.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">scene</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Sinema Modu</span>
    <span class="na">entities</span><span class="pi">:</span>
      <span class="na">light.tavan</span><span class="pi">:</span>
        <span class="na">state</span><span class="pi">:</span> <span class="s2">"</span><span class="s">off"</span>
      <span class="na">light.lambader</span><span class="pi">:</span>
        <span class="na">state</span><span class="pi">:</span> <span class="s2">"</span><span class="s">on"</span>
        <span class="na">brightness</span><span class="pi">:</span> <span class="m">65</span>
        <span class="na">rgb_color</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">90</span><span class="pi">,</span> <span class="nv">30</span><span class="pi">,</span> <span class="nv">140</span><span class="pi">]</span>
        <span class="na">transition</span><span class="pi">:</span> <span class="m">2</span>
      <span class="na">light.tv_seridi</span><span class="pi">:</span>
        <span class="na">state</span><span class="pi">:</span> <span class="s2">"</span><span class="s">on"</span>
        <span class="na">brightness</span><span class="pi">:</span> <span class="m">110</span>
        <span class="na">color_temp_kelvin</span><span class="pi">:</span> <span class="m">3000</span>
        <span class="na">transition</span><span class="pi">:</span> <span class="m">2</span>
</code></pre></div></div>

<p>Sahneyi bir otomasyondan, panelden veya sesli asistandan çağırabiliriz:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">service</span><span class="pi">:</span> <span class="s">scene.turn_on</span>
<span class="na">target</span><span class="pi">:</span>
  <span class="na">entity_id</span><span class="pi">:</span> <span class="s">scene.sinema_modu</span>
<span class="na">data</span><span class="pi">:</span>
  <span class="na">transition</span><span class="pi">:</span> <span class="m">2</span>
</code></pre></div></div>

<p>İlk blok <strong>hangi durumun oluşturulacağını</strong>, ikinci blok ise <strong>bu durumun ne zaman uygulanacağını</strong> ifade eder. Bu ayrım önemlidir: Scene durum tarif eder; otomasyon ise tetikleyici ve koşullarla karar verir.</p>

<h2 id="mqtt-ile-kendi-denetleyicini-yazmak">MQTT ile kendi denetleyicini yazmak</h2>

<p>Özel bir IoT projesinde sahne, JSON olarak MQTT konusuna yayınlanabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">json</span>
<span class="kn">import</span> <span class="n">paho.mqtt.publish</span> <span class="k">as</span> <span class="n">publish</span>

<span class="n">scene</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">group</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">salon</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">brightness</span><span class="sh">"</span><span class="p">:</span> <span class="mi">35</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">color</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">r</span><span class="sh">"</span><span class="p">:</span> <span class="mi">80</span><span class="p">,</span> <span class="sh">"</span><span class="s">g</span><span class="sh">"</span><span class="p">:</span> <span class="mi">20</span><span class="p">,</span> <span class="sh">"</span><span class="s">b</span><span class="sh">"</span><span class="p">:</span> <span class="mi">130</span><span class="p">},</span>
    <span class="sh">"</span><span class="s">transition_ms</span><span class="sh">"</span><span class="p">:</span> <span class="mi">2000</span>
<span class="p">}</span>

<span class="n">publish</span><span class="p">.</span><span class="nf">single</span><span class="p">(</span>
    <span class="sh">"</span><span class="s">home/lights/scene</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">payload</span><span class="o">=</span><span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">scene</span><span class="p">),</span>
    <span class="n">hostname</span><span class="o">=</span><span class="sh">"</span><span class="s">192.168.1.20</span><span class="sh">"</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Bu kod sahne verisini tek mesaj hâlinde yayımlar. Abone olan denetleyici mesajı ayrıştırıp ilgili ışıklara uygular. Üretim ortamında kimlik doğrulama, TLS, hata kontrolü ve çevrimdışı cihaz yönetimi de eklenmelidir.</p>

<h2 id="sağlam-sahneler-için-ipuçları">Sağlam sahneler için ipuçları</h2>

<ul>
  <li>Cihazları işlevlerine göre gruplandırın.</li>
  <li>Bulut yerine mümkünse yerel kontrol kullanın.</li>
  <li>Tüm ışıklara ortak geçiş süresi verin.</li>
  <li>Erişilemeyen cihazlarda işlemi tamamen durdurmak yerine kalanları çalıştırın.</li>
  <li>Sahnenin mevcut ayarları mı kaydedeceğine, sabit değerler mi kullanacağına karar verin.</li>
</ul>

<p>İyi tasarlanmış bir scene sistemi, karmaşık cihaz ayrıntılarını kullanıcıdan saklar. Kullanıcı yalnızca “Çalışma”, “Parti” veya “Uyku” der; arka plandaki yazılım ise ışık orkestrasının şefliğini üstlenir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="akıllı aydınlatma" /><category term="scene programlama" /><category term="iot" /><category term="otomasyon" /><category term="mqtt" /><category term="home assistant" /><summary type="html"><![CDATA[Bir odadaki beş farklı lambayı film izlemeye uygun hâle getirmek için her birini ayrı ayrı ayarladığınızı düşünün: tavan ışığını kıs, lambaderi mora çevir, LED şeridi yak… Akıllı aydınlatma sistemlerindeki scene, yani sahne yaklaşımı, bu küçük kumanda maratonunu tek komuta indirir. “Sinema” sahnesini çağırdığınızda bütün ışıklar önceden belirlenen renk, parlaklık ve geçiş sürelerine senkronize biçimde ulaşır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-aydinlatmada-scene-22.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-aydinlatmada-scene-22.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Akıllı Evin Ortak Dili: Zigbee, Z-Wave ve Matter Karşılaştırması</title><link href="https://program.sonsuz.us/posts/akilli-evin-ortak-dili-zigbee-z-wave-ve-matter-karsilastirmasi/" rel="alternate" type="text/html" title="Akıllı Evin Ortak Dili: Zigbee, Z-Wave ve Matter Karşılaştırması" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-evin-ortak-dili-zigbee-z-wave-ve-matter-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-evin-ortak-dili-zigbee-z-wave-ve-matter-karsilastirmasi/"><![CDATA[<p>Bir hareket sensörü lambaya “Biri geldi!” derken, termostat kombiden yardım ister. Peki farklı markaların cihazları aynı evde birbirini nasıl anlar? Akıllı ev protokolleri, bu dijital apartmanın haberleşme kurallarını belirler. Zigbee, Z-Wave ve Matter ise benzer ihtiyaçları farklı katmanlarda çözer. Doğru seçim, yalnızca kutudaki logoya bakmaktan biraz daha fazlasını gerektirir.</p>

<p>``</p>

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

<p>Haberleşmenin iki temel sorusu vardır: “Veriyi nasıl taşıyoruz?” ve “Taşınan veri ne anlama geliyor?” Radyo teknolojisi ilk soruya, uygulama protokolü ikinci soruya yanıt verir. Ortak frekans kullanmak, ortak dili konuşmak anlamına gelmez; cihazların komutları, güvenlik kurallarını ve katılım süreçlerini de anlaması gerekir.</p>

<p>Zigbee ve Z-Wave kendi ağ ve uygulama yapılarını sunar. Matter ise IP üzerinde çalışan bir uygulama standardıdır; veriyi Thread, Wi-Fi veya Ethernet taşıyabilir. Bluetooth LE genellikle ilk kurulumda yardımcı olur, normal Matter haberleşmesinin taşıyıcısı değildir.</p>

<p>Örgü, yani <em>mesh</em> ağlarda mesajlar ara cihazlardan geçebilir. Her atlamanın bağımsız başarı olasılığı $p$ ise, $h$ atlamalı basitleştirilmiş bir yol için $P = p^h$ olur. Örneğin $0.99^3 = 0.970299$. Bu, yeniden denemeleri dışlayan öğretici bir modeldir; gerçek performansı yerleşim, parazit ve alternatif yollar belirler.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Zigbee</th>
      <th>Z-Wave</th>
      <th>Matter</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel yaklaşım</td>
      <td>IP dışı cihaz ağı</td>
      <td>IP dışı cihaz ağı</td>
      <td>IP tabanlı uygulama standardı</td>
    </tr>
    <tr>
      <td>Taşıma</td>
      <td>Genellikle 2,4 GHz</td>
      <td>Bölgesel sub-GHz bantları</td>
      <td>Thread, Wi-Fi, Ethernet</td>
    </tr>
    <tr>
      <td>Ağ düzeni</td>
      <td>Mesh</td>
      <td>Klasik ağlarda mesh</td>
      <td>Taşıyıcıya bağlı</td>
    </tr>
    <tr>
      <td>Temel altyapı</td>
      <td>Koordinatör</td>
      <td>Denetleyici</td>
      <td>Matter denetleyicisi</td>
    </tr>
    <tr>
      <td>Güçlü taraf</td>
      <td>Geniş ürün seçeneği</td>
      <td>Bölgesel, düşük frekanslı haberleşme</td>
      <td>Ekosistemler arası ortak dil</td>
    </tr>
  </tbody>
</table>

<h2 id="zigbee-kalabalık-ve-ekonomik-mahalle">Zigbee: Kalabalık ve ekonomik mahalle</h2>

<p>Zigbee, sensörlerden ampullere uzanan geniş ürün çeşitliliğiyle dikkat çeker. Koordinatör ağı oluşturur; yönlendirici cihazlar mesajları aktarır. Pilli uç cihazlar çoğunlukla uyuyarak enerji tasarrufu yapar ve başkalarının mesajlarını taşımaz. Şebekeden beslenen her cihazın yönlendirici olduğunu varsaymamak gerekir.</p>

<p>Dezavantajı, yaygın kullanılan 2,4 GHz bandını Wi-Fi ile paylaşmasıdır. Kanal planlaması önemlidir. Ayrıca “Zigbee destekli” etiketi, her cihazın her merkezde bütün özellikleriyle çalışacağını garanti etmez. Satın almadan önce merkezin uyumluluk listesini kontrol edin.</p>

<h2 id="z-wave-daha-sakin-frekansların-komşusu">Z-Wave: Daha sakin frekansların komşusu</h2>

<p>Z-Wave, bölgeye göre değişen sub-GHz frekanslarını kullanır. Avrupa ürünlerinde sıklıkla 868 MHz çevresi görülür; ABD ürünleri farklı bantlardadır. Bu yüzden yurt dışından alınan cihazın yerel denetleyiciyle ve mevzuatla uyumunu kontrol etmek şarttır.</p>

<p>Düşük frekans, benzer koşullarda yayılım açısından avantaj sağlayabilir; ancak beton duvarları sihirli biçimde ortadan kaldırmaz. Sertifikasyon birlikte çalışabilirliği destekler, yine de denetleyicinin özellik desteği önemlidir. Ayrıca Z-Wave Long Range, klasik mesh yaklaşımından farklı olarak yıldız topolojisi kullanır.</p>

<h2 id="matter-ortak-sözlük-farklı-yollar">Matter: Ortak sözlük, farklı yollar</h2>

<p>Matter’ın büyük vaadi, markalar arasındaki uygulama dilini standartlaştırmaktır. Desteklenen cihazlar Multi-Admin özelliğiyle birden fazla ekosisteme eklenebilir. Ancak uygulamaların sunduğu özellikler, cihaz türü desteği ve Matter sürümleri hâlâ kontrol edilmelidir.</p>

<p>Thread kullanan Matter cihazları, evin diğer IP ağlarına ulaşmak için bir Thread sınır yönlendiricisinden yararlanır. Matter denetleyicisi ise cihazın kurulumu ve yönetimiyle ilgilenir. Bu roller aynı üründe bulunabilir ama aynı şey değildir.</p>

<p>Eski Zigbee veya Z-Wave cihazları kendiliğinden Matter cihazına dönüşmez. Uyumlu bir köprü, yalnızca desteklediği cihaz türlerini ve özelliklerini Matter tarafına sunabilir.</p>

<h2 id="yazılım-tarafında-ortak-komut-modeli">Yazılım tarafında ortak komut modeli</h2>

<p>Bir otomasyon uygulaması, cihazın protokolünü her iş kuralına taşımak yerine adaptör seçimini merkezileştirebilir. Aşağıdaki Python örneği gerçek radyo iletişimi yapmaz; komutun hangi entegrasyona yönlendirileceğini planlar:</p>

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

<span class="nd">@dataclass</span><span class="p">(</span><span class="n">frozen</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Device</span><span class="p">:</span>
    <span class="n">name</span><span class="p">:</span> <span class="nb">str</span>
    <span class="n">protocol</span><span class="p">:</span> <span class="nb">str</span>
    <span class="n">online</span><span class="p">:</span> <span class="nb">bool</span>

<span class="n">ADAPTERS</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">'</span><span class="s">zigbee</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">zigbee_gateway</span><span class="sh">'</span><span class="p">,</span>
    <span class="sh">'</span><span class="s">z-wave</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">zwave_controller</span><span class="sh">'</span><span class="p">,</span>
    <span class="sh">'</span><span class="s">matter</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">matter_controller</span><span class="sh">'</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">def</span> <span class="nf">plan_command</span><span class="p">(</span><span class="n">device</span><span class="p">:</span> <span class="n">Device</span><span class="p">,</span> <span class="n">enabled</span><span class="p">:</span> <span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">device</span><span class="p">.</span><span class="n">online</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ConnectionError</span><span class="p">(</span><span class="sh">'</span><span class="s">Cihaz çevrimdışı</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">device</span><span class="p">.</span><span class="n">protocol</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ADAPTERS</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">Desteklenmeyen protokol</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">'</span><span class="s">adapter</span><span class="sh">'</span><span class="p">:</span> <span class="n">ADAPTERS</span><span class="p">[</span><span class="n">device</span><span class="p">.</span><span class="n">protocol</span><span class="p">],</span>
        <span class="sh">'</span><span class="s">device</span><span class="sh">'</span><span class="p">:</span> <span class="n">device</span><span class="p">.</span><span class="n">name</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">action</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">set_power</span><span class="sh">'</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">value</span><span class="sh">'</span><span class="p">:</span> <span class="n">enabled</span><span class="p">,</span>
    <span class="p">}</span>

<span class="n">lamp</span> <span class="o">=</span> <span class="nc">Device</span><span class="p">(</span><span class="sh">'</span><span class="s">salon_lambası</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">matter</span><span class="sh">'</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">plan_command</span><span class="p">(</span><span class="n">lamp</span><span class="p">,</span> <span class="bp">True</span><span class="p">))</span>
</code></pre></div></div>

<p>Gerçek adaptör, ortak <code class="language-plaintext highlighter-rouge">set_power</code> isteğini cihazın desteklediği komuta çevirir. Kimlik doğrulama, zaman aşımı, yeniden deneme ve durum doğrulaması ayrıca uygulanmalıdır. Böylece otomasyon mantığı, haberleşme ayrıntılarından bağımsız kalır.</p>

<h2 id="hangisini-seçmeli">Hangisini seçmeli?</h2>

<p>Uygun fiyatlı sensör çeşitliliğinde Zigbee, bölgesel frekans avantajında Z-Wave, ekosistemler arası kullanımda Matter güçlü adaylardır. Yeni kurulumda yalnızca protokolü değil, gereken denetleyiciyi, çevrimdışı çalışma davranışını ve güncelleme politikasını da değerlendirin. Güvenli eşleştirme kullanın, yazılımı güncel tutun ve otomasyonlarınızı internet kesildiğinde sınayın. En akıllı ev, internet gidince ev olmayı unutmayan evdir.</p>

<p><img src="/img/akilli-evin-ortak-54.svg" alt="akilli-evin-ortak-54" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="akıllı ev" /><category term="zigbee" /><category term="z-wave" /><category term="matter" /><category term="thread" /><category term="iot" /><summary type="html"><![CDATA[Bir hareket sensörü lambaya “Biri geldi!” derken, termostat kombiden yardım ister. Peki farklı markaların cihazları aynı evde birbirini nasıl anlar? Akıllı ev protokolleri, bu dijital apartmanın haberleşme kurallarını belirler. Zigbee, Z-Wave ve Matter ise benzer ihtiyaçları farklı katmanlarda çözer. Doğru seçim, yalnızca kutudaki logoya bakmaktan biraz daha fazlasını gerektirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-evin-ortak-54.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-evin-ortak-54.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ Yapıcılar ve Yıkıcılar: Nesnelerin Doğumundan Vedaya Bellek Yönetimi</title><link href="https://program.sonsuz.us/posts/c-yapicilar-ve-yikicilar-nesnelerin-dogumundan-vedaya-bellek-yonetimi/" rel="alternate" type="text/html" title="C++ Yapıcılar ve Yıkıcılar: Nesnelerin Doğumundan Vedaya Bellek Yönetimi" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-yapicilar-ve-yikicilar-nesnelerin-dogumundan-vedaya-bellek-yonetimi</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-yapicilar-ve-yikicilar-nesnelerin-dogumundan-vedaya-bellek-yonetimi/"><![CDATA[<p><img src="/img/c-yapicilar-ve-65.svg" alt="c-yapicilar-ve-65" /></p>

<p>C++ nesnelerini küçük bir atölyenin çalışanları gibi düşünün: İşe başlarken ekipmanlarını hazırlamaları, ayrılırken de masalarını toplamaları gerekir. Yapıcılar nesneyi kullanıma hazırlar; yıkıcılar ise nesnenin sorumluluğundaki kaynakların bırakılmasını sağlar. Bu ikiliyi anlamak, yalnızca bellek sızıntılarını önlemek değil, güvenilir sınıflar tasarlamak için de temel bir adımdır.</p>

<p>``</p>

<h2 id="önce-teori-bellek-ile-nesne-aynı-şey-değildir">Önce teori: Bellek ile nesne aynı şey değildir</h2>

<p>Bir nesne için depolama alanı ayrılması, o nesnenin doğru biçimde kurulmuş olması anlamına gelmez. Yapıcı, üyeleri başlatır ve sınıfın geçerli durum koşullarını oluşturur. Örneğin bir tamponun boyutu ile sahip olduğu depolama alanı birbiriyle uyumlu olmalıdır. Bu koşullara <strong>sınıf değişmezi</strong>, yani invariant denir.</p>

<p>Yıkıcı kaynakları temizler; nesnenin kendi depolama alanının bırakılması ise kullanılan depolama modeline bağlıdır. Dolayısıyla “yıkıcı belleği siler” ifadesi tek başına eksiktir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Yapıcı</th>
      <th>Yıkıcı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İsim</td>
      <td>Sınıf adı</td>
      <td>Sınıf adının önünde <code class="language-plaintext highlighter-rouge">~</code></td>
    </tr>
    <tr>
      <td>Dönüş türü</td>
      <td>Yok</td>
      <td>Yok</td>
    </tr>
    <tr>
      <td>Parametre</td>
      <td>Alabilir</td>
      <td>Alamaz</td>
    </tr>
    <tr>
      <td>Aşırı yükleme</td>
      <td>Yapılabilir</td>
      <td>Yapılamaz</td>
    </tr>
    <tr>
      <td>Temel görev</td>
      <td>Geçerli başlangıç durumu</td>
      <td>Kaynak temizliği</td>
    </tr>
  </tbody>
</table>

<h2 id="yapıcılar-başlangıç-ayarları-önemlidir">Yapıcılar: Başlangıç ayarları önemlidir</h2>

<p>Parametresiz çağrılabilen yapıcıya <strong>varsayılan yapıcı</strong> denir. Parametreli yapıcılar farklı başlangıç seçenekleri sunar. Bir yapıcının başka bir yapıcıyı çağırması ise delegasyon olarak adlandırılır; böylece aynı kurulum mantığını tekrar yazmazsınız.</p>

<p>Üyeleri yapıcı gövdesinde atamak yerine <strong>üye başlatma listesinde</strong> başlatmak genellikle daha doğrudur. Özellikle referans üyeler ve <code class="language-plaintext highlighter-rouge">const</code> üyeler burada başlatılmalıdır. Ayrıca üyeler, listede yazdığınız sırayla değil, sınıf içinde bildirildikleri sırayla başlatılır. Bu ayrıntı, başka bir üyeye bağlı başlangıç değerlerinde kritik önem taşır.</p>

<h2 id="uygulama-kendi-tamponunu-yöneten-sınıf">Uygulama: Kendi tamponunu yöneten sınıf</h2>

<p>Aşağıdaki sınıf, tamsayı dizisini kurulum sırasında edinir ve yıkım sırasında bırakır. Ham işaretçi burada mekanizmayı görünür kılmak için kullanılıyor:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;cstddef&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;memory&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">Tampon</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">boyut_</span><span class="p">;</span>
    <span class="kt">int</span><span class="o">*</span> <span class="n">veri_</span><span class="p">;</span>

<span class="nl">public:</span>
    <span class="n">Tampon</span><span class="p">()</span> <span class="o">:</span> <span class="n">Tampon</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> <span class="p">{}</span>

    <span class="k">explicit</span> <span class="nf">Tampon</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">boyut</span><span class="p">)</span>
        <span class="o">:</span> <span class="n">boyut_</span><span class="p">(</span><span class="n">boyut</span><span class="p">),</span> <span class="n">veri_</span><span class="p">(</span><span class="k">new</span> <span class="kt">int</span><span class="p">[</span><span class="n">boyut</span><span class="p">]{})</span> <span class="p">{}</span>

    <span class="n">Tampon</span><span class="p">(</span><span class="k">const</span> <span class="n">Tampon</span><span class="o">&amp;</span><span class="p">)</span> <span class="o">=</span> <span class="k">delete</span><span class="p">;</span>
    <span class="n">Tampon</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="k">const</span> <span class="n">Tampon</span><span class="o">&amp;</span><span class="p">)</span> <span class="o">=</span> <span class="k">delete</span><span class="p">;</span>

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

    <span class="n">std</span><span class="o">::</span><span class="kt">size_t</span> <span class="n">boyut</span><span class="p">()</span> <span class="k">const</span> <span class="k">noexcept</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">boyut_</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Tampon</span> <span class="n">yerel</span><span class="p">;</span>
    <span class="k">auto</span> <span class="n">dinamik</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o">&lt;</span><span class="n">Tampon</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">8</span><span class="p">);</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">yerel</span><span class="p">.</span><span class="n">boyut</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Tampon()</code> dört elemanlık kuruluma yönlendirir. <code class="language-plaintext highlighter-rouge">explicit</code>, bir sayının istemeden <code class="language-plaintext highlighter-rouge">Tampon</code> nesnesine dönüştürülmesini engeller. Dizinin sonundaki <code class="language-plaintext highlighter-rouge">{}</code>, tamsayıları sıfırla başlatır. <code class="language-plaintext highlighter-rouge">delete[]</code>, <code class="language-plaintext highlighter-rouge">new[]</code> ile edinilen diziyi doğru biçimde bırakır.</p>

<p>Kopyalama işlemleri özellikle kapatıldı: Varsayılan kopyalama iki nesnenin aynı adresi sahiplenmesine, ardından aynı belleğin iki kez bırakılmasına yol açabilirdi. Bu sınıf taşıma işlemleri de tanımlamadığından, sahipliğin nesneler arasında aktarılmasını desteklemez.</p>

<h2 id="yaşam-süresi-ve-raii">Yaşam süresi ve RAII</h2>

<p><code class="language-plaintext highlighter-rouge">yerel</code>, blok sona erdiğinde otomatik olarak yıkılır. <code class="language-plaintext highlighter-rouge">dinamik</code> ise bir <code class="language-plaintext highlighter-rouge">std::unique_ptr</code> tarafından sahiplenilir; akıllı işaretçi yıkılınca yönettiği <code class="language-plaintext highlighter-rouge">Tampon</code> da yıkılır ve depolama alanı bırakılır. Bu örnekte önce <code class="language-plaintext highlighter-rouge">dinamik</code>, ardından <code class="language-plaintext highlighter-rouge">yerel</code> temizlenir.</p>

<table>
  <thead>
    <tr>
      <th>Kullanım</th>
      <th>Temizlik sorumluluğu</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yerel nesne</td>
      <td>Otomatik kapsam yönetimi</td>
      <td>Genellikle düşük</td>
    </tr>
    <tr>
      <td>Ham <code class="language-plaintext highlighter-rouge">new</code></td>
      <td>Programcı, uygun <code class="language-plaintext highlighter-rouge">delete</code> ile</td>
      <td>Unutulan temizlik</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::unique_ptr</code></td>
      <td>Sahiplik nesnesi</td>
      <td>Genellikle düşük</td>
    </tr>
  </tbody>
</table>

<p>Bu yaklaşımın adı <strong>RAII</strong>: Kaynak edinimini nesne kurulmasına, kaynak bırakmayı nesne yıkımına bağlamak. Kaynak yalnızca bellek değildir; dosya, kilit veya bağlantı da olabilir.</p>

<p>Basit bir kaynak sayacıyla hedefi ifade edebiliriz:</p>

\[R_{son} = R_{ilk} + R_{edinilen} - R_{birakilan}\]

<p>Başlangıçta sahip olunan kaynak sayısı sıfırsa, nesnenin işi bittiğinde sonuç yine sıfır olmalıdır. Atölyeden çıkarken masada unutulan tornavida istemiyoruz!</p>

<h2 id="i̇stisnalar-ve-güvenli-tasarım">İstisnalar ve güvenli tasarım</h2>

<p>Yapıcı istisna fırlatırsa nesne tamamen kurulmuş sayılmaz; o nesnenin yıkıcısı çağrılmaz. Ancak başarıyla kurulmuş üyeler ve taban sınıflar temizlenir. Bu yüzden kaynakları akıllı işaretçi veya standart kapsayıcı üyelerde tutmak, yarım kalan kurulumlarda da güvenlik sağlar.</p>

<p>Yıkıcılardan istisna kaçırmaktan kaçının: Özellikle başka bir istisna nedeniyle yığın çözülürken bu durum <code class="language-plaintext highlighter-rouge">std::terminate</code> ile programı sonlandırabilir. Taban sınıf işaretçisi üzerinden türetilmiş nesneleri silecekseniz, taban yıkıcısını <code class="language-plaintext highlighter-rouge">virtual</code> yapın.</p>

<p>Gerçek projelerde bu tampon için çoğunlukla <code class="language-plaintext highlighter-rouge">std::vector&lt;int&gt;</code> tercih edilir. Böylece özel yıkıcı ve sahiplik kodu yazmadan <strong>Rule of Zero</strong> yaklaşımına ulaşılır. En iyi temizlik kodu, çoğu zaman güvenilir bir üyeye devrettiğiniz koddur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="constructors" /><category term="destructors" /><category term="bellek yönetimi" /><category term="raii" /><category term="nesne yaşam döngüsü" /><summary type="html"><![CDATA[C++ nesnelerini küçük bir atölyenin çalışanları gibi düşünün: İşe başlarken ekipmanlarını hazırlamaları, ayrılırken de masalarını toplamaları gerekir. Yapıcılar nesneyi kullanıma hazırlar; yıkıcılar ise nesnenin sorumluluğundaki kaynakların bırakılmasını sağlar. Bu ikiliyi anlamak, yalnızca bellek sızıntılarını önlemek değil, güvenilir sınıflar tasarlamak için de temel bir adımdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-yapicilar-ve-65.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-yapicilar-ve-65.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Can Barı Nerede Yaşıyor? Diegetik Arayüzlerle Oyuncu Deneyimini Tasarlamak</title><link href="https://program.sonsuz.us/posts/can-bari-nerede-yasiyor-diegetik-arayuzlerle-oyuncu-deneyimini-tasarlamak/" rel="alternate" type="text/html" title="Can Barı Nerede Yaşıyor? Diegetik Arayüzlerle Oyuncu Deneyimini Tasarlamak" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/can-bari-nerede-yasiyor-diegetik-arayuzlerle-oyuncu-deneyimini-tasarlamak</id><content type="html" xml:base="https://program.sonsuz.us/posts/can-bari-nerede-yasiyor-diegetik-arayuzlerle-oyuncu-deneyimini-tasarlamak/"><![CDATA[<p>Bir uzay istasyonunda yürüyorsunuz. Oksijeniniz azalıyor; peki bunu ekranın köşesindeki bir göstergeden mi, yoksa karakterinizin bileğindeki cihazdan mı öğrenmelisiniz? İkisi de aynı bilgiyi verebilir, fakat aynı deneyimi yaratmaz. Can barının nerede yaşadığı; dikkatinizi, karar hızınızı ve oyun dünyasıyla kurduğunuz ilişkiyi değiştirir.</p>

<p><img src="/img/can-bari-nerede-39.svg" alt="can-bari-nerede-39" /></p>

<p>``</p>

<h2 id="önce-kavramları-yerine-oturtalım">Önce kavramları yerine oturtalım</h2>

<p><strong>Diegetik arayüz</strong>, oyunun kurmaca dünyasında gerçekten var olan bilgi sunumudur. Karakterin okuyabildiği bir bileklik ekranı veya zırhındaki durum göstergesi buna örnektir. <strong>Diegetik olmayan arayüz</strong> ise doğrudan oyuncuya seslenir: Ekranın köşesinde duran klasik can barını karakteriniz görmez.</p>

<p>Buradaki ayrım yalnızca iki boyutlu ve üç boyutlu olmak değildir. Düşmanın üzerinde süzülen bir can barı, sahnenin içinde çizilse bile kurmaca dünyada karşılığı yoksa otomatik olarak diegetik sayılmaz. Böyle göstergeler çoğunlukla <strong>mekânsal arayüz</strong> olarak değerlendirilir. Asıl soru şudur: Bu bilgi kaynağı, hikâyenin evreninde mevcut mu?</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Diegetik arayüz</th>
      <th>Diegetik olmayan arayüz</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bilginin taşıyıcısı</td>
      <td>Dünyadaki nesne veya cihaz</td>
      <td>Ekrana sabitlenmiş gösterge</td>
    </tr>
    <tr>
      <td>Görünürlük</td>
      <td>Bakışa, ışığa ve mesafeye bağlı olabilir</td>
      <td>Genellikle daha tutarlıdır</td>
    </tr>
    <tr>
      <td>Kurmaca ile ilişki</td>
      <td>Dünyanın işleyişine katılır</td>
      <td>Oyuncuya dışarıdan bilgi verir</td>
    </tr>
    <tr>
      <td>Tipik örnek</td>
      <td>Kıyafetteki sağlık göstergesi</td>
      <td>Köşedeki can barı</td>
    </tr>
  </tbody>
</table>

<p>Bu sınıflar bir kalite sıralaması değildir. Diegetik tasarım her zaman daha sürükleyici, klasik HUD ise her zaman daha anlaşılır olmak zorunda değildir. Uygulama ve bağlam belirleyicidir.</p>

<h2 id="oyuncunun-dikkat-bütçesi">Oyuncunun dikkat bütçesi</h2>

<p>Oyuncu çatışma sırasında düşmanı, çevreyi ve kaynaklarını aynı anda izler. Can bilgisini almak için bileğini kaldırması gerekiyorsa, bilgiye erişmek başlı başına bir eyleme dönüşür. Bu, korku oyununda gerilim yaratabilir; hızlı bir rekabetçi oyunda ise gereksiz sürtünme oluşturabilir.</p>

<p>Bu maliyeti düşünmek için basit bir model kullanabiliriz:</p>

\[T_{tepki} = T_{bulma} + T_{okuma} + T_{karar}\]

<p>Burada göstergeyi bulmak, anlamak ve karar vermek ayrı aşamalardır. Bu denklem evrensel bir ölçüm yasası değil, tasarım sorularını düzenleyen bir çerçevedir. Göstergeyi dünyaya yerleştirmek ilk iki süreyi artırıyorsa, kazandığınız atmosferin bu maliyeti karşılayıp karşılamadığını test etmelisiniz.</p>

<h2 id="unity-aynı-sağlık-iki-farklı-sunum">Unity: Aynı sağlık, iki farklı sunum</h2>

<p>Aşağıdaki örnek, tek sağlık değerini hem ekran üzerindeki bir <code class="language-plaintext highlighter-rouge">Image</code> bileşenine hem de kıyafetteki uyarı lambasını temsil eden bir <code class="language-plaintext highlighter-rouge">Light</code> bileşenine aktarır. HUD nesnesini ekran uzayındaki Canvas içine yerleştirin; <code class="language-plaintext highlighter-rouge">Image Type</code> ayarını <code class="language-plaintext highlighter-rouge">Filled</code> yapın. Lambayı ise karakterin ekipmanına bağlayın.</p>

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

<span class="k">public</span> <span class="k">class</span> <span class="nc">HealthFeedback</span> <span class="p">:</span> <span class="n">MonoBehaviour</span>
<span class="p">{</span>
    <span class="p">[</span><span class="n">SerializeField</span><span class="p">]</span> <span class="k">private</span> <span class="n">Image</span> <span class="n">hudBar</span><span class="p">;</span>
    <span class="p">[</span><span class="n">SerializeField</span><span class="p">]</span> <span class="k">private</span> <span class="n">Light</span> <span class="n">suitLight</span><span class="p">;</span>
    <span class="p">[</span><span class="n">SerializeField</span><span class="p">]</span> <span class="k">private</span> <span class="kt">float</span> <span class="n">maxHealth</span> <span class="p">=</span> <span class="m">100f</span><span class="p">;</span>
    <span class="k">private</span> <span class="kt">float</span> <span class="n">health</span><span class="p">;</span>

    <span class="k">private</span> <span class="k">void</span> <span class="nf">Awake</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">maxHealth</span> <span class="p">=</span> <span class="n">Mathf</span><span class="p">.</span><span class="nf">Max</span><span class="p">(</span><span class="m">1f</span><span class="p">,</span> <span class="n">maxHealth</span><span class="p">);</span>
        <span class="n">health</span> <span class="p">=</span> <span class="n">maxHealth</span><span class="p">;</span>
        <span class="nf">Refresh</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">TakeDamage</span><span class="p">(</span><span class="kt">float</span> <span class="n">amount</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">health</span> <span class="p">=</span> <span class="n">Mathf</span><span class="p">.</span><span class="nf">Clamp</span><span class="p">(</span>
            <span class="n">health</span> <span class="p">-</span> <span class="n">Mathf</span><span class="p">.</span><span class="nf">Max</span><span class="p">(</span><span class="m">0f</span><span class="p">,</span> <span class="n">amount</span><span class="p">),</span> <span class="m">0f</span><span class="p">,</span> <span class="n">maxHealth</span><span class="p">);</span>
        <span class="nf">Refresh</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="k">void</span> <span class="nf">Refresh</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">float</span> <span class="n">ratio</span> <span class="p">=</span> <span class="n">health</span> <span class="p">/</span> <span class="n">maxHealth</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">hudBar</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
            <span class="n">hudBar</span><span class="p">.</span><span class="n">fillAmount</span> <span class="p">=</span> <span class="n">ratio</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">suitLight</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
            <span class="n">suitLight</span><span class="p">.</span><span class="n">intensity</span> <span class="p">=</span> <span class="n">Mathf</span><span class="p">.</span><span class="nf">Lerp</span><span class="p">(</span><span class="m">0.2f</span><span class="p">,</span> <span class="m">2f</span><span class="p">,</span> <span class="n">ratio</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Sağlık oranı $r = H/H_{max}$ ile normalize edilir. <code class="language-plaintext highlighter-rouge">TakeDamage</code>, negatif hasarı engeller ve sağlığı geçerli aralıkta tutar. <code class="language-plaintext highlighter-rouge">Refresh</code>, aynı veriyi iki görsel kanala dönüştürür. Büyük projelerde sağlık modeliyle sunum bileşenlerini ayırmak daha uygundur; burada bağlantıyı görünür tutmak için birlikte gösteriyoruz. Lambanın ayrıca görünür bir gövdesi ve anlaşılır bir kurmaca gerekçesi olmalıdır.</p>

<h2 id="hangisini-seçmeli">Hangisini seçmeli?</h2>

<p>Seçimi yalnızca estetik tercihle yapmayın. Oyunun temposu, bilginin önemi ve oyuncunun görsel koşulları birlikte değerlendirilmelidir. Diegetik bir lambanın parlaklığı, aydınlık sahnelerde kolayca kaybolabilir. Kritik bilgiyi yalnızca renkle anlatmak da erişilebilirlik sorunları yaratır.</p>

<table>
  <thead>
    <tr>
      <th>Tasarım hedefi</th>
      <th>Denenebilecek yaklaşım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gerilim ve kırılganlık</td>
      <td>Etkileşim gerektiren diegetik gösterge</td>
    </tr>
    <tr>
      <td>Hızlı ve kesin karar</td>
      <td>Kolay okunabilen sabit HUD</td>
    </tr>
    <tr>
      <td>Atmosfer ile erişilebilirlik</td>
      <td>Diegetik gösterge ve isteğe bağlı HUD</td>
    </tr>
  </tbody>
</table>

<p>İki sürümü aynı görevde deneyin. Oyuncuların düşük sağlığı fark etme süresini, kaçırdığı uyarıları ve öznel sürükleyicilik değerlendirmelerini karşılaştırın. Kamera hareketi, ekran boyutu ve ışık koşullarını da değiştirin. Böylece yalnızca güzel görünen değil, farklı koşullarda işleyen bir tasarım seçersiniz.</p>

<p>Sonuçta iyi arayüz, kendini gizleyen arayüz değildir. Oyuncuya doğru bilgiyi doğru anda veren arayüzdür. Bazen bu bilgi bilekte yaşar; bazen ekranın köşesinde. Can barının adresinden çok, oyuncunun onu gerektiğinde bulabilmesi önemlidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun-tasarımı" /><category term="arayüz-tasarımı" /><category term="diegetik-arayüz" /><category term="oyuncu-deneyimi" /><category term="unity" /><category term="ux" /><summary type="html"><![CDATA[Bir uzay istasyonunda yürüyorsunuz. Oksijeniniz azalıyor; peki bunu ekranın köşesindeki bir göstergeden mi, yoksa karakterinizin bileğindeki cihazdan mı öğrenmelisiniz? İkisi de aynı bilgiyi verebilir, fakat aynı deneyimi yaratmaz. Can barının nerede yaşadığı; dikkatinizi, karar hızınızı ve oyun dünyasıyla kurduğunuz ilişkiyi değiştirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/can-bari-nerede-39.png" /><media:content medium="image" url="https://program.sonsuz.us/img/can-bari-nerede-39.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Fintech API’leri: Bankalar ve Yazılımlar Birbirleriyle Nasıl Konuşuyor?</title><link href="https://program.sonsuz.us/posts/fintech-apileri-bankalar-ve-yazilimlar-birbirleriyle-nasil-konusuyor/" rel="alternate" type="text/html" title="Fintech API’leri: Bankalar ve Yazılımlar Birbirleriyle Nasıl Konuşuyor?" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/fintech-apileri-bankalar-ve-yazilimlar-birbirleriyle-nasil-konusuyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/fintech-apileri-bankalar-ve-yazilimlar-birbirleriyle-nasil-konusuyor/"><![CDATA[<p>Bir bütçe uygulaması banka bakiyenizi nasıl gösteriyor? Bir e-ticaret sitesi ödemenizin tamamlandığını nasıl anlıyor? Cevap, bankanın içinde klavyeye yetişmeye çalışan minik muhasebeciler değil: API’ler! Bu arayüzler, finansal sistemlerin belirli kurallar ve izinler çerçevesinde veri alışverişi yapmasını sağlıyor. Ancak para söz konusu olduğunda, sohbetin hem güvenli hem de tutarlı olması gerekiyor.</p>

<p>``</p>

<h2 id="api-finans-dünyasının-ortak-sözleşmesi">API: Finans dünyasının ortak sözleşmesi</h2>

<p>API, bir yazılımın başka bir yazılıma sunduğu programlama arayüzüdür. Bankacılıkta bu arayüz; hesapları listelemek, işlem geçmişini okumak veya ödeme başlatmak gibi yetenekler sunabilir.</p>

<p>Buradaki temel fikir <strong>sözleşmedir</strong>: Hangi adrese istek gönderileceği, hangi alanların beklendiği, kimlerin erişebileceği ve hataların nasıl bildirileceği önceden tanımlanır. API, bankanın veritabanına açılan sınırsız bir kapı değil, yetkileri sınırlandırılmış bir servis girişidir.</p>

<p>REST tabanlı sistemlerde HTTP yöntemleri yaygındır: <code class="language-plaintext highlighter-rouge">GET</code> veri okumak, <code class="language-plaintext highlighter-rouge">POST</code> ise ödeme talebi gibi yeni bir işlem oluşturmak için kullanılabilir. JSON, taşınan verinin sık kullanılan formatıdır; ancak bütün bankalar aynı uç noktaları veya alan isimlerini kullanmaz.</p>

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

<p>Bir açık bankacılık uygulamasının hesap bilgilerini okuduğunu düşünelim:</p>

<ol>
  <li><strong>İzin:</strong> Kullanıcı, hangi hesaplara ve verilere erişilebileceğini onaylar. Bu onay belirli bir süreyle sınırlandırılabilir.</li>
  <li><strong>Yetkilendirme:</strong> Uygulama, uygun akış üzerinden bir erişim belirteci alır. OAuth 2.0 burada sık kullanılan bir yetkilendirme çerçevesidir.</li>
  <li><strong>İstek:</strong> Uygulama, erişim belirtecini ekleyerek bankanın API’sine HTTPS üzerinden bağlanır.</li>
  <li><strong>Kontrol:</strong> Banka; uygulamanın yetkisini, iznin geçerliliğini ve istenen işlemin kapsamını denetler.</li>
  <li><strong>Yanıt:</strong> Banka, sözleşmeye uygun veriyi veya bir hata yanıtını döndürür.</li>
</ol>

<p>OAuth 2.0, tek başına her durumda kullanıcı kimliğini doğrulayan bir protokol değildir. Kimlik doğrulama ile yetkilendirme ilişkili, fakat farklı kavramlardır. Ayrıca uygulamanın kullanıcıdan internet bankacılığı şifresini toplaması bu modelin gereği değildir.</p>

<h2 id="anlık-yanıt-tamamlanmış-işlem-demek-değildir">Anlık yanıt, tamamlanmış işlem demek değildir</h2>

<p>Toplam yanıt süresini kabaca $T = T_a + T_k + T_i$ şeklinde düşünebiliriz. Burada $T_a$ ağ gecikmesini, $T_k$ güvenlik kontrollerini, $T_i$ ise işlem süresini temsil eder. Fakat bu süre yalnızca isteğin yanıtlanmasını anlatır; paranın kesin olarak alıcıya geçtiğini değil!</p>

<table>
  <thead>
    <tr>
      <th>İletişim biçimi</th>
      <th>Kim başlatır?</th>
      <th>Tipik kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>REST API isteği</td>
      <td>Uygulama</td>
      <td>Bakiye sorgulama, ödeme başlatma</td>
    </tr>
    <tr>
      <td>Webhook bildirimi</td>
      <td>Servis sağlayıcı</td>
      <td>Ödeme durumunun değiştiğini haber verme</td>
    </tr>
    <tr>
      <td>Toplu dosya aktarımı</td>
      <td>Planlanmış süreç</td>
      <td>Gün sonu raporu ve mutabakat</td>
    </tr>
  </tbody>
</table>

<p>Bunlar rakip değil, tamamlayıcı yöntemlerdir. Örneğin <code class="language-plaintext highlighter-rouge">202 Accepted</code>, isteğin işlenmek üzere kabul edildiğini belirtir; ödeme başarısı garantisi vermez. Kesin durum, sorgulama uç noktasından veya doğrulanmış bir webhook üzerinden öğrenilebilir.</p>

<h2 id="python-ile-örnek-ödeme-isteği">Python ile örnek ödeme isteği</h2>

<p>Aşağıdaki örnek, <code class="language-plaintext highlighter-rouge">requests</code> kütüphanesiyle temsili bir API’ye ödeme talebi gönderir. Alanlar sağlayıcıya göre değişir; <code class="language-plaintext highlighter-rouge">API_ROOT</code> gerçek para hareketi olmayan test ortamına ayarlanmalıdır.</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">payment_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">PAYMENT_KEY</span><span class="sh">"</span><span class="p">]</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="sa">f</span><span class="sh">'</span><span class="si">{</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">API_ROOT</span><span class="sh">"</span><span class="p">]</span><span class="si">}</span><span class="s">/payments</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
        <span class="sh">"</span><span class="s">Authorization</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">Bearer </span><span class="si">{</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">ACCESS_TOKEN</span><span class="sh">"</span><span class="p">]</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">Idempotency-Key</span><span class="sh">"</span><span class="p">:</span> <span class="n">payment_key</span><span class="p">,</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">amount_minor</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1250</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">currency</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">TRY</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">recipient_ref</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">beneficiary_42</span><span class="sh">"</span><span class="p">,</span>
    <span class="p">},</span>
    <span class="n">timeout</span><span class="o">=</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">10</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="nf">print</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="nf">json</span><span class="p">()[</span><span class="sh">"</span><span class="s">status</span><span class="sh">"</span><span class="p">])</span>
</code></pre></div></div>

<p>Bu örnekte tutar, sözleşme gereği kuruş cinsindendir: 1250 kuruş, 12,50 TL eder. Tamsayı kullanımı, kayan noktalı sayıların hassasiyet sorunlarını önlemeye yardımcı olur. Bağlantı ve okuma zaman aşımı ayrı tanımlanmıştır; kod HTTP hatasında istisna üretir. Üretimde bu hatalar ayrıca ele alınmalıdır.</p>

<p><strong>Idempotency anahtarı</strong>, sağlayıcı destekliyorsa, aynı mantıksal talebin tekrarında ikinci bir ödeme oluşmasını önlemeye yardımcı olur. Anahtar işlemle birlikte kalıcı saklanmalı, tekrar denemelerinde değiştirilmemelidir. Sağlayıcının saklama süresi ve tekrar davranışı mutlaka incelenmelidir.</p>

<h2 id="güvenlik-ve-belirsizlikle-yaşamak">Güvenlik ve belirsizlikle yaşamak</h2>

<p>HTTPS aktarımı korur; bazı entegrasyonlarda karşılıklı TLS ile uygulamanın sertifikası da doğrulanır. Erişim belirteçleri ve hesap bilgileri günlüklere gelişigüzel yazılmamalıdır. Webhook’larda sağlayıcının imza doğrulaması uygulanmalı, tekrar oynatılan veya yinelenen bildirimler hesaba katılmalıdır.</p>

<p>En kritik senaryo şudur: Banka ödemeyi kabul eder, fakat yanıt ağda kaybolur. Zaman aşımı, başarısız ödeme anlamına gelmez. Körlemesine yeni ödeme oluşturmak yerine mevcut işlem sorgulanmalı ve belgelenmiş tekrar mekanizması kullanılmalıdır. Hız sınırı yanıtlarında da sağlayıcının bekleme talimatlarına uyulmalıdır.</p>

<p>Son olarak <strong>mutabakat</strong>, uygulamanızdaki kayıtlarla bankanın kayıtlarını karşılaştırır. Çünkü sağlam fintech entegrasyonu yalnızca konuşabilen değil; yanlış anlayınca durabilen, tekrarları yönetebilen ve gün sonunda hesabını verebilen yazılımdır.</p>

<p><img src="/img/fintech-apileri-bankalar-88.svg" alt="fintech-apileri-bankalar-88" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="fintech" /><category term="api" /><category term="açık-bankacılık" /><category term="oauth" /><category term="python" /><category term="güvenlik" /><summary type="html"><![CDATA[Bir bütçe uygulaması banka bakiyenizi nasıl gösteriyor? Bir e-ticaret sitesi ödemenizin tamamlandığını nasıl anlıyor? Cevap, bankanın içinde klavyeye yetişmeye çalışan minik muhasebeciler değil: API’ler! Bu arayüzler, finansal sistemlerin belirli kurallar ve izinler çerçevesinde veri alışverişi yapmasını sağlıyor. Ancak para söz konusu olduğunda, sohbetin hem güvenli hem de tutarlı olması gerekiyor.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/fintech-apileri-bankalar-88.png" /><media:content medium="image" url="https://program.sonsuz.us/img/fintech-apileri-bankalar-88.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Hasta Verisini Değil, Bilgiyi Paylaşın: Sağlıkta Diferansiyel Mahremiyet</title><link href="https://program.sonsuz.us/posts/hasta-verisini-degil-bilgiyi-paylasin-saglikta-diferansiyel-mahremiyet/" rel="alternate" type="text/html" title="Hasta Verisini Değil, Bilgiyi Paylaşın: Sağlıkta Diferansiyel Mahremiyet" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/hasta-verisini-degil-bilgiyi-paylasin-saglikta-diferansiyel-mahremiyet</id><content type="html" xml:base="https://program.sonsuz.us/posts/hasta-verisini-degil-bilgiyi-paylasin-saglikta-diferansiyel-mahremiyet/"><![CDATA[<p>Bir hastanenin diyabet eğilimlerini araştırdığını düşünün. Araştırmacılar toplumdaki riskleri görmek istiyor; kimsenin komşusunun teşhisini öğrenmesini değil! Peki, hasta kayıtlarından yararlı sonuçlar çıkarırken kişileri nasıl koruyabiliriz? İsimleri silmek iyi bir başlangıçtır, fakat gerçek mahremiyet daha fazlasını gerektirir. Diferansiyel mahremiyet, tam da bu noktada matematiği güvenlik görevlisine dönüştürür.</p>

<p>``</p>

<h2 id="i̇sim-silmek-neden-yetmez">İsim silmek neden yetmez?</h2>

<p>Bir kayıttan ad, telefon ve kimlik numarasını kaldırmak, o kaydı otomatik olarak anonim yapmaz. Yaş, posta kodu ve hastaneye başvuru tarihi gibi <strong>dolaylı tanımlayıcılar</strong>, başka kaynaklarla eşleştirildiğinde kişiyi yeniden ortaya çıkarabilir. Nadir hastalıklar bu riski özellikle artırır.</p>

<p>Örneğin, küçük bir ilçede yaşayan 97 yaşındaki tek kişinin kayıtlarında isim bulunmasa bile kimliği tahmin edilebilir. Dolayısıyla takma kimlik kullanmak ile anonimlik aynı şey değildir. Takma kimlikli kayıtlar, bağlantı anahtarı veya yardımcı bilgiler üzerinden kişilere bağlanabilir.</p>

<table>
  <thead>
    <tr>
      <th>Teknik</th>
      <th>Temel yaklaşım</th>
      <th>Önemli sınır</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Maskeleme</td>
      <td>Doğrudan tanımlayıcıları kaldırır</td>
      <td>Dolaylı eşleştirmeyi engellemez</td>
    </tr>
    <tr>
      <td>k-anonimlik</td>
      <td>Belirli özelliklerde kayıtları benzeştirir</td>
      <td>Hassas özellikler yine çıkarılabilir</td>
    </tr>
    <tr>
      <td>Diferansiyel mahremiyet</td>
      <td>Çıktılara kontrollü rastgelelik ekler</td>
      <td>Doğruluk ve bütçe yönetimi gerektirir</td>
    </tr>
  </tbody>
</table>

<h2 id="diferansiyel-mahremiyetin-matematiksel-fikri">Diferansiyel mahremiyetin matematiksel fikri</h2>

<p>Diferansiyel mahremiyet, genellikle satırları anonimleştirmekten ziyade <strong>yayımlanan istatistikleri veya model çıktılarını</strong> korur. Amaç, tek bir hastanın araştırmaya katılıp katılmamasının sonuçları fazla değiştirmemesidir.</p>

<p>Bir hastanın eklenmesi veya çıkarılmasıyla farklılaşan iki veri kümesine $D$ ve $D’$ diyelim. Rastgeleleştirilmiş mekanizma $M$, herhangi bir çıktı kümesi $S$ için şu koşulu sağlamalıdır:</p>

\[P(M(D)\in S)\le e^{\varepsilon}P(M(D')\in S)+\delta\]

<p>Burada $\varepsilon$ mahremiyet kaybını kontrol eder: küçük değer daha güçlü koruma, genellikle daha fazla gürültü demektir. $\delta$ ise eşitsizliğe eklenen küçük bir olasılık payıdır; doğrudan yeniden kimliklendirme ihtimali olarak okunmamalıdır. Laplace mekanizması uygun koşullarda $\delta=0$ sağlar.</p>

<p>Önemli ayrıntı: Koruma birimi <strong>hasta</strong> olmalıdır. Aynı hastanın yirmi muayenesini bağımsız kişiler gibi sayarsanız, kayıt düzeyindeki güvence hasta düzeyindeki güvenceye dönüşmez.</p>

<h2 id="gürültü-rastgele-miktarı-hesaplı">Gürültü rastgele, miktarı hesaplı</h2>

<p>Bir sorgunun duyarlılığı $\Delta f$, tek hastanın değişmesiyle sonucun değişebileceği en büyük miktardır. Her hasta sayıma en fazla bir katkı yapıyorsa, ekleme/çıkarma komşuluğunda sayımın duyarlılığı $1$ olur.</p>

<p>Laplace mekanizması şu çıktıyı üretir:</p>

\[\widetilde{f}(D)=f(D)+\operatorname{Laplace}(0,\Delta f/\varepsilon)\]

<p>$\varepsilon=0.5$ için gürültü ölçeği $2$, $\varepsilon=0.1$ için $10$ olur. Yani mahremiyet düğmesini çevirdikçe istatistik biraz daha bulanıklaşır. Bu, gelişigüzel veri bozmak değil; etkisi hesaplanan bir tasarım tercihidir.</p>

<h2 id="python-ile-korumalı-hasta-sayımı">Python ile korumalı hasta sayımı</h2>

<p>Aşağıdaki eğitim örneğinde her Boolean değer, farklı bir hastanın hipertansiyon durumunu temsil eder. Gerçek sistemde tekrarlanan ziyaretler önce hasta düzeyinde birleştirilmelidir. Kod yalnızca gürültülü toplamı döndürür; gerçek toplam yayımlanmaz.</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">ozel_sayim</span><span class="p">(</span><span class="n">hasta_bayraklari</span><span class="p">,</span> <span class="n">epsilon</span><span class="o">=</span><span class="mf">0.5</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">np</span><span class="p">.</span><span class="nf">isfinite</span><span class="p">(</span><span class="n">epsilon</span><span class="p">)</span> <span class="ow">or</span> <span class="n">epsilon</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">Epsilon pozitif ve sonlu olmalı.</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="nf">all</span><span class="p">(</span><span class="nf">type</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">bool</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">hasta_bayraklari</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">Her hasta için bir Boolean gerekli.</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">gercek_toplam</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">hasta_bayraklari</span><span class="p">)</span>
    <span class="n">duyarlilik</span> <span class="o">=</span> <span class="mf">1.0</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="n">gurultu</span> <span class="o">=</span> <span class="n">rng</span><span class="p">.</span><span class="nf">laplace</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">duyarlilik</span> <span class="o">/</span> <span class="n">epsilon</span><span class="p">)</span>
    <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nf">int</span><span class="p">(</span><span class="nf">round</span><span class="p">(</span><span class="n">gercek_toplam</span> <span class="o">+</span> <span class="n">gurultu</span><span class="p">)))</span>


<span class="c1"># Tamamen sentetik: 1.000 hasta, 240 pozitif durum.
</span><span class="n">ornek</span> <span class="o">=</span> <span class="p">[</span><span class="bp">True</span><span class="p">]</span> <span class="o">*</span> <span class="mi">240</span> <span class="o">+</span> <span class="p">[</span><span class="bp">False</span><span class="p">]</span> <span class="o">*</span> <span class="mi">760</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">ozel_sayim</span><span class="p">(</span><span class="n">ornek</span><span class="p">))</span>
</code></pre></div></div>

<p>Negatif sonuçları sıfıra çekmek ve yuvarlamak, yalnızca korumalı çıktıya uygulanan <strong>son işlemedir</strong>; ek mahremiyet kaybı yaratmaz. Ancak sonucu yanlılaştırabilir. NumPy örneği üretim garantisi değildir: güvenli rastgelelik, kayan nokta davranışı ve mekanizma doğruluğu için OpenDP gibi denetlenmiş araçlar değerlendirilmelidir.</p>

<h2 id="mahremiyet-bütçesi-sınırsız-değildir">Mahremiyet bütçesi sınırsız değildir</h2>

<p>Aynı hastalar üzerinde tekrar tekrar sorgu yayımlamak bilgi biriktirir. Temel bileşim kuralında toplam bütçe $\varepsilon_{toplam}\le\sum_i\varepsilon_i$ şeklinde izlenebilir. Sonuçları tekrar üreterek ortalamasını almak, gürültüyü azaltırken mahremiyet maliyetini artırır.</p>

<p>Bu nedenle sorgu onayı, bütçe kaydı ve erişim denetimi birlikte tasarlanmalıdır. Ortalama gibi sorgularda katkı sınırları ayrıca belirlenmelidir; sınırsız ölçüm değerleri uygun duyarlılık hesabını bozar. Küçük hasta gruplarında gürültünün göreli etkisi büyüdüğünden, klinik yorumlar belirsizlikle sunulmalıdır.</p>

<p>Diferansiyel mahremiyet, ham veriyi şifrelemenin veya KVKK yükümlülüklerinin yerine geçmez. Sağlam yaklaşım; veri minimizasyonu, güvenli saklama ve kontrollü yayımlamayı birleştirir. Böylece araştırma ilerlerken hastanın mahremiyeti, sonradan eklenen bir aksesuar değil, sistemin temel tasarım ilkesi olur.</p>

<p><img src="/img/hasta-verisini-degil-39.svg" alt="hasta-verisini-degil-39" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="sağlık verileri" /><category term="mahremiyet" /><category term="differential privacy" /><category term="veri güvenliği" /><category term="python" /><category term="istatistik" /><summary type="html"><![CDATA[Bir hastanenin diyabet eğilimlerini araştırdığını düşünün. Araştırmacılar toplumdaki riskleri görmek istiyor; kimsenin komşusunun teşhisini öğrenmesini değil! Peki, hasta kayıtlarından yararlı sonuçlar çıkarırken kişileri nasıl koruyabiliriz? İsimleri silmek iyi bir başlangıçtır, fakat gerçek mahremiyet daha fazlasını gerektirir. Diferansiyel mahremiyet, tam da bu noktada matematiği güvenlik görevlisine dönüştürür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/hasta-verisini-degil-39.png" /><media:content medium="image" url="https://program.sonsuz.us/img/hasta-verisini-degil-39.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">İlaç Keşfinde Moleküler Simülasyon: Proteinlerle Dijital Prova</title><link href="https://program.sonsuz.us/posts/ilac-kesfinde-molekuler-simulasyon-proteinlerle-dijital-prova/" rel="alternate" type="text/html" title="İlaç Keşfinde Moleküler Simülasyon: Proteinlerle Dijital Prova" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ilac-kesfinde-molekuler-simulasyon-proteinlerle-dijital-prova</id><content type="html" xml:base="https://program.sonsuz.us/posts/ilac-kesfinde-molekuler-simulasyon-proteinlerle-dijital-prova/"><![CDATA[<p>Bir ilaç adayını laboratuvarda sınamadan önce, hedef proteinle bilgisayar ortamında buluşturabilir miyiz? Evet; üstelik yalnızca birbirlerine yakışıp yakışmadıklarına değil, nasıl hareket ettiklerine de bakabiliriz. Moleküler simülasyon, ilaç keşfinin dijital prova sahnesidir. Ancak alkış alan bir prova, gerçek gösterinin mutlaka başarılı olacağı anlamına gelmez.</p>

<p><img src="/img/ilac-kesfinde-molekuler-40.svg" alt="ilac-kesfinde-molekuler-40" /></p>

<p>``</p>

<h2 id="önce-hedefi-ve-molekülü-tanıyalım">Önce hedefi ve molekülü tanıyalım</h2>

<p>İlaç adayının bağlandığı moleküle <strong>hedef</strong>, aday küçük moleküle ise çoğunlukla <strong>ligand</strong> denir. Protein üzerindeki bağlanma cebi; geometrisi, elektrik yükleri ve suyla ilişkisi nedeniyle bazı ligandları diğerlerinden daha iyi karşılar. Buradaki mesele yalnızca anahtarın kilide sığması değildir: Kilit esner, anahtar döner ve aradaki su molekülleri pazarlığa katılır.</p>

<p>Önce deneysel veya tahmini bir protein yapısı hazırlanır. Eksik atomlar, protonlanma durumları, önemli su molekülleri ve gerekiyorsa metal iyonları değerlendirilir. Ligandın üç boyutlu geometrisi ve yükleri hazırlanır. Yanlış protonlanma, hesaplamanın sonucunu değiştirebilir; bilgisayar, yanlış hazırlanmış girdiyi büyük bir özgüvenle işlemekten çekinmez.</p>

<h2 id="i̇lk-eleme-moleküler-kenetlenme">İlk eleme: Moleküler kenetlenme</h2>

<p><strong>Moleküler kenetlenme</strong>, yani docking, ligandın bağlanma cebindeki olası yerleşimlerini araştırır. Arama algoritması konum, yönelim ve dönebilen bağları değiştirir; puanlama fonksiyonu ise temasları değerlendirir. Hidrojen bağları, hidrofobik etkileşimler ve sterik çakışmalar bu değerlendirmede rol oynar.</p>

<p>Docking, binlerce adayı hızla daraltabilir. Fakat verdiği skor, ölçülmüş bağlanma afinitesi veya kesin bir serbest enerji değildir. Farklı yazılımların skorlarını doğrudan aynı terazide tartmak da güvenilir olmaz.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Temel soru</th>
      <th>Başlıca sınır</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Docking</td>
      <td>Ligand nereye yerleşebilir?</td>
      <td>Esneklik ve çözücü yaklaşık ele alınır</td>
    </tr>
    <tr>
      <td>Moleküler dinamik</td>
      <td>Kompleks zamanla nasıl davranır?</td>
      <td>Örnekleme pahalıdır</td>
    </tr>
    <tr>
      <td>Serbest enerji hesabı</td>
      <td>Bağlanma ne kadar elverişlidir?</td>
      <td>Yakınsama dikkatle sınanmalıdır</td>
    </tr>
    <tr>
      <td>Deney</td>
      <td>Gerçekte ne oluyor?</td>
      <td>Zaman ve kaynak gerektirir</td>
    </tr>
  </tbody>
</table>

<h2 id="hareket-başlasın-moleküler-dinamik">Hareket başlasın: Moleküler dinamik</h2>

<p>Moleküler dinamikte atomlar, bir <strong>kuvvet alanının</strong> tanımladığı potansiyel enerjiye göre hareket eder. Bağların gerilmesi, açıların değişmesi, elektrostatik ve van der Waals etkileşimleri birlikte hesaplanır. Kuvvet, enerjinin konuma göre değişiminden elde edilir:</p>

\[\mathbf{F}_i=-\nabla_i U\]

<p>Newton denklemleri küçük zaman adımlarıyla çözülür. Böylece tek bir görüntü yerine bir yörünge oluşur. Protein nefes alır gibi kıpırdar; ligand bazı temasları kaybederken yenilerini kurabilir. Termostat, sistemin sıcaklığını hedef değer çevresinde tutmaya yardımcı olur.</p>

<p>Aşağıdaki OpenMM örneği, önceden hazırlanmış, su ve iyon içeren periyodik bir AMBER kompleksini çalıştırır. Protein ve ligandın uyumlu kuvvet alanı parametreleri dosyalarda bulunmalıdır; kod parametre üretmez.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">openmm</span> <span class="kn">import</span> <span class="n">LangevinMiddleIntegrator</span>
<span class="kn">from</span> <span class="n">openmm.app</span> <span class="kn">import</span> <span class="p">(</span>
    <span class="n">AmberPrmtopFile</span><span class="p">,</span> <span class="n">AmberInpcrdFile</span><span class="p">,</span> <span class="n">Simulation</span><span class="p">,</span>
    <span class="n">PME</span><span class="p">,</span> <span class="n">HBonds</span><span class="p">,</span> <span class="n">DCDReporter</span>
<span class="p">)</span>
<span class="kn">from</span> <span class="n">openmm.unit</span> <span class="kn">import</span> <span class="n">kelvin</span><span class="p">,</span> <span class="n">picosecond</span><span class="p">,</span> <span class="n">nanometer</span>

<span class="n">prmtop</span> <span class="o">=</span> <span class="nc">AmberPrmtopFile</span><span class="p">(</span><span class="sh">"</span><span class="s">complex.prmtop</span><span class="sh">"</span><span class="p">)</span>
<span class="n">inpcrd</span> <span class="o">=</span> <span class="nc">AmberInpcrdFile</span><span class="p">(</span><span class="sh">"</span><span class="s">complex.inpcrd</span><span class="sh">"</span><span class="p">)</span>
<span class="n">system</span> <span class="o">=</span> <span class="n">prmtop</span><span class="p">.</span><span class="nf">createSystem</span><span class="p">(</span>
    <span class="n">nonbondedMethod</span><span class="o">=</span><span class="n">PME</span><span class="p">,</span>
    <span class="n">nonbondedCutoff</span><span class="o">=</span><span class="mf">1.0</span> <span class="o">*</span> <span class="n">nanometer</span><span class="p">,</span>
    <span class="n">constraints</span><span class="o">=</span><span class="n">HBonds</span>
<span class="p">)</span>
<span class="n">integrator</span> <span class="o">=</span> <span class="nc">LangevinMiddleIntegrator</span><span class="p">(</span>
    <span class="mi">300</span> <span class="o">*</span> <span class="n">kelvin</span><span class="p">,</span> <span class="mi">1</span> <span class="o">/</span> <span class="n">picosecond</span><span class="p">,</span> <span class="mf">0.002</span> <span class="o">*</span> <span class="n">picosecond</span>
<span class="p">)</span>
<span class="n">sim</span> <span class="o">=</span> <span class="nc">Simulation</span><span class="p">(</span><span class="n">prmtop</span><span class="p">.</span><span class="n">topology</span><span class="p">,</span> <span class="n">system</span><span class="p">,</span> <span class="n">integrator</span><span class="p">)</span>
<span class="n">sim</span><span class="p">.</span><span class="n">context</span><span class="p">.</span><span class="nf">setPositions</span><span class="p">(</span><span class="n">inpcrd</span><span class="p">.</span><span class="n">positions</span><span class="p">)</span>
<span class="n">sim</span><span class="p">.</span><span class="n">context</span><span class="p">.</span><span class="nf">setPeriodicBoxVectors</span><span class="p">(</span><span class="o">*</span><span class="n">inpcrd</span><span class="p">.</span><span class="n">boxVectors</span><span class="p">)</span>
<span class="n">sim</span><span class="p">.</span><span class="nf">minimizeEnergy</span><span class="p">()</span>
<span class="n">sim</span><span class="p">.</span><span class="n">context</span><span class="p">.</span><span class="nf">setVelocitiesToTemperature</span><span class="p">(</span><span class="mi">300</span> <span class="o">*</span> <span class="n">kelvin</span><span class="p">)</span>
<span class="n">sim</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="mi">10000</span><span class="p">)</span>
<span class="n">sim</span><span class="p">.</span><span class="n">reporters</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nc">DCDReporter</span><span class="p">(</span><span class="sh">"</span><span class="s">trajectory.dcd</span><span class="sh">"</span><span class="p">,</span> <span class="mi">1000</span><span class="p">))</span>
<span class="n">sim</span><span class="p">.</span><span class="nf">step</span><span class="p">(</span><span class="mi">250000</span><span class="p">)</span>
</code></pre></div></div>

<p>Enerji minimizasyonu kötü temasları azaltır; ardından kısa bir ön dengeleme yapılır. Son bölüm, iki femtosaniyelik adımlarla <strong>0,5 nanosaniyelik</strong> yörünge üretir. Bu yalnızca teknik bir başlangıçtır; güvenilir analiz için daha kapsamlı dengeleme, daha uzun koşular ve bağımsız tekrarlar gerekir.</p>

<h2 id="yörüngeden-karar-çıkarmak">Yörüngeden karar çıkarmak</h2>

<p>Ligandın yer değiştirmesi, hidrojen bağlarının devamlılığı ve cebin şekil değişimleri incelenebilir. Ancak düşük RMSD, tek başına güçlü bağlanmanın kanıtı değildir. Ayrıca proteinin genel hareketini ayırmadan hesaplanan ligand RMSD değerleri yanıltıcı olabilir.</p>

<p>Bağlanma termodinamiği için standart serbest enerji önemlidir:</p>

\[\Delta G^\circ=RT\ln(K_d/C^\circ)\]

<p>Burada $K_d$ ayrışma sabiti, $C^\circ$ standart derişimdir. Daha küçük $K_d$, daha elverişli bağlanmaya karşılık gelir. Benzer adayların farklarını inceleyen FEP gibi yöntemler güçlüdür; fakat yeterli örnekleme ve belirsizlik analizi şarttır.</p>

<h2 id="son-söz-laboratuvarın">Son söz laboratuvarın</h2>

<p>İyi bağlanmak, mutlaka iyi ilaç olmak değildir. Adayın proteini gerçekten baskılayıp baskılamadığı, başka hedeflere bağlanması, hücreye erişmesi, metabolizması ve toksisitesi ayrıca değerlendirilir. Simülasyon sonuçları biyokimyasal, hücresel ve gerektiğinde ileri deneylerle doğrulanmalıdır.</p>

<p>En verimli yaklaşım, docking ile elemek, dinamikle davranışı incelemek ve uygun adaylarda serbest enerji hesaplarına ilerlemektir. Parametreleri, yazılım sürümlerini ve tekrar koşullarını kaydetmek de sonuçları yeniden üretilebilir kılar. Bilgisayar burada sihirli ilaç makinesi değil; yanlış adaylara harcanan emeği azaltan, doğru deneyleri tasarlamaya yardımcı olan meraklı bir araştırma ortağıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ilaç keşfi" /><category term="moleküler simülasyon" /><category term="moleküler dinamik" /><category term="biyoinformatik" /><category term="python" /><category term="hesaplamalı kimya" /><summary type="html"><![CDATA[Bir ilaç adayını laboratuvarda sınamadan önce, hedef proteinle bilgisayar ortamında buluşturabilir miyiz? Evet; üstelik yalnızca birbirlerine yakışıp yakışmadıklarına değil, nasıl hareket ettiklerine de bakabiliriz. Moleküler simülasyon, ilaç keşfinin dijital prova sahnesidir. Ancak alkış alan bir prova, gerçek gösterinin mutlaka başarılı olacağı anlamına gelmez.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ilac-kesfinde-molekuler-40.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ilac-kesfinde-molekuler-40.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Markowitz Modeliyle Portföy Optimizasyonu: Risk ve Getiriyi Kodla Dengelemek</title><link href="https://program.sonsuz.us/posts/markowitz-modeliyle-portfoy-optimizasyonu-risk-ve-getiriyi-kodla-dengelemek/" rel="alternate" type="text/html" title="Markowitz Modeliyle Portföy Optimizasyonu: Risk ve Getiriyi Kodla Dengelemek" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/markowitz-modeliyle-portfoy-optimizasyonu-risk-ve-getiriyi-kodla-dengelemek</id><content type="html" xml:base="https://program.sonsuz.us/posts/markowitz-modeliyle-portfoy-optimizasyonu-risk-ve-getiriyi-kodla-dengelemek/"><![CDATA[<p>Yatırım dünyasında herkes yüksek getiri ister; fakat kimse geceleri portföyünün eridiğini düşünerek uyanmak istemez. Markowitz modeli, bu iki isteği matematiksel bir çerçevede buluşturur. Modelin temel sorusu şudur: Belirli bir getiri düzeyine ulaşırken riski nasıl en aza indirebiliriz? Gelin modern portföy teorisinin kalbine inip bu problemi Python ile çözelim.</p>

<p>``</p>

<h2 id="markowitz-modelinin-temel-fikri">Markowitz modelinin temel fikri</h2>

<p>Harry Markowitz tarafından geliştirilen modern portföy teorisi, yatırım araçlarını yalnızca tek tek değerlendirmez. Varlıkların birbirleriyle nasıl hareket ettiğini de hesaba katar. Çünkü iki riskli varlık, fiyatları farklı yönlerde hareket ediyorsa birlikte daha dengeli bir portföy oluşturabilir.</p>

<p>Bir portföyde $n$ adet varlık bulunduğunu düşünelim. Her varlığa ayrılan oranı $w_i$ ile gösterirsek ağırlıkların toplamı genellikle şöyle sınırlandırılır:</p>

\[\sum_{i=1}^{n} w_i = 1\]

<p>Açığa satışa izin verilmiyorsa ayrıca $w_i \geq 0$ koşulu uygulanır. Portföyün beklenen getirisi:</p>

\[E(R_p) = \mathbf{w}^T\boldsymbol{\mu}\]

<p>Portföy riski, yani varyansı ise kovaryans matrisi kullanılarak hesaplanır:</p>

\[\sigma_p^2 = \mathbf{w}^T\Sigma\mathbf{w}\]

<p>Burada $\boldsymbol{\mu}$ beklenen getiriler vektörü, $\Sigma$ kovaryans matrisi ve $\mathbf{w}$ portföy ağırlıklarıdır. Standart sapma için varyansın karekökü alınır.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Ne anlatır?</th>
      <th>Portföydeki etkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Beklenen getiri</td>
      <td>Geçmiş veya tahmini ortalama kazanç</td>
      <td>Yükseldikçe kazanç potansiyeli artar</td>
    </tr>
    <tr>
      <td>Varyans</td>
      <td>Getirilerin ortalamadan sapması</td>
      <td>Yüksekse belirsizlik büyür</td>
    </tr>
    <tr>
      <td>Kovaryans</td>
      <td>İki varlığın birlikte hareketi</td>
      <td>Düşük veya negatifse çeşitlendirme sağlar</td>
    </tr>
    <tr>
      <td>Ağırlık</td>
      <td>Varlığa ayrılan sermaye oranı</td>
      <td>Risk-getiri profilini belirler</td>
    </tr>
  </tbody>
</table>

<h2 id="python-ile-minimum-varyanslı-portföy">Python ile minimum varyanslı portföy</h2>

<p>Aşağıdaki örnekte yıllık beklenen getirileri ve kovaryans matrisini doğrudan tanımlıyoruz. Gerçek projelerde bunlar günlük fiyat verilerinden hesaplanabilir.</p>

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

<span class="n">returns</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">0.12</span><span class="p">,</span> <span class="mf">0.18</span><span class="p">,</span> <span class="mf">0.10</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">])</span>

<span class="n">covariance</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span>
    <span class="p">[</span><span class="mf">0.040</span><span class="p">,</span> <span class="mf">0.010</span><span class="p">,</span> <span class="mf">0.008</span><span class="p">,</span> <span class="mf">0.012</span><span class="p">],</span>
    <span class="p">[</span><span class="mf">0.010</span><span class="p">,</span> <span class="mf">0.090</span><span class="p">,</span> <span class="mf">0.006</span><span class="p">,</span> <span class="mf">0.020</span><span class="p">],</span>
    <span class="p">[</span><span class="mf">0.008</span><span class="p">,</span> <span class="mf">0.006</span><span class="p">,</span> <span class="mf">0.025</span><span class="p">,</span> <span class="mf">0.009</span><span class="p">],</span>
    <span class="p">[</span><span class="mf">0.012</span><span class="p">,</span> <span class="mf">0.020</span><span class="p">,</span> <span class="mf">0.009</span><span class="p">,</span> <span class="mf">0.060</span><span class="p">]</span>
<span class="p">])</span>

<span class="n">asset_count</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">returns</span><span class="p">)</span>
<span class="n">initial_weights</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">ones</span><span class="p">(</span><span class="n">asset_count</span><span class="p">)</span> <span class="o">/</span> <span class="n">asset_count</span>

<span class="k">def</span> <span class="nf">portfolio_variance</span><span class="p">(</span><span class="n">weights</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">weights</span><span class="p">.</span><span class="n">T</span> <span class="o">@</span> <span class="n">covariance</span> <span class="o">@</span> <span class="n">weights</span>

<span class="n">constraints</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span><span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">eq</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">fun</span><span class="sh">'</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">w</span><span class="p">:</span> <span class="n">np</span><span class="p">.</span><span class="nf">sum</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">}</span>
<span class="p">]</span>

<span class="n">bounds</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span> <span class="o">*</span> <span class="n">asset_count</span>

<span class="n">result</span> <span class="o">=</span> <span class="nf">minimize</span><span class="p">(</span>
    <span class="n">portfolio_variance</span><span class="p">,</span>
    <span class="n">initial_weights</span><span class="p">,</span>
    <span class="n">method</span><span class="o">=</span><span class="sh">'</span><span class="s">SLSQP</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">bounds</span><span class="o">=</span><span class="n">bounds</span><span class="p">,</span>
    <span class="n">constraints</span><span class="o">=</span><span class="n">constraints</span>
<span class="p">)</span>

<span class="n">weights</span> <span class="o">=</span> <span class="n">result</span><span class="p">.</span><span class="n">x</span>
<span class="n">portfolio_return</span> <span class="o">=</span> <span class="n">weights</span> <span class="o">@</span> <span class="n">returns</span>
<span class="n">portfolio_risk</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="nf">portfolio_variance</span><span class="p">(</span><span class="n">weights</span><span class="p">))</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Ağırlıklar:</span><span class="sh">'</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="n">weights</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Beklenen getiri:</span><span class="sh">'</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="n">portfolio_return</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Risk:</span><span class="sh">'</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="n">portfolio_risk</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">portfolio_variance</code> fonksiyonu optimizasyonun küçültmeye çalıştığı hedefi temsil eder. <code class="language-plaintext highlighter-rouge">constraints</code>, sermayenin tamamının kullanılmasını; <code class="language-plaintext highlighter-rouge">bounds</code> ise hiçbir varlığın negatif ağırlık almamasını sağlar. SLSQP algoritması, eşitlik ve sınır koşulları içeren bu tür problemlerde oldukça kullanışlıdır.</p>

<h2 id="hedef-getiri-ve-etkin-sınır">Hedef getiri ve etkin sınır</h2>

<p>Minimum varyanslı portföy güvenlidir; ancak beklenen getirisi yatırımcı için yetersiz kalabilir. Örneğin en az %14 getiri istiyorsak ikinci bir koşul ekleyebiliriz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">target_return</span> <span class="o">=</span> <span class="mf">0.14</span>
<span class="n">constraints</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">type</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">eq</span><span class="sh">'</span><span class="p">,</span>
    <span class="sh">'</span><span class="s">fun</span><span class="sh">'</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">w</span><span class="p">:</span> <span class="n">w</span> <span class="o">@</span> <span class="n">returns</span> <span class="o">-</span> <span class="n">target_return</span>
<span class="p">})</span>

<span class="n">result</span> <span class="o">=</span> <span class="nf">minimize</span><span class="p">(</span>
    <span class="n">portfolio_variance</span><span class="p">,</span>
    <span class="n">initial_weights</span><span class="p">,</span>
    <span class="n">method</span><span class="o">=</span><span class="sh">'</span><span class="s">SLSQP</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">bounds</span><span class="o">=</span><span class="n">bounds</span><span class="p">,</span>
    <span class="n">constraints</span><span class="o">=</span><span class="n">constraints</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Farklı hedef getiriler için optimizasyonu tekrarladığımızda <strong>etkin sınır</strong> ortaya çıkar. Bu eğri üzerindeki her portföy, aynı getiri seviyesindeki alternatiflerden daha düşük riske sahiptir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Amaç</th>
      <th>Uygun yatırımcı profili</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Minimum varyans</td>
      <td>Riski mümkün olduğunca azaltmak</td>
      <td>Temkinli</td>
    </tr>
    <tr>
      <td>Hedef getirili optimizasyon</td>
      <td>Belirli getiride en düşük riski bulmak</td>
      <td>Dengeli</td>
    </tr>
    <tr>
      <td>Maksimum Sharpe oranı</td>
      <td>Risk başına getiriyi artırmak</td>
      <td>Performans odaklı</td>
    </tr>
  </tbody>
</table>

<p>Markowitz modeli güçlüdür ama kusursuz değildir: geçmiş getirilerin geleceği temsil ettiği, korelasyonların sabit kaldığı ve işlem maliyetlerinin önemsiz olduğu varsayılır. Bu nedenle sonuçları kesin reçete değil, karar destek aracı olarak görmek gerekir. Sağlam veri, periyodik yeniden dengeleme ve ağırlık sınırları eklendiğinde model, portföyünüz için matematik bilen bir yardımcı pilota dönüşebilir.</p>

<p><img src="/img/markowitz-modeliyle-portfoy-49.svg" alt="markowitz-modeliyle-portfoy-49" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="portföy optimizasyonu" /><category term="markowitz modeli" /><category term="python" /><category term="finans" /><category term="risk yönetimi" /><category term="scipy" /><summary type="html"><![CDATA[Yatırım dünyasında herkes yüksek getiri ister; fakat kimse geceleri portföyünün eridiğini düşünerek uyanmak istemez. Markowitz modeli, bu iki isteği matematiksel bir çerçevede buluşturur. Modelin temel sorusu şudur: Belirli bir getiri düzeyine ulaşırken riski nasıl en aza indirebiliriz? Gelin modern portföy teorisinin kalbine inip bu problemi Python ile çözelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/markowitz-modeliyle-portfoy-49.png" /><media:content medium="image" url="https://program.sonsuz.us/img/markowitz-modeliyle-portfoy-49.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Mikroskop Görüntülerinde Kanser Hücrelerini Bilgisayarla Tespit Etmek</title><link href="https://program.sonsuz.us/posts/mikroskop-goruntulerinde-kanser-hucrelerini-bilgisayarla-tespit-etmek/" rel="alternate" type="text/html" title="Mikroskop Görüntülerinde Kanser Hücrelerini Bilgisayarla Tespit Etmek" /><published>2026-10-30T00:00:00+00:00</published><updated>2026-10-30T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/mikroskop-goruntulerinde-kanser-hucrelerini-bilgisayarla-tespit-etmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/mikroskop-goruntulerinde-kanser-hucrelerini-bilgisayarla-tespit-etmek/"><![CDATA[<p>Mikroskop altında yüzlerce hücreyi tek tek incelemek, samanlıkta iğne aramaya benzeyebilir. Bilgisayarlı görüntü analizi ise şüpheli hücreleri otomatik biçimde işaretleyerek araştırmacılara ve patologlara yardımcı olur. Gelin, bir mikroskop görüntüsünün piksellerden hücre adaylarına, oradan da sınıflandırma sonucuna uzanan yolculuğunu inceleyelim.</p>

<p><img src="/img/mikroskop-goruntulerinde-kanser-62.svg" alt="mikroskop-goruntulerinde-kanser-62" /></p>

<p>``</p>

<h2 id="problem-aslında-nedir">Problem aslında nedir?</h2>

<p>Kanser hücreleri sağlıklı hücrelerden çekirdek büyüklüğü, şekil düzensizliği, kromatin yoğunluğu ve hücre bölünme hızı gibi özelliklerle ayrılabilir. Ancak boyama yöntemi, mikroskop ışığı ve doku türü değiştikçe görüntünün görünümü de değişir. Dolayısıyla bilgisayar yalnızca “koyu renkli olan kanserdir” gibi basit bir kuralla güvenilir sonuç üretemez.</p>

<p>Tipik bir sistem dört aşamadan oluşur:</p>

<ol>
  <li>Görüntünün renk ve gürültü bakımından düzeltilmesi</li>
  <li>Hücre veya çekirdeklerin bölütlenmesi</li>
  <li>Her hücreden açıklayıcı özelliklerin çıkarılması</li>
  <li>Hücrenin normal ya da anormal olarak sınıflandırılması</li>
</ol>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Amaç</th>
      <th>Örnek yöntem</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ön işleme</td>
      <td>Görüntü farklılıklarını azaltmak</td>
      <td>Gaussian filtre, renk normalizasyonu</td>
    </tr>
    <tr>
      <td>Bölütleme</td>
      <td>Hücre sınırlarını bulmak</td>
      <td>Otsu eşikleme, watershed, U-Net</td>
    </tr>
    <tr>
      <td>Özellik çıkarımı</td>
      <td>Hücreyi sayılarla tanımlamak</td>
      <td>Alan, çevre, doku, yuvarlaklık</td>
    </tr>
    <tr>
      <td>Sınıflandırma</td>
      <td>Anormallik olasılığı üretmek</td>
      <td>SVM, rastgele orman, CNN</td>
    </tr>
  </tbody>
</table>

<h2 id="hücreyi-matematikle-anlatmak">Hücreyi matematikle anlatmak</h2>

<p>Bir hücrenin alanı $A$, çevresi $P$ ile gösterilsin. Şeklin ne kadar dairesel olduğunu ölçmek için şu değer kullanılabilir:</p>

\[C = \frac{4\pi A}{P^2}\]

<p>Kusursuz bir dairede $C$ değeri 1’e yaklaşır. Girintili çıkıntılı hücrelerde ise küçülür. Bunun yanında çekirdeğin ortalama parlaklığı, renk dağılımı ve komşularına göre büyüklüğü de modele verilebilir.</p>

<p>Sınıflandırıcı çoğu zaman $p(y=1\mid x)$, yani özellikleri $x$ olan hücrenin anormal olma olasılığını hesaplar. Olasılık belirlenen eşiği aşarsa hücre şüpheli kabul edilir. Eşiği düşürmek daha fazla şüpheli hücre yakalar; fakat yanlış alarm sayısını da artırır.</p>

<h2 id="basit-bir-prototip">Basit bir prototip</h2>

<p>Aşağıdaki Python örneği, gri tonlamalı görüntüde koyu çekirdekleri ayırır, küçük gürültüleri temizler ve büyük hücre adaylarını işaretler. Bu kod klinik tanı sistemi değil, temel görüntü işleme mantığını gösteren bir başlangıçtır.</p>

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

<span class="n">image</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">imread</span><span class="p">(</span><span class="sh">"</span><span class="s">hucreler.png</span><span class="sh">"</span><span class="p">)</span>
<span class="n">gray</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">cvtColor</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="n">cv2</span><span class="p">.</span><span class="n">COLOR_BGR2GRAY</span><span class="p">)</span>

<span class="c1"># Gürültüyü azaltarak eşikleme sonucunu daha kararlı yapar.
</span><span class="n">blurred</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nc">GaussianBlur</span><span class="p">(</span><span class="n">gray</span><span class="p">,</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="mi">0</span><span class="p">)</span>

<span class="c1"># Otsu yöntemi uygun eşik değerini görüntüden otomatik hesaplar.
</span><span class="n">_</span><span class="p">,</span> <span class="n">mask</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">threshold</span><span class="p">(</span>
    <span class="n">blurred</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span>
    <span class="n">cv2</span><span class="p">.</span><span class="n">THRESH_BINARY_INV</span> <span class="o">+</span> <span class="n">cv2</span><span class="p">.</span><span class="n">THRESH_OTSU</span>
<span class="p">)</span>

<span class="n">contours</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">findContours</span><span class="p">(</span>
    <span class="n">mask</span><span class="p">,</span> <span class="n">cv2</span><span class="p">.</span><span class="n">RETR_EXTERNAL</span><span class="p">,</span> <span class="n">cv2</span><span class="p">.</span><span class="n">CHAIN_APPROX_SIMPLE</span>
<span class="p">)</span>

<span class="k">for</span> <span class="n">contour</span> <span class="ow">in</span> <span class="n">contours</span><span class="p">:</span>
    <span class="n">area</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">contourArea</span><span class="p">(</span><span class="n">contour</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">area</span> <span class="o">&gt;</span> <span class="mi">250</span><span class="p">:</span>  <span class="c1"># Örnek amaçlı şüpheli büyüklük sınırı
</span>        <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">boundingRect</span><span class="p">(</span><span class="n">contour</span><span class="p">)</span>
        <span class="n">cv2</span><span class="p">.</span><span class="nf">rectangle</span><span class="p">(</span><span class="n">image</span><span class="p">,</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="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">w</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">h</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="mi">255</span><span class="p">),</span> <span class="mi">2</span><span class="p">)</span>

<span class="n">cv2</span><span class="p">.</span><span class="nf">imwrite</span><span class="p">(</span><span class="sh">"</span><span class="s">isaretli_hucreler.png</span><span class="sh">"</span><span class="p">,</span> <span class="n">image</span><span class="p">)</span>
</code></pre></div></div>

<p>Gerçek dokularda hücreler üst üste binebilir. Böyle durumlarda watershed algoritması veya piksel düzeyinde öğrenen U-Net gibi derin öğrenme modelleri daha başarılıdır. Yine de derin modeller daha fazla etiketli veri, güçlü donanım ve dikkatli doğrulama gerektirir.</p>

<h2 id="başarıyı-doğru-ölçmek">Başarıyı doğru ölçmek</h2>

<p>Kanser taramasında yalnızca doğruluk değerine bakmak yanıltıcıdır. Bin hücrenin yalnızca onu anormalse, her hücreye “normal” diyen model yüzde 99 doğruluk elde eder ama hiçbir vakayı bulamaz.</p>

<table>
  <thead>
    <tr>
      <th>Metrik</th>
      <th>Yanıtladığı soru</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Duyarlılık</td>
      <td>Anormal hücrelerin kaçını yakaladık?</td>
    </tr>
    <tr>
      <td>Özgüllük</td>
      <td>Normal hücrelerin kaçını doğru eledik?</td>
    </tr>
    <tr>
      <td>Kesinlik</td>
      <td>İşaretlenen hücrelerin kaçı gerçekten anormal?</td>
    </tr>
    <tr>
      <td>F1 skoru</td>
      <td>Duyarlılık ve kesinlik dengeli mi?</td>
    </tr>
  </tbody>
</table>

<p>Veriler hasta bazında ayrılmalıdır; aynı hastaya ait benzer görüntülerin hem eğitim hem test kümesine girmesi veri sızıntısına yol açar. Ayrıca farklı laboratuvarlardan alınan örneklerle harici doğrulama yapılmalıdır.</p>

<p>Sonuç olarak bilgisayar, patoloğun yerini alan sihirli bir doktor değil; yorucu tarama işini hızlandıran dikkatli bir asistandır. Güvenilir bir sistem için kaliteli etiketler, açıklanabilir sonuçlar, mahremiyet koruması ve uzman denetimi vazgeçilmezdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="yapay zeka" /><category term="görüntü işleme" /><category term="kanser araştırmaları" /><category term="makine öğrenmesi" /><category term="opencv" /><category term="mikroskopi" /><summary type="html"><![CDATA[Mikroskop altında yüzlerce hücreyi tek tek incelemek, samanlıkta iğne aramaya benzeyebilir. Bilgisayarlı görüntü analizi ise şüpheli hücreleri otomatik biçimde işaretleyerek araştırmacılara ve patologlara yardımcı olur. Gelin, bir mikroskop görüntüsünün piksellerden hücre adaylarına, oradan da sınıflandırma sonucuna uzanan yolculuğunu inceleyelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/mikroskop-goruntulerinde-kanser-62.png" /><media:content medium="image" url="https://program.sonsuz.us/img/mikroskop-goruntulerinde-kanser-62.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>