<?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-29T18:06:19+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Akıllı Kilitlerde Güvenli Uzaktan Açma: Kimlik Doğrulama ve Şifreleme</title><link href="https://program.sonsuz.us/posts/akilli-kilitlerde-guvenli-uzaktan-acma-kimlik-dogrulama-ve-sifreleme/" rel="alternate" type="text/html" title="Akıllı Kilitlerde Güvenli Uzaktan Açma: Kimlik Doğrulama ve Şifreleme" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-kilitlerde-guvenli-uzaktan-acma-kimlik-dogrulama-ve-sifreleme</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-kilitlerde-guvenli-uzaktan-acma-kimlik-dogrulama-ve-sifreleme/"><![CDATA[<p>Telefonunuzdaki düğmeye dokunduğunuzda kilometrelerce uzaktaki bir kapının açılması sihir gibi görünebilir. Oysa perde arkasında cihaz kimliği, kriptografik anahtarlar, zaman damgaları ve tek kullanımlık mesajlar birlikte çalışır. Amaç yalnızca doğru komutu kilide ulaştırmak değil; komutun gerçekten yetkili kişiden geldiğini, değiştirilmediğini ve daha önce kullanılmış bir kaydın tekrarı olmadığını kanıtlamaktır.</p>

<p>``</p>

<h2 id="uzaktan-açma-isteği-nasıl-ilerler">Uzaktan açma isteği nasıl ilerler?</h2>

<p>Tipik bir sistemde telefon doğrudan kilide bağlanmak yerine üreticinin sunucusuyla haberleşir. Kullanıcı önce parola, biyometri veya geçiş anahtarıyla oturum açar. Sunucu kullanıcının ilgili kapıyı açma yetkisini denetler ve kilide imzalanmış bir komut gönderir. Kilit, komutun doğruluğunu kendi içindeki güvenli anahtarla kontrol ettikten sonra motoru çalıştırır.</p>

<p>Bu süreç üç temel soruya cevap vermelidir:</p>

<ol>
  <li><strong>Kim gönderdi?</strong> Kimlik doğrulama bunu belirler.</li>
  <li><strong>Mesaj değiştirildi mi?</strong> Bütünlük kontrolü bunu gösterir.</li>
  <li><strong>İçeriği başkası okuyabilir mi?</strong> Şifreleme gizliliği sağlar.</li>
</ol>

<p>Kimlik doğrulama ile yetkilendirme aynı şey değildir. Kimlik doğrulama, “Bu kişi Ayşe mi?” sorusunu; yetkilendirme ise “Ayşe bu kapıyı şu anda açabilir mi?” sorusunu cevaplar. Örneğin temizlik görevlisinin hesabı gerçek olabilir, fakat erişimi yalnızca 09.00–11.00 arasında geçerli olabilir.</p>

<h2 id="şifreleme-hangi-katmanlarda-kullanılır">Şifreleme hangi katmanlarda kullanılır?</h2>

<p>Telefon, sunucu ve kilit arasındaki ağ trafiği genellikle TLS ile korunur. Böylece ortak Wi-Fi ağındaki saldırgan komutu okuyamaz veya değiştiremez. Ancak yalnızca bağlantı şifrelemesine güvenmek yeterli değildir. Açma komutunun ayrıca dijital imza ya da HMAC ile doğrulanması, aradaki sunucu veya ağ katmanlarına karşı ek güvence sağlar.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Temel amacı</th>
      <th>Akıllı kilitte örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>AES</td>
      <td>Veriyi gizlemek</td>
      <td>Yerel kayıtları şifrelemek</td>
    </tr>
    <tr>
      <td>HMAC</td>
      <td>Kaynak ve bütünlüğü doğrulamak</td>
      <td>Açma komutunu onaylamak</td>
    </tr>
    <tr>
      <td>Dijital imza</td>
      <td>Özel anahtar sahibini kanıtlamak</td>
      <td>Sunucunun komut imzalaması</td>
    </tr>
    <tr>
      <td>TLS</td>
      <td>İletişim kanalını korumak</td>
      <td>Telefon-sunucu bağlantısı</td>
    </tr>
  </tbody>
</table>

<p>HMAC kabaca şu şekilde ifade edilir:</p>

\[HMAC(K,m)=H((K'\oplus opad)\parallel H((K'\oplus ipad)\parallel m))\]

<p>Burada $K$ gizli anahtar, $m$ ise mesajdır. Anahtarı bilmeyen saldırgan geçerli doğrulama kodunu pratikte üretemez.</p>

<h2 id="tekrar-saldırısı-neden-tehlikelidir">Tekrar saldırısı neden tehlikelidir?</h2>

<p>Bir saldırgan şifreli paketi okuyamasa bile paketi kaydedip daha sonra yeniden gönderebilir. Buna <strong>replay saldırısı</strong> denir. Savunma için her isteğe rastgele bir <code class="language-plaintext highlighter-rouge">nonce</code>, kısa son kullanma süresi ve benzersiz işlem kimliği eklenir. Kilit daha önce gördüğü nonce değerlerini reddeder.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">hmac</span><span class="p">,</span> <span class="n">hashlib</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">secrets</span>

<span class="n">key</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">"</span><span class="s">cihaz-icin-gizli-anahtar</span><span class="sh">"</span>
<span class="n">nonce</span> <span class="o">=</span> <span class="n">secrets</span><span class="p">.</span><span class="nf">token_hex</span><span class="p">(</span><span class="mi">16</span><span class="p">)</span>
<span class="n">expires</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">time</span><span class="p">.</span><span class="nf">time</span><span class="p">())</span> <span class="o">+</span> <span class="mi">30</span>
<span class="n">message</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">OPEN|front-door|</span><span class="si">{</span><span class="n">nonce</span><span class="si">}</span><span class="s">|</span><span class="si">{</span><span class="n">expires</span><span class="si">}</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">()</span>
<span class="n">signature</span> <span class="o">=</span> <span class="n">hmac</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">hashlib</span><span class="p">.</span><span class="n">sha256</span><span class="p">).</span><span class="nf">hexdigest</span><span class="p">()</span>
</code></pre></div></div>

<p>Bu örnek, kapı kimliğiyle birlikte rastgele nonce ve 30 saniyelik geçerlilik süresi içeren bir mesaj üretir. HMAC, mesajın değiştirilip değiştirilmediğini denetlemeyi sağlar. Gerçek bir üründe anahtar kaynak koda yazılmaz; secure element, TPM benzeri güvenli donanım veya işletim sisteminin anahtar kasasında tutulur.</p>

<p>256 bitlik ideal bir anahtarı rastgele tahmin etmenin tek denemedeki başarı olasılığı $1/2^{256}$ seviyesindedir. Fakat güçlü matematik, kötü anahtar yönetimini kurtaramaz. Aynı anahtarın bütün kilitlerde kullanılması, güncelleme imzalarının doğrulanmaması veya hata ayıklama portlarının açık bırakılması sistemi savunmasız yapabilir.</p>

<h2 id="güvenli-tasarımın-tamamlayıcı-parçaları">Güvenli tasarımın tamamlayıcı parçaları</h2>

<p>Akıllı kilit güvenliği; çok faktörlü kimlik doğrulama, erişim süresi sınırları, başarısız denemelerde hız kısıtlama, imzalı yazılım güncellemeleri ve denetlenebilir olay kayıtlarıyla tamamlanır. İnternet kesildiğinde sistemin nasıl davranacağı da önceden belirlenmelidir. Acil çıkış güvenliği korunurken dışarıdan yetkisiz girişe izin verilmemelidir.</p>

<p>Kısacası güvenli bir akıllı kilit, sadece “şifreli bağlantı kullanan motorlu kapı” değildir. Kimlik, yetki, mesaj bütünlüğü, anahtar saklama ve fiziksel güvenlik birlikte tasarlandığında uzaktan açma işlemi hem kullanışlı hem de güvenilir hale gelir.</p>

<p><img src="/img/akilli-kilitlerde-guvenli-79.svg" alt="akilli-kilitlerde-guvenli-79" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="akıllı kilit" /><category term="siber güvenlik" /><category term="kimlik doğrulama" /><category term="şifreleme" /><category term="iot" /><category term="hmac" /><summary type="html"><![CDATA[Telefonunuzdaki düğmeye dokunduğunuzda kilometrelerce uzaktaki bir kapının açılması sihir gibi görünebilir. Oysa perde arkasında cihaz kimliği, kriptografik anahtarlar, zaman damgaları ve tek kullanımlık mesajlar birlikte çalışır. Amaç yalnızca doğru komutu kilide ulaştırmak değil; komutun gerçekten yetkili kişiden geldiğini, değiştirilmediğini ve daha önce kullanılmış bir kaydın tekrarı olmadığını kanıtlamaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-kilitlerde-guvenli-79.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-kilitlerde-guvenli-79.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Akıllı Priz Verisiyle Elektrik Faturasını Küçültme Rehberi</title><link href="https://program.sonsuz.us/posts/akilli-priz-verisiyle-elektrik-faturasini-kucultme-rehberi/" rel="alternate" type="text/html" title="Akıllı Priz Verisiyle Elektrik Faturasını Küçültme Rehberi" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-priz-verisiyle-elektrik-faturasini-kucultme-rehberi</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-priz-verisiyle-elektrik-faturasini-kucultme-rehberi/"><![CDATA[<p><img src="/img/akilli-priz-verisiyle-23.svg" alt="akilli-priz-verisiyle-23" /></p>

<p>Elektrik faturası bazen evde görünmez bir canavar dolaşıyormuş hissi verir: Buzdolabı sessizce çalışır, televizyon bekleme modunda enerji tüketir, elektrikli ısıtıcı ise bütçeyi adeta közler. Akıllı prizler bu canavarı görünür hâle getirir. Cihaz bazında güç ve enerji ölçümü yaparak hangi cihazın ne zaman, ne kadar tükettiğini anlamamızı; tahminlere değil, verilere dayalı tasarruf kararları almamızı sağlar.</p>

<p>``</p>

<h2 id="akıllı-priz-hangi-verileri-toplar">Akıllı priz hangi verileri toplar?</h2>

<p>Tipik bir akıllı priz belirli aralıklarla gerilim, akım ve aktif güç değerlerini kaydeder. Bazı modeller güç faktörü, frekans ve toplam enerji tüketimi de sunar. Temel elektrik ilişkisi şöyledir:</p>

\[P = V \times I \times \cos(\varphi)\]

<p>Burada $P$ aktif gücü (W), $V$ gerilimi, $I$ akımı ve $\cos(\varphi)$ güç faktörünü gösterir. Bir cihazın tükettiği enerji ise gücün zaman boyunca birikimidir:</p>

\[E = \sum_{i=1}^{n} \frac{P_i \times \Delta t_i}{1000}\]

<p>$P_i$ watt, $\Delta t_i$ saat cinsindeyse sonuç kilovatsaat, yani kWh olur. Faturanın enerji kısmını yaklaşık hesaplamak için $E$ değeri birim fiyatla çarpılır.</p>

<table>
  <thead>
    <tr>
      <th>Veri</th>
      <th style="text-align: right">Birim</th>
      <th>Bize ne anlatır?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gerilim</td>
      <td style="text-align: right">V</td>
      <td>Şebeke seviyesini ve dalgalanmaları</td>
    </tr>
    <tr>
      <td>Aktif güç</td>
      <td style="text-align: right">W</td>
      <td>Cihazın o andaki tüketimini</td>
    </tr>
    <tr>
      <td>Enerji</td>
      <td style="text-align: right">kWh</td>
      <td>Zaman içinde biriken tüketimi</td>
    </tr>
    <tr>
      <td>Güç faktörü</td>
      <td style="text-align: right">0–1</td>
      <td>Elektriğin ne kadar verimli kullanıldığını</td>
    </tr>
    <tr>
      <td>Zaman damgası</td>
      <td style="text-align: right">Tarih/saat</td>
      <td>Kullanım alışkanlıklarını ve pik saatleri</td>
    </tr>
  </tbody>
</table>

<h2 id="ham-veriden-anlamlı-sonuca">Ham veriden anlamlı sonuca</h2>

<p>Akıllı priz kayıtları önce temizlenmelidir. Eksik ölçümler, tekrarlanan satırlar ve gerçek dışı sıçramalar analizi yanıltabilir. Örneğin normalde 100 W çeken bir televizyonun bir saniyeliğine 30.000 W görünmesi büyük olasılıkla ölçüm veya iletişim hatasıdır.</p>

<p>Temiz veride şu göstergeler özellikle değerlidir:</p>

<ul>
  <li><strong>Baz yük:</strong> Cihaz kapalı sanılırken devam eden tüketim.</li>
  <li><strong>Pik güç:</strong> Cihazın ulaştığı en yüksek güç seviyesi.</li>
  <li><strong>Çalışma süresi:</strong> Gücün belirlenen eşiğin üzerinde kaldığı süre.</li>
  <li><strong>Günlük enerji:</strong> Gün boyunca biriken kWh miktarı.</li>
  <li><strong>Kullanım deseni:</strong> Cihazın hangi saatlerde ve ne sıklıkta çalıştığı.</li>
</ul>

<p>Aşağıdaki Python örneği, CSV dosyasındaki ölçümlerden günlük enerji ve maliyet üretir:</p>

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

<span class="n">BIRIM_FIYAT</span> <span class="o">=</span> <span class="mf">2.60</span>  <span class="c1"># Örnek TL/kWh
</span>
<span class="n">veri</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">read_csv</span><span class="p">(</span><span class="sh">"</span><span class="s">priz_verisi.csv</span><span class="sh">"</span><span class="p">,</span> <span class="n">parse_dates</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">zaman</span><span class="sh">"</span><span class="p">])</span>
<span class="n">veri</span> <span class="o">=</span> <span class="n">veri</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="sh">"</span><span class="s">zaman</span><span class="sh">"</span><span class="p">).</span><span class="nf">drop_duplicates</span><span class="p">(</span><span class="sh">"</span><span class="s">zaman</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># Ölçümler arasındaki süreyi saate çevirir.
</span><span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">sure_saat</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">zaman</span><span class="sh">"</span><span class="p">].</span><span class="nf">diff</span><span class="p">().</span><span class="n">dt</span><span class="p">.</span><span class="nf">total_seconds</span><span class="p">()</span> <span class="o">/</span> <span class="mi">3600</span>
<span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">sure_saat</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">sure_saat</span><span class="sh">"</span><span class="p">].</span><span class="nf">clip</span><span class="p">(</span><span class="n">lower</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">upper</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>

<span class="c1"># Watt-saat hesabını kWh değerine dönüştürür.
</span><span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">enerji_kwh</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">guc_watt</span><span class="sh">"</span><span class="p">]</span> <span class="o">*</span> <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">sure_saat</span><span class="sh">"</span><span class="p">]</span> <span class="o">/</span> <span class="mi">1000</span>
<span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">gun</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">"</span><span class="s">zaman</span><span class="sh">"</span><span class="p">].</span><span class="n">dt</span><span class="p">.</span><span class="n">date</span>

<span class="n">ozet</span> <span class="o">=</span> <span class="n">veri</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">"</span><span class="s">gun</span><span class="sh">"</span><span class="p">)[</span><span class="sh">"</span><span class="s">enerji_kwh</span><span class="sh">"</span><span class="p">].</span><span class="nf">sum</span><span class="p">().</span><span class="nf">to_frame</span><span class="p">()</span>
<span class="n">ozet</span><span class="p">[</span><span class="sh">"</span><span class="s">maliyet_tl</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">ozet</span><span class="p">[</span><span class="sh">"</span><span class="s">enerji_kwh</span><span class="sh">"</span><span class="p">]</span> <span class="o">*</span> <span class="n">BIRIM_FIYAT</span>
<span class="nf">print</span><span class="p">(</span><span class="n">ozet</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, ardışık kayıtlar arasındaki süreyi hesaplar ve ölçülen güçle çarpar. Bir saatten uzun veri boşluklarını sınırlamak, eksik kayıtların tüketimi yapay biçimde büyütmesini engeller.</p>

<h2 id="tasarruf-fırsatlarını-sınıflandırmak">Tasarruf fırsatlarını sınıflandırmak</h2>

<p>Her yüksek tüketim gereksiz değildir. Buzdolabının sürekli çalışması normal olabilir; fakat eski bir modelin yeni modele göre iki kat enerji harcaması değişim kararını destekleyebilir.</p>

<table>
  <thead>
    <tr>
      <th>Gözlem</th>
      <th>Olası neden</th>
      <th>Uygulanabilecek işlem</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gece boyunca sabit tüketim</td>
      <td>Bekleme modu</td>
      <td>Zamanlayıcıyla elektriği kesmek</td>
    </tr>
    <tr>
      <td>Uzun ve sık çalışma döngüsü</td>
      <td>Bakım ihtiyacı</td>
      <td>Filtre, conta veya termostat kontrolü</td>
    </tr>
    <tr>
      <td>Pik saatlerde yoğun kullanım</td>
      <td>Kullanım alışkanlığı</td>
      <td>Çalışmayı uygun saatlere taşımak</td>
    </tr>
    <tr>
      <td>Benzer cihazdan yüksek tüketim</td>
      <td>Düşük verimlilik</td>
      <td>Verimli modelle değiştirmeyi değerlendirmek</td>
    </tr>
  </tbody>
</table>

<p>Bir önlemin aylık kazancı yaklaşık olarak</p>

\[Tasarruf = Azaltılan\ kWh \times Birim\ Fiyat\]

<p>formülüyle bulunabilir. Yeni cihaz alınacaksa geri ödeme süresi de $Yatırım\ Maliyeti / Aylık\ Tasarruf$ şeklinde hesaplanır.</p>

<p>Sonuç olarak akıllı priz, tek başına faturayı düşüren sihirli bir düğme değildir; doğru soruları sormayı sağlayan küçük bir veri laboratuvarıdır. En etkili yaklaşım, birkaç hafta ölçüm yapmak, baz tüketimi ve çalışma döngülerini karşılaştırmak, ardından zamanlama, bakım veya cihaz değişimi gibi müdahalelerin sonucunu yeniden ölçmektir. Ölç, değiştir, tekrar ölç: Enerji optimizasyonunun en kısa ve en güvenilir döngüsü budur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="akıllı priz" /><category term="enerji optimizasyonu" /><category term="veri analizi" /><category term="python" /><category term="iot" /><category term="elektrik tüketimi" /><summary type="html"><![CDATA[Elektrik faturası bazen evde görünmez bir canavar dolaşıyormuş hissi verir: Buzdolabı sessizce çalışır, televizyon bekleme modunda enerji tüketir, elektrikli ısıtıcı ise bütçeyi adeta közler. Akıllı prizler bu canavarı görünür hâle getirir. Cihaz bazında güç ve enerji ölçümü yaparak hangi cihazın ne zaman, ne kadar tükettiğini anlamamızı; tahminlere değil, verilere dayalı tasarruf kararları almamızı sağlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-priz-verisiyle-23.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-priz-verisiyle-23.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Belirtilerden Önce Alarm: Makine Öğrenmesiyle Erken Hastalık Risk Tahmini</title><link href="https://program.sonsuz.us/posts/belirtilerden-once-alarm-makine-ogrenmesiyle-erken-hastalik-risk-tahmini/" rel="alternate" type="text/html" title="Belirtilerden Önce Alarm: Makine Öğrenmesiyle Erken Hastalık Risk Tahmini" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/belirtilerden-once-alarm-makine-ogrenmesiyle-erken-hastalik-risk-tahmini</id><content type="html" xml:base="https://program.sonsuz.us/posts/belirtilerden-once-alarm-makine-ogrenmesiyle-erken-hastalik-risk-tahmini/"><![CDATA[<p>Bir hastalığı belirtiler ortaya çıkmadan tahmin etmek bilim kurgu gibi gelebilir. Oysa elektronik sağlık kayıtları, laboratuvar sonuçları, tıbbi görüntüler, genetik veriler ve akıllı saat ölçümleri bir araya geldiğinde makine öğrenmesi önemli risk sinyallerini yakalayabilir. Ancak burada kritik bir ayrım vardır: Model çoğunlukla hastalığa kesin tanı koymaz; belirli bir zaman aralığında hastalığın gelişme olasılığını hesaplar.</p>

<p>``</p>

<h2 id="risk-tahmini-nasıl-çalışır">Risk tahmini nasıl çalışır?</h2>

<p>Makine öğrenmesi, geçmişte sonucu bilinen hasta verilerindeki örüntüleri öğrenir. Örneğin diyabet riskini tahmin eden bir sistem; yaş, vücut kitle indeksi, açlık glukozu, aile öyküsü ve fiziksel aktivite gibi değişkenleri kullanabilir.</p>

<p>Bir hastanın özelliklerini $x$ ile gösterirsek modelin temel amacı şu olasılığı kestirmektir:</p>

\[P(Y=1 \mid X=x)\]

<p>Burada $Y=1$, belirlenen süre içinde hastalığın geliştiği anlamına gelir. Lojistik regresyon gibi açıklanabilir bir model bu olasılığı şöyle hesaplayabilir:</p>

\[P(Y=1)=\frac{1}{1+e^{-(\beta_0+\beta_1x_1+\cdots+\beta_nx_n)}}\]

<p>Katsayılar, her değişkenin risk üzerindeki etkisini temsil eder. Derin öğrenme modelleriyse çok daha karmaşık ilişkileri öğrenebilir; fakat kararlarını açıklamak genellikle daha zordur.</p>

<h2 id="hangi-veriler-erken-sinyal-taşıyabilir">Hangi veriler erken sinyal taşıyabilir?</h2>

<table>
  <thead>
    <tr>
      <th>Veri türü</th>
      <th>Yakalanabilecek sinyal</th>
      <th>Örnek kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kan testleri</td>
      <td>Küçük biyobelirteç değişimleri</td>
      <td>Diyabet veya böbrek hastalığı riski</td>
    </tr>
    <tr>
      <td>Tıbbi görüntüler</td>
      <td>İnsan gözünün zor seçtiği dokusal örüntüler</td>
      <td>Kanser taraması</td>
    </tr>
    <tr>
      <td>Elektronik kayıtlar</td>
      <td>Tanı, ilaç ve başvuru geçmişi</td>
      <td>Kalp yetmezliği riski</td>
    </tr>
    <tr>
      <td>Giyilebilir cihazlar</td>
      <td>Nabız, uyku ve hareket sapmaları</td>
      <td>Ritim bozukluğu uyarısı</td>
    </tr>
    <tr>
      <td>Genetik veriler</td>
      <td>Kalıtsal yatkınlık</td>
      <td>Bazı kanser türleri</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/belirtilerden-once-alarm-54.svg" alt="belirtilerden-once-alarm-54" /></p>

<p>Tek bir ölçüm yerine zaman içindeki değişim çoğu zaman daha değerlidir. Örneğin nabzın 80 olması tek başına anlamlı olmayabilir; kişinin aylar boyunca 60 civarında seyreden nabzının sürekli 80’e çıkması dikkat çekici olabilir.</p>

<h2 id="basit-bir-risk-modeli">Basit bir risk modeli</h2>

<p>Aşağıdaki örnek, hasta özelliklerinden ikili risk tahmini yapan sade bir Python iş akışıdır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">sklearn.model_selection</span> <span class="kn">import</span> <span class="n">train_test_split</span>
<span class="kn">from</span> <span class="n">sklearn.preprocessing</span> <span class="kn">import</span> <span class="n">StandardScaler</span>
<span class="kn">from</span> <span class="n">sklearn.pipeline</span> <span class="kn">import</span> <span class="n">make_pipeline</span>
<span class="kn">from</span> <span class="n">sklearn.linear_model</span> <span class="kn">import</span> <span class="n">LogisticRegression</span>
<span class="kn">from</span> <span class="n">sklearn.metrics</span> <span class="kn">import</span> <span class="n">roc_auc_score</span>

<span class="n">X_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">y_train</span><span class="p">,</span> <span class="n">y_test</span> <span class="o">=</span> <span class="nf">train_test_split</span><span class="p">(</span>
    <span class="n">X</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">test_size</span><span class="o">=</span><span class="mf">0.2</span><span class="p">,</span> <span class="n">stratify</span><span class="o">=</span><span class="n">y</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span>
<span class="p">)</span>

<span class="n">model</span> <span class="o">=</span> <span class="nf">make_pipeline</span><span class="p">(</span>
    <span class="nc">StandardScaler</span><span class="p">(),</span>
    <span class="nc">LogisticRegression</span><span class="p">(</span><span class="n">class_weight</span><span class="o">=</span><span class="sh">"</span><span class="s">balanced</span><span class="sh">"</span><span class="p">)</span>
<span class="p">)</span>

<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">)</span>
<span class="n">risk_scores</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict_proba</span><span class="p">(</span><span class="n">X_test</span><span class="p">)[:,</span> <span class="mi">1</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">ROC-AUC:</span><span class="sh">"</span><span class="p">,</span> <span class="nf">roc_auc_score</span><span class="p">(</span><span class="n">y_test</span><span class="p">,</span> <span class="n">risk_scores</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">StandardScaler</code>, değişkenleri benzer ölçeklere getirir. <code class="language-plaintext highlighter-rouge">class_weight="balanced"</code> ise hasta sayısının sağlıklı bireylerden çok az olduğu dengesiz veri kümelerinde modele yardımcı olur. <code class="language-plaintext highlighter-rouge">predict_proba</code>, kesin bir etiket yerine risk skoru üretir.</p>

<h2 id="başarı-yalnızca-doğruluk-değildir">Başarı yalnızca doğruluk değildir</h2>

<p>Nadir hastalıklarda herkese “sağlıklı” diyen bir model yüksek doğruluk gösterebilir. Bu nedenle farklı ölçütler birlikte değerlendirilmelidir:</p>

<table>
  <thead>
    <tr>
      <th>Ölçüt</th>
      <th>Yanıtladığı soru</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Duyarlılık</td>
      <td>Gerçek hastaların ne kadarı yakalandı?</td>
    </tr>
    <tr>
      <td>Özgüllük</td>
      <td>Sağlıklı kişilerin ne kadarı doğru elendi?</td>
    </tr>
    <tr>
      <td>Kesinlik</td>
      <td>Riskli denilenlerin ne kadarı gerçekten hastalandı?</td>
    </tr>
    <tr>
      <td>ROC-AUC</td>
      <td>Model riskli ve risksiz kişileri ne kadar ayırabiliyor?</td>
    </tr>
    <tr>
      <td>Kalibrasyon</td>
      <td>Yüzde 20 risk verilen grubun gerçekten yaklaşık yüzde 20’si hastalanıyor mu?</td>
    </tr>
  </tbody>
</table>

<p>Tarama sistemlerinde yanlış negatifler tehlikelidir; ancak çok fazla yanlış pozitif de gereksiz testlere, maliyete ve kaygıya yol açabilir. Bu yüzden karar eşiği klinik bağlama göre belirlenmelidir.</p>

<h2 id="peki-gerçekten-mümkün-mü">Peki gerçekten mümkün mü?</h2>

<p>Evet, bazı hastalıklar için belirtilerden önce anlamlı risk tahmini yapılabilir. Fakat veri kalitesi, farklı topluluklarda doğrulama, mahremiyet, algoritmik önyargı ve klinik denetim vazgeçilmezdir. Bir hastanede başarılı olan model, başka bir bölgede aynı sonucu vermeyebilir.</p>

<p>En sağlıklı yaklaşım, makine öğrenmesini doktorun yerine geçen dijital bir kâhin olarak değil, dikkat edilmesi gereken hastaları önceliklendiren bir erken uyarı sistemi olarak görmektir. Nihai tanı; hekim değerlendirmesi, doğrulayıcı testler ve hastanın klinik öyküsüyle konmalıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="makine öğrenmesi" /><category term="erken teşhis" /><category term="sağlık teknolojileri" /><category term="yapay zeka" /><category term="risk tahmini" /><category term="veri bilimi" /><summary type="html"><![CDATA[Bir hastalığı belirtiler ortaya çıkmadan tahmin etmek bilim kurgu gibi gelebilir. Oysa elektronik sağlık kayıtları, laboratuvar sonuçları, tıbbi görüntüler, genetik veriler ve akıllı saat ölçümleri bir araya geldiğinde makine öğrenmesi önemli risk sinyallerini yakalayabilir. Ancak burada kritik bir ayrım vardır: Model çoğunlukla hastalığa kesin tanı koymaz; belirli bir zaman aralığında hastalığın gelişme olasılığını hesaplar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/belirtilerden-once-alarm-54.png" /><media:content medium="image" url="https://program.sonsuz.us/img/belirtilerden-once-alarm-54.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bulut Oyun Teknolojisi: Tuşa Basınca Uzak Sunucuda Neler Oluyor?</title><link href="https://program.sonsuz.us/posts/bulut-oyun-teknolojisi-tusa-basinca-uzak-sunucuda-neler-oluyor/" rel="alternate" type="text/html" title="Bulut Oyun Teknolojisi: Tuşa Basınca Uzak Sunucuda Neler Oluyor?" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bulut-oyun-teknolojisi-tusa-basinca-uzak-sunucuda-neler-oluyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/bulut-oyun-teknolojisi-tusa-basinca-uzak-sunucuda-neler-oluyor/"><![CDATA[<p>Güçlü bir ekran kartına sahip olmadan yüksek kaliteli oyunları çalıştırmak sihir gibi görünebilir. Bulut oyun teknolojisinde oyun aslında telefonunuzda, televizyonunuzda veya eski dizüstü bilgisayarınızda çalışmaz. Uzak bir veri merkezindeki güçlü sunucu oyunu işler; ortaya çıkan görüntüler sıkıştırılarak internet üzerinden size gönderilir. Siz de yalnızca canlı videoyu izler ve kontrol komutlarını sunucuya iletirsiniz.
``</p>
<h2 id="bulut-oyun-döngüsü-nasıl-çalışır">Bulut oyun döngüsü nasıl çalışır?</h2>

<p>Sistem, oyuncunun bir tuşa basmasıyla başlayan sürekli bir veri alışverişi üzerine kuruludur. Klavye, fare veya oyun kolundan alınan komut önce istemci uygulaması tarafından küçük bir ağ paketine dönüştürülür. Paket sunucuya ulaştığında oyun motoru yeni durumu hesaplar, ekran kartı kareyi oluşturur ve video kodlayıcı bu kareyi sıkıştırır. Son olarak görüntü istemciye gönderilip ekranda gösterilir.</p>

<p>Bu zincirin toplam gecikmesi kabaca şöyle modellenebilir:</p>

\[T_{toplam} = T_{gidiş} + T_{işleme} + T_{kodlama} + T_{dönüş} + T_{çözme}\]

<p>Örneğin komutun sunucuya ulaşması 20 ms, oyunun kareyi üretmesi 12 ms, kodlama ve çözme işlemleri toplam 15 ms, görüntünün dönüşü ise 20 ms sürerse gecikme yaklaşık $67\,ms$ olur. Bu değer strateji oyunlarında kabul edilebilirken rekabetçi bir nişancı oyununda oyuncuya belirgin gelebilir.</p>

<h2 id="yerel-oyun-ile-bulut-oyunun-karşılaştırması">Yerel oyun ile bulut oyunun karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Yerel oyun</th>
      <th>Bulut oyun</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Grafik işlemi</td>
      <td>Kullanıcının cihazında</td>
      <td>Uzak sunucuda</td>
    </tr>
    <tr>
      <td>Donanım ihtiyacı</td>
      <td>Genellikle yüksek</td>
      <td>Düşük veya orta</td>
    </tr>
    <tr>
      <td>İnternet bağımlılığı</td>
      <td>Çevrimdışı oyunlarda az</td>
      <td>Çok yüksek</td>
    </tr>
    <tr>
      <td>Giriş gecikmesi</td>
      <td>Genellikle düşük</td>
      <td>Ağ koşullarına bağlı</td>
    </tr>
    <tr>
      <td>Güncelleme</td>
      <td>Cihaza indirilir</td>
      <td>Sunucuda uygulanır</td>
    </tr>
    <tr>
      <td>Görüntü kalitesi</td>
      <td>Yerel ve kayıpsız olabilir</td>
      <td>Sıkıştırma izleri görülebilir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/bulut-oyun-teknolojisi-91.svg" alt="bulut-oyun-teknolojisi-91" /></p>

<p>Bulut oyun cihaz maliyetini azaltır; ancak hesaplama yükünü ortadan kaldırmaz, yalnızca veri merkezine taşır. Sunucularda güçlü GPU’lar, çok çekirdekli işlemciler ve hızlı depolama sistemleri bulunur. Aynı fiziksel GPU, sanallaştırma teknolojileri sayesinde birden fazla oyuncuya bölüştürülebilir.</p>

<h2 id="video-akışı-neden-kritik">Video akışı neden kritik?</h2>

<p>Ham görüntüleri internetten göndermek pratik değildir. Saniyede 60 kare üreten, 1920×1080 çözünürlüklü ve piksel başına 24 bit kullanan sıkıştırılmamış bir akışın yaklaşık veri hızı şöyledir:</p>

\[1920 \times 1080 \times 24 \times 60 \approx 2.99\text{ Gbit/s}\]

<p>Bu nedenle H.264, H.265 veya AV1 gibi kodekler kullanılır. Kodek, birbirini takip eden karelerde değişmeyen bölgeleri tekrar göndermek yerine hareket ve fark bilgilerini taşır. Böylece gerekli bant genişliği çoğu senaryoda 15–50 Mbit/s aralığına düşebilir. Buna karşılık daha güçlü sıkıştırma, kodlama süresini veya görüntü bozulmasını artırabilir.</p>

<h2 id="ağ-kalitesi-yalnızca-hız-değildir">Ağ kalitesi yalnızca hız değildir</h2>

<p>Yüksek indirme hızı tek başına kusursuz deneyim sağlamaz. <strong>Ping</strong>, paketin gidiş-dönüş süresini; <strong>jitter</strong>, gecikmedeki düzensizliği; <strong>paket kaybı</strong> ise ulaşmayan veri oranını belirtir. Video aktarımında çoğunlukla düşük gecikmeli UDP tabanlı protokoller tercih edilir. Kayıp bir paketin yeniden gönderilmesini beklemek yerine sonraki karenin gösterilmesi, oyunun donmasını engelleyebilir.</p>

<p>Aşağıdaki basit Python kodu, yaklaşık toplam gecikmeyi hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">bulut_oyun_gecikmesi</span><span class="p">(</span><span class="n">gidis</span><span class="p">,</span> <span class="n">isleme</span><span class="p">,</span> <span class="n">kodlama</span><span class="p">,</span> <span class="n">donus</span><span class="p">,</span> <span class="n">cozme</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">gidis</span> <span class="o">+</span> <span class="n">isleme</span> <span class="o">+</span> <span class="n">kodlama</span> <span class="o">+</span> <span class="n">donus</span> <span class="o">+</span> <span class="n">cozme</span>

<span class="n">gecikme</span> <span class="o">=</span> <span class="nf">bulut_oyun_gecikmesi</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Tahmini gecikme: </span><span class="si">{</span><span class="n">gecikme</span><span class="si">}</span><span class="s"> ms</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Gerçek sistemler ağ durumunu sürekli ölçerek bit hızını ve çözünürlüğü dinamik biçimde değiştirir. Bağlantı kötüleştiğinde 4K görüntüyü korumaya çalışmak yerine çözünürlüğü düşürmek, oynanabilirliği sürdürür.</p>

<h2 id="gelecekte-bizi-ne-bekliyor">Gelecekte bizi ne bekliyor?</h2>

<p>Edge computing sayesinde oyun sunucuları oyunculara daha yakın noktalara yerleştiriliyor. 5G, gelişmiş AV1 kodlayıcıları ve gecikme tahmin teknikleri de deneyimi iyileştiriyor. Bulut oyun, güçlü bilgisayarları tamamen gereksiz kılmasa da donanımı bir ürün olmaktan çıkarıp uzaktan erişilen bir hizmete dönüştürüyor. Kısacası geleceğin oyun konsolu, salonunuzdaki kutudan çok size en yakın veri merkezindeki sunucu olabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="bulut oyun" /><category term="cloud gaming" /><category term="oyun teknolojileri" /><category term="ağ gecikmesi" /><category term="video akışı" /><category term="sunucu altyapısı" /><summary type="html"><![CDATA[Güçlü bir ekran kartına sahip olmadan yüksek kaliteli oyunları çalıştırmak sihir gibi görünebilir. Bulut oyun teknolojisinde oyun aslında telefonunuzda, televizyonunuzda veya eski dizüstü bilgisayarınızda çalışmaz. Uzak bir veri merkezindeki güçlü sunucu oyunu işler; ortaya çıkan görüntüler sıkıştırılarak internet üzerinden size gönderilir. Siz de yalnızca canlı videoyu izler ve kontrol komutlarını sunucuya iletirsiniz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bulut-oyun-teknolojisi-91.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bulut-oyun-teknolojisi-91.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C’de enum ve typedef: Verilere Anlamlı İsimler Vermek</title><link href="https://program.sonsuz.us/posts/cde-enum-ve-typedef-verilere-anlamli-isimler-vermek/" rel="alternate" type="text/html" title="C’de enum ve typedef: Verilere Anlamlı İsimler Vermek" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/cde-enum-ve-typedef-verilere-anlamli-isimler-vermek</id><content type="html" xml:base="https://program.sonsuz.us/posts/cde-enum-ve-typedef-verilere-anlamli-isimler-vermek/"><![CDATA[<p>C dilinde her şeyi <code class="language-plaintext highlighter-rouge">int</code>, <code class="language-plaintext highlighter-rouge">char</code> veya <code class="language-plaintext highlighter-rouge">float</code> ile temsil etmek mümkündür; ancak bu yaklaşım büyüyen programlarda kodun anlamını hızla bulanıklaştırır. Örneğin <code class="language-plaintext highlighter-rouge">durum == 2</code> ifadesindeki 2 neyi anlatır? İşte <code class="language-plaintext highlighter-rouge">enum</code> sabit değerlere anlamlı adlar verirken, <code class="language-plaintext highlighter-rouge">typedef</code> karmaşık tip bildirimlerini okunabilir isimlerle sadeleştirir. Bu iki araç programın bellekteki davranışını sihirli biçimde değiştirmez, fakat geliştiricinin kodu anlama hızını ciddi ölçüde artırır.</p>

<p><img src="/img/cde-enum-ve-97.svg" alt="cde-enum-ve-97" /></p>

<p>``</p>

<h2 id="numaralandırma-enum">Numaralandırma: <code class="language-plaintext highlighter-rouge">enum</code></h2>

<p><code class="language-plaintext highlighter-rouge">enum</code>, ilişkili tam sayı sabitlerini tek bir başlık altında toplar. Bir trafik lambasının durumlarını ele alalım:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="k">enum</span> <span class="n">TrafikIsigi</span> <span class="p">{</span>
    <span class="n">KIRMIZI</span><span class="p">,</span>
    <span class="n">SARI</span><span class="p">,</span>
    <span class="n">YESIL</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">enum</span> <span class="n">TrafikIsigi</span> <span class="n">aktif</span> <span class="o">=</span> <span class="n">YESIL</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">aktif</span> <span class="o">==</span> <span class="n">YESIL</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"Geçebilirsiniz.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Değer belirtilmediğinde ilk eleman <code class="language-plaintext highlighter-rouge">0</code> olur ve sonraki elemanlar birer artar. Yani burada <code class="language-plaintext highlighter-rouge">KIRMIZI = 0</code>, <code class="language-plaintext highlighter-rouge">SARI = 1</code> ve <code class="language-plaintext highlighter-rouge">YESIL = 2</code> kabul edilir. Genel olarak ilk değer $v_0 = 0$ ise sıralama $v_i = v_0 + i$ biçimindedir.</p>

<p>Değerleri kendimiz de belirleyebiliriz:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">enum</span> <span class="n">HttpDurumu</span> <span class="p">{</span>
    <span class="n">HTTP_OK</span> <span class="o">=</span> <span class="mi">200</span><span class="p">,</span>
    <span class="n">HTTP_BULUNAMADI</span> <span class="o">=</span> <span class="mi">404</span><span class="p">,</span>
    <span class="n">HTTP_SUNUCU_HATASI</span> <span class="o">=</span> <span class="mi">500</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Böylece <code class="language-plaintext highlighter-rouge">durum == 404</code> yerine <code class="language-plaintext highlighter-rouge">durum == HTTP_BULUNAMADI</code> yazılır. İki ifade sayısal olarak aynı sonucu üretse de ikincisi niyeti açıklar.</p>

<h2 id="typedef-ile-tiplere-takma-ad-vermek"><code class="language-plaintext highlighter-rouge">typedef</code> ile tiplere takma ad vermek</h2>

<p><code class="language-plaintext highlighter-rouge">typedef</code>, mevcut bir tipe yeni bir isim tanımlar. Yeni ve bağımsız bir veri tipi oluşturmaz; derleyici açısından çoğunlukla bir takma addır.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">KullaniciId</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">float</span> <span class="n">Sicaklik</span><span class="p">;</span>

<span class="n">KullaniciId</span> <span class="n">id</span> <span class="o">=</span> <span class="mi">12045</span><span class="p">;</span>
<span class="n">Sicaklik</span> <span class="n">oda</span> <span class="o">=</span> <span class="mi">23</span><span class="p">.</span><span class="mi">5</span><span class="n">f</span><span class="p">;</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">KullaniciId</code>, <code class="language-plaintext highlighter-rouge">unsigned long</code> ile aynı temsile sahiptir. Dolayısıyla bellek boyutu için şu ilişki geçerlidir:</p>

\[sizeof(KullaniciId) = sizeof(unsigned\ long)\]

<p>Asıl avantaj, değişkenin ne amaçla kullanıldığını göstermesidir. Yine de <code class="language-plaintext highlighter-rouge">typedef</code> güçlü tip güvenliği sağlamaz; <code class="language-plaintext highlighter-rouge">KullaniciId</code> ile başka bir <code class="language-plaintext highlighter-rouge">unsigned long</code> değer yanlışlıkla karıştırılabilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th><code class="language-plaintext highlighter-rouge">enum</code></th>
      <th><code class="language-plaintext highlighter-rouge">typedef</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel amaç</td>
      <td>İsimlendirilmiş sabitler oluşturmak</td>
      <td>Bir tipe alternatif isim vermek</td>
    </tr>
    <tr>
      <td>Yeni değer kümesi</td>
      <td>Evet, sembolik sabitler tanımlar</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>Okunabilirlik katkısı</td>
      <td>Durum ve seçenekleri açıklar</td>
      <td>Karmaşık bildirimleri sadeleştirir</td>
    </tr>
    <tr>
      <td>Yaygın kullanım</td>
      <td>Durumlar, modlar, hata kodları</td>
      <td>Yapılar, işaretçiler, platform tipleri</td>
    </tr>
  </tbody>
</table>

<h2 id="struct-enum-ve-typedef-birlikte"><code class="language-plaintext highlighter-rouge">struct</code>, <code class="language-plaintext highlighter-rouge">enum</code> ve <code class="language-plaintext highlighter-rouge">typedef</code> birlikte</h2>

<p>C dilinde yapı değişkeni tanımlarken normalde <code class="language-plaintext highlighter-rouge">struct</code> anahtar kelimesi tekrar edilir. <code class="language-plaintext highlighter-rouge">typedef</code> bu gürültüyü azaltabilir:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="k">enum</span> <span class="p">{</span>
    <span class="n">ROL_MISAFIR</span><span class="p">,</span>
    <span class="n">ROL_EDITOR</span><span class="p">,</span>
    <span class="n">ROL_YONETICI</span>
<span class="p">}</span> <span class="n">KullaniciRolu</span><span class="p">;</span>

<span class="k">typedef</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">id</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">ad</span><span class="p">[</span><span class="mi">40</span><span class="p">];</span>
    <span class="n">KullaniciRolu</span> <span class="n">rol</span><span class="p">;</span>
<span class="p">}</span> <span class="n">Kullanici</span><span class="p">;</span>

<span class="kt">void</span> <span class="nf">rolYazdir</span><span class="p">(</span><span class="n">Kullanici</span> <span class="n">kullanici</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">switch</span> <span class="p">(</span><span class="n">kullanici</span><span class="p">.</span><span class="n">rol</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">case</span> <span class="n">ROL_MISAFIR</span><span class="p">:</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"Misafir</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="n">ROL_EDITOR</span><span class="p">:</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"Editör</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="k">case</span> <span class="n">ROL_YONETICI</span><span class="p">:</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"Yönetici</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="nl">default:</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"Geçersiz rol</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu örnekte <code class="language-plaintext highlighter-rouge">KullaniciRolu</code>, numaralandırmanın; <code class="language-plaintext highlighter-rouge">Kullanici</code> ise yapının kısa tip ismidir. <code class="language-plaintext highlighter-rouge">switch</code> kullanımı olası değerleri görmeyi kolaylaştırır. <code class="language-plaintext highlighter-rouge">default</code> dalı eklemek de dışarıdan veya hatalı dönüşümle gelebilecek geçersiz değerlere karşı savunma sağlar.</p>

<h2 id="dikkat-edilmesi-gerekenler">Dikkat edilmesi gerekenler</h2>

<p>C, <code class="language-plaintext highlighter-rouge">enum</code> değişkenine yalnızca listelenen değerlerin atanmasını kesin olarak engellemez. Örneğin açık bir dönüşüm veya doğrudan atama sonucunda beklenmeyen sayılar oluşabilir. Bu nedenle giriş doğrulaması hâlâ gereklidir. Ayrıca bir <code class="language-plaintext highlighter-rouge">enum</code> türünün boyutunun her platformda mutlaka <code class="language-plaintext highlighter-rouge">int</code> boyutunda olduğunu varsaymak taşınabilir kod açısından doğru değildir.</p>

<p>İsim çakışmalarını önlemek için sabitlerde <code class="language-plaintext highlighter-rouge">ROL_</code>, <code class="language-plaintext highlighter-rouge">HTTP_</code> veya <code class="language-plaintext highlighter-rouge">RENK_</code> gibi önekler kullanmak iyi bir alışkanlıktır. Özetle <code class="language-plaintext highlighter-rouge">enum</code>, “hangi seçenek?” sorusunu; <code class="language-plaintext highlighter-rouge">typedef</code> ise “bu veri neyi temsil ediyor?” sorusunu yanıtlar. Birlikte kullanıldıklarında C kodu yalnızca çalışan değil, aynı zamanda kendi hikâyesini anlatan bir yapıya kavuşur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="enum" /><category term="typedef" /><category term="veri tipleri" /><category term="programlama" /><summary type="html"><![CDATA[C dilinde her şeyi int, char veya float ile temsil etmek mümkündür; ancak bu yaklaşım büyüyen programlarda kodun anlamını hızla bulanıklaştırır. Örneğin durum == 2 ifadesindeki 2 neyi anlatır? İşte enum sabit değerlere anlamlı adlar verirken, typedef karmaşık tip bildirimlerini okunabilir isimlerle sadeleştirir. Bu iki araç programın bellekteki davranışını sihirli biçimde değiştirmez, fakat geliştiricinin kodu anlama hızını ciddi ölçüde artırır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/cde-enum-ve-97.png" /><media:content medium="image" url="https://program.sonsuz.us/img/cde-enum-ve-97.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital Bankacılığın Mimarisi: Mobil Dokunuştan Gerçek Zamanlı Para Transferine</title><link href="https://program.sonsuz.us/posts/dijital-bankaciligin-mimarisi-mobil-dokunustan-gercek-zamanli-para-transferine/" rel="alternate" type="text/html" title="Dijital Bankacılığın Mimarisi: Mobil Dokunuştan Gerçek Zamanlı Para Transferine" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-bankaciligin-mimarisi-mobil-dokunustan-gercek-zamanli-para-transferine</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-bankaciligin-mimarisi-mobil-dokunustan-gercek-zamanli-para-transferine/"><![CDATA[<p><img src="/img/dijital-bankaciligin-mimarisi-54.svg" alt="dijital-bankaciligin-mimarisi-54" /></p>

<p>Mobil bankacılıkta birkaç saniye içinde tamamlanan para transferi, kullanıcıya son derece basit görünür: IBAN yazılır, tutar girilir ve düğmeye dokunulur. Oysa bu kısa yolculuğun arkasında kimlik doğrulama servisleri, dolandırıcılık motorları, muhasebe kayıtları, mesaj kuyrukları ve dış ödeme ağlarından oluşan kalabalık bir ekip çalışır. Kısacası ekrandaki “Başarılı” mesajı, dağıtık sistemlerin birlikte verdiği küçük bir konserdir.</p>

<p>``</p>

<h2 id="büyük-resim-katmanlı-mimari">Büyük resim: Katmanlı mimari</h2>

<p>Dijital bankacılık mimarisi genellikle istemci, erişim, iş servisleri, veri ve entegrasyon katmanlarına ayrılır. Mobil uygulama doğrudan hesap veritabanına bağlanmaz; böyle bir tasarım güvenlik ekibinin uykularını kaçırırdı. Bunun yerine istekler önce API Gateway üzerinden geçer.</p>

<table>
  <thead>
    <tr>
      <th>Katman</th>
      <th>Temel görev</th>
      <th>Örnek teknolojiler</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mobil istemci</td>
      <td>Arayüz, biyometri, cihaz güvenliği</td>
      <td>Swift, Kotlin, Flutter</td>
    </tr>
    <tr>
      <td>API Gateway</td>
      <td>Yönlendirme, hız sınırlama, doğrulama</td>
      <td>Kong, Apigee, NGINX</td>
    </tr>
    <tr>
      <td>İş servisleri</td>
      <td>Transfer ve hesap kuralları</td>
      <td>Java, .NET, Go</td>
    </tr>
    <tr>
      <td>Veri katmanı</td>
      <td>Bakiye, işlem ve defter kayıtları</td>
      <td>PostgreSQL, Oracle, Redis</td>
    </tr>
    <tr>
      <td>Mesajlaşma</td>
      <td>Asenkron olay dağıtımı</td>
      <td>Kafka, RabbitMQ</td>
    </tr>
    <tr>
      <td>Entegrasyon</td>
      <td>Ödeme ağları ve diğer bankalar</td>
      <td>REST, ISO 20022, gRPC</td>
    </tr>
  </tbody>
</table>

<p>Bu ayrımın amacı yalnızca düzen değildir. Her katman bağımsız ölçeklenebilir, izlenebilir ve güvenlik politikalarıyla sınırlandırılabilir.</p>

<h2 id="bir-transferin-adım-adım-yolculuğu">Bir transferin adım adım yolculuğu</h2>

<p>Kullanıcı transfer emrini gönderdiğinde mobil uygulama, erişim belirtecini ve benzersiz işlem anahtarını isteğe ekler. API Gateway oturumu doğrular, olağan dışı istek sıklığını kontrol eder ve çağrıyı transfer servisine iletir.</p>

<p>Transfer servisi sırasıyla şu soruları sorar:</p>

<ol>
  <li>Hesap aktif mi ve kullanıcı yetkili mi?</li>
  <li>Kullanılabilir bakiye yeterli mi?</li>
  <li>Alıcı bilgileri biçimsel olarak doğru mu?</li>
  <li>İşlem, kara para aklama veya dolandırıcılık kuralına takılıyor mu?</li>
  <li>Aynı istek daha önce işlendi mi?</li>
</ol>

<p>Son soru <strong>idempotency</strong> kavramına dayanır. Mobil bağlantı kopunca kullanıcı düğmeye tekrar basabilir. Aynı anahtarla gelen istek ikinci kez para düşürmemelidir.</p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">POST /transfers
Authorization: Bearer token
Idempotency-Key: tx-2026-8f31
Content-Type: application/json

{
  "sourceAccount": "TR-A",
  "targetIban": "TR-B",
  "amount": 1250.00,
  "currency": "TRY"
}
</span></code></pre></div></div>

<p>Sunucu, <code class="language-plaintext highlighter-rouge">Idempotency-Key</code> değerini sonuçla birlikte saklar. Aynı anahtar yeniden geldiğinde işlemi tekrarlamak yerine önceki yanıtı döndürür.</p>

<h2 id="para-neden-yalnızca-bir-sayı-değildir">Para neden yalnızca bir sayı değildir?</h2>

<p>Bankalar bakiyeyi doğrudan değiştirip geçmez; çift taraflı muhasebe defteri kullanır. Bir hesaptaki azalma başka bir hesaptaki artışla dengelenmelidir. Temel eşitlik şöyledir:</p>

\[Varlıklar = Yükümlülükler + Öz kaynak\]

<p>Transfer özelinde defter hareketlerinin toplamı sıfır olmalıdır:</p>

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

<p>Gönderen için $-1250$ TL, alıcı için $+1250$ TL kaydedilir. Kayıtlar değiştirilmeye çalışılmaz; hata varsa ters kayıt oluşturulur. Böylece denetim izi korunur.</p>

<h2 id="gerçek-zamanlılık-ve-tutarlılık-dengesi">Gerçek zamanlılık ve tutarlılık dengesi</h2>

<p>Her adımı tek, devasa veritabanı işlemi içinde yürütmek güvenilir görünse de dış bankalar ve ağ gecikmeleri bunu zorlaştırır. Bu nedenle modern sistemler çoğunlukla olay güdümlü mimari ve <strong>Saga</strong> yaklaşımı kullanır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Senkron işlem</td>
      <td>Anında kesin yanıt</td>
      <td>Gecikme ve zincirleme hata</td>
    </tr>
    <tr>
      <td>Asenkron olay</td>
      <td>Yüksek ölçeklenebilirlik</td>
      <td>Gecikmeli tutarlılık</td>
    </tr>
    <tr>
      <td>Saga</td>
      <td>Dağıtık adımları yönetir</td>
      <td>Telafi mantığı gerektirir</td>
    </tr>
  </tbody>
</table>

<p>Transfer kaydedildikten sonra <code class="language-plaintext highlighter-rouge">TransferCreated</code> olayı Kafka’ya gönderilebilir. Bildirim, raporlama ve analiz servisleri bu olayı ayrı ayrı tüketir. Kritik muhasebe işlemi ise güçlü tutarlılıkla korunur.</p>

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

<p>TLS iletişimi şifreler; OAuth 2.0 ve kısa ömürlü belirteçler erişimi sınırlar. Biyometri tek başına yeterli değildir: cihaz bağlama, işlem imzalama, limit kontrolleri ve davranış analizi birlikte kullanılmalıdır.</p>

<p>Son olarak her istek bir korelasyon kimliğiyle izlenir. Loglar, metrikler ve dağıtık izler sayesinde ekipler transferin hangi serviste yavaşladığını görebilir. İyi bir dijital banka yalnızca parayı hızla taşımaz; işlemi kanıtlanabilir, tekrarlanamaz ve gerektiğinde saniye saniye açıklanabilir hâle getirir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="dijital bankacılık" /><category term="yazılım mimarisi" /><category term="fintech" /><category term="mikroservisler" /><category term="gerçek zamanlı sistemler" /><category term="siber güvenlik" /><summary type="html"><![CDATA[Mobil bankacılıkta birkaç saniye içinde tamamlanan para transferi, kullanıcıya son derece basit görünür: IBAN yazılır, tutar girilir ve düğmeye dokunulur. Oysa bu kısa yolculuğun arkasında kimlik doğrulama servisleri, dolandırıcılık motorları, muhasebe kayıtları, mesaj kuyrukları ve dış ödeme ağlarından oluşan kalabalık bir ekip çalışır. Kısacası ekrandaki “Başarılı” mesajı, dağıtık sistemlerin birlikte verdiği küçük bir konserdir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-bankaciligin-mimarisi-54.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-bankaciligin-mimarisi-54.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital İkizlerle Geleceğin Şehrini Bugünden Test Etmek</title><link href="https://program.sonsuz.us/posts/dijital-ikizlerle-gelecegin-sehrini-bugunden-test-etmek/" rel="alternate" type="text/html" title="Dijital İkizlerle Geleceğin Şehrini Bugünden Test Etmek" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-ikizlerle-gelecegin-sehrini-bugunden-test-etmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-ikizlerle-gelecegin-sehrini-bugunden-test-etmek/"><![CDATA[<p><img src="/img/dijital-ikizlerle-gelecegin-61.svg" alt="dijital-ikizlerle-gelecegin-61" /></p>

<p>Bir köprüyü inşa etmeden trafiğe açmak, yeni metro hattını kazı başlamadan çalıştırmak veya şiddetli yağmurun hangi sokakları göle çevireceğini önceden görmek mümkün mü? Dijital ikiz teknolojisi sayesinde şehir yöneticileri, gerçek dünyada pahalı ve riskli kararlar almadan önce bir şehrin sanal kopyası üzerinde deneyler yapabiliyor. Kısacası şehir, dev bir strateji oyununa dönüşüyor; ancak bu oyunda verilen kararlar gerçek insanların yaşamını etkiliyor.
``</p>

<h2 id="dijital-ikiz-nedir">Dijital ikiz nedir?</h2>

<p>Dijital ikiz, fiziksel bir varlığın veya sistemin verilerle sürekli güncellenen sanal temsilidir. Şehir ölçeğinde bu temsil; yolları, binaları, enerji hatlarını, kanalizasyon sistemlerini, toplu taşımayı ve hatta hava kalitesini kapsayabilir.</p>

<p>Sıradan bir üç boyutlu model yalnızca şehrin görünüşünü gösterirken dijital ikiz, şehrin <strong>davranışını</strong> taklit eder. Trafik sensörleri, uydu görüntüleri, hava istasyonları ve Nesnelerin İnterneti cihazları gerçek zamanlı veri gönderir. Böylece sanal şehir, fiziksel kardeşiyle birlikte değişir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Geleneksel 3B model</th>
      <th>Dijital ikiz</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Görsel temsil</td>
      <td>Var</td>
      <td>Var</td>
    </tr>
    <tr>
      <td>Gerçek zamanlı veri</td>
      <td>Genellikle yok</td>
      <td>Var</td>
    </tr>
    <tr>
      <td>Senaryo simülasyonu</td>
      <td>Sınırlı</td>
      <td>Gelişmiş</td>
    </tr>
    <tr>
      <td>Tahmin üretme</td>
      <td>Yok veya düşük</td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Fiziksel sistemle bağlantı</td>
      <td>Tek yönlü</td>
      <td>Çift yönlü olabilir</td>
    </tr>
  </tbody>
</table>

<h2 id="sanal-şehir-nasıl-oluşturulur">Sanal şehir nasıl oluşturulur?</h2>

<p>İlk adım veri toplamaktır. Coğrafi Bilgi Sistemleri parsel ve yol geometrisini, LiDAR taramaları bina yüksekliklerini, sensörler ise trafik yoğunluğu gibi değişkenleri sağlar. Bu veriler ortak bir koordinat sistemi içinde birleştirilir.</p>

<p>Ardından fiziksel süreçler matematiksel modellere dönüştürülür. Örneğin bir yol bölümündeki trafik akışı basitçe şöyle ifade edilebilir:</p>

\[q = k \times v\]

<p>Burada $q$ birim zamanda geçen araç sayısını, $k$ yol üzerindeki araç yoğunluğunu, $v$ ise ortalama hızı temsil eder. Yoğunluk arttığında hızın her zaman sabit kalmaması, daha gelişmiş modellerin kullanılmasını gerektirir. İşte dijital ikizin gücü, binlerce bağlantılı değişkeni aynı simülasyonda değerlendirebilmesidir.</p>

<h2 id="altyapı-kararları-nasıl-test-edilir">Altyapı kararları nasıl test edilir?</h2>

<p>Belediyenin yoğun bir kavşağa yeni şerit eklemeyi düşündüğünü varsayalım. Dijital ikiz üzerinde mevcut durum, yeni şerit ve toplu taşımaya öncelik veren alternatif ayrı ayrı çalıştırılabilir. Yolculuk süresi, emisyon, maliyet ve yaya güvenliği karşılaştırılır.</p>

<table>
  <thead>
    <tr>
      <th>Senaryo</th>
      <th style="text-align: right">Trafik süresi</th>
      <th style="text-align: right">Emisyon</th>
      <th style="text-align: right">Yaklaşık maliyet</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mevcut durum</td>
      <td style="text-align: right">42 dakika</td>
      <td style="text-align: right">Yüksek</td>
      <td style="text-align: right">0</td>
    </tr>
    <tr>
      <td>Ek şerit</td>
      <td style="text-align: right">35 dakika</td>
      <td style="text-align: right">Orta-yüksek</td>
      <td style="text-align: right">Yüksek</td>
    </tr>
    <tr>
      <td>Otobüs önceliği</td>
      <td style="text-align: right">31 dakika</td>
      <td style="text-align: right">Düşük</td>
      <td style="text-align: right">Orta</td>
    </tr>
  </tbody>
</table>

<p>Benzer yöntemle yağmur suyu altyapısı da sınanabilir. Simülasyona aşırı yağış verilir; suyun nerede biriktiği ve hangi rögarların kapasitesini aştığı gözlenir. Yeni drenaj hattı önce sanal ortamda eklenerek etkisi ölçülür.</p>

<h2 id="küçük-bir-senaryo-hesabı">Küçük bir senaryo hesabı</h2>

<p>Aşağıdaki Python kodu, farklı ulaşım politikalarını basit bir puanlama modeliyle karşılaştırır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">senaryolar</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">'</span><span class="s">ek_serit</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">sure</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">emisyon</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">maliyet</span><span class="sh">'</span><span class="p">:</span> <span class="mi">90</span><span class="p">},</span>
    <span class="sh">'</span><span class="s">otobus_onceligi</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">sure</span><span class="sh">'</span><span class="p">:</span> <span class="mi">31</span><span class="p">,</span> <span class="sh">'</span><span class="s">emisyon</span><span class="sh">'</span><span class="p">:</span> <span class="mi">45</span><span class="p">,</span> <span class="sh">'</span><span class="s">maliyet</span><span class="sh">'</span><span class="p">:</span> <span class="mi">55</span><span class="p">},</span>
    <span class="sh">'</span><span class="s">mevcut_durum</span><span class="sh">'</span><span class="p">:</span> <span class="p">{</span><span class="sh">'</span><span class="s">sure</span><span class="sh">'</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span> <span class="sh">'</span><span class="s">emisyon</span><span class="sh">'</span><span class="p">:</span> <span class="mi">95</span><span class="p">,</span> <span class="sh">'</span><span class="s">maliyet</span><span class="sh">'</span><span class="p">:</span> <span class="mi">0</span><span class="p">}</span>
<span class="p">}</span>

<span class="k">for</span> <span class="n">ad</span><span class="p">,</span> <span class="n">veri</span> <span class="ow">in</span> <span class="n">senaryolar</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
    <span class="n">puan</span> <span class="o">=</span> <span class="mf">0.4</span> <span class="o">*</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">sure</span><span class="sh">'</span><span class="p">]</span> <span class="o">+</span> <span class="mf">0.35</span> <span class="o">*</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">emisyon</span><span class="sh">'</span><span class="p">]</span> <span class="o">+</span> <span class="mf">0.25</span> <span class="o">*</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">maliyet</span><span class="sh">'</span><span class="p">]</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">ad</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="n">puan</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
</code></pre></div></div>

<p>Buradaki ağırlıklar, belediyenin önceliklerini temsil eder. Düşük puan daha iyi sonuç anlamına gelir. Gerçek bir dijital ikizde hesap; nüfus hareketleri, saatlik talep, kaza riski ve hava durumu gibi çok daha fazla değişken içerir.</p>

<h2 id="kusursuz-bir-kristal-küre-mi">Kusursuz bir kristal küre mi?</h2>

<p>Hayır. Eksik sensör verileri, hatalı varsayımlar ve insanların beklenmedik davranışları tahminleri bozabilir. Ayrıca kameralar ve konum verileri kullanıldığında mahremiyet, veri güvenliği ve algoritmik tarafsızlık kritik hâle gelir. Model ne kadar etkileyici görünürse görünsün sonuçları uzmanlar ve kent sakinleri birlikte değerlendirmelidir.</p>

<p>Doğru kullanıldığında dijital ikiz, beton dökmeden önce düşünmeyi sağlar. Böylece şehirler yalnızca daha teknolojik değil; daha güvenli, sürdürülebilir ve insan odaklı biçimde planlanabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="dijital ikiz" /><category term="şehir planlama" /><category term="akıllı şehirler" /><category term="simülasyon" /><category term="veri analizi" /><category term="nesnelerin interneti" /><summary type="html"><![CDATA[Bir köprüyü inşa etmeden trafiğe açmak, yeni metro hattını kazı başlamadan çalıştırmak veya şiddetli yağmurun hangi sokakları göle çevireceğini önceden görmek mümkün mü? Dijital ikiz teknolojisi sayesinde şehir yöneticileri, gerçek dünyada pahalı ve riskli kararlar almadan önce bir şehrin sanal kopyası üzerinde deneyler yapabiliyor. Kısacası şehir, dev bir strateji oyununa dönüşüyor; ancak bu oyunda verilen kararlar gerçek insanların yaşamını etkiliyor.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-ikizlerle-gelecegin-61.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-ikizlerle-gelecegin-61.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Genom Analizi: DNA Dizileri Bilgisayarlarla Nasıl Karşılaştırılıyor?</title><link href="https://program.sonsuz.us/posts/genom-analizi-dna-dizileri-bilgisayarlarla-nasil-karsilastiriliyor/" rel="alternate" type="text/html" title="Genom Analizi: DNA Dizileri Bilgisayarlarla Nasıl Karşılaştırılıyor?" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/genom-analizi-dna-dizileri-bilgisayarlarla-nasil-karsilastiriliyor</id><content type="html" xml:base="https://program.sonsuz.us/posts/genom-analizi-dna-dizileri-bilgisayarlarla-nasil-karsilastiriliyor/"><![CDATA[<p><img src="/img/genom-analizi-dna-72.svg" alt="genom-analizi-dna-72" /></p>

<p>DNA, canlıların yapım talimatlarını taşıyan devasa bir metin gibi düşünülebilir. Ancak bu metnin alfabesinde yalnızca dört harf bulunur: adenin (<code class="language-plaintext highlighter-rouge">A</code>), sitozin (<code class="language-plaintext highlighter-rouge">C</code>), guanin (<code class="language-plaintext highlighter-rouge">G</code>) ve timin (<code class="language-plaintext highlighter-rouge">T</code>). İnsan genomu yaklaşık 3 milyar harften oluştuğu için iki DNA dizisini gözle karşılaştırmak pek gerçekçi değildir. İşte biyoinformatik algoritmaları burada devreye girer: Diziler arasındaki benzerlikleri, farklılıkları ve olası biyolojik ilişkileri bilgisayarlarla araştırır.</p>

<p>``</p>

<h2 id="dna-karşılaştırması-neden-yapılır">DNA karşılaştırması neden yapılır?</h2>

<p>Genom karşılaştırması; hastalıklarla ilişkili mutasyonları bulmak, türler arasındaki evrimsel yakınlığı ölçmek, virüs varyantlarını takip etmek ve kişiselleştirilmiş tedaviler geliştirmek için kullanılır. Temel amaç, iki dizide aynı kalan veya değişen bölgeleri belirlemektir.</p>

<p>Örneğin aşağıdaki dizileri ele alalım:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Dizi 1: ACGTACG
Dizi 2: ACGTTCG
</code></pre></div></div>

<p>Burada beşinci karakter <code class="language-plaintext highlighter-rouge">A</code> yerine <code class="language-plaintext highlighter-rouge">T</code> olmuştur. Bu değişime <strong>substitüsyon</strong> denir. DNA’da ayrıca karakter eklenmesi anlamına gelen <strong>insersiyon</strong> ve karakter kaybı anlamına gelen <strong>delesyon</strong> görülebilir.</p>

<table>
  <thead>
    <tr>
      <th>Değişim</th>
      <th>Örnek</th>
      <th>Açıklama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Substitüsyon</td>
      <td><code class="language-plaintext highlighter-rouge">ACG</code> → <code class="language-plaintext highlighter-rouge">ATG</code></td>
      <td>Bir baz başka bir bazla değişir</td>
    </tr>
    <tr>
      <td>İnsersiyon</td>
      <td><code class="language-plaintext highlighter-rouge">ACG</code> → <code class="language-plaintext highlighter-rouge">ACTG</code></td>
      <td>Diziye yeni bir baz eklenir</td>
    </tr>
    <tr>
      <td>Delesyon</td>
      <td><code class="language-plaintext highlighter-rouge">ACG</code> → <code class="language-plaintext highlighter-rouge">AG</code></td>
      <td>Diziden bir baz silinir</td>
    </tr>
  </tbody>
</table>

<h2 id="dizi-hizalama-mantığı">Dizi hizalama mantığı</h2>

<p>Bilgisayarlar DNA dizilerini karşılaştırırken karakterleri uygun konumlarda alt alta getirmeye çalışır. Bu işleme <strong>dizi hizalama</strong> denir. Her eşleşmeye pozitif, uyumsuzluğa veya boşluğa negatif puan verilerek en yüksek puanlı hizalama aranır.</p>

<p>Basit bir puan fonksiyonu şöyle tanımlanabilir:</p>

\[s(a,b)=
\begin{cases}
+2, &amp; a=b \\
-1, &amp; a\neq b
\end{cases}\]

<p>Diziye eklenen boşlukların puanı da örneğin $-2$ olabilir. Algoritma, toplam puanı</p>

\[S=\sum_{i=1}^{n}s(x_i,y_i)\]

<p>ifadesine göre en büyük yapan hizalamayı seçer. Böylece yalnızca kaç harfin aynı olduğuna değil, ekleme ve silmelerin diziyi nasıl kaydırdığına da dikkat edilir.</p>

<h2 id="global-ve-lokal-hizalama">Global ve lokal hizalama</h2>

<p>İki temel yaklaşım bulunur:</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Algoritma</th>
      <th>Kullanım amacı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Global hizalama</td>
      <td>Needleman–Wunsch</td>
      <td>Dizilerin tamamını karşılaştırır</td>
    </tr>
    <tr>
      <td>Lokal hizalama</td>
      <td>Smith–Waterman</td>
      <td>En benzer alt bölgeleri bulur</td>
    </tr>
  </tbody>
</table>

<p>Global hizalama, uzunlukları ve kökenleri benzer diziler için uygundur. Lokal hizalama ise büyük bir genom içinde belirli bir gen bölgesini ararken daha kullanışlıdır. Her iki yöntem de <strong>dinamik programlama</strong> kullanır. Problem küçük alt problemlere ayrılır ve daha önce hesaplanan sonuçlar bir tabloda saklanır. Böylece aynı işlem tekrar tekrar yapılmaz.</p>

<h2 id="python-ile-basit-benzerlik-hesabı">Python ile basit benzerlik hesabı</h2>

<p>Aşağıdaki kod, eşit uzunluktaki iki DNA dizisinde aynı konumda bulunan bazların oranını hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">dna_benzerligi</span><span class="p">(</span><span class="n">dizi1</span><span class="p">,</span> <span class="n">dizi2</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">dizi1</span><span class="p">)</span> <span class="o">!=</span> <span class="nf">len</span><span class="p">(</span><span class="n">dizi2</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">Diziler eşit uzunlukta olmalı</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">eslesme</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span>
        <span class="n">baz1</span> <span class="o">==</span> <span class="n">baz2</span>
        <span class="k">for</span> <span class="n">baz1</span><span class="p">,</span> <span class="n">baz2</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">dizi1</span><span class="p">,</span> <span class="n">dizi2</span><span class="p">)</span>
    <span class="p">)</span>
    <span class="k">return</span> <span class="n">eslesme</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">dizi1</span><span class="p">)</span>

<span class="n">oran</span> <span class="o">=</span> <span class="nf">dna_benzerligi</span><span class="p">(</span><span class="sh">"</span><span class="s">ACGTACG</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">ACGTTCG</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Benzerlik: %</span><span class="si">{</span><span class="n">oran</span> <span class="o">*</span> <span class="mi">100</span><span class="si">:</span><span class="p">.</span><span class="mi">2</span><span class="n">f</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu örnek yaklaşık <code class="language-plaintext highlighter-rouge">%85.71</code> benzerlik verir. Ancak insersiyon ve delesyonları doğru değerlendiremez; çünkü boşluk ekleyerek hizalama yapmaz. Gerçek projelerde Biopython, BLAST ve minimap2 gibi araçlar tercih edilir.</p>

<h2 id="milyarlarca-harf-nasıl-aranıyor">Milyarlarca harf nasıl aranıyor?</h2>

<p>Klasik dinamik programlama algoritmalarının zaman karmaşıklığı genellikle $O(nm)$ düzeyindedir. Milyarlarca baz söz konusu olduğunda bu maliyet fazlasıyla büyür. BLAST gibi araçlar bu nedenle önce kısa ve umut vadeden eşleşmeleri bulur, ardından yalnızca bu bölgeleri ayrıntılı biçimde hizalar. Bu yaklaşım kesin sonucu garanti etmek yerine hız ile doğruluk arasında kullanışlı bir denge kurar.</p>

<p>Kısacası genom analizi, DNA’yı sıradan bir metin olarak görmekten çok daha fazlasıdır. Dizi algoritmaları, olasılık, dinamik programlama ve yüksek performanslı hesaplama birlikte çalışarak dört harfli biyolojik alfabenin içindeki yaşam hikâyesini okunabilir hâle getirir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="genom" /><category term="dna" /><category term="biyoinformatik" /><category term="algoritma" /><category term="python" /><category term="dizi-hizalama" /><summary type="html"><![CDATA[DNA, canlıların yapım talimatlarını taşıyan devasa bir metin gibi düşünülebilir. Ancak bu metnin alfabesinde yalnızca dört harf bulunur: adenin (A), sitozin (C), guanin (G) ve timin (T). İnsan genomu yaklaşık 3 milyar harften oluştuğu için iki DNA dizisini gözle karşılaştırmak pek gerçekçi değildir. İşte biyoinformatik algoritmaları burada devreye girer: Diziler arasındaki benzerlikleri, farklılıkları ve olası biyolojik ilişkileri bilgisayarlarla araştırır.]]></summary></entry><entry><title type="html">GIS ile Arazi Kullanım Analizi: Şehirler Katmanlarla Nasıl Planlanır?</title><link href="https://program.sonsuz.us/posts/gis-ile-arazi-kullanim-analizi-sehirler-katmanlarla-nasil-planlanir/" rel="alternate" type="text/html" title="GIS ile Arazi Kullanım Analizi: Şehirler Katmanlarla Nasıl Planlanır?" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/gis-ile-arazi-kullanim-analizi-sehirler-katmanlarla-nasil-planlanir</id><content type="html" xml:base="https://program.sonsuz.us/posts/gis-ile-arazi-kullanim-analizi-sehirler-katmanlarla-nasil-planlanir/"><![CDATA[<p>Bir şehrin nereye doğru büyümesi gerektiğine karar vermek, boş görünen bir araziyi işaretlemekten çok daha karmaşıktır. Zeminin eğimi, ulaşım ağı, nüfus yoğunluğu, tarım alanları, su kaynakları ve afet riskleri aynı anda değerlendirilmelidir. Coğrafi Bilgi Sistemleri (GIS), tüm bu verileri katmanlar hâlinde bir araya getirerek yapılaşma kararlarını ölçülebilir, karşılaştırılabilir ve görsel olarak anlaşılır hâle getirir.
``</p>

<h2 id="katman-mantığı-nedir">Katman mantığı nedir?</h2>

<p>GIS ortamında gerçek dünyanın farklı özellikleri ayrı veri katmanlarında tutulur. Yol ağı bir çizgi katmanı, binalar poligon katmanı, hastaneler nokta katmanı olabilir. Uydu görüntüsü ve yükseklik modeli gibi kesintisiz veriler ise genellikle raster biçimindedir.</p>

<table>
  <thead>
    <tr>
      <th>Veri katmanı</th>
      <th>Tipik veri modeli</th>
      <th>Planlamadaki rolü</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mevcut binalar</td>
      <td>Vektör-poligon</td>
      <td>Yapı yoğunluğunu gösterir</td>
    </tr>
    <tr>
      <td>Ulaşım ağı</td>
      <td>Vektör-çizgi</td>
      <td>Erişilebilirliği ölçer</td>
    </tr>
    <tr>
      <td>Sayısal yükseklik modeli</td>
      <td>Raster</td>
      <td>Eğim ve bakı üretir</td>
    </tr>
    <tr>
      <td>Taşkın alanları</td>
      <td>Raster veya poligon</td>
      <td>Riskli bölgeleri dışlar</td>
    </tr>
    <tr>
      <td>Tarım ve orman alanları</td>
      <td>Poligon</td>
      <td>Korunacak bölgeleri belirler</td>
    </tr>
    <tr>
      <td>Nüfus yoğunluğu</td>
      <td>Raster veya bölgesel tablo</td>
      <td>Hizmet talebini açıklar</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/gis-ile-arazi-88.svg" alt="gis-ile-arazi-88" /></p>

<p>Bu katmanların birlikte kullanılabilmesi için aynı koordinat referans sistemine dönüştürülmesi gerekir. Örneğin mesafe ve alan hesabı yapılacaksa derece kullanan coğrafi koordinatlar yerine metre tabanlı uygun bir projeksiyon tercih edilmelidir. Aksi hâlde harita güzel görünürken hesaplar sessizce hatalı sonuç verebilir.</p>

<h2 id="uygunluk-modeli-nasıl-kurulur">Uygunluk modeli nasıl kurulur?</h2>

<p>Yeni bir konut bölgesi aradığımızı düşünelim. Düz araziler, ana yollara yakın bölgeler ve mevcut altyapıya erişebilen alanlar avantajlıdır. Taşkın riski yüksek, orman niteliğindeki veya aşırı eğimli bölgeler ise elenmelidir.</p>

<p>Her ölçüt ortak bir ölçeğe, örneğin 0 ile 1 arasına normalize edilebilir. Ardından ağırlıklı doğrusal birleşim uygulanır:</p>

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

<p>Burada $S$ toplam uygunluk puanı, $x_i$ normalize edilmiş ölçüt değeri ve $w_i$ karar vericinin belirlediği ağırlıktır. Ağırlıkların toplamı genellikle $\sum w_i = 1$ olacak şekilde düzenlenir. Örnek olarak eğim için 0,30; ulaşım için 0,25; altyapı için 0,25 ve nüfus talebi için 0,20 kullanılabilir.</p>

<p>Ancak yüksek puan, alanın otomatik olarak imara açılması gerektiği anlamına gelmez. Yasal koruma sınırları gibi kesin kısıtlar ayrı bir maske ile uygulanır:</p>

\[S_{son} = S \times M\]

<p>$M$ değeri yasak bölgelerde 0, değerlendirilebilir bölgelerde 1 olur. Böylece çok erişilebilir olsa bile bir sulak alan sonuç listesinden çıkarılır.</p>

<h2 id="python-ile-basit-bir-mekânsal-eleme">Python ile basit bir mekânsal eleme</h2>

<p>Aşağıdaki GeoPandas örneği, aday parsellerden taşkın alanlarıyla kesişenleri çıkarır ve yollara yakın olanları seçer:</p>

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

<span class="n">parseller</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="nf">read_file</span><span class="p">(</span><span class="sh">"</span><span class="s">aday_parseller.geojson</span><span class="sh">"</span><span class="p">)</span>
<span class="n">yollar</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="nf">read_file</span><span class="p">(</span><span class="sh">"</span><span class="s">ana_yollar.geojson</span><span class="sh">"</span><span class="p">)</span>
<span class="n">taskin</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="nf">read_file</span><span class="p">(</span><span class="sh">"</span><span class="s">taskin_alani.geojson</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># Tüm katmanları metre tabanlı aynı koordinat sistemine getirir.
</span><span class="n">hedef_crs</span> <span class="o">=</span> <span class="sh">"</span><span class="s">EPSG:32636</span><span class="sh">"</span>
<span class="n">parseller</span> <span class="o">=</span> <span class="n">parseller</span><span class="p">.</span><span class="nf">to_crs</span><span class="p">(</span><span class="n">hedef_crs</span><span class="p">)</span>
<span class="n">yollar</span> <span class="o">=</span> <span class="n">yollar</span><span class="p">.</span><span class="nf">to_crs</span><span class="p">(</span><span class="n">hedef_crs</span><span class="p">)</span>
<span class="n">taskin</span> <span class="o">=</span> <span class="n">taskin</span><span class="p">.</span><span class="nf">to_crs</span><span class="p">(</span><span class="n">hedef_crs</span><span class="p">)</span>

<span class="c1"># Ana yolların çevresinde 1000 metrelik erişim bölgesi oluşturur.
</span><span class="n">yol_tamponu</span> <span class="o">=</span> <span class="n">yollar</span><span class="p">.</span><span class="nf">buffer</span><span class="p">(</span><span class="mi">1000</span><span class="p">).</span><span class="nf">union_all</span><span class="p">()</span>

<span class="c1"># Yola yakın ve taşkın alanıyla kesişmeyen parselleri belirler.
</span><span class="n">uygun</span> <span class="o">=</span> <span class="n">parseller</span><span class="p">[</span>
    <span class="n">parseller</span><span class="p">.</span><span class="nf">intersects</span><span class="p">(</span><span class="n">yol_tamponu</span><span class="p">)</span>
    <span class="o">&amp;</span> <span class="o">~</span><span class="n">parseller</span><span class="p">.</span><span class="nf">intersects</span><span class="p">(</span><span class="n">taskin</span><span class="p">.</span><span class="nf">union_all</span><span class="p">())</span>
<span class="p">].</span><span class="nf">copy</span><span class="p">()</span>

<span class="n">uygun</span><span class="p">.</span><span class="nf">to_file</span><span class="p">(</span><span class="sh">"</span><span class="s">uygun_parseller.geojson</span><span class="sh">"</span><span class="p">,</span> <span class="n">driver</span><span class="o">=</span><span class="sh">"</span><span class="s">GeoJSON</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu işlem yalnızca ilk elemedir. Sonraki aşamada parsel alanı, eğim ortalaması, toplu taşımaya mesafe ve altyapı maliyeti gibi nitelikler puanlanabilir.</p>

<h2 id="harita-kararın-kendisi-değildir">Harita kararın kendisi değildir</h2>

<p>GIS güçlü bir karar destek aracıdır; fakat verinin güncelliği, çözünürlüğü ve kaynağı sonucu doğrudan etkiler. Ayrıca ağırlıklar teknik uzmanlar, yerel yönetimler ve bölge halkıyla birlikte belirlenmelidir. Farklı ağırlık senaryolarını karşılaştıran duyarlılık analizi, hangi kararların sağlam kaldığını gösterir.</p>

<p>Sonuç olarak katmanlı analiz, şehir planlamasını sezgisel bir çizim çalışmasından şeffaf bir değerlendirme sürecine taşır. En iyi harita yalnızca nerede yapılaşılabileceğini değil, neden orada yapılaşmanın daha dengeli olduğunu da açıklayabilen haritadır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="gis" /><category term="arazi kullanımı" /><category term="şehir planlama" /><category term="mekânsal analiz" /><category term="python" /><category term="geopandas" /><summary type="html"><![CDATA[Bir şehrin nereye doğru büyümesi gerektiğine karar vermek, boş görünen bir araziyi işaretlemekten çok daha karmaşıktır. Zeminin eğimi, ulaşım ağı, nüfus yoğunluğu, tarım alanları, su kaynakları ve afet riskleri aynı anda değerlendirilmelidir. Coğrafi Bilgi Sistemleri (GIS), tüm bu verileri katmanlar hâlinde bir araya getirerek yapılaşma kararlarını ölçülebilir, karşılaştırılabilir ve görsel olarak anlaşılır hâle getirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/gis-ile-arazi-88.png" /><media:content medium="image" url="https://program.sonsuz.us/img/gis-ile-arazi-88.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">IoT Sensör Ağlarıyla Akıllı Sera Otomasyonu</title><link href="https://program.sonsuz.us/posts/iot-sensor-aglariyla-akilli-sera-otomasyonu/" rel="alternate" type="text/html" title="IoT Sensör Ağlarıyla Akıllı Sera Otomasyonu" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/iot-sensor-aglariyla-akilli-sera-otomasyonu</id><content type="html" xml:base="https://program.sonsuz.us/posts/iot-sensor-aglariyla-akilli-sera-otomasyonu/"><![CDATA[<p>Bir serayı sağlıklı tutmak, yalnızca bitkileri sulamaktan ibaret değildir. Sıcaklık yükseldiğinde havalandırmayı açmak, nem azaldığında sulamayı başlatmak ve gün ışığı yetersiz kaldığında yetiştirme lambalarını devreye almak gerekir. IoT sensör ağları sayesinde bu kararlar sürekli ölçüm yapan, verileri paylaşan ve çevresel koşulları otomatik olarak dengeleyen akıllı bir sistem tarafından alınabilir.</p>

<p>``</p>

<h2 id="sistemin-temel-mimarisi">Sistemin Temel Mimarisi</h2>

<p>Akıllı sera sistemi üç katmandan oluşur. Sensör katmanında sıcaklık ve hava nemi için DHT22, toprak nemi için kapasitif sensör, ışık seviyesi için BH1750 kullanılabilir. Kontrol katmanındaki ESP32 veya Raspberry Pi verileri işler. Eyleyici katmanında ise fan, sulama pompası, sisleme sistemi, ısıtıcı ve LED lambalar bulunur.</p>

<p>Sensör düğümleri MQTT gibi hafif bir mesajlaşma protokolüyle merkezi denetleyiciye veri gönderir. Örneğin <code class="language-plaintext highlighter-rouge">sera/sicaklik</code> konusu sıcaklık ölçümlerini, <code class="language-plaintext highlighter-rouge">sera/toprak_nemi</code> konusu ise sulama kararında kullanılacak değerleri taşıyabilir.</p>

<table>
  <thead>
    <tr>
      <th>Değişken</th>
      <th>Sensör</th>
      <th style="text-align: right">Hedef aralık</th>
      <th>Kontrol edilen cihaz</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sıcaklık</td>
      <td>DHT22</td>
      <td style="text-align: right">20–28 °C</td>
      <td>Fan ve ısıtıcı</td>
    </tr>
    <tr>
      <td>Hava nemi</td>
      <td>DHT22</td>
      <td style="text-align: right">%60–80</td>
      <td>Sisleyici ve fan</td>
    </tr>
    <tr>
      <td>Toprak nemi</td>
      <td>Kapasitif sensör</td>
      <td style="text-align: right">%40–70</td>
      <td>Su pompası</td>
    </tr>
    <tr>
      <td>Işık</td>
      <td>BH1750</td>
      <td style="text-align: right">10.000–25.000 lux</td>
      <td>LED yetiştirme lambası</td>
    </tr>
  </tbody>
</table>

<h2 id="kontrol-mantığının-teorisi">Kontrol Mantığının Teorisi</h2>

<p>En basit yöntem eşik tabanlı kontroldür. Ölçülen değer $x$, alt sınır $L$ ve üst sınır $U$ ile karşılaştırılır:</p>

\[u(x)=
\begin{cases}
1, &amp; x &lt; L \\
0, &amp; x &gt; U
\end{cases}\]

<p>Buradaki $u$, cihazın açık veya kapalı olmasını temsil eder. Ancak tek bir eşik kullanılırsa ölçüm sınır çevresinde dalgalandığında röle sürekli açılıp kapanabilir. Bunu önlemek için histerezis uygulanır. Örneğin pompa, toprak nemi %40’ın altına düşünce açılır; %55’e ulaşınca kapanır.</p>

<p>Daha hassas sıcaklık kontrolünde PID algoritması kullanılabilir:</p>

\[u(t)=K_p e(t)+K_i\int e(t)dt+K_d\frac{de(t)}{dt}\]

<p>Burada $e(t)$, hedef sıcaklık ile ölçülen sıcaklık arasındaki farktır. Oransal bileşen mevcut hataya, integral bileşen birikmiş hataya, türev bileşeni ise değişim hızına tepki verir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Eşik kontrolü</td>
      <td>Basit ve hızlıdır</td>
      <td>Dalgalanma oluşturabilir</td>
      <td>Sulama ve aydınlatma</td>
    </tr>
    <tr>
      <td>Histerezis</td>
      <td>Röle ömrünü uzatır</td>
      <td>Çok hassas değildir</td>
      <td>Pompa ve fan kontrolü</td>
    </tr>
    <tr>
      <td>PID</td>
      <td>Kararlı ve hassastır</td>
      <td>Ayarlama gerektirir</td>
      <td>Isıtma ve havalandırma</td>
    </tr>
  </tbody>
</table>

<h2 id="örnek-kontrol-algoritması">Örnek Kontrol Algoritması</h2>

<p>Aşağıdaki Python kodu, sensör verilerine göre fanı, pompayı ve lambayı yönetir. Gerçek projede değişkenler MQTT mesajlarından veya sensör sürücülerinden alınabilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sicaklik</span> <span class="o">=</span> <span class="mf">30.2</span>
<span class="n">toprak_nemi</span> <span class="o">=</span> <span class="mi">37</span>
<span class="n">isik</span> <span class="o">=</span> <span class="mi">7200</span>

<span class="n">pompa_acik</span> <span class="o">=</span> <span class="bp">False</span>

<span class="k">if</span> <span class="n">sicaklik</span> <span class="o">&gt;</span> <span class="mi">28</span><span class="p">:</span>
    <span class="n">fan</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">elif</span> <span class="n">sicaklik</span> <span class="o">&lt;</span> <span class="mi">24</span><span class="p">:</span>
    <span class="n">fan</span> <span class="o">=</span> <span class="bp">False</span>

<span class="c1"># Histerezisli sulama kontrolü
</span><span class="k">if</span> <span class="n">toprak_nemi</span> <span class="o">&lt;</span> <span class="mi">40</span><span class="p">:</span>
    <span class="n">pompa_acik</span> <span class="o">=</span> <span class="bp">True</span>
<span class="k">elif</span> <span class="n">toprak_nemi</span> <span class="o">&gt;</span> <span class="mi">55</span><span class="p">:</span>
    <span class="n">pompa_acik</span> <span class="o">=</span> <span class="bp">False</span>

<span class="c1"># Yetersiz doğal ışıkta destek aydınlatması
</span><span class="n">lamba</span> <span class="o">=</span> <span class="n">isik</span> <span class="o">&lt;</span> <span class="mi">10000</span>

<span class="nf">print</span><span class="p">({</span><span class="sh">'</span><span class="s">fan</span><span class="sh">'</span><span class="p">:</span> <span class="n">fan</span><span class="p">,</span> <span class="sh">'</span><span class="s">pompa</span><span class="sh">'</span><span class="p">:</span> <span class="n">pompa_acik</span><span class="p">,</span> <span class="sh">'</span><span class="s">lamba</span><span class="sh">'</span><span class="p">:</span> <span class="n">lamba</span><span class="p">})</span>
</code></pre></div></div>

<p>Kodun belirli aralıklarla çalıştırılması yerine olay tabanlı MQTT mesajlarıyla tetiklenmesi ağ trafiğini ve enerji tüketimini azaltabilir. Kablosuz sensörler pille çalışıyorsa ölçümlerin her saniye değil, örneğin her 30 saniyede bir gönderilmesi daha mantıklıdır.</p>

<h2 id="daha-güvenilir-bir-sera-i̇çin">Daha Güvenilir Bir Sera İçin</h2>

<p>Otomasyon sistemi yalnızca anlık ölçümlere güvenmemelidir. Hareketli ortalama kullanılarak gürültü azaltılabilir:</p>

\[\bar{x}_n=\frac{1}{N}\sum_{i=0}^{N-1}x_{n-i}\]

<p>Ayrıca sensör kopması, aşırı sıcaklık veya uzun süre çalışan pompa için güvenlik kuralları tanımlanmalıdır. Verilerin InfluxDB gibi zaman serisi veritabanında saklanması, Grafana üzerinden izlenmesi ve kritik durumlarda telefona bildirim gönderilmesi sistemi tamamlar. Böylece sera, bitkilerin ihtiyaçlarını tahmin eden küçük ama çalışkan bir dijital bahçıvana dönüşür.</p>

<p><img src="/img/iot-sensor-aglariyla-52.svg" alt="iot-sensor-aglariyla-52" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="iot" /><category term="sera otomasyonu" /><category term="sensör ağları" /><category term="python" /><category term="mqtt" /><category term="kontrol algoritmaları" /><summary type="html"><![CDATA[Bir serayı sağlıklı tutmak, yalnızca bitkileri sulamaktan ibaret değildir. Sıcaklık yükseldiğinde havalandırmayı açmak, nem azaldığında sulamayı başlatmak ve gün ışığı yetersiz kaldığında yetiştirme lambalarını devreye almak gerekir. IoT sensör ağları sayesinde bu kararlar sürekli ölçüm yapan, verileri paylaşan ve çevresel koşulları otomatik olarak dengeleyen akıllı bir sistem tarafından alınabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/iot-sensor-aglariyla-52.png" /><media:content medium="image" url="https://program.sonsuz.us/img/iot-sensor-aglariyla-52.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>