<?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://sonsuzus.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sonsuzus.github.io/" rel="alternate" type="text/html" /><updated>2026-08-02T10:13:18+00:00</updated><id>https://sonsuzus.github.io/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">Algoritmik Önyargıyı Satranç Metaforuyla Anlamak: Kurallar Adil, Sonuç Neden Değil?</title><link href="https://sonsuzus.github.io/posts/algoritmik-onyargiyi-satranc-metaforuyla-anlamak-kurallar-adil-sonuc-neden-degil/" rel="alternate" type="text/html" title="Algoritmik Önyargıyı Satranç Metaforuyla Anlamak: Kurallar Adil, Sonuç Neden Değil?" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/algoritmik-onyargiyi-satranc-metaforuyla-anlamak-kurallar-adil-sonuc-neden-degil</id><content type="html" xml:base="https://sonsuzus.github.io/posts/algoritmik-onyargiyi-satranc-metaforuyla-anlamak-kurallar-adil-sonuc-neden-degil/"><![CDATA[<p>Satrançta kurallar herkes için aynıdır: Piyon bir kare ilerler, fil çapraz gider, şah tehdit altındaysa korunmalıdır. Yine de bir oyuncuya vezir, diğerine yalnızca birkaç piyon vererek oyunu başlatırsak kuralların eşit olması karşılaşmayı adil yapmaz. Kural tabanlı yazılımlarda algoritmik önyargı da çoğu zaman böyle doğar. Kod herkese aynı koşulları uygulayabilir; fakat başlangıç koşulları, kullanılan göstergeler ve geçmişten alınan veriler eşit değilse sonuçlar sistematik biçimde bazı grupları dezavantajlı hâle getirebilir.</p>

<p>``</p>

<h2 id="tahta-aynı-başlangıç-konumları-farklı">Tahta Aynı, Başlangıç Konumları Farklı</h2>

<p>Kural tabanlı sistemler, önceden belirlenen koşullara göre karar verir. Örneğin bir kredi sistemi şöyle çalışabilir: “Geliri belirli bir sınırın altında olan ve son iki yılda düzenli ödeme geçmişi bulunmayan başvuruyu reddet.” Bu kuralda cinsiyet, yaş veya etnik köken açıkça yazmıyor olabilir. Dolayısıyla sistem ilk bakışta tarafsız görünür.</p>

<p>Ancak ödeme geçmişi oluşturma fırsatı herkese eşit dağılmamışsa kural, geçmişteki eşitsizlikleri yeniden üretir. Satranç metaforuyla söylersek hakem taşların rengini önemsemiyordur; fakat oyunculardan biri oyuna zaten eksik taşlarla başlamıştır.</p>

<p>Bir grubun olumlu karar alma oranını şöyle gösterebiliriz:</p>

\[P(\hat{Y}=1 \mid G=g)\]

<p>Burada $\hat{Y}=1$ olumlu kararı, $G=g$ ise belirli bir gruba üyeliği ifade eder. İki grup için bu olasılıklar ciddi biçimde farklıysa açıkça ayrımcı bir kural bulunmasa bile sonuçlarda önyargı olabilir.</p>

<h2 id="önyargı-hangi-hamlelerde-gizlenir">Önyargı Hangi Hamlelerde Gizlenir?</h2>

<table>
  <thead>
    <tr>
      <th>Satranç unsuru</th>
      <th>Algoritmik karşılığı</th>
      <th>Olası adaletsizlik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Başlangıç dizilimi</td>
      <td>Geçmiş veri ve koşullar</td>
      <td>Eski eşitsizliklerin devralınması</td>
    </tr>
    <tr>
      <td>Hamle kuralları</td>
      <td>İş kuralları ve eşikler</td>
      <td>Herkese aynı görünen katı ölçütler</td>
    </tr>
    <tr>
      <td>Taşın değeri</td>
      <td>Özelliklere verilen önem</td>
      <td>Bazı göstergelerin abartılması</td>
    </tr>
    <tr>
      <td>Hakemin kararı</td>
      <td>Denetim ve itiraz süreci</td>
      <td>Hataların düzeltilememesi</td>
    </tr>
    <tr>
      <td>Oyun sonucu</td>
      <td>Kabul, ret veya sıralama</td>
      <td>Belirli grupların sürekli geride kalması</td>
    </tr>
  </tbody>
</table>

<p>Özellikle <strong>vekil değişkenler</strong> önemlidir. Sistem mahalle kodunu kullanıyor ama etnik kökeni kullanmıyor olabilir. Ne var ki mahalle kodu toplumsal ayrışma nedeniyle etnik köken veya gelir düzeyiyle güçlü biçimde ilişkiliyse yasaklanan bilgi arka kapıdan oyuna döner. Fil yerine “çapraz ilerleyen uzun taş” demek, onun fil olduğu gerçeğini değiştirmez.</p>

<h2 id="basit-bir-kural-nasıl-sorun-üretir">Basit Bir Kural Nasıl Sorun Üretir?</h2>

<p>Aşağıdaki örnek, başvuruları gelir ve kredi geçmişine göre değerlendirir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">kredi_karari</span><span class="p">(</span><span class="n">gelir</span><span class="p">,</span> <span class="n">kredi_gecmisi_ayi</span><span class="p">):</span>
    <span class="n">puan</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">if</span> <span class="n">gelir</span> <span class="o">&gt;=</span> <span class="mi">30_000</span><span class="p">:</span>
        <span class="n">puan</span> <span class="o">+=</span> <span class="mi">1</span>
    <span class="k">if</span> <span class="n">kredi_gecmisi_ayi</span> <span class="o">&gt;=</span> <span class="mi">24</span><span class="p">:</span>
        <span class="n">puan</span> <span class="o">+=</span> <span class="mi">1</span>

    <span class="k">return</span> <span class="sh">"</span><span class="s">Kabul</span><span class="sh">"</span> <span class="k">if</span> <span class="n">puan</span> <span class="o">==</span> <span class="mi">2</span> <span class="k">else</span> <span class="sh">"</span><span class="s">Ret</span><span class="sh">"</span>
</code></pre></div></div>

<p>Kod kısa, anlaşılır ve herkese aynı şekilde uygulanır. Fakat düzenli finansal hizmetlere erişemeyen kişiler 24 aylık geçmiş koşulunu karşılayamaz. Böylece teknik olarak “eşit” kural, fırsat eşitsizliğini cezaya dönüştürür.</p>

<p>Sonuçları incelemek için seçim oranları karşılaştırılabilir:</p>

\[\text{Oran} = \frac{P(\hat{Y}=1 \mid G=A)}{P(\hat{Y}=1 \mid G=B)}\]

<p>Bu değerin $1$’den belirgin biçimde uzaklaşması araştırılması gereken bir dengesizliğe işaret eder. Ancak tek bir matematiksel ölçü adaletin tamamını açıklamaz; yanlış ret oranları, ekonomik koşullar ve kararın insanlar üzerindeki etkisi de değerlendirilmelidir.</p>

<h2 id="daha-adil-bir-oyun-kurmak">Daha Adil Bir Oyun Kurmak</h2>

<p>İlk adım, yalnızca kodu değil oyunun tamamını denetlemektir. Kurallar farklı gruplara ait örnek verilerle test edilmeli, vekil değişkenler araştırılmalı ve eşik değerlerinin etkisi ölçülmelidir. İnsanlara karar gerekçesi sunmak ve itiraz kanalı açmak da kritiktir.</p>

<p>Ayrıca “herkese aynı kural” ile “herkese adil fırsat” arasındaki fark unutulmamalıdır. Bazen geçmişi daha kısa olan başvurular için alternatif güvenilirlik göstergeleri kullanmak gerekir. Amaç bir gruba bedava vezir vermek değil, kimsenin oyuna şahı eksik başlamadığından emin olmaktır.</p>

<p>Algoritmik adalet, yalnızca tarafsız görünen kurallar yazma işi değildir. Asıl soru şudur: Tahtayı kim kurdu, taşların değerini kim belirledi ve oyun bittiğinde kaybedenler neden hep aynı tarafta kaldı?</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="algoritmik önyargı" /><category term="etik" /><category term="kural tabanlı sistemler" /><summary type="html"><![CDATA[Satrançta kurallar herkes için aynıdır: Piyon bir kare ilerler, fil çapraz gider, şah tehdit altındaysa korunmalıdır. Yine de bir oyuncuya vezir, diğerine yalnızca birkaç piyon vererek oyunu başlatırsak kuralların eşit olması karşılaşmayı adil yapmaz. Kural tabanlı yazılımlarda algoritmik önyargı da çoğu zaman böyle doğar. Kod herkese aynı koşulları uygulayabilir; fakat başlangıç koşulları, kullanılan göstergeler ve geçmişten alınan veriler eşit değilse sonuçlar sistematik biçimde bazı grupları dezavantajlı hâle getirebilir.]]></summary></entry><entry><title type="html">Apache Spark ile Dağıtık ve Bellek İçi Veri İşleme</title><link href="https://sonsuzus.github.io/posts/apache-spark-ile-dagitik-ve-bellek-ici-veri-isleme/" rel="alternate" type="text/html" title="Apache Spark ile Dağıtık ve Bellek İçi Veri İşleme" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/apache-spark-ile-dagitik-ve-bellek-ici-veri-isleme</id><content type="html" xml:base="https://sonsuzus.github.io/posts/apache-spark-ile-dagitik-ve-bellek-ici-veri-isleme/"><![CDATA[<p>Devasa bir veri setini tek bilgisayarda işlemeye çalışmak, taşınma günü bütün kolileri küçük bir otomobile doldurmaya benzer: Bir noktadan sonra ne bagaj kapanır ne de süreç ilerler. Apache Spark, verileri kümeye dağıtarak ve ara sonuçları mümkün olduğunca bellekte tutarak bu sorunu çözer. Böylece haritalama, filtreleme ve indirgeme gibi işlemler, her aşamada diske yazma zorunluluğuna takılmadan çok daha hızlı gerçekleştirilebilir.</p>

<p>``</p>

<h2 id="spark-neden-hızlıdır">Spark neden hızlıdır?</h2>

<p>Geleneksel Hadoop MapReduce modelinde bir işin çıktısı çoğunlukla diske yazılır ve sonraki aşama bu veriyi yeniden diskten okur. Disk erişimi, özellikle yinelemeli algoritmalarda önemli bir darboğazdır. Spark ise çalışma verilerini RAM üzerinde saklayabilir ve aynı veri tekrar kullanılacaksa <code class="language-plaintext highlighter-rouge">cache()</code> veya <code class="language-plaintext highlighter-rouge">persist()</code> ile bellekte tutabilir.</p>

<p>Basitleştirilmiş toplam çalışma süresini şöyle düşünebiliriz:</p>

\[T_{toplam} = T_{okuma} + T_{hesaplama} + T_{iletisim} + T_{yazma}\]

<p>Spark, özellikle $T_{okuma}$ ve $T_{yazma}$ bileşenlerini azaltmaya çalışır. Ancak “Spark her şeyi RAM’de yapar” demek doğru değildir. Bellek yetersiz kalırsa bazı bölümler diske taşabilir; ayrıca shuffle sırasında ağ ve disk kullanılabilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Geleneksel MapReduce</th>
      <th>Apache Spark</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ara sonuçlar</td>
      <td>Genellikle diske yazılır</td>
      <td>Bellekte tutulabilir</td>
    </tr>
    <tr>
      <td>Yinelemeli işler</td>
      <td>Daha yavaş</td>
      <td>Cache sayesinde hızlı</td>
    </tr>
    <tr>
      <td>İşlem modeli</td>
      <td>Map ve Reduce aşamaları</td>
      <td>DAG tabanlı esnek aşamalar</td>
    </tr>
    <tr>
      <td>Gerçek zamanlı kullanım</td>
      <td>Sınırlı</td>
      <td>Structured Streaming desteği</td>
    </tr>
    <tr>
      <td>API seçenekleri</td>
      <td>Daha düşük seviyeli</td>
      <td>Python, Scala, Java ve R</td>
    </tr>
  </tbody>
</table>

<h2 id="dağıtık-işlem-mantığı">Dağıtık işlem mantığı</h2>

<p>Spark uygulamasında <strong>driver</strong>, yapılacak işi planlar; <strong>executor</strong> süreçleri ise verinin parçaları üzerinde hesaplama yapar. Veri, partition adı verilen bölümlere ayrılır. Her partition farklı bir executor tarafından işlenebildiği için paralellik elde edilir.</p>

<p>Teorik olarak $N$ kayıt, eşit güçte $P$ işlemciye kusursuz biçimde dağıtılırsa işlem yükü yaklaşık olarak şöyledir:</p>

\[W_{birim} \approx \frac{N}{P}\]

<p>Gerçekte ağ iletişimi, görev planlama ve dengesiz partition dağılımı nedeniyle doğrusal hızlanma her zaman mümkün değildir. Örneğin kayıtların büyük kısmı tek bir anahtara aitse <strong>data skew</strong> oluşur ve bir executor diğerleri kahvesini bitirmişken hâlâ çalışıyor olabilir.</p>

<h2 id="pyspark-ile-mapreduce-benzeri-analiz">PySpark ile MapReduce benzeri analiz</h2>

<p>Aşağıdaki örnek, bir metindeki kelimeleri sayar. <code class="language-plaintext highlighter-rouge">flatMap</code> satırları kelimelere ayırır, <code class="language-plaintext highlighter-rouge">map</code> her kelimeyi <code class="language-plaintext highlighter-rouge">(kelime, 1)</code> çiftine dönüştürür ve <code class="language-plaintext highlighter-rouge">reduceByKey</code> aynı kelimelerin sayılarını toplar.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">pyspark.sql</span> <span class="kn">import</span> <span class="n">SparkSession</span>

<span class="n">spark</span> <span class="o">=</span> <span class="n">SparkSession</span><span class="p">.</span><span class="n">builder</span> \
    <span class="p">.</span><span class="nf">appName</span><span class="p">(</span><span class="sh">"</span><span class="s">KelimeSayaci</span><span class="sh">"</span><span class="p">)</span> \
    <span class="p">.</span><span class="nf">getOrCreate</span><span class="p">()</span>

<span class="n">satirlar</span> <span class="o">=</span> <span class="n">spark</span><span class="p">.</span><span class="n">sparkContext</span><span class="p">.</span><span class="nf">textFile</span><span class="p">(</span><span class="sh">"</span><span class="s">veri/metinler.txt</span><span class="sh">"</span><span class="p">)</span>

<span class="n">sonuclar</span> <span class="o">=</span> <span class="p">(</span>
    <span class="n">satirlar</span>
    <span class="p">.</span><span class="nf">flatMap</span><span class="p">(</span><span class="k">lambda</span> <span class="n">satir</span><span class="p">:</span> <span class="n">satir</span><span class="p">.</span><span class="nf">lower</span><span class="p">().</span><span class="nf">split</span><span class="p">())</span>
    <span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">kelime</span><span class="p">:</span> <span class="p">(</span><span class="n">kelime</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
    <span class="p">.</span><span class="nf">reduceByKey</span><span class="p">(</span><span class="k">lambda</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">)</span>
<span class="p">)</span>

<span class="k">for</span> <span class="n">kelime</span><span class="p">,</span> <span class="n">adet</span> <span class="ow">in</span> <span class="n">sonuclar</span><span class="p">.</span><span class="nf">take</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">kelime</span><span class="p">,</span> <span class="n">adet</span><span class="p">)</span>

<span class="n">spark</span><span class="p">.</span><span class="nf">stop</span><span class="p">()</span>
</code></pre></div></div>

<p>Buradaki dönüşümler hemen çalışmaz. Spark, <strong>lazy evaluation</strong> yaklaşımıyla işlemleri bir DAG üzerinde biriktirir. <code class="language-plaintext highlighter-rouge">take(10)</code> gibi bir action çağrıldığında plan optimize edilir ve görevler executorlara gönderilir. Bu sayede gereksiz hesaplamalar azaltılabilir.</p>

<h2 id="rdd-mi-dataframe-mi">RDD mi, DataFrame mi?</h2>

<table>
  <thead>
    <tr>
      <th>Yapı</th>
      <th>Avantajı</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>RDD</td>
      <td>Düşük seviyeli kontrol</td>
      <td>Özel veri dönüşümleri</td>
    </tr>
    <tr>
      <td>DataFrame</td>
      <td>Catalyst optimizasyonu</td>
      <td>Analiz ve ETL süreçleri</td>
    </tr>
    <tr>
      <td>Dataset</td>
      <td>Tip güvenliği</td>
      <td>Scala ve Java uygulamaları</td>
    </tr>
  </tbody>
</table>

<p>Modern projelerde çoğunlukla DataFrame API tercih edilir. Çünkü Spark’ın Catalyst optimizer bileşeni sorgu planını inceleyerek filtreleri erkene alma ve gereksiz sütunları okumama gibi iyileştirmeler yapabilir.</p>

<p>Spark sihirli bir hızlandırma düğmesi değildir; doğru partition sayısı, uygun cache kullanımı ve shuffle maliyetlerinin izlenmesi gerekir. Yine de büyük veri setlerinde tekrarlı analiz, makine öğrenmesi, ETL ve akış işleme ihtiyaçları söz konusu olduğunda bellek içi yaklaşımı, klasik disk merkezli modellere karşı son derece güçlü bir avantaj sağlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Apache Spark" /><category term="Büyük Veri" /><category term="PySpark" /><summary type="html"><![CDATA[Devasa bir veri setini tek bilgisayarda işlemeye çalışmak, taşınma günü bütün kolileri küçük bir otomobile doldurmaya benzer: Bir noktadan sonra ne bagaj kapanır ne de süreç ilerler. Apache Spark, verileri kümeye dağıtarak ve ara sonuçları mümkün olduğunca bellekte tutarak bu sorunu çözer. Böylece haritalama, filtreleme ve indirgeme gibi işlemler, her aşamada diske yazma zorunluluğuna takılmadan çok daha hızlı gerçekleştirilebilir.]]></summary></entry><entry><title type="html">Büyük Verinin Temelleri: 3V Kuralıyla Verinin Yeni Dünyası</title><link href="https://sonsuzus.github.io/posts/buyuk-verinin-temelleri-3v-kuraliyla-verinin-yeni-dunyasi/" rel="alternate" type="text/html" title="Büyük Verinin Temelleri: 3V Kuralıyla Verinin Yeni Dünyası" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/buyuk-verinin-temelleri-3v-kuraliyla-verinin-yeni-dunyasi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/buyuk-verinin-temelleri-3v-kuraliyla-verinin-yeni-dunyasi/"><![CDATA[<p>Bir e-ticaret sitesindeki tıklamalar, akıllı saatlerin ölçtüğü nabız değerleri, sosyal medya paylaşımları ve fabrikalardaki sensör kayıtları… Modern dünyada veri yalnızca çoğalmıyor; hızlanıyor ve biçim değiştiriyor. <strong>Büyük Veri (Big Data)</strong>, tek başına “çok fazla veri” anlamına gelmez. Geleneksel sistemlerin makul süre ve maliyetle saklamakta, işleyip analiz etmekte zorlandığı veri kümelerini ve bu sorunu çözmek için geliştirilen yöntemleri ifade eder.
``</p>
<h2 id="büyük-veri-neden-büyüktür">Büyük Veri Neden “Büyük”tür?</h2>

<p>Bir veri kümesinin büyüklüğü mutlak değildir. Dün büyük sayılan birkaç terabayt, bugün sıradan bir şirketin günlük üretimi olabilir. Bu nedenle Büyük Veri’yi yalnızca gigabayt veya petabayt üzerinden tanımlamak yanıltıcıdır. Asıl soru şudur: <strong>Mevcut altyapı, veriyi kabul edilebilir sürede ve maliyetle işleyebiliyor mu?</strong></p>

<p>Basitleştirilmiş biçimde işleme süresini şöyle düşünebiliriz:</p>

\[T \approx \frac{D}{R \times N} + O\]

<p>Burada $D$ veri miktarını, $R$ tek bir düğümün işleme hızını, $N$ paralel çalışan düğüm sayısını, $O$ ise ağ iletişimi ve koordinasyon maliyetini temsil eder. Daha fazla makine eklemek teoride süreyi azaltır; ancak dağıtık sistemlerde koordinasyon bedeli nedeniyle kazanç doğrusal değildir.</p>

<h2 id="3v-kuralı">3V Kuralı</h2>

<p>Büyük Verinin doğasını açıklayan klasik model üç temel özelliğe dayanır: <strong>Volume, Velocity ve Variety</strong>.</p>

<table>
  <thead>
    <tr>
      <th>Boyut</th>
      <th>Temel soru</th>
      <th>Örnek</th>
      <th>Oluşturduğu ihtiyaç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Volume</td>
      <td>Ne kadar veri var?</td>
      <td>Milyarlarca işlem kaydı</td>
      <td>Dağıtık depolama ve paralel hesaplama</td>
    </tr>
    <tr>
      <td>Velocity</td>
      <td>Veri ne hızla geliyor?</td>
      <td>Canlı ödeme hareketleri</td>
      <td>Akış işleme ve düşük gecikme</td>
    </tr>
    <tr>
      <td>Variety</td>
      <td>Veri hangi biçimlerde?</td>
      <td>JSON, video, tablo, metin</td>
      <td>Esnek şema ve farklı veri modelleri</td>
    </tr>
  </tbody>
</table>

<h3 id="volume-hacim">Volume: Hacim</h3>

<p>Hacim, tek bir sunucunun disk ve işlem kapasitesini aşan veri miktarıdır. Geleneksel yaklaşım daha güçlü bir makine satın almak, yani <strong>dikey ölçekleme</strong> yapmaktır. Büyük Veri sistemleri ise çoğunlukla yeni makineler ekleyerek <strong>yatay ölçekleme</strong> uygular. Veriler parçalara ayrılır, farklı düğümlerde saklanır ve hata ihtimaline karşı çoğaltılır.</p>

<h3 id="velocity-hız">Velocity: Hız</h3>

<p>Bazı verilerin değeri zamanla hızla azalır. Bir kredi kartı dolandırıcılığını ertesi gün bulmak faydalıdır; işlemi gerçekleşirken yakalamak ise çok daha değerlidir. Bu nedenle toplu işleme yerine Kafka veya Pulsar gibi mesajlaşma altyapılarıyla beslenen gerçek zamanlı veri akışları kullanılır.</p>

<p>Saniyede gelen olay sayısı $\lambda$, sistemin işleyebildiği olay sayısı $\mu$ ise sürdürülebilir bir akış için genel beklenti şöyledir:</p>

\[\lambda &lt; \mu\]

<p>Aksi durumda kuyruk sürekli büyür; gecikme artar ve sistem sonunda nefessiz kalır.</p>

<h3 id="variety-çeşitlilik">Variety: Çeşitlilik</h3>

<p>İlişkisel veritabanları düzenli satır ve sütunları sever. Oysa gerçek dünya CSV dosyaları, iç içe JSON belgeleri, fotoğraflar, loglar ve ses kayıtları üretir. Bu çeşitlilik; belge veritabanları, nesne depoları ve veri gölleri gibi esnek çözümleri gerekli kılar.</p>

<p>Aşağıdaki Python örneği, farklı yapıdaki olayları ortak bir işleme adımında normalize eder:</p>

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

<span class="k">def</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">user_id</span><span class="sh">"</span><span class="p">:</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">user_id</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">anonymous</span><span class="sh">"</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">event_type</span><span class="sh">"</span><span class="p">:</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">unknown</span><span class="sh">"</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">timestamp</span><span class="sh">"</span><span class="p">:</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">timestamp</span><span class="sh">"</span><span class="p">,</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">().</span><span class="nf">isoformat</span><span class="p">()),</span>
        <span class="sh">"</span><span class="s">payload</span><span class="sh">"</span><span class="p">:</span> <span class="n">event</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">payload</span><span class="sh">"</span><span class="p">,</span> <span class="p">{})</span>
    <span class="p">}</span>
</code></pre></div></div>

<p>Bu fonksiyon eksik alanlara varsayılan değerler atar ve değişken kaynaklardan gelen kayıtları ortak bir biçime yaklaştırır. Gerçek sistemlerde buna doğrulama, şema sürümleme ve hatalı kayıt yönetimi de eklenir.</p>

<h2 id="geleneksel-sistemden-yeni-nesil-mimariye">Geleneksel Sistemden Yeni Nesil Mimariye</h2>

<table>
  <thead>
    <tr>
      <th>Geleneksel yaklaşım</th>
      <th>Büyük Veri yaklaşımı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tek ve güçlü sunucu</td>
      <td>Dağıtık makine kümesi</td>
    </tr>
    <tr>
      <td>Önceden tanımlı katı şema</td>
      <td>Gerektiğinde yorumlanan esnek şema</td>
    </tr>
    <tr>
      <td>Periyodik toplu sorgular</td>
      <td>Toplu ve gerçek zamanlı işleme</td>
    </tr>
    <tr>
      <td>Merkezi hata noktası</td>
      <td>Çoğaltma ve hata toleransı</td>
    </tr>
  </tbody>
</table>

<p>Hadoop, Spark, Kafka ve NoSQL sistemleri birer moda sözcük değil; 3V’nin oluşturduğu teknik baskılara verilmiş farklı cevaplardır. Bununla birlikte her proje Büyük Veri projesi değildir. Küçük bir veri kümesini karmaşık kümelerde çalıştırmak, roketle markete gitmeye benzer. Doğru yaklaşım; hacmi, gecikme beklentisini, veri biçimlerini ve maliyeti ölçerek en sade yeterli mimariyi seçmektir. Büyük Verinin özü teknoloji yığını değil, verinin doğasına uygun ölçeklenebilir düşünme biçimidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Büyük Veri" /><category term="3V Kuralı" /><category term="Veri Mühendisliği" /><summary type="html"><![CDATA[Bir e-ticaret sitesindeki tıklamalar, akıllı saatlerin ölçtüğü nabız değerleri, sosyal medya paylaşımları ve fabrikalardaki sensör kayıtları… Modern dünyada veri yalnızca çoğalmıyor; hızlanıyor ve biçim değiştiriyor. Büyük Veri (Big Data), tek başına “çok fazla veri” anlamına gelmez. Geleneksel sistemlerin makul süre ve maliyetle saklamakta, işleyip analiz etmekte zorlandığı veri kümelerini ve bu sorunu çözmek için geliştirilen yöntemleri ifade eder.]]></summary></entry><entry><title type="html">Dağıtık Ekiplerde Ortak Bir “Şimdi” Nasıl Yaratılır?</title><link href="https://sonsuzus.github.io/posts/dagitik-ekiplerde-ortak-bir-simdi-nasil-yaratilir/" rel="alternate" type="text/html" title="Dağıtık Ekiplerde Ortak Bir “Şimdi” Nasıl Yaratılır?" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/dagitik-ekiplerde-ortak-bir-simdi-nasil-yaratilir</id><content type="html" xml:base="https://sonsuzus.github.io/posts/dagitik-ekiplerde-ortak-bir-simdi-nasil-yaratilir/"><![CDATA[<p>Uzaktan çalışma ofisi ortadan kaldırırken zamanı da görünmez biçimde yeniden tasarladı. İstanbul’daki bir geliştirici güne başlarken San Francisco’daki ekip arkadaşı uyuyor, Tokyo’daki tasarımcı ise bilgisayarını kapatıyor olabilir. Böyle bir ekipte “hemen konuşalım” masum bir öneri değil, coğrafi bir ayrıcalıktır. Ortak bir “şimdi” yaratmak, herkesi aynı anda çevrim içi tutmak değil; eşzamanlı ve eşzamansız çalışmayı bilinçli biçimde dengelemektir.
``</p>

<h2 id="saat-aynı-deneyim-farklı">Saat aynı, deneyim farklı</h2>

<p>Saat dilimleri teknik olarak UTC’ye göre tanımlanan ofsetlerdir. Bir kişinin yerel zamanı basitçe şöyle gösterilebilir:</p>

\[T_{yerel} = T_{UTC} + O\]

<p>Burada $O$, saat dilimi ofsetidir. Ancak insan deneyimi bu formülden daha karmaşıktır. Saat 09.00’da yapılan bir toplantı bir çalışan için kahveyle başlayan sakin bir sabah, diğeri için aile yemeğinin ortası olabilir. Üstelik yaz saati uygulamaları nedeniyle ofsetler yıl boyunca sabit kalmayabilir.</p>

<p>Dağıtık ekiplerde zamanın üç farklı biçimi vardır:</p>

<table>
  <thead>
    <tr>
      <th>Zaman biçimi</th>
      <th>Anlamı</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kronolojik zaman</td>
      <td>Takvim ve saatle ölçülen zaman</td>
      <td>Sprint pazartesi başlar</td>
    </tr>
    <tr>
      <td>Biyolojik zaman</td>
      <td>Bedenin uyku ve enerji ritmi</td>
      <td>Gece toplantısında odak düşer</td>
    </tr>
    <tr>
      <td>Sosyal zaman</td>
      <td>Aile ve toplum düzeni</td>
      <td>Akşam yemeği, okul çıkışı</td>
    </tr>
  </tbody>
</table>

<p>İyi bir çalışma düzeni yalnızca kronolojik zamanı optimize etmez; diğer iki katmanı da hesaba katar.</p>

<h2 id="eşzamanlılık-bir-spektrumdur">Eşzamanlılık bir spektrumdur</h2>

<p>Ofis kültürü çoğu zaman üretkenliği aynı anda bulunmakla eşleştirir. Oysa yazılım ekiplerinde işlerin önemli bir bölümü eşzamansız yürütülebilir. Kod incelemesi, teknik karar kaydı ve durum güncellemesi için herkesin aynı görüntülü görüşmede bulunması gerekmez.</p>

<table>
  <thead>
    <tr>
      <th>Eşzamanlı çalışma</th>
      <th>Eşzamansız çalışma</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hızlı geri bildirim sağlar</td>
      <td>Derin çalışmayı destekler</td>
    </tr>
    <tr>
      <td>Belirsiz konuları çözmekte etkilidir</td>
      <td>Saat dilimlerinden bağımsızdır</td>
    </tr>
    <tr>
      <td>Toplantı yorgunluğu yaratabilir</td>
      <td>Yanıt gecikmesi oluşturabilir</td>
    </tr>
    <tr>
      <td>Beyin fırtınasına uygundur</td>
      <td>Kalıcı ve aranabilir kayıt üretir</td>
    </tr>
  </tbody>
</table>

<p>Buradaki amaç yöntemlerden birini seçmek değil, iletişimin gecikme maliyetine göre seçim yapmaktır. Bir mesajın bekleme süresi $L$, ekip üyeleri arasındaki saat farkı $D$ ve günlük ortak çalışma penceresi $W$ ile ilişkili düşünülebilir:</p>

\[L \approx \max(0, D - W)\]

<p>Ortak pencere küçüldükçe soruların bir sonraki güne taşınma ihtimali artar. Bu nedenle iyi yazılmış bir mesaj; bağlamı, beklenen çıktıyı ve son tarihi birlikte içermelidir.</p>

<h2 id="ortak-pencereyi-adil-biçimde-bulmak">Ortak pencereyi adil biçimde bulmak</h2>

<p>Aşağıdaki Python örneği, ekip üyelerinin UTC cinsinden çalışma aralıklarının kesişimini hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Tuple</span>

<span class="k">def</span> <span class="nf">ortak_pencere</span><span class="p">(</span><span class="n">araliklar</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">|</span> <span class="bp">None</span><span class="p">:</span>
    <span class="n">baslangic</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">aralik</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">aralik</span> <span class="ow">in</span> <span class="n">araliklar</span><span class="p">)</span>
    <span class="n">bitis</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="n">aralik</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">aralik</span> <span class="ow">in</span> <span class="n">araliklar</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">baslangic</span> <span class="o">&gt;=</span> <span class="n">bitis</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span>
    <span class="k">return</span> <span class="n">baslangic</span><span class="p">,</span> <span class="n">bitis</span>

<span class="n">calisma_saatleri</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">14</span><span class="p">),</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">16</span><span class="p">),</span> <span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">20</span><span class="p">)]</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">ortak_pencere</span><span class="p">(</span><span class="n">calisma_saatleri</span><span class="p">))</span>  <span class="c1"># (12, 14)
</span></code></pre></div></div>

<p>Fonksiyon en geç başlangıç ile en erken bitişi karşılaştırır. Sonuç <code class="language-plaintext highlighter-rouge">(12, 14)</code> ise ekip UTC 12.00–14.00 arasında buluşabilir. Ancak matematiksel kesişim otomatik olarak adalet anlamına gelmez. Sürekli aynı kişinin sabahın köründe toplantıya katılması, zaman yükünü görünmez biçimde ona aktarır. Kritik toplantı saatlerini dönüşümlü planlamak daha adildir.</p>

<h2 id="şimdiyi-bir-protokole-dönüştürmek">“Şimdi”yi bir protokole dönüştürmek</h2>

<p>Sağlıklı bir dağıtık ekip şu pratikleri benimseyebilir:</p>

<ul>
  <li>Tarih ve saatleri yerel kısaltmalar yerine UTC ile belirtmek.</li>
  <li>Kararları toplantı sonrasında yazılı olarak kaydetmek.</li>
  <li>Mesajlarda “acil”, “bugün” ve “bu hafta” seviyelerini ayırmak.</li>
  <li>Çevrim içi durumunu anında yanıt zorunluluğu saymamak.</li>
  <li>Ortak saatleri kararlar için, bireysel saatleri üretim için korumak.</li>
  <li>Toplantı yükünü ve uygunsuz saatleri ekip içinde dönüşümlü dağıtmak.</li>
</ul>

<p>Sonuçta ortak bir “şimdi”, duvardaki saatlerin eşitlenmesi değildir. Ekibin ne zaman birlikte düşünmesi, ne zaman bağımsız ilerlemesi ve ne kadar gecikmeyi kabul etmesi gerektiğine dair paylaşılan bir protokoldür. Dağıtık ekipler zamanı yönetmekten çok, zaman hakkında güven inşa eder. İyi tasarlanmış bir düzende iş güneşi takip eder; çalışanlar ise onu kovalamak zorunda kalmaz.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="uzaktan çalışma" /><category term="dağıtık ekipler" /><category term="saat dilimleri" /><summary type="html"><![CDATA[Uzaktan çalışma ofisi ortadan kaldırırken zamanı da görünmez biçimde yeniden tasarladı. İstanbul’daki bir geliştirici güne başlarken San Francisco’daki ekip arkadaşı uyuyor, Tokyo’daki tasarımcı ise bilgisayarını kapatıyor olabilir. Böyle bir ekipte “hemen konuşalım” masum bir öneri değil, coğrafi bir ayrıcalıktır. Ortak bir “şimdi” yaratmak, herkesi aynı anda çevrim içi tutmak değil; eşzamanlı ve eşzamansız çalışmayı bilinçli biçimde dengelemektir.]]></summary></entry><entry><title type="html">ETL Süreçleriyle Ham Veriden Güvenilir Veri Boru Hatlarına</title><link href="https://sonsuzus.github.io/posts/etl-surecleriyle-ham-veriden-guvenilir-veri-boru-hatlarina/" rel="alternate" type="text/html" title="ETL Süreçleriyle Ham Veriden Güvenilir Veri Boru Hatlarına" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/etl-surecleriyle-ham-veriden-guvenilir-veri-boru-hatlarina</id><content type="html" xml:base="https://sonsuzus.github.io/posts/etl-surecleriyle-ham-veriden-guvenilir-veri-boru-hatlarina/"><![CDATA[<p>Bir e-ticaret şirketinde siparişler PostgreSQL’de, reklam verileri bir API’de, müşteri yorumları JSON dosyalarında tutulabilir. Analiz ekibinin bütün bunları tek tek toplaması hem zaman kaybettirir hem de hata üretir. ETL süreçleri, dağınık ham veriyi otomatik biçimde çekip temizleyerek analiz edilmeye hazır, güvenilir bir veri kaynağına dönüştürür.</p>

<p>``</p>

<h2 id="etl-nedir">ETL nedir?</h2>

<p>ETL; <strong>Extract, Transform, Load</strong> kelimelerinin baş harflerinden oluşur. Bir veri boru hattı ise verinin kaynaktan hedefe düzenli, izlenebilir ve mümkünse hatalara dayanıklı biçimde akmasını sağlayan daha geniş otomasyon sistemidir.</p>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Temel soru</th>
      <th>Örnek işlem</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Extract</td>
      <td>Veri nereden alınacak?</td>
      <td>API, veritabanı veya CSV okuma</td>
    </tr>
    <tr>
      <td>Transform</td>
      <td>Veri nasıl kullanılabilir hâle gelecek?</td>
      <td>Temizleme, birleştirme, doğrulama</td>
    </tr>
    <tr>
      <td>Load</td>
      <td>Veri nereye yazılacak?</td>
      <td>Veri ambarına veya data lake’e yükleme</td>
    </tr>
  </tbody>
</table>

<h3 id="1-extract-veriyi-kaynağından-çekmek">1. Extract: Veriyi kaynağından çekmek</h3>

<p>Çıkarma aşamasında ilişkisel veritabanları, uygulama günlükleri, sensörler, bulut depoları ve harici API’ler gibi farklı kaynaklara bağlanılır. Buradaki önemli karar, verinin tamamının mı yoksa yalnızca değişen bölümünün mü alınacağıdır.</p>

<p>Tam yükte her çalıştırmada $N$ kayıt okunur. Artımlı yükte yalnızca değişen $\Delta N$ kayıt işlenir. Genellikle $\Delta N \ll N$ olduğundan artımlı yaklaşım ağ ve işlem maliyetini ciddi ölçüde azaltır. Bunun için zaman damgası, artan kimlik veya CDC (Change Data Capture) kullanılabilir.</p>

<h3 id="2-transform-ham-veriyi-anlamlı-hâle-getirmek">2. Transform: Ham veriyi anlamlı hâle getirmek</h3>

<p>Dönüştürme, ETL’in mutfağıdır. Eksik alanlar ele alınır, tarih biçimleri standartlaştırılır, tekrar eden kayıtlar silinir ve iş kuralları uygulanır. Örneğin toplam sipariş geliri şu şekilde hesaplanabilir:</p>

\[Gelir = \sum_{i=1}^{n} adet_i \times birim\_fiyat_i\]

<p>Ancak matematik doğru olsa bile para birimleri farklıysa sonuç yanıltıcıdır. Bu nedenle dönüşüm yalnızca kod yazmak değil, verinin iş bağlamını anlamaktır.</p>

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

<span class="k">def</span> <span class="nf">transform_orders</span><span class="p">(</span><span class="n">df</span><span class="p">:</span> <span class="n">pd</span><span class="p">.</span><span class="n">DataFrame</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">pd</span><span class="p">.</span><span class="n">DataFrame</span><span class="p">:</span>
    <span class="c1"># Kimliği olmayan kayıtlar güvenilir biçimde eşleştirilemez.
</span>    <span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">dropna</span><span class="p">(</span><span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">order_id</span><span class="sh">"</span><span class="p">])</span>
    <span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">drop_duplicates</span><span class="p">(</span><span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">order_id</span><span class="sh">"</span><span class="p">])</span>

    <span class="c1"># Farklı tarih gösterimlerini ortak tipe dönüştürür.
</span>    <span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">order_date</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">to_datetime</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">order_date</span><span class="sh">"</span><span class="p">],</span> <span class="n">errors</span><span class="o">=</span><span class="sh">"</span><span class="s">coerce</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">total_amount</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">quantity</span><span class="sh">"</span><span class="p">]</span> <span class="o">*</span> <span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">unit_price</span><span class="sh">"</span><span class="p">]</span>

    <span class="c1"># Geçersiz veya negatif tutarları dışarıda bırakır.
</span>    <span class="k">return</span> <span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="sh">"</span><span class="s">total_amount</span><span class="sh">"</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">]</span>
</code></pre></div></div>

<p>Bu fonksiyon temel temizlik, tip dönüşümü ve gelir hesaplamasını tek adımda gerçekleştirir. Gerçek sistemlerde kurallar testlerle desteklenmelidir.</p>

<h3 id="3-load-sonucu-hedefe-taşımak">3. Load: Sonucu hedefe taşımak</h3>

<p>Temizlenen veri; Snowflake, BigQuery, Redshift gibi veri ambarlarına veya bir data lake’e yüklenebilir. Yükleme tam yenileme, ekleme ya da <strong>upsert</strong> yöntemiyle yapılabilir. Upsert, mevcut kaydı günceller; yoksa yeni kayıt ekler.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Batch</td>
      <td>Basit ve ekonomik</td>
      <td>Veri gecikmeli gelir</td>
    </tr>
    <tr>
      <td>Streaming</td>
      <td>Düşük gecikme</td>
      <td>İşletmesi daha karmaşıktır</td>
    </tr>
    <tr>
      <td>ETL</td>
      <td>Hedefe temiz veri gider</td>
      <td>Dönüşüm altyapısı gerekir</td>
    </tr>
    <tr>
      <td>ELT</td>
      <td>Ham veri korunur, esnektir</td>
      <td>Güçlü hedef sistem ister</td>
    </tr>
  </tbody>
</table>

<h2 id="sağlam-bir-pipeline-nasıl-tasarlanır">Sağlam bir pipeline nasıl tasarlanır?</h2>

<p>İyi bir veri boru hattı yalnızca başarılı durumda çalışmamalıdır. Aynı işlem tekrar çalıştırıldığında sonucu bozmayan <strong>idempotent</strong> adımlar tasarlanmalı; başarısız kayıtlar ayrı bir hata kuyruğuna gönderilmelidir. Loglama, veri kalite kontrolleri, şema doğrulama ve uyarılar da sistemin vazgeçilmez parçalarıdır.</p>

<p>Airflow, Dagster veya Prefect görevlerin sırasını ve zamanlamasını yönetebilir. Kafka gerçek zamanlı veri akışında, dbt ise SQL tabanlı dönüşümlerde öne çıkar. Araç seçiminden önce veri hacmi, gecikme beklentisi, maliyet ve ekip deneyimi değerlendirilmelidir.</p>

<p>Sonuç olarak ETL, veriyi A noktasından B noktasına taşıyan basit bir kargo hizmeti değildir. Kaynakları uzlaştıran, kaliteyi koruyan ve analitik kararların güvenilir temelini oluşturan otomatik bir üretim hattıdır. Boru hattı görünmez çalıştığında herkes mutludur; durduğunda ise neden veri mühendislerine ihtiyaç duyulduğu hemen anlaşılır!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ETL" /><category term="veri mühendisliği" /><category term="data pipeline" /><summary type="html"><![CDATA[Bir e-ticaret şirketinde siparişler PostgreSQL’de, reklam verileri bir API’de, müşteri yorumları JSON dosyalarında tutulabilir. Analiz ekibinin bütün bunları tek tek toplaması hem zaman kaybettirir hem de hata üretir. ETL süreçleri, dağınık ham veriyi otomatik biçimde çekip temizleyerek analiz edilmeye hazır, güvenilir bir veri kaynağına dönüştürür.]]></summary></entry><entry><title type="html">Gerçek Zamanlı Veri Akışı ve Apache Kafka ile Kayıpsız İşleme</title><link href="https://sonsuzus.github.io/posts/gercek-zamanli-veri-akisi-ve-apache-kafka-ile-kayipsiz-isleme/" rel="alternate" type="text/html" title="Gerçek Zamanlı Veri Akışı ve Apache Kafka ile Kayıpsız İşleme" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/gercek-zamanli-veri-akisi-ve-apache-kafka-ile-kayipsiz-isleme</id><content type="html" xml:base="https://sonsuzus.github.io/posts/gercek-zamanli-veri-akisi-ve-apache-kafka-ile-kayipsiz-isleme/"><![CDATA[<p>Bir web sitesindeki tıklamalar, sunucu logları veya fabrikadaki sıcaklık sensörleri kimsenin “Kaydet” düğmesine basmasını beklemez. Veriler saniyede yüzlerce, hatta milyonlarca olay hâlinde kesintisiz akar. Gerçek zamanlı veri akışı, bu olayları oluştukları anda yakalayıp güvenilir biçimde taşıma ve gecikmeyi mümkün olduğunca düşük tutarak işleme yaklaşımıdır. Apache Kafka ise bu yoğun veri trafiğinin ortasında çalışan dayanıklı bir dijital konveyör bandı gibidir.</p>

<p>``</p>

<h2 id="streaming-neden-farklıdır">Streaming neden farklıdır?</h2>

<p>Geleneksel toplu işlemede veriler önce biriktirilir, ardından belirli aralıklarla işlenir. Streaming sistemlerinde ise teorik olarak sonu bulunmayan bir olay dizisi vardır:</p>

\[S = \{e_1, e_2, e_3, \ldots\}\]

<p>Her olayın bir değeri, zaman damgası ve çoğunlukla anahtarı bulunur. Sistem, olayları bekletmeden işlerken ani trafik artışlarına da dayanmalıdır. Üretim hızı $P$, tüketim hızı $C$ ile gösterilirse sürdürülebilir çalışma için genel beklenti şudur:</p>

\[C \geq P\]

<p>Eğer $P &gt; C$ olursa olaylar hemen kaybolmak zorunda değildir; Kafka bunları diskte tutar. Ancak tüketicinin geride kaldığı miktar, yani <strong>consumer lag</strong>, büyür. Bu tamponlama yeteneği üreticilerle tüketicilerin birbirinden bağımsız ölçeklenmesini sağlar.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Batch işleme</th>
      <th>Streaming işleme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Veri yapısı</td>
      <td>Sonlu veri kümesi</td>
      <td>Sürekli olay dizisi</td>
    </tr>
    <tr>
      <td>Gecikme</td>
      <td>Dakika veya saat</td>
      <td>Milisaniye veya saniye</td>
    </tr>
    <tr>
      <td>Kullanım</td>
      <td>Günlük rapor</td>
      <td>Anlık alarm, dolandırıcılık tespiti</td>
    </tr>
    <tr>
      <td>Zorluk</td>
      <td>Büyük hacimli hesaplama</td>
      <td>Sıralama, tekrar ve gecikmiş olaylar</td>
    </tr>
  </tbody>
</table>

<h2 id="kafkanın-temel-parçaları">Kafka’nın temel parçaları</h2>

<p>Kafka’da üreticiler (<strong>producer</strong>) olayları <strong>topic</strong> adı verilen mantıksal kanallara gönderir. Topic’ler ölçeklenebilmek için <strong>partition</strong> bölümlerine ayrılır. Her partition yalnızca sonuna ekleme yapılan sıralı bir kayıttır. Olaylar silinmek yerine yapılandırılmış saklama süresi boyunca diskte korunur.</p>

<p>Bir olayın anahtarı aynı kaldığında genellikle aynı partition seçilir. Böylece örneğin aynı sensöre ait ölçümlerin sırası korunabilir. Fakat Kafka tüm topic genelinde mutlak sıra garantisi vermez; garanti partition düzeyindedir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Görevi</th>
      <th>Benzetme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Producer</td>
      <td>Olay yayımlar</td>
      <td>Kargo gönderen kişi</td>
    </tr>
    <tr>
      <td>Topic</td>
      <td>Olayları sınıflandırır</td>
      <td>Kargo hattı</td>
    </tr>
    <tr>
      <td>Partition</td>
      <td>Paralellik ve sıralama sağlar</td>
      <td>Ayrı taşıma şeridi</td>
    </tr>
    <tr>
      <td>Broker</td>
      <td>Veriyi saklayan Kafka sunucusudur</td>
      <td>Dağıtım merkezi</td>
    </tr>
    <tr>
      <td>Consumer group</td>
      <td>İş yükünü paylaşır</td>
      <td>Teslimat ekibi</td>
    </tr>
    <tr>
      <td>Offset</td>
      <td>Okuma konumunu belirtir</td>
      <td>Kitap ayracı</td>
    </tr>
  </tbody>
</table>

<h2 id="basit-bir-sensör-üreticisi">Basit bir sensör üreticisi</h2>

<p>Aşağıdaki Python kodu, sıcaklık ölçümlerini JSON olarak Kafka’ya yollar. <code class="language-plaintext highlighter-rouge">sensor_id</code> anahtar olarak kullanıldığı için aynı sensörün olayları aynı partition’da sıralanabilir.</p>

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

<span class="n">producer</span> <span class="o">=</span> <span class="nc">KafkaProducer</span><span class="p">(</span>
    <span class="n">bootstrap_servers</span><span class="o">=</span><span class="sh">"</span><span class="s">localhost:9092</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">value_serializer</span><span class="o">=</span><span class="k">lambda</span> <span class="n">value</span><span class="p">:</span> <span class="n">json</span><span class="p">.</span><span class="nf">dumps</span><span class="p">(</span><span class="n">value</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="p">)</span>

<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
    <span class="n">event</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">sensor_id</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">sensor-42</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">temperature</span><span class="sh">"</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="n">random</span><span class="p">.</span><span class="nf">uniform</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">35</span><span class="p">),</span> <span class="mi">2</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">timestamp</span><span class="sh">"</span><span class="p">:</span> <span class="n">time</span><span class="p">.</span><span class="nf">time</span><span class="p">()</span>
    <span class="p">}</span>
    <span class="n">producer</span><span class="p">.</span><span class="nf">send</span><span class="p">(</span>
        <span class="sh">"</span><span class="s">temperature-events</span><span class="sh">"</span><span class="p">,</span>
        <span class="n">key</span><span class="o">=</span><span class="n">event</span><span class="p">[</span><span class="sh">"</span><span class="s">sensor_id</span><span class="sh">"</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">value</span><span class="o">=</span><span class="n">event</span>
    <span class="p">)</span>
    <span class="n">time</span><span class="p">.</span><span class="nf">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">send</code> işlemi asenkrondur; yüksek performans için olaylar paketlenebilir. Kritik sistemlerde <code class="language-plaintext highlighter-rouge">acks="all"</code> kullanmak, lider ve gerekli replikalar doğrulamadan gönderimi başarılı saymamak açısından önemlidir.</p>

<h2 id="kayıpsızlık-gerçekten-ne-demek">Kayıpsızlık gerçekten ne demek?</h2>

<p>Kafka veriyi çoğaltarak broker arızalarına karşı korur, fakat uçtan uca güvenilirlik yalnızca Kafka ayarı değildir. Üretici tekrar denemeleri, <code class="language-plaintext highlighter-rouge">acks</code>, replikasyon faktörü ve tüketicinin offset yönetimi birlikte tasarlanmalıdır.</p>

<ul>
  <li><strong>At-most-once:</strong> Olay en fazla bir kez işlenir; kayıp mümkündür.</li>
  <li><strong>At-least-once:</strong> Kayıp önlenir, fakat tekrar işleme olabilir.</li>
  <li><strong>Exactly-once:</strong> İşlem sonucu mantıksal olarak yalnızca bir kez uygulanır.</li>
</ul>

<p>Pratikte <code class="language-plaintext highlighter-rouge">at-least-once</code> ve <strong>idempotent</strong> tüketiciler güçlü bir çözümdür. Aynı <code class="language-plaintext highlighter-rouge">event_id</code> ikinci kez geldiğinde veritabanı işlemi sonucu değiştirmiyorsa tekrarlar zararsızlaşır. Kafka Transactions ve Kafka Streams ise uygun senaryolarda exactly-once semantiğini destekler.</p>

<p>Sonuç olarak Kafka yalnızca hızlı bir mesaj kuyruğu değil; olayları kalıcı biçimde saklayan, yeniden oynatılabilir ve dağıtık bir olay günlüğüdür. Web loglarından sensör alarmlarına kadar sağlam bir streaming mimarisi; partition planı, lag takibi, replikasyon, şema yönetimi ve idempotent işleme birlikte düşünüldüğünde gerçekten güvenilir hâle gelir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Apache Kafka" /><category term="streaming" /><category term="gerçek zamanlı veri" /><summary type="html"><![CDATA[Bir web sitesindeki tıklamalar, sunucu logları veya fabrikadaki sıcaklık sensörleri kimsenin “Kaydet” düğmesine basmasını beklemez. Veriler saniyede yüzlerce, hatta milyonlarca olay hâlinde kesintisiz akar. Gerçek zamanlı veri akışı, bu olayları oluştukları anda yakalayıp güvenilir biçimde taşıma ve gecikmeyi mümkün olduğunca düşük tutarak işleme yaklaşımıdır. Apache Kafka ise bu yoğun veri trafiğinin ortasında çalışan dayanıklı bir dijital konveyör bandı gibidir.]]></summary></entry><entry><title type="html">Kodlama Yaparken Akış Hali: Programcılar İçin Meditasyonun Bilimsel Karşılığı</title><link href="https://sonsuzus.github.io/posts/kodlama-yaparken-akis-hali-programcilar-icin-meditasyonun-bilimsel-karsiligi/" rel="alternate" type="text/html" title="Kodlama Yaparken Akış Hali: Programcılar İçin Meditasyonun Bilimsel Karşılığı" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kodlama-yaparken-akis-hali-programcilar-icin-meditasyonun-bilimsel-karsiligi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kodlama-yaparken-akis-hali-programcilar-icin-meditasyonun-bilimsel-karsiligi/"><![CDATA[<p>Bazen kod yazarken saatler dakikaya dönüşür; klavye sanki düşüncelerin uzantısı olur ve dış dünya sessize alınır. Psikolog Mihaly Csikszentmihalyi bu yoğun odaklanma, kontrol ve içsel tatmin deneyimini <strong>akış hali</strong> olarak tanımlar. Programcıların sıkça yaşadığı bu durum meditasyona benzese de mistik bir trans değil; dikkat, beceri ve geri bildirim arasındaki ölçülebilir dengenin sonucudur.</p>

<p>``</p>

<h2 id="akış-hali-nasıl-oluşur">Akış hali nasıl oluşur?</h2>

<p>Csikszentmihalyi’ye göre akış, yapılan işin zorluğu ile kişinin becerisi birbirine yaklaştığında ortaya çıkar. Bunu basitçe şöyle gösterebiliriz:</p>

\[F \approx C \approx S\]

<p>Burada $F$ akış olasılığını, $C$ görevin zorluğunu, $S$ ise mevcut beceriyi temsil eder. Zorluk becerinin çok üzerindeyse kaygı; çok altındaysa sıkılma oluşur. Tam sınırdaki görev ise zihne tatlı bir meydan okuma sunar.</p>

<table>
  <thead>
    <tr>
      <th>Görev-beceri ilişkisi</th>
      <th>Zihinsel durum</th>
      <th>Yazılımdan örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$C &gt; S$</td>
      <td>Kaygı</td>
      <td>Yeni başlayan birinin dağıtık sistem tasarlaması</td>
    </tr>
    <tr>
      <td>$C &lt; S$</td>
      <td>Sıkılma</td>
      <td>Deneyimli geliştiricinin sürekli aynı CRUD ekranını yazması</td>
    </tr>
    <tr>
      <td>$C \approx S$</td>
      <td>Akış</td>
      <td>Bilinen araçlarla zorlayıcı bir özelliğin geliştirilmesi</td>
    </tr>
  </tbody>
</table>

<p>Akışın diğer bileşenleri açık hedef, hızlı geri bildirim, dikkatin tek noktada toplanması ve kontrol hissidir. Yazılım geliştirme bunların çoğunu doğal olarak sağlar: Derleyici anında konuşur, testler sonucu bildirir ve çalışan özellik somut ilerleme yaratır.</p>

<h2 id="meditasyonla-ortak-noktası-ne">Meditasyonla ortak noktası ne?</h2>

<p>Meditasyon dikkati şimdiki ana geri getirme pratiğidir. Akışta da geçmişteki hata veya yaklaşan toplantı yerine mevcut problem öne çıkar. Fakat ikisi aynı şey değildir. Meditasyonda kişi dikkatini bilinçli biçimde gözlemlerken akışta dikkat, faaliyetin içine emilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Meditasyon</th>
      <th>Kodlama sırasında akış</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ana hedef</td>
      <td>Farkındalık geliştirmek</td>
      <td>Görevi tamamlamak</td>
    </tr>
    <tr>
      <td>Dikkat nesnesi</td>
      <td>Nefes, beden veya düşünceler</td>
      <td>Kod, model ve problem</td>
    </tr>
    <tr>
      <td>Geri bildirim</td>
      <td>İçsel gözlem</td>
      <td>Test, çıktı ve hata mesajı</td>
    </tr>
    <tr>
      <td>Sonuç</td>
      <td>Sakinlik ve farkındalık</td>
      <td>Üretkenlik ve içsel tatmin</td>
    </tr>
  </tbody>
</table>

<p>Bu nedenle akışı, programcılar için meditasyonun bilimsel karşılığı diye düşünmek faydalı bir benzetmedir; ancak klinik veya nörolojik açıdan birebir eşitlik değildir.</p>

<h2 id="akış-için-çalışma-ortamı-tasarlamak">Akış için çalışma ortamı tasarlamak</h2>

<p>Akış emirle başlamaz, fakat koşulları hazırlanabilir. Öncelikle büyük işi, sonucu görülebilen küçük görevlere bölmek gerekir. Belirsiz bir biçimde uygulamayı geliştir demek yerine giriş doğrulamasını tamamla gibi açık bir hedef seçilmelidir.</p>

<p>İkinci adım geri bildirim döngüsünü kısaltmaktır. Otomatik testler burada zihinsel pusula görevi görür:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">indirimliFiyat</span><span class="p">(</span><span class="nx">fiyat</span><span class="p">,</span> <span class="nx">oran</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">oran</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="nx">oran</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="dl">'</span><span class="s1">Geçersiz oran</span><span class="dl">'</span><span class="p">);</span>
  <span class="k">return</span> <span class="nx">fiyat</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="nx">oran</span><span class="p">);</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">assert</span><span class="p">(</span><span class="nf">indirimliFiyat</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="mf">0.25</span><span class="p">)</span> <span class="o">===</span> <span class="mi">150</span><span class="p">);</span>
</code></pre></div></div>

<p>Bu küçük örnekte fonksiyon tek bir sorumluluk taşır; doğrulama hatalı girdiyi engeller, test ise sonucun doğru olup olmadığını hemen gösterir. Hızlı geri bildirim, zihnin belirsizlik yerine bir sonraki adıma odaklanmasını kolaylaştırır.</p>

<p>Bildirimleri kapatmak da kritiktir. Her kesinti yalnızca birkaç saniye çalmaz; problem modelinin çalışma belleğinde yeniden kurulmasını gerektirir. Bu yüzden 45-90 dakikalık kesintisiz bloklar, açık sekmelerin azaltılması ve telefonun görüş alanından çıkarılması etkili olabilir.</p>

<h2 id="akış-bağımlılık-değil-ritimdir">Akış bağımlılık değil, ritimdir</h2>

<p>Saatlerce ara vermeden kod yazmak her zaman başarı değildir. Açlık, yorgunluk ve ergonomik sorunlar performansı düşürürken kişi hâlâ üretken olduğunu sanabilir. İdeal yaklaşım, yoğun odaklanmayı bilinçli molalarla dengelemektir.</p>

<p>Akışın formülü sihirli kulaklıklar veya sınırsız kahve değildir: net hedef, uygun zorluk, hızlı geri bildirim ve korunmuş dikkattir. Bir sonraki kodlama oturumunda bütün projeyi fethetmeye çalışma; becerini biraz aşan tek bir problem seç, testini çalıştır ve zihnin gürültüden üretken sessizliğe geçmesine izin ver.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="akış hali" /><category term="yazılım geliştirme" /><category term="üretkenlik" /><summary type="html"><![CDATA[Bazen kod yazarken saatler dakikaya dönüşür; klavye sanki düşüncelerin uzantısı olur ve dış dünya sessize alınır. Psikolog Mihaly Csikszentmihalyi bu yoğun odaklanma, kontrol ve içsel tatmin deneyimini akış hali olarak tanımlar. Programcıların sıkça yaşadığı bu durum meditasyona benzese de mistik bir trans değil; dikkat, beceri ve geri bildirim arasındaki ölçülebilir dengenin sonucudur.]]></summary></entry><entry><title type="html">Petabaytları Parçalara Bölmek: HDFS ve Hadoop Mimarisi</title><link href="https://sonsuzus.github.io/posts/petabaytlari-parcalara-bolmek-hdfs-ve-hadoop-mimarisi/" rel="alternate" type="text/html" title="Petabaytları Parçalara Bölmek: HDFS ve Hadoop Mimarisi" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/petabaytlari-parcalara-bolmek-hdfs-ve-hadoop-mimarisi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/petabaytlari-parcalara-bolmek-hdfs-ve-hadoop-mimarisi/"><![CDATA[<p>Bir petabayt veriyi dizüstü bilgisayarınıza kopyalamaya çalıştığınızı düşünün. Diskin itiraz etmesi bir yana, işlem tamamlanmadan bilgisayarınız emekli olabilir! Hadoop Dağıtık Dosya Sistemi, yani HDFS, bu problemi devasa ve pahalı bir sunucu almak yerine veriyi yüzlerce sıradan makineye dağıtarak çözer. Üstelik disk arızalarını istisna değil, sistemin doğal bir parçası kabul eder.
``</p>
<h2 id="hdfs-neden-ortaya-çıktı">HDFS neden ortaya çıktı?</h2>

<p>Geleneksel dosya sistemleri, çoğunlukla tek makinenin disklerini yönetir. Veri büyüklüğü terabaytlardan petabaytlara çıktığında kapasite, aktarım hızı ve hata toleransı ciddi sorunlara dönüşür. HDFS’nin temel düşüncesi basittir: <strong>Veriyi hesaplamaya taşımak yerine hesaplamayı veriye taşı.</strong></p>

<p>Bir dosya küçük bloklara ayrılır ve farklı bilgisayarlarda saklanır. Toplam kullanılabilir kapasite kabaca şöyle düşünülebilir:</p>

\[C_{toplam} = \frac{N \times D}{R}\]

<p>Burada $N$ düğüm sayısını, $D$ her düğümün disk kapasitesini, $R$ ise çoğaltma faktörünü gösterir. Örneğin 100 makinenin her birinde 10 TB alan ve çoğaltma faktörü 3 ise kullanılabilir kapasite yaklaşık $333$ TB olur.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Geleneksel dosya sistemi</th>
      <th>HDFS</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Depolama</td>
      <td>Tek sunucu ağırlıklı</td>
      <td>Çok sayıda düğüme dağıtılmış</td>
    </tr>
    <tr>
      <td>Hata yaklaşımı</td>
      <td>Arıza olağan dışıdır</td>
      <td>Arıza beklenen bir durumdur</td>
    </tr>
    <tr>
      <td>Dosya tipi</td>
      <td>Küçük ve büyük dosyalar</td>
      <td>Büyük dosyalar için ideal</td>
    </tr>
    <tr>
      <td>Erişim modeli</td>
      <td>Düşük gecikme</td>
      <td>Yüksek aktarım kapasitesi</td>
    </tr>
    <tr>
      <td>Ölçekleme</td>
      <td>Daha güçlü sunucu</td>
      <td>Daha fazla sıradan sunucu</td>
    </tr>
  </tbody>
</table>

<h2 id="namenode-ve-datanode-rolleri">NameNode ve DataNode rolleri</h2>

<p>HDFS mimarisinin koordinatörü <strong>NameNode</strong>‘dur. Dosya adlarını, klasörleri, izinleri ve hangi bloğun hangi makinede bulunduğunu takip eder. Ancak gerçek dosya içeriğini saklamaz. Onu, işçiler gibi çalışan <strong>DataNode</strong> düğümleri depolar.</p>

<p>Bir istemci dosya okumak istediğinde önce NameNode’a başvurur. NameNode uygun DataNode adreslerini bildirir; veri daha sonra doğrudan DataNode’lardan alınır. Böylece NameNode, bütün verinin içinden geçtiği bir darboğaza dönüşmez.</p>

<p>DataNode’lar düzenli olarak <strong>heartbeat</strong> mesajları göndererek hayatta olduklarını bildirir. Bir düğüm uzun süre sessiz kalırsa NameNode onu arızalı sayar ve eksilen kopyaların başka düğümlerde oluşturulmasını ister.</p>

<h2 id="bloklar-ve-çoğaltma">Bloklar ve çoğaltma</h2>

<p>HDFS dosyaları genellikle 128 MB gibi büyük bloklara böler. Diyelim ki 300 MB büyüklüğünde bir dosyamız var. Bu dosya 128 MB, 128 MB ve 44 MB olmak üzere üç bloğa ayrılır. Çoğaltma faktörü 3 olduğunda her blok üç farklı DataNode üzerinde tutulur.</p>

<p>Bir bloğun kullanılabilir olma olasılığı, bağımsız düğüm arızası varsayımıyla şu şekilde ifade edilebilir:</p>

\[P_{erişim} = 1 - p^R\]

<p>$p$ tek düğümün arıza olasılığıdır. $p=0.1$ ve $R=3$ için bloğun bütün kopyalarını kaybetme olasılığı yalnızca $0.001$ olur. Elbette gerçek sistemlerde aynı rack veya ağ anahtarının çökmesi gibi ilişkili arızalar da vardır. Bu nedenle HDFS, kopyaları farklı rack’lere dağıtan <strong>rack awareness</strong> yaklaşımını kullanır.</p>

<h2 id="dosya-yükleme-akışı">Dosya yükleme akışı</h2>

<p>Aşağıdaki komut yerel bir dosyayı HDFS’ye gönderir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hdfs dfs <span class="nt">-mkdir</span> <span class="nt">-p</span> /veri/loglar
hdfs dfs <span class="nt">-put</span> uygulama.log /veri/loglar/
hdfs dfs <span class="nt">-ls</span> /veri/loglar
</code></pre></div></div>

<p>İlk komut hedef klasörü oluşturur, ikincisi dosyayı HDFS’ye yükler, üçüncüsü sonucu listeler. Arka plandaki süreç ise şöyledir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1. İstemci, NameNode'dan dosya oluşturma izni ister.
2. NameNode uygun DataNode zincirini belirler.
3. İstemci bloğu ilk DataNode'a yollar.
4. Blok zincirdeki diğer DataNode'lara aktarılır.
5. Onaylar ters yönde istemciye döner.
</code></pre></div></div>

<p>Bu aktarım zinciri, istemcinin her kopyayı ayrı ayrı göndermesini önleyerek ağ kullanımını dengeler.</p>

<h2 id="güçlü-olduğu-ve-olmadığı-yerler">Güçlü olduğu ve olmadığı yerler</h2>

<p>HDFS; günlük kayıtları, video arşivleri, sensör verileri ve toplu analitik işlemler için mükemmeldir. Buna karşılık milyonlarca küçük dosya NameNode belleğini tüketebilir. Sürekli rastgele güncelleme isteyen işlemler ve milisaniyelik yanıt bekleyen uygulamalar da HDFS’nin uzmanlık alanı değildir.</p>

<p>Kısacası HDFS, tek bir süper bilgisayar yerine birlikte çalışan sıradan makinelerden güvenilir bir depolama ordusu kurar. Hadoop ekosistemindeki MapReduce veya Spark gibi araçlar da hesaplamayı ilgili blokların bulunduğu düğümlere yaklaştırarak petabaytların ağda gereksiz yere dolaşmasını engeller.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="HDFS" /><category term="Hadoop" /><category term="Dağıtık Sistemler" /><summary type="html"><![CDATA[Bir petabayt veriyi dizüstü bilgisayarınıza kopyalamaya çalıştığınızı düşünün. Diskin itiraz etmesi bir yana, işlem tamamlanmadan bilgisayarınız emekli olabilir! Hadoop Dağıtık Dosya Sistemi, yani HDFS, bu problemi devasa ve pahalı bir sunucu almak yerine veriyi yüzlerce sıradan makineye dağıtarak çözer. Üstelik disk arızalarını istisna değil, sistemin doğal bir parçası kabul eder.]]></summary></entry><entry><title type="html">Rust Felsefesi ve Bellek Güvenliği: Çöp Toplayıcı Olmadan Güvenli Sistem Programlama</title><link href="https://sonsuzus.github.io/posts/rust-felsefesi-ve-bellek-guvenligi-cop-toplayici-olmadan-guvenli-sistem-programlama/" rel="alternate" type="text/html" title="Rust Felsefesi ve Bellek Güvenliği: Çöp Toplayıcı Olmadan Güvenli Sistem Programlama" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/rust-felsefesi-ve-bellek-guvenligi-cop-toplayici-olmadan-guvenli-sistem-programlama</id><content type="html" xml:base="https://sonsuzus.github.io/posts/rust-felsefesi-ve-bellek-guvenligi-cop-toplayici-olmadan-guvenli-sistem-programlama/"><![CDATA[<p>C ve C++, programcıya belleğin anahtarlarını teslim eder; fakat anahtarlığın yanında kullanım kılavuzu vermez. Rust ise aynı donanım kontrolünü korurken “Bu bellek hâlâ geçerli mi?” sorusunu çalışma anına bırakmak yerine derleme sırasında yanıtlamaya çalışır. Üstelik bunu kodun arkasında dolaşan bir garbage collector olmadan gerçekleştirir.
``</p>

<h2 id="sorun-belleği-ayırmak-değil-doğru-zamanda-bırakmaktır">Sorun belleği ayırmak değil, doğru zamanda bırakmaktır</h2>

<p>C dilinde <code class="language-plaintext highlighter-rouge">malloc</code> ile ayrılan alanın <code class="language-plaintext highlighter-rouge">free</code> ile serbest bırakılması programcının sorumluluğundadır. Serbest bırakma unutulursa bellek sızıntısı, erken yapılırsa use-after-free, iki kez yapılırsa double-free ortaya çıkabilir. C++ bu yükü RAII ve akıllı işaretçilerle azaltır; ancak ham işaretçiler ve karmaşık sahiplik ilişkileri hâlâ hata alanı oluşturur.</p>

<p>Rust’ın yaklaşımı üç temel kavrama dayanır:</p>

<ol>
  <li><strong>Ownership (sahiplik):</strong> Her değerin tek bir sahibi vardır.</li>
  <li><strong>Borrowing (ödünç alma):</strong> Değere sahiplik aktarılmadan referansla erişilebilir.</li>
  <li><strong>Lifetime (yaşam süresi):</strong> Referans, işaret ettiği değerden daha uzun yaşayamaz.</li>
</ol>

<p>Bir değerin kapsamı sona erdiğinde Rust otomatik olarak <code class="language-plaintext highlighter-rouge">drop</code> çağırır. Bu işlem çalışma zamanında izleme yapan bir çöp toplayıcıya değil, derleyicinin önceden doğruladığı deterministik kurallara dayanır.</p>

<p>Bellek kullanımını kabaca şöyle düşünebiliriz:</p>

\[M_{aktif} = M_{ayrılan} - M_{serbest\ bırakılan}\]

<p>Rust, sahip kapsamdan çıktığında serbest bırakma işlemini otomatik üretir. Böylece programcının her çıkış yolunda manuel temizlik yazması gerekmez.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>C</th>
      <th>C++</th>
      <th>Rust</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bellek yönetimi</td>
      <td>Manuel</td>
      <td>RAII + manuel seçenekler</td>
      <td>Ownership + RAII</td>
    </tr>
    <tr>
      <td>Garbage collector</td>
      <td>Yok</td>
      <td>Yok</td>
      <td>Yok</td>
    </tr>
    <tr>
      <td>Use-after-free koruması</td>
      <td>Yok</td>
      <td>Kısmi</td>
      <td>Derleme zamanında</td>
    </tr>
    <tr>
      <td>Veri yarışı koruması</td>
      <td>Yok</td>
      <td>Kısmi</td>
      <td>Güvenli kodda derleme zamanında</td>
    </tr>
    <tr>
      <td>Ham işaretçi</td>
      <td>Doğrudan</td>
      <td>Doğrudan</td>
      <td><code class="language-plaintext highlighter-rouge">unsafe</code> içinde</td>
    </tr>
    <tr>
      <td>Serbest bırakma zamanı</td>
      <td>Programcı belirler</td>
      <td>Genellikle deterministik</td>
      <td>Deterministik</td>
    </tr>
  </tbody>
</table>

<h2 id="sahiplik-aktarımı">Sahiplik aktarımı</h2>

<p>Aşağıdaki örnekte heap üzerinde tutulan metnin sahipliği <code class="language-plaintext highlighter-rouge">mesaj</code> değişkeninden <code class="language-plaintext highlighter-rouge">yazdir</code> fonksiyonuna aktarılır:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">yazdir</span><span class="p">(</span><span class="n">metin</span><span class="p">:</span> <span class="nb">String</span><span class="p">)</span> <span class="p">{</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"{metin}"</span><span class="p">);</span>
<span class="p">}</span> <span class="c1">// metin kapsamdan çıkar ve bellek bırakılır</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">mesaj</span> <span class="o">=</span> <span class="nn">String</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="s">"Merhaba Rust!"</span><span class="p">);</span>
    <span class="nf">yazdir</span><span class="p">(</span><span class="n">mesaj</span><span class="p">);</span>

    <span class="c1">// println!("{mesaj}"); // Derleme hatası: değer taşındı</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Derleyici son satıra izin vermez; çünkü <code class="language-plaintext highlighter-rouge">mesaj</code> artık belleğin sahibi değildir. C veya C++ dünyasında bu tür bir hata geçersiz işaretçi erişimine dönüşebilirken Rust programı daha çalışmadan durdurur.</p>

<p>Veriyi tüketmeden kullanmak için ödünç alma tercih edilir:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">uzunluk</span><span class="p">(</span><span class="n">metin</span><span class="p">:</span> <span class="o">&amp;</span><span class="nb">String</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">usize</span> <span class="p">{</span>
    <span class="n">metin</span><span class="nf">.len</span><span class="p">()</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">mesaj</span> <span class="o">=</span> <span class="nn">String</span><span class="p">::</span><span class="nf">from</span><span class="p">(</span><span class="s">"Ferris iş başında"</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">sonuc</span> <span class="o">=</span> <span class="nf">uzunluk</span><span class="p">(</span><span class="o">&amp;</span><span class="n">mesaj</span><span class="p">);</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"{mesaj}: {sonuc} karakter"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Buradaki <code class="language-plaintext highlighter-rouge">&amp;String</code>, sahipliği almayan değişmez bir referanstır. Borrow checker genel olarak aynı anda ya çok sayıda değişmez referansa ya da yalnızca bir değişebilir referansa izin verir:</p>

\[N_{mutable}=1 \Rightarrow N_{immutable}=0\]

<p>Bu kural, eş zamanlı programlarda veri yarışlarının önemli bir bölümünü engeller.</p>

<h2 id="rust-bellek-sızıntısını-tamamen-imkânsız-mı-yapar">Rust bellek sızıntısını tamamen imkânsız mı yapar?</h2>

<p>Hayır; önemli bir nüans burada saklıdır. Rust, bellek sızıntısını <strong>bellek güvenliği ihlali</strong> saymaz. <code class="language-plaintext highlighter-rouge">Rc</code> ile döngüsel referanslar kurulması veya <code class="language-plaintext highlighter-rouge">std::mem::forget</code> kullanılması belleğin serbest bırakılmamasına yol açabilir. Buna karşın güvenli Rust kodunda sızan belleğe geçersiz biçimde erişilmez; use-after-free ve double-free gibi daha tehlikeli sonuçlar önlenir.</p>

<p>Döngüsel yapılarda güçlü bağlantılardan biri <code class="language-plaintext highlighter-rouge">Weak</code> referansa çevrilerek sayaç döngüsü kırılabilir. Dolayısıyla Rust’ın vaadi “hiç bellek sızmaz” değil, “belleğin yaşam süresi kuralları ihlal edilerek tanımsız davranış üretilmez” şeklinde okunmalıdır.</p>

<h2 id="güvenlik-ile-kontrolün-uzlaşması">Güvenlik ile kontrolün uzlaşması</h2>

<p>Rust sıfır maliyetli soyutlamaları benimser: Kullanılmayan çalışma zamanı denetimleri programa eklenmez ve ownership kontrollerinin çoğu derleme sırasında tamamlanır. Gerektiğinde <code class="language-plaintext highlighter-rouge">unsafe</code>, ham işaretçiler ve FFI aracılığıyla düşük seviyeli kontrol sağlanır; ancak riskli bölge görünür biçimde sınırlandırılır.</p>

<p>Sonuç olarak Rust, programcıdan kontrolü almak yerine kontrolün sorumluluğunu kurallara bağlar. Derleyici zaman zaman huysuz bir ekip arkadaşı gibi görünse de üretimde gece yarısı çalan hata alarmından çok daha naziktir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Rust" /><category term="Bellek Güvenliği" /><category term="Sistem Programlama" /><summary type="html"><![CDATA[C ve C++, programcıya belleğin anahtarlarını teslim eder; fakat anahtarlığın yanında kullanım kılavuzu vermez. Rust ise aynı donanım kontrolünü korurken “Bu bellek hâlâ geçerli mi?” sorusunu çalışma anına bırakmak yerine derleme sırasında yanıtlamaya çalışır. Üstelik bunu kodun arkasında dolaşan bir garbage collector olmadan gerçekleştirir.]]></summary></entry><entry><title type="html">Rust Kurulumu ve Cargo ile İlk Geliştirme Ortamı</title><link href="https://sonsuzus.github.io/posts/rust-kurulumu-ve-cargo-ile-ilk-gelistirme-ortami/" rel="alternate" type="text/html" title="Rust Kurulumu ve Cargo ile İlk Geliştirme Ortamı" /><published>2026-08-02T00:00:00+00:00</published><updated>2026-08-02T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/rust-kurulumu-ve-cargo-ile-ilk-gelistirme-ortami</id><content type="html" xml:base="https://sonsuzus.github.io/posts/rust-kurulumu-ve-cargo-ile-ilk-gelistirme-ortami/"><![CDATA[<p>Rust öğrenme yolculuğunun ilk durağı, derleyiciyi kurup editörü hazırlamaktır. Neyse ki Rust dünyasında kurulum, farklı araçları tek tek avlamaktan çok daha düzenlidir: <code class="language-plaintext highlighter-rouge">rustup</code> araç zincirini yönetir, <code class="language-plaintext highlighter-rouge">rustc</code> kodu derler, Cargo ise proje ve bağımlılık işlerini üstlenir. VS Code eklentileri de eklenince geriye yalnızca güvenli ve hızlı kod yazmak kalır.
``</p>
<h2 id="rust-araç-zincirini-tanıyalım">Rust araç zincirini tanıyalım</h2>

<p>Kuruluma başlamadan önce oyuncu kadrosunu tanımak faydalıdır. Rust tek bir programdan ibaret değildir; birlikte çalışan araçlardan oluşan bir ekosistemdir.</p>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Görevi</th>
      <th>Tipik komut</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rustup</code></td>
      <td>Rust sürümlerini ve hedeflerini yönetir</td>
      <td><code class="language-plaintext highlighter-rouge">rustup update</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rustc</code></td>
      <td>Rust kaynak kodunu derler</td>
      <td><code class="language-plaintext highlighter-rouge">rustc main.rs</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">cargo</code></td>
      <td>Proje, bağımlılık, test ve derleme yönetimi yapar</td>
      <td><code class="language-plaintext highlighter-rouge">cargo build</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rustfmt</code></td>
      <td>Kod biçimini standartlaştırır</td>
      <td><code class="language-plaintext highlighter-rouge">cargo fmt</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">clippy</code></td>
      <td>Olası hatalar ve kötü pratikler için öneriler verir</td>
      <td><code class="language-plaintext highlighter-rouge">cargo clippy</code></td>
    </tr>
  </tbody>
</table>

<p>Basitçe düşünürsek toplam derleme süresi yaklaşık olarak</p>

\[T_{toplam} = T_{bağımlılık} + T_{derleme} + T_{bağlama}\]

<p>şeklindedir. Cargo bu aşamaları bizim adımıza koordine eder ve değişmeyen parçaları önbellekten kullanarak sonraki derlemeleri hızlandırır.</p>

<h2 id="rust-kurulumu">Rust kurulumu</h2>

<p>Linux ve macOS üzerinde resmi <code class="language-plaintext highlighter-rouge">rustup</code> kurulum komutu şöyledir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">--proto</span> <span class="s1">'=https'</span> <span class="nt">--tlsv1</span>.2 <span class="nt">-sSf</span> https://sh.rustup.rs | sh
</code></pre></div></div>

<p>Kurulum ekranında varsayılan seçenek genellikle yeterlidir. İşlem bittikten sonra terminali yeniden açın veya ortam değişkenlerini yükleyin:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">source</span> <span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/.cargo/env"</span>
rustc <span class="nt">--version</span>
cargo <span class="nt">--version</span>
</code></pre></div></div>

<p>macOS kullanıyorsanız bağlayıcı araçlar için <code class="language-plaintext highlighter-rouge">xcode-select --install</code> komutu gerekebilir. Debian veya Ubuntu tabanlı Linux sistemlerinde ise <code class="language-plaintext highlighter-rouge">sudo apt install build-essential</code> paketi yerel derlemelerde ihtiyaç duyulan araçları sağlar.</p>

<p>Windows kullanıcıları <a href="https://rustup.rs/">rustup.rs</a> üzerinden <code class="language-plaintext highlighter-rouge">rustup-init.exe</code> dosyasını indirip çalıştırabilir. Kurulum, Microsoft C++ Build Tools isteyebilir. Bu bileşen, Rust programlarının Windows üzerinde bağlanabilmesi için gereklidir. Yeni bir PowerShell penceresinde sürüm komutlarını çalıştırarak kurulumu doğrulayın.</p>

<p>Kararlı araç zincirini güncellemek ve gerekli yardımcı bileşenleri eklemek için:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rustup update stable
rustup default stable
rustup component add rustfmt clippy
</code></pre></div></div>

<h2 id="vs-code-ortamını-hazırlama">VS Code ortamını hazırlama</h2>

<p>VS Code içinde <strong>Extensions</strong> bölümünü açıp <code class="language-plaintext highlighter-rouge">rust-analyzer</code> eklentisini kurun. Resmî Rust eklentisi; otomatik tamamlama, tür gösterimi, hata analizi, yeniden adlandırma ve kod gezinme özellikleri sunar. Hata ayıklamak için ayrıca <strong>CodeLLDB</strong> kurulabilir.</p>

<table>
  <thead>
    <tr>
      <th>Eklenti</th>
      <th>Sağladığı özellik</th>
      <th>Gerekli mi?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>rust-analyzer</td>
      <td>Tamamlama ve anlık analiz</td>
      <td>Evet</td>
    </tr>
    <tr>
      <td>CodeLLDB</td>
      <td>Kesme noktalarıyla hata ayıklama</td>
      <td>Önerilir</td>
    </tr>
    <tr>
      <td>Even Better TOML</td>
      <td><code class="language-plaintext highlighter-rouge">Cargo.toml</code> desteği</td>
      <td>İsteğe bağlı</td>
    </tr>
  </tbody>
</table>

<p>VS Code ayarlarında dosya kaydedildiğinde biçimlendirmeyi etkinleştirmek, kod düzenini otomatik korur:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"[rust]"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"editor.defaultFormatter"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rust-lang.rust-analyzer"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"editor.formatOnSave"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h2 id="cargo-ile-ilk-proje">Cargo ile ilk proje</h2>

<p>Terminalde aşağıdaki komutlarla yeni bir uygulama oluşturun:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cargo new merhaba_rust
<span class="nb">cd </span>merhaba_rust
code <span class="nb">.</span>
cargo run
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">cargo new</code>, kaynak kodunun bulunduğu <code class="language-plaintext highlighter-rouge">src/main.rs</code> dosyasını ve proje tanımı olan <code class="language-plaintext highlighter-rouge">Cargo.toml</code> dosyasını üretir. <code class="language-plaintext highlighter-rouge">cargo run</code> ise projeyi önce derler, ardından çalıştırır. Yalnızca hata kontrolü yapmak istediğinizde daha hızlı olan <code class="language-plaintext highlighter-rouge">cargo check</code> kullanılabilir.</p>

<p>Temel geliştirme döngüsü şu komutlardan oluşur:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cargo check    <span class="c"># Kodu hızlıca denetler</span>
cargo <span class="nb">fmt</span>      <span class="c"># Biçimlendirmeyi düzeltir</span>
cargo clippy   <span class="c"># İyileştirme önerileri sunar</span>
cargo <span class="nb">test</span>     <span class="c"># Testleri çalıştırır</span>
cargo run      <span class="c"># Uygulamayı derleyip başlatır</span>
</code></pre></div></div>

<p>Bağımlılıklar <code class="language-plaintext highlighter-rouge">Cargo.toml</code> içindeki <code class="language-plaintext highlighter-rouge">[dependencies]</code> bölümünde tutulur ve kesin sürümler <code class="language-plaintext highlighter-rouge">Cargo.lock</code> dosyasına kaydedilir. Böylece ekipteki herkes aynı bağımlılıklarla tekrarlanabilir derlemeler yapar. Son kontrol olarak <code class="language-plaintext highlighter-rouge">cargo run</code> çıktısında “Hello, world!” görüyorsanız tebrikler: Rust atölyeniz üretime hazır!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Rust" /><category term="Cargo" /><category term="VS Code" /><summary type="html"><![CDATA[Rust öğrenme yolculuğunun ilk durağı, derleyiciyi kurup editörü hazırlamaktır. Neyse ki Rust dünyasında kurulum, farklı araçları tek tek avlamaktan çok daha düzenlidir: rustup araç zincirini yönetir, rustc kodu derler, Cargo ise proje ve bağımlılık işlerini üstlenir. VS Code eklentileri de eklenince geriye yalnızca güvenli ve hızlı kod yazmak kalır.]]></summary></entry></feed>