<?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-29T12:05:41+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ı 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">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">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">Mahsul Sınıflandırmada Hiperspektral Görüntüleme: Bitkilerin Görünmez Stres Sinyalleri</title><link href="https://program.sonsuz.us/posts/mahsul-siniflandirmada-hiperspektral-goruntuleme-bitkilerin-gorunmez-stres-sinyalleri/" rel="alternate" type="text/html" title="Mahsul Sınıflandırmada Hiperspektral Görüntüleme: Bitkilerin Görünmez Stres Sinyalleri" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/mahsul-siniflandirmada-hiperspektral-goruntuleme-bitkilerin-gorunmez-stres-sinyalleri</id><content type="html" xml:base="https://program.sonsuz.us/posts/mahsul-siniflandirmada-hiperspektral-goruntuleme-bitkilerin-gorunmez-stres-sinyalleri/"><![CDATA[<p>Bir yaprak insan gözüne capcanlı yeşil görünürken susuzluk, mineral eksikliği veya hastalık nedeniyle çoktan alarm vermeye başlamış olabilir. Normal kameralar bu erken sinyalleri çoğu zaman kaçırır; hiperspektral kameralar ise görünür ışığın ötesindeki dalga boylarını inceleyerek bitkinin adeta biyokimyasal parmak izini çıkarır. Böylece tarla tamamen sararmadan önce hangi mahsulün sağlıklı, stresli veya hastalıklı olduğu belirlenebilir.</p>

<p>``</p>

<h2 id="pikselden-spektral-i̇mza-çıkarmak">Pikselden Spektral İmza Çıkarmak</h2>

<p>Standart bir RGB kamera her pikseli kırmızı, yeşil ve mavi olmak üzere üç değerle temsil eder. Hiperspektral görüntüleme ise elektromanyetik spektrumu onlarca, hatta yüzlerce dar banda ayırır. Sonuç, iki uzamsal ve bir spektral boyuta sahip bir <strong>veri küpüdür</strong>:</p>

\[I(x,y,\lambda)\]

<p>Burada $x$ ve $y$ pikselin konumunu, $\lambda$ ise ölçülen dalga boyunu gösterir. Örneğin bir sistem 400–1000 nm aralığında 200 bant kaydedebilir. Her piksel için elde edilen yansıma eğrisi, o noktadaki bitkinin su, pigment ve hücre yapısı hakkında bilgi taşır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>RGB kamera</th>
      <th>Hiperspektral kamera</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bant sayısı</td>
      <td>3</td>
      <td>Onlarca veya yüzlerce</td>
    </tr>
    <tr>
      <td>Algılanan bölge</td>
      <td>Genellikle görünür ışık</td>
      <td>Görünür ve yakın kızılötesi</td>
    </tr>
    <tr>
      <td>Veri boyutu</td>
      <td>Düşük</td>
      <td>Çok yüksek</td>
    </tr>
    <tr>
      <td>Erken stres tespiti</td>
      <td>Sınırlı</td>
      <td>Güçlü</td>
    </tr>
    <tr>
      <td>Temel kullanım</td>
      <td>Renk ve şekil</td>
      <td>Kimyasal ve fizyolojik farklılık</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/mahsul-siniflandirmada-hiperspektral-22.svg" alt="mahsul-siniflandirmada-hiperspektral-22" /></p>

<h2 id="bitki-stresi-neden-görünmezken-yakalanabilir">Bitki Stresi Neden Görünmezken Yakalanabilir?</h2>

<p>Sağlıklı yaprak klorofili, mavi ve kırmızı ışığı güçlü biçimde soğururken yeşil ışığı daha fazla yansıtır. Bu nedenle yaprakları yeşil görürüz. Yakın kızılötesi bölgede ise yansımayı yaprağın hücresel yapısı belirler. Susuzluk, mantar enfeksiyonu veya azot eksikliği başladığında klorofil yoğunluğu, su içeriği ve hücre düzeni değişir. İnsan gözü henüz fark görmese bile spektral eğri kaymaya başlar.</p>

<p>Bitki analizinde sık kullanılan göstergelerden biri NDVI değeridir:</p>

\[NDVI = \frac{NIR-Red}{NIR+Red}\]

<p>Yüksek NDVI genellikle yoğun ve sağlıklı bitki örtüsüne işaret eder. Ancak hiperspektral sistemlerin asıl avantajı, yalnızca iki bandı değil bütün spektral profili kullanabilmesidir. Böylece su stresi ile besin eksikliği gibi görsel açıdan benzer durumlar birbirinden ayrılabilir.</p>

<h2 id="sınıflandırma-süreci">Sınıflandırma Süreci</h2>

<p>Tipik bir projede önce görüntüler sensör gürültüsünden ve aydınlatma farklarından arındırılır. Karanlık ve beyaz referans ölçümleriyle yansıma değeri yaklaşık olarak şöyle hesaplanır:</p>

\[R = \frac{I-D}{W-D}\]

<p>Burada $I$ ham görüntü, $D$ karanlık referans, $W$ ise beyaz referanstır. Ardından PCA gibi boyut indirgeme yöntemleri uygulanabilir. Son aşamada Destek Vektör Makineleri, Random Forest veya sinir ağlarıyla sağlıklı, susuz, hastalıklı ve besin eksikliği bulunan örnekler sınıflandırılır.</p>

<p>Aşağıdaki Python örneği, spektral ölçümler üzerinde Random Forest modeli kurar:</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.ensemble</span> <span class="kn">import</span> <span class="n">RandomForestClassifier</span>
<span class="kn">from</span> <span class="n">sklearn.metrics</span> <span class="kn">import</span> <span class="n">classification_report</span>

<span class="c1"># X: örneklerin spektral bantları, y: stres sınıfları
</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.25</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="nc">RandomForestClassifier</span><span class="p">(</span>
    <span class="n">n_estimators</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">max_depth</span><span class="o">=</span><span class="mi">12</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="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">predictions</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">classification_report</span><span class="p">(</span><span class="n">y_test</span><span class="p">,</span> <span class="n">predictions</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu kod, her bitki örneğinin bant değerlerini özellik olarak kullanır ve karar ağaçlarından oluşan bir toplulukla stres türünü tahmin eder. <code class="language-plaintext highlighter-rouge">stratify</code> parametresi sınıf oranlarını korurken rapor; kesinlik, duyarlılık ve F1 skorlarını gösterir.</p>

<h2 id="tarladan-geleceğe">Tarladan Geleceğe</h2>

<p>Hiperspektral kameralar drone, uydu veya traktör üzerine yerleştirilebilir. Üretici böylece yalnızca sorunlu bölgelere su, gübre ya da ilaç uygulayabilir. Bununla birlikte yüksek cihaz maliyeti, büyük veri hacmi ve değişken güneş ışığı önemli zorluklardır. Yine de daha ucuz sensörler ve güçlü yapay zekâ modelleri sayesinde teknoloji hızla erişilebilir hâle geliyor. Kısacası geleceğin tarlasında bitkiler konuşmayacak; fakat spektrumları onların yerine oldukça ayrıntılı konuşacak.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="hiperspektral görüntüleme" /><category term="tarım teknolojileri" /><category term="makine öğrenmesi" /><category term="görüntü işleme" /><category term="uzaktan algılama" /><category term="bitki stresi" /><summary type="html"><![CDATA[Bir yaprak insan gözüne capcanlı yeşil görünürken susuzluk, mineral eksikliği veya hastalık nedeniyle çoktan alarm vermeye başlamış olabilir. Normal kameralar bu erken sinyalleri çoğu zaman kaçırır; hiperspektral kameralar ise görünür ışığın ötesindeki dalga boylarını inceleyerek bitkinin adeta biyokimyasal parmak izini çıkarır. Böylece tarla tamamen sararmadan önce hangi mahsulün sağlıklı, stresli veya hastalıklı olduğu belirlenebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/mahsul-siniflandirmada-hiperspektral-22.png" /><media:content medium="image" url="https://program.sonsuz.us/img/mahsul-siniflandirmada-hiperspektral-22.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Prosedürel Zindan Üretimi: Hücresel Otomata mı, BSP mi?</title><link href="https://program.sonsuz.us/posts/prosedurel-zindan-uretimi-hucresel-otomata-mi-bsp-mi/" rel="alternate" type="text/html" title="Prosedürel Zindan Üretimi: Hücresel Otomata mı, BSP mi?" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/prosedurel-zindan-uretimi-hucresel-otomata-mi-bsp-mi</id><content type="html" xml:base="https://program.sonsuz.us/posts/prosedurel-zindan-uretimi-hucresel-otomata-mi-bsp-mi/"><![CDATA[<p>Bir zindanı elle tasarlamak keyiflidir; yüzüncü zindanı tasarlamak ise insanı duvarlarla konuşmaya başlatabilir. Prosedürel üretim algoritmaları, belirli kurallardan yararlanarak her oyun oturumunda farklı haritalar oluşturur. Hücresel otomata doğal mağaralar üretirken Binary Space Partitioning, yani BSP, düzenli odalar ve koridorlar konusunda parlar. Peki projeniz için hangisini seçmelisiniz?</p>

<p>``</p>

<h2 id="temel-problem-rastgelelik-mi-oynanabilirlik-mi">Temel problem: Rastgelelik mi, oynanabilirlik mi?</h2>

<p>Bir harita $W \times H$ boyutlarında hücrelerden oluşsun. En basit temsil şöyledir:</p>

\[M(x,y) \in \{0,1\}\]

<p>Burada $0$ yürünebilir zemini, $1$ ise duvarı gösterebilir. Algoritmanın görevi yalnızca hücreleri doldurmak değildir; bağlantılı, dengeli ve oyun mekaniğine uygun bir düzen üretmektir. Tam rastgele dağılım çoğunlukla kopuk odalar, erişilemeyen bölgeler ve anlamsız duvar kümeleri doğurur. Bu nedenle kontrollü rastgelelik gerekir.</p>

<h2 id="hücresel-otomata-mağaraların-mimarı">Hücresel otomata: Mağaraların mimarı</h2>

<p>Hücresel otomata önce her hücreyi belirli bir olasılıkla duvar yapar. Ardından komşulara bakarak haritayı birkaç tur yumuşatır. Bir hücrenin sonraki durumu kabaca şöyle tanımlanabilir:</p>

\[M_{t+1}(x,y)=\begin{cases}1, &amp; N_t(x,y) \geq T \\ 0, &amp; N_t(x,y)&lt;T\end{cases}\]

<p>$N_t$, çevredeki duvar sayısını; $T$ ise eşik değerini temsil eder. Örneğin sekiz komşudan en az beşi duvarsa merkez hücre de duvara dönüşür.</p>

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

<span class="k">def</span> <span class="nf">cellular_step</span><span class="p">(</span><span class="n">grid</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
    <span class="n">height</span><span class="p">,</span> <span class="n">width</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">grid</span><span class="p">),</span> <span class="nf">len</span><span class="p">(</span><span class="n">grid</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
    <span class="n">result</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">width</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">height</span><span class="p">)]</span>

    <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">height</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">width</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
            <span class="n">walls</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span>
                <span class="n">grid</span><span class="p">[</span><span class="n">y</span> <span class="o">+</span> <span class="n">dy</span><span class="p">][</span><span class="n">x</span> <span class="o">+</span> <span class="n">dx</span><span class="p">]</span>
                <span class="k">for</span> <span class="n">dy</span> <span class="ow">in</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
                <span class="k">for</span> <span class="n">dx</span> <span class="ow">in</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
                <span class="nf">if </span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">)</span> <span class="o">!=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
            <span class="p">)</span>
            <span class="n">result</span><span class="p">[</span><span class="n">y</span><span class="p">][</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">walls</span> <span class="o">&gt;=</span> <span class="n">threshold</span> <span class="k">else</span> <span class="mi">0</span>
    <span class="k">return</span> <span class="n">result</span>
</code></pre></div></div>

<p>Bu fonksiyon tek bir yumuşatma turu uygular. Üç ila altı tur genellikle organik boşluklar oluşturur. Ancak sonuçların bağlantılı olduğu garanti edilmez. Flood fill ile erişilemeyen bölgeleri tespit etmek ve küçük alanları kapatmak gerekebilir.</p>

<h2 id="bsp-düzen-seven-zindan-ustası">BSP: Düzen seven zindan ustası</h2>

<p>BSP, haritayı dikdörtgen bölgelere ayırır. Her bölge yeterince büyükse yatay veya dikey olarak ikiye bölünür. Yaprak bölgelerin içine odalar yerleştirilir; ardından kardeş bölgelerdeki odalar koridorlarla bağlanır.</p>

<p>Bir bölgenin alanı $A=w \cdot h$ olsun. Bölme işlemi, $A$ belirlenen minimum oda alanından büyük olduğu sürece devam eder. En-boy oranına bakmak aşırı ince bölgeleri önler.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">split</span><span class="p">(</span><span class="n">rect</span><span class="p">,</span> <span class="n">min_size</span><span class="o">=</span><span class="mi">12</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">w</span><span class="p">,</span> <span class="n">h</span> <span class="o">=</span> <span class="n">rect</span>
    <span class="k">if</span> <span class="n">w</span> <span class="o">&lt;</span> <span class="n">min_size</span> <span class="o">*</span> <span class="mi">2</span> <span class="ow">and</span> <span class="n">h</span> <span class="o">&lt;</span> <span class="n">min_size</span> <span class="o">*</span> <span class="mi">2</span><span class="p">:</span>
        <span class="k">return</span> <span class="p">[</span><span class="n">rect</span><span class="p">]</span>

    <span class="k">if</span> <span class="n">w</span> <span class="o">&gt;</span> <span class="n">h</span> <span class="ow">and</span> <span class="n">w</span> <span class="o">&gt;=</span> <span class="n">min_size</span> <span class="o">*</span> <span class="mi">2</span><span class="p">:</span>
        <span class="n">cut</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">randint</span><span class="p">(</span><span class="n">min_size</span><span class="p">,</span> <span class="n">w</span> <span class="o">-</span> <span class="n">min_size</span><span class="p">)</span>
        <span class="k">return</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">cut</span><span class="p">,</span> <span class="n">h</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">cut</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">w</span> <span class="o">-</span> <span class="n">cut</span><span class="p">,</span> <span class="n">h</span><span class="p">)]</span>

    <span class="k">if</span> <span class="n">h</span> <span class="o">&gt;=</span> <span class="n">min_size</span> <span class="o">*</span> <span class="mi">2</span><span class="p">:</span>
        <span class="n">cut</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">randint</span><span class="p">(</span><span class="n">min_size</span><span class="p">,</span> <span class="n">h</span> <span class="o">-</span> <span class="n">min_size</span><span class="p">)</span>
        <span class="k">return</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">w</span><span class="p">,</span> <span class="n">cut</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">cut</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">h</span> <span class="o">-</span> <span class="n">cut</span><span class="p">)]</span>

    <span class="k">return</span> <span class="p">[</span><span class="n">rect</span><span class="p">]</span>
</code></pre></div></div>

<p>Kod, tek bir dikdörtgeni güvenli ölçülerde iki parçaya ayırır. Gerçek üretimde fonksiyon yapraklara özyinelemeli uygulanır; odalar küçültülerek bölge sınırlarından pay bırakılır.</p>

<h2 id="yöntemlerin-karşılaştırması">Yöntemlerin karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Hücresel otomata</th>
      <th>BSP</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Görsel karakter</td>
      <td>Organik ve mağaramsı</td>
      <td>Geometrik ve mimari</td>
    </tr>
    <tr>
      <td>Bağlantı garantisi</td>
      <td>Doğrudan yok</td>
      <td>Koridorlarla kolay</td>
    </tr>
    <tr>
      <td>Parametreler</td>
      <td>Duvar olasılığı, eşik, tur</td>
      <td>Minimum boyut, bölme yönü</td>
    </tr>
    <tr>
      <td>Oda kontrolü</td>
      <td>Düşük</td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Uygun türler</td>
      <td>Roguelike, hayatta kalma</td>
      <td>RPG, taktik, klasik dungeon</td>
    </tr>
    <tr>
      <td>Son işlem ihtiyacı</td>
      <td>Genellikle yüksek</td>
      <td>Genellikle orta</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/prosedurel-zindan-uretimi-30.svg" alt="prosedurel-zindan-uretimi-30" /></p>

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

<p>Doğal mağaralar, belirsiz görüş hatları ve keşif hissi istiyorsanız hücresel otomata güçlü bir tercihtir. Anahtar odaları, boss alanlarını ve görev rotalarını hassas biçimde konumlandırmanız gerekiyorsa BSP daha öngörülebilir davranır.</p>

<p>İki yöntemi birleştirmek de mümkündür: Önce BSP ile bağlantılı ana odaları kurabilir, ardından bazı bölgelerin içini hücresel otomata ile aşındırabilirsiniz. Böylece BSP’nin oynanabilirlik garantisi ile hücresel otomatanın organik görünümü birleşir. Kısacası en iyi algoritma evrensel değildir; oyununuzun mekânsal ihtiyaçlarını en az son işlemle karşılayan algoritmadır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="prosedürel üretim" /><category term="hücresel otomata" /><category term="bsp" /><category term="oyun geliştirme" /><category term="algoritma" /><category term="zindan tasarımı" /><summary type="html"><![CDATA[Bir zindanı elle tasarlamak keyiflidir; yüzüncü zindanı tasarlamak ise insanı duvarlarla konuşmaya başlatabilir. Prosedürel üretim algoritmaları, belirli kurallardan yararlanarak her oyun oturumunda farklı haritalar oluşturur. Hücresel otomata doğal mağaralar üretirken Binary Space Partitioning, yani BSP, düzenli odalar ve koridorlar konusunda parlar. Peki projeniz için hangisini seçmelisiniz?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/prosedurel-zindan-uretimi-30.png" /><media:content medium="image" url="https://program.sonsuz.us/img/prosedurel-zindan-uretimi-30.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Tıbbi Veri Gizliliği: Şifreleme ve Anonimleştirme Nasıl Çalışır?</title><link href="https://program.sonsuz.us/posts/tibbi-veri-gizliligi-sifreleme-ve-anonimlestirme-nasil-calisir/" rel="alternate" type="text/html" title="Tıbbi Veri Gizliliği: Şifreleme ve Anonimleştirme Nasıl Çalışı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/tibbi-veri-gizliligi-sifreleme-ve-anonimlestirme-nasil-calisir</id><content type="html" xml:base="https://program.sonsuz.us/posts/tibbi-veri-gizliligi-sifreleme-ve-anonimlestirme-nasil-calisir/"><![CDATA[<p>Bir hastane kaydında yalnızca tanı ve tahlil sonuçları bulunmaz; ad, kimlik numarası, genetik özellikler, kullanılan ilaçlar ve hatta psikolojik değerlendirmeler de yer alabilir. Bu bilgiler yanlış ellere geçtiğinde kredi kartı gibi kolayca değiştirilemez. İşte bu nedenle tıbbi verilerin korunması, kapıya güçlü bir kilit takmaktan çok daha fazlasını gerektirir.</p>

<p>``</p>

<h2 id="önce-tehdit-modelini-anlayalım">Önce tehdit modelini anlayalım</h2>

<p>Veri güvenliği planlanırken “Neyi kimden koruyoruz?” sorusu sorulur. Saldırgan dışarıdan sisteme sızan biri olabileceği gibi gereğinden fazla yetkiye sahip bir çalışan veya yanlış yapılandırılmış bir bulut servisi de olabilir.</p>

<p>Tıbbi veriler genellikle üç durumda korunur:</p>

<ul>
  <li><strong>Depolanan veri:</strong> Veritabanı, disk, yedek veya arşiv içindeki kayıtlar.</li>
  <li><strong>Aktarılan veri:</strong> Hastane ile laboratuvar arasında dolaşan bilgiler.</li>
  <li><strong>İşlenen veri:</strong> Bir uygulamanın belleğinde aktif olarak kullanılan kayıtlar.</li>
</ul>

<p>Şifreleme ilk iki durumda oldukça etkilidir. İşlenen veride ise erişim kontrolü, denetim kayıtları ve güvenli çalışma ortamları devreye girer.</p>

<h2 id="şifreleme-veriyi-okunamaz-hâle-getirmek">Şifreleme: Veriyi okunamaz hâle getirmek</h2>

<p>Şifreleme, açık veriyi bir anahtar yardımıyla anlamsız görünen şifreli metne dönüştürür. Basitleştirilmiş biçimiyle:</p>

\[C = E_K(P)\]

<p>Burada $P$ açık tıbbi kayıt, $K$ anahtar, $E$ şifreleme işlemi ve $C$ şifreli çıktıdır. Yetkili taraf aynı veya ilişkili anahtarla veriyi çözer.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Temel özellik</th>
      <th>Sağlık sistemindeki kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Simetrik şifreleme</td>
      <td>Aynı anahtar kullanılır, hızlıdır</td>
      <td>Veritabanı ve yedek şifreleme</td>
    </tr>
    <tr>
      <td>Asimetrik şifreleme</td>
      <td>Açık ve özel anahtar çifti kullanır</td>
      <td>Anahtar paylaşımı, dijital imza</td>
    </tr>
    <tr>
      <td>TLS</td>
      <td>Aktarım kanalını korur</td>
      <td>Hasta portalı ve laboratuvar bağlantıları</td>
    </tr>
    <tr>
      <td>Hash</td>
      <td>Tek yönlü özet üretir</td>
      <td>Bütünlük kontrolü, parola doğrulama</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/tibbi-veri-gizliligi-10.svg" alt="tibbi-veri-gizliligi-10" /></p>

<p>Şifrelenmiş verinin güvenliği algoritmanın gizli tutulmasına değil, anahtarın korunmasına dayanmalıdır. Anahtarı şifreli verinin yanında düz metin olarak saklamak, kasanın anahtarını kapağına bantlamaya benzer. Üretim sistemlerinde anahtar yönetim servisleri, düzenli anahtar döndürme ve donanımsal güvenlik modülleri tercih edilir.</p>

<h2 id="anonimleştirme-ile-kimliği-ayırmak">Anonimleştirme ile kimliği ayırmak</h2>

<p>Anonimleştirme, bir kişinin makul yöntemlerle yeniden belirlenememesini amaçlar. Ad ve kimlik numarasını silmek tek başına yeterli değildir. Nadir bir hastalık, posta kodu ve doğum tarihi bir araya geldiğinde kişi tekrar bulunabilir.</p>

<p><strong>Takma adlandırma (pseudonymization)</strong> işleminde kimlik, rastgele bir kodla değiştirilir; eşleştirme anahtarı korunduğu sürece işlem geri alınabilir. Gerçek anonimleştirmede ise geri dönüş bağlantısının ortadan kaldırılması hedeflenir.</p>

<table>
  <thead>
    <tr>
      <th>Teknik</th>
      <th>Ne yapar?</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Maskeleme</td>
      <td>Değerin bir bölümünü gizler</td>
      <td>Bağlam kimliği ele verebilir</td>
    </tr>
    <tr>
      <td>Genelleştirme</td>
      <td>Yaşı 47 yerine 40–50 yapar</td>
      <td>Analiz hassasiyeti azalır</td>
    </tr>
    <tr>
      <td>$k$-anonimlik</td>
      <td>Her kaydı en az $k-1$ kayda benzetir</td>
      <td>Hassas değer çeşitliliğini garanti etmez</td>
    </tr>
    <tr>
      <td>Diferansiyel gizlilik</td>
      <td>Sonuçlara kontrollü gürültü ekler</td>
      <td>Gizlilik-doğruluk dengesi gerekir</td>
    </tr>
  </tbody>
</table>

<p>Diferansiyel gizlilikte küçük bir $epsilon$ değeri daha güçlü gizliliği, fakat daha fazla gürültüyü ifade eder. Temel düşünce, tek bir kişinin veri kümesine eklenmesinin istatistiksel sonucu belirgin biçimde değiştirmemesidir.</p>

<h2 id="basit-bir-takma-adlandırma-örneği">Basit bir takma adlandırma örneği</h2>

<p>Aşağıdaki Python kodu hasta numarasını gizli bir anahtarla HMAC özetine dönüştürür. Aynı numara aynı kodu üretir; böylece kayıtlar gerçek kimlik gösterilmeden ilişkilendirilebilir.</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="kn">import</span> <span class="n">hashlib</span>

<span class="k">def</span> <span class="nf">hasta_kodu</span><span class="p">(</span><span class="n">hasta_no</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">gizli_anahtar</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="n">ozet</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">gizli_anahtar</span><span class="p">,</span>
        <span class="n">hasta_no</span><span class="p">.</span><span class="nf">encode</span><span class="p">(</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</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>
    <span class="k">return</span> <span class="n">ozet</span><span class="p">[:</span><span class="mi">16</span><span class="p">]</span>

<span class="n">kod</span> <span class="o">=</span> <span class="nf">hasta_kodu</span><span class="p">(</span><span class="sh">"</span><span class="s">HASTA-1042</span><span class="sh">"</span><span class="p">,</span> <span class="sa">b</span><span class="sh">"</span><span class="s">ornek-gizli-anahtar</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">kod</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu örnek eğitim amaçlıdır. Gerçek sistemlerde anahtar kaynak koduna yazılmaz; güvenli bir kasada tutulur. Ayrıca çıktı kısaltılırken çakışma riski değerlendirilmelidir.</p>

<h2 id="tek-teknoloji-yetmez">Tek teknoloji yetmez</h2>

<p>Sağlık verilerini korumak katmanlı savunma gerektirir: en az ayrıcalık ilkesi, çok faktörlü kimlik doğrulama, erişim kayıtları, yedekleme, sızıntı izleme ve çalışan eğitimi birlikte uygulanmalıdır. Araştırma için yalnızca gerekli alanlar paylaşılmalı, saklama süresi dolan kayıtlar güvenli biçimde silinmelidir.</p>

<p>Kısacası şifreleme veriyi kilitler, anonimleştirme kişiyle arasındaki bağı zayıflatır. Doğru anahtar yönetimi ve yeniden kimliklendirme riskinin düzenli ölçümü olmadan ise bu iki güçlü araç, beyaz önlük giymiş bir güvenlik illüzyonuna dönüşebilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="tıbbi veri" /><category term="veri gizliliği" /><category term="şifreleme" /><category term="anonimleştirme" /><category term="siber güvenlik" /><category term="sağlık teknolojileri" /><summary type="html"><![CDATA[Bir hastane kaydında yalnızca tanı ve tahlil sonuçları bulunmaz; ad, kimlik numarası, genetik özellikler, kullanılan ilaçlar ve hatta psikolojik değerlendirmeler de yer alabilir. Bu bilgiler yanlış ellere geçtiğinde kredi kartı gibi kolayca değiştirilemez. İşte bu nedenle tıbbi verilerin korunması, kapıya güçlü bir kilit takmaktan çok daha fazlasını gerektirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/tibbi-veri-gizliligi-10.png" /><media:content medium="image" url="https://program.sonsuz.us/img/tibbi-veri-gizliligi-10.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Toprağı Dinleyen Bahçe: Sensör Tabanlı Akıllı Sulama Sistemi</title><link href="https://program.sonsuz.us/posts/topragi-dinleyen-bahce-sensor-tabanli-akilli-sulama-sistemi/" rel="alternate" type="text/html" title="Toprağı Dinleyen Bahçe: Sensör Tabanlı Akıllı Sulama Sistemi" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/topragi-dinleyen-bahce-sensor-tabanli-akilli-sulama-sistemi</id><content type="html" xml:base="https://program.sonsuz.us/posts/topragi-dinleyen-bahce-sensor-tabanli-akilli-sulama-sistemi/"><![CDATA[<p>Bitkileri düzenli sulamak kolay görünür; ancak doğru miktarı doğru zamanda vermek bambaşka bir meseledir. Hava sıcaklığı, yağış, toprak türü ve bitkinin gelişim dönemi su ihtiyacını sürekli değiştirir. Sensör tabanlı akıllı sulama sistemi, sabit saatlere bağlı kalmak yerine toprağın gerçek durumunu ölçer ve yalnızca ihtiyaç olduğunda pompayı çalıştırır. Böylece hem bitkiler hem de su faturası rahat bir nefes alır.</p>

<p>``</p>

<h2 id="sistemin-temel-mantığı">Sistemin Temel Mantığı</h2>

<p>Bir nem sensörü, toprağın elektriksel özelliklerini ölçerek mikrodenetleyiciye analog bir değer gönderir. Arduino veya ESP32 gibi bir kart bu değeri okur, önceden belirlenen eşiklerle karşılaştırır ve röle üzerinden su pompasını kontrol eder.</p>

<p>Sistemin karar zinciri şöyledir:</p>

<ol>
  <li>Toprak nemi ölçülür.</li>
  <li>Ham sensör değeri filtrelenir.</li>
  <li>Değer, nem yüzdesine dönüştürülür.</li>
  <li>Nem alt sınırın altındaysa pompa açılır.</li>
  <li>Yeterli neme ulaşıldığında pompa kapatılır.</li>
</ol>

<p>Sensörün kuru topraktaki değeri $R_{kuru}$, ıslak topraktaki değeri $R_{islak}$ ve anlık ölçüm $R$ olsun. Yaklaşık nem yüzdesi şu şekilde hesaplanabilir:</p>

\[Nem(\%) = \frac{R_{kuru}-R}{R_{kuru}-R_{islak}} \times 100\]

<p>Bazı sensörlerde ölçüm yönü ters olabilir. Bu nedenle formülü ezberlemek yerine kalibrasyon sonuçlarına göre uyarlamak gerekir.</p>

<h2 id="hangi-nem-sensörü">Hangi Nem Sensörü?</h2>

<p>Bahçe projelerinde çoğunlukla dirençli veya kapasitif sensörler kullanılır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Dirençli sensör</th>
      <th>Kapasitif sensör</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ölçüm yöntemi</td>
      <td>İki prob arasındaki iletkenlik</td>
      <td>Dielektrik değişimi</td>
    </tr>
    <tr>
      <td>Fiyat</td>
      <td>Daha düşük</td>
      <td>Biraz daha yüksek</td>
    </tr>
    <tr>
      <td>Korozyon</td>
      <td>Yüksek</td>
      <td>Düşük</td>
    </tr>
    <tr>
      <td>Uzun süreli kullanım</td>
      <td>Zayıf</td>
      <td>Daha uygun</td>
    </tr>
    <tr>
      <td>Bahçe otomasyonu</td>
      <td>Deneme projeleri</td>
      <td>Kalıcı sistemler</td>
    </tr>
  </tbody>
</table>

<p>Dirençli modeller ekonomik olsa da problardan geçen akım zamanla oksitlenmeye yol açar. Uzun ömürlü bir sistem için kapasitif sensör genellikle daha iyi seçimdir. Sensör gövdesinin elektronik kısmı toprağa gömülmemeli ve yağmurdan korunmalıdır.</p>

<h2 id="eşik-değil-histerezis">Eşik Değil, Histerezis</h2>

<p>Pompayı yalnızca tek bir eşik değeriyle yönetmek sorun çıkarabilir. Nem yüzde 39 ile 40 arasında dalgalanırsa röle sürekli açılıp kapanabilir. Bunun yerine iki farklı eşik kullanılır:</p>

<ul>
  <li>Nem yüzde 35’in altına düşünce pompayı aç.</li>
  <li>Nem yüzde 55’e çıkınca pompayı kapat.</li>
</ul>

<p>Bu iki değer arasındaki fark histerezis olarak adlandırılır. Matematiksel olarak açma eşiği $T_a$, kapatma eşiği $T_k$ ise güvenli çalışma için $T_a &lt; T_k$ olmalıdır.</p>

<h2 id="arduino-ile-örnek-kontrol">Arduino ile Örnek Kontrol</h2>

<p>Aşağıdaki kod sensörü okur, değeri yüzdeye çevirir ve histerezis kullanarak pompayı yönetir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="kt">int</span> <span class="n">sensorPin</span> <span class="o">=</span> <span class="n">A0</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">relayPin</span> <span class="o">=</span> <span class="mi">7</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">dryValue</span> <span class="o">=</span> <span class="mi">820</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">wetValue</span> <span class="o">=</span> <span class="mi">360</span><span class="p">;</span>

<span class="kt">bool</span> <span class="n">pumpRunning</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>

<span class="kt">void</span> <span class="nf">setup</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">pinMode</span><span class="p">(</span><span class="n">relayPin</span><span class="p">,</span> <span class="n">OUTPUT</span><span class="p">);</span>
  <span class="n">digitalWrite</span><span class="p">(</span><span class="n">relayPin</span><span class="p">,</span> <span class="n">LOW</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">loop</span><span class="p">()</span> <span class="p">{</span>
  <span class="kt">int</span> <span class="n">rawValue</span> <span class="o">=</span> <span class="n">analogRead</span><span class="p">(</span><span class="n">sensorPin</span><span class="p">);</span>
  <span class="kt">int</span> <span class="n">moisture</span> <span class="o">=</span> <span class="n">map</span><span class="p">(</span><span class="n">rawValue</span><span class="p">,</span> <span class="n">dryValue</span><span class="p">,</span> <span class="n">wetValue</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
  <span class="n">moisture</span> <span class="o">=</span> <span class="n">constrain</span><span class="p">(</span><span class="n">moisture</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>

  <span class="k">if</span> <span class="p">(</span><span class="n">moisture</span> <span class="o">&lt;</span> <span class="mi">35</span><span class="p">)</span> <span class="n">pumpRunning</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">moisture</span> <span class="o">&gt;</span> <span class="mi">55</span><span class="p">)</span> <span class="n">pumpRunning</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>

  <span class="n">digitalWrite</span><span class="p">(</span><span class="n">relayPin</span><span class="p">,</span> <span class="n">pumpRunning</span> <span class="o">?</span> <span class="n">HIGH</span> <span class="o">:</span> <span class="n">LOW</span><span class="p">);</span>
  <span class="n">delay</span><span class="p">(</span><span class="mi">2000</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">map</code> fonksiyonu kalibrasyon değerlerini yüzde aralığına dönüştürür. <code class="language-plaintext highlighter-rouge">constrain</code> ise hesaplanan sonucu 0 ile 100 arasında tutar. Röle modülünüz düşük seviyede tetikleniyorsa <code class="language-plaintext highlighter-rouge">HIGH</code> ve <code class="language-plaintext highlighter-rouge">LOW</code> mantığını ters çevirmek gerekebilir.</p>

<h2 id="daha-güvenilir-kararlar">Daha Güvenilir Kararlar</h2>

<p>Tek bir ölçüme güvenmek yerine son beş ölçümün ortalamasını almak ani sıçramaları azaltır:</p>

\[\bar{x} = \frac{x_1+x_2+x_3+x_4+x_5}{5}\]

<p>Ayrıca pompaya azami çalışma süresi tanımlanmalıdır. Sensör arızalanırsa veya su deposu boşalırsa pompanın saatlerce çalışması önlenir. Depo seviye sensörü, yağmur sensörü ve akış ölçer eklenerek sistem daha güvenli hâle getirilebilir. ESP32 kullanıldığında ölçümler telefondan izlenebilir ve geçmiş veriler grafikleştirilebilir.</p>

<p>Başarılı bir akıllı sulama sistemi yalnızca toprağın kuru olduğunu fark etmez; ölçümü doğrular, dalgalanmayı filtreler ve güvenli sınırlar içinde karar verir. Kısacası bahçeye otomasyon eklemek, pompaya zamanlayıcı bağlamaktan çok daha akıllı bir iştir.</p>

<p><img src="/img/topragi-dinleyen-bahce-48.svg" alt="topragi-dinleyen-bahce-48" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="akıllı sulama" /><category term="bahçe otomasyonu" /><category term="nem sensörü" /><category term="arduino" /><category term="iot" /><category term="sensörler" /><summary type="html"><![CDATA[Bitkileri düzenli sulamak kolay görünür; ancak doğru miktarı doğru zamanda vermek bambaşka bir meseledir. Hava sıcaklığı, yağış, toprak türü ve bitkinin gelişim dönemi su ihtiyacını sürekli değiştirir. Sensör tabanlı akıllı sulama sistemi, sabit saatlere bağlı kalmak yerine toprağın gerçek durumunu ölçer ve yalnızca ihtiyaç olduğunda pompayı çalıştırır. Böylece hem bitkiler hem de su faturası rahat bir nefes alır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/topragi-dinleyen-bahce-48.png" /><media:content medium="image" url="https://program.sonsuz.us/img/topragi-dinleyen-bahce-48.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Uzay Görevlerinde Otomatik Yakıt Yönetimi: Her Damla Delta-v’nin Hesabı</title><link href="https://program.sonsuz.us/posts/uzay-gorevlerinde-otomatik-yakit-yonetimi-her-damla-delta-vnin-hesabi/" rel="alternate" type="text/html" title="Uzay Görevlerinde Otomatik Yakıt Yönetimi: Her Damla Delta-v’nin Hesabı" /><published>2026-10-29T00:00:00+00:00</published><updated>2026-10-29T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/uzay-gorevlerinde-otomatik-yakit-yonetimi-her-damla-delta-vnin-hesabi</id><content type="html" xml:base="https://program.sonsuz.us/posts/uzay-gorevlerinde-otomatik-yakit-yonetimi-her-damla-delta-vnin-hesabi/"><![CDATA[<p>Uzay aracında yakıt göstergesinin kırmızıya yaklaşması, otomobilde benzin istasyonu aramaya benzemez; uzayda yol kenarında yakıt satan bir tesis yoktur. Bu nedenle otomatik yakıt yönetimi algoritmaları, görevin başından sonuna kadar her manevrayı planlar, belirsizlikleri hesaba katar ve bilimsel hedeflerle güvenlik arasında sürekli denge kurar.
``</p>

<h2 id="yakıt-değil-delta-v-bütçesi">Yakıt değil, delta-v bütçesi</h2>

<p>Görev mühendisleri çoğunlukla yalnızca kilogram cinsinden yakıttan değil, aracın hızını ne kadar değiştirebileceğini gösteren <strong>delta-v</strong> bütçesinden söz eder. Bir yörünge düzeltmesi, istasyon koruma manevrası veya iniş ateşlemesi bu bütçeden harcama yapar.</p>

<p>Roket denklemi, yakıt ile erişilebilir hız değişimi arasındaki ilişkiyi açıklar:</p>

\[Δv = I_{sp} g_0 ln(m_0 / m_f)\]

<p>Burada $I_{sp}$ motorun özgül itkisi, $g_0$ standart yerçekimi ivmesi, $m_0$ başlangıç kütlesi ve $m_f$ yakıt harcandıktan sonraki kütledir. Denklem logaritmik olduğu için iki kat yakıt, iki kat delta-v sağlamaz. Üstelik taşınan ekstra yakıtın kendisi de hızlandırılmalıdır; uzay mühendisliğinin küçük ama pahalı şakası budur.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantajı</th>
      <th>Dezavantajı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sabit bütçe</td>
      <td>Basit ve doğrulanabilir</td>
      <td>Değişen koşullara uyum sağlayamaz</td>
    </tr>
    <tr>
      <td>Açgözlü seçim</td>
      <td>Anlık olarak ucuz manevrayı seçer</td>
      <td>Gelecekteki ihtiyaçları gözden kaçırabilir</td>
    </tr>
    <tr>
      <td>Dinamik programlama</td>
      <td>Çok aşamalı kararları değerlendirir</td>
      <td>Durum sayısı hızla büyür</td>
    </tr>
    <tr>
      <td>Model öngörülü kontrol</td>
      <td>Sistemi düzenli olarak yeniden planlar</td>
      <td>Yüksek hesaplama gücü gerektirir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/uzay-gorevlerinde-otomatik-23.svg" alt="uzay-gorevlerinde-otomatik-23" /></p>

<h2 id="algoritma-neyi-optimize-eder">Algoritma neyi optimize eder?</h2>

<p>Bir görev planlayıcısının amacı yalnızca en az yakıtı harcamak değildir. Manevra süresi, haberleşme penceresi, termal sınırlar, çarpışma riski ve bilimsel kazanç da önemlidir. Bu nedenle maliyet fonksiyonu birkaç hedefi birleştirebilir:</p>

\[J = w_f F + w_t T + w_r R - w_s S\]

<p>$F$ yakıt tüketimini, $T$ süreyi, $R$ riski ve $S$ bilimsel getiriyi temsil eder. $w$ katsayıları ise görev önceliklerini belirler. Bir asteroid sondasında bilimsel getiri ağır basabilirken insanlı görevde güvenlik katsayısı çok daha yüksek tutulur.</p>

<p>Algoritma ayrıca yakıtın tamamını planlanan manevralara dağıtmaz. Motor performansındaki sapmalar, navigasyon hataları ve beklenmeyen yörünge düzeltmeleri için bir <strong>rezerv</strong> bırakır. Böylece teorik olarak mükemmel fakat ilk sürprizde başarısız olan kırılgan planlardan kaçınılır.</p>

<h2 id="basitleştirilmiş-bir-seçim-algoritması">Basitleştirilmiş bir seçim algoritması</h2>

<p>Aşağıdaki Python örneği, manevraları bilimsel değerlerinin yakıt maliyetine oranına göre seçer. Bu yöntem gerçek görev yazılımı değildir; yakıt kısıtı altında karar verme mantığını görünür kılan küçük bir modeldir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">gorevleri_sec</span><span class="p">(</span><span class="n">manevralar</span><span class="p">,</span> <span class="n">toplam_yakit</span><span class="p">,</span> <span class="n">rezerv_orani</span><span class="o">=</span><span class="mf">0.20</span><span class="p">):</span>
    <span class="n">kullanilabilir</span> <span class="o">=</span> <span class="n">toplam_yakit</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">rezerv_orani</span><span class="p">)</span>
    <span class="n">secilenler</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="c1"># Bir kilogram yakıt başına en fazla değeri üretenleri öne alır.
</span>    <span class="n">sirali</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">(</span>
        <span class="n">manevralar</span><span class="p">,</span>
        <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">m</span><span class="p">:</span> <span class="n">m</span><span class="p">[</span><span class="sh">"</span><span class="s">bilimsel_deger</span><span class="sh">"</span><span class="p">]</span> <span class="o">/</span> <span class="n">m</span><span class="p">[</span><span class="sh">"</span><span class="s">yakit</span><span class="sh">"</span><span class="p">],</span>
        <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span>
    <span class="p">)</span>

    <span class="k">for</span> <span class="n">manevra</span> <span class="ow">in</span> <span class="n">sirali</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">manevra</span><span class="p">[</span><span class="sh">"</span><span class="s">yakit</span><span class="sh">"</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">kullanilabilir</span><span class="p">:</span>
            <span class="n">secilenler</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">manevra</span><span class="p">[</span><span class="sh">"</span><span class="s">ad</span><span class="sh">"</span><span class="p">])</span>
            <span class="n">kullanilabilir</span> <span class="o">-=</span> <span class="n">manevra</span><span class="p">[</span><span class="sh">"</span><span class="s">yakit</span><span class="sh">"</span><span class="p">]</span>

    <span class="k">return</span> <span class="n">secilenler</span><span class="p">,</span> <span class="n">kullanilabilir</span>
</code></pre></div></div>

<p>Bu açgözlü yaklaşım hızlıdır; ancak en iyi küresel sonucu garanti etmez. Örneğin düşük değerli görünen bir yörünge düzeltmesi, daha sonra yüksek değerli bir gözlemi mümkün kılabilir. Gerçek sistemler bu bağımlılıkları karma tamsayılı programlama, dinamik programlama veya sezgisel arama yöntemleriyle ele alır.</p>

<h2 id="uçuş-sırasında-yeniden-planlama">Uçuş sırasında yeniden planlama</h2>

<p>Uzay ortamı kusursuz tahmin edilemez. Ölçülen konum beklenenden farklı çıktığında algoritma yeni durumu kestirir, kalan yakıtı hesaplar ve gelecekteki manevraları yeniden optimize eder. Model öngörülü kontrolde bu döngü düzenli olarak tekrarlanır: tahmin et, optimize et, ilk komutu uygula ve yeni ölçüm gelince baştan hesapla.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Algoritmanın tepkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Motor beklenenden zayıf</td>
      <td>Manevra süresini uzatır veya hedefi küçültür</td>
    </tr>
    <tr>
      <td>Yakıt kaçağı şüphesi</td>
      <td>Rezerv oranını artırır, düşük öncelikleri iptal eder</td>
    </tr>
    <tr>
      <td>Yeni bilimsel fırsat</td>
      <td>Getiri-maliyet hesabını yeniden yapar</td>
    </tr>
    <tr>
      <td>Çarpışma riski</td>
      <td>Güvenliği öne alarak acil manevra planlar</td>
    </tr>
  </tbody>
</table>

<p>Sonuç olarak otomatik yakıt yönetimi, bir depo ölçümünden çok daha fazlasıdır. İyi bir algoritma bugünkü manevrayı gerçekleştirirken aylar sonra gereken son düzeltmeyi de düşünür. Uzayda başarı, motoru en uzun süre çalıştırmak değil, doğru anda doğru miktarda çalıştırmaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="uzay" /><category term="algoritma" /><category term="optimizasyon" /><category term="yakıt-yönetimi" /><category term="python" /><category term="otonom-sistemler" /><summary type="html"><![CDATA[Uzay aracında yakıt göstergesinin kırmızıya yaklaşması, otomobilde benzin istasyonu aramaya benzemez; uzayda yol kenarında yakıt satan bir tesis yoktur. Bu nedenle otomatik yakıt yönetimi algoritmaları, görevin başından sonuna kadar her manevrayı planlar, belirsizlikleri hesaba katar ve bilimsel hedeflerle güvenlik arasında sürekli denge kurar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/uzay-gorevlerinde-otomatik-23.png" /><media:content medium="image" url="https://program.sonsuz.us/img/uzay-gorevlerinde-otomatik-23.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>