<?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-10T07:13:24+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">apt’tan Nix’e: Paket Yöneticilerinin Bağımlılık Savaşları</title><link href="https://sonsuzus.github.io/posts/apttan-nixe-paket-yoneticilerinin-bagimlilik-savaslari/" rel="alternate" type="text/html" title="apt’tan Nix’e: Paket Yöneticilerinin Bağımlılık Savaşları" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/apttan-nixe-paket-yoneticilerinin-bagimlilik-savaslari</id><content type="html" xml:base="https://sonsuzus.github.io/posts/apttan-nixe-paket-yoneticilerinin-bagimlilik-savaslari/"><![CDATA[<p>Bir yazılımı çalıştırmak eskiden “dosyayı kopyala ve aç” kadar basitti. Sonra kütüphaneler, sürüm beklentileri, derleyiciler ve işletim sistemi paketleri sahneye çıktı. Bugün bir projenin çalışması için yalnızca kodun değil, kodun konuştuğu bütün çevrenin de doğru biçimde kurulması gerekir. Paket yöneticilerinin tarihi, aslında bu görünmez bağımlılık ağını evcilleştirme girişimlerinin kısa ama oldukça hareketli tarihidir.
``</p>

<h2 id="sorun-aynı-makinede-herkesin-i̇stediği-sürüm">Sorun: Aynı Makinede Herkesin İstediği Sürüm</h2>

<p>Bir uygulama <code class="language-plaintext highlighter-rouge">libssl</code>in eski sürümünü isterken diğeri yeni sürümünü isteyebilir. Üçüncü uygulama ise Python 3.10 ile çalışır, ancak sistemin varsayılan Python’ını değiştirmek istemezsiniz. Bu durum, bağımlılık çözümleyicisinin şu soruya cevap vermesini gerektirir: “Tüm sürüm kısıtlarını aynı anda sağlayan bir kurulum var mı?”</p>

<p>Teorik olarak bu, sürüm seçimi değişkenleri içeren bir kısıt tatmin problemidir. Her bağımlılık yeni kısıtlar ekler:</p>

\[\text{Uygun çözüm} = \bigcap_{i=1}^{n} \text{SürümKısıtı}_i\]

<p>Kesişim boşsa ünlü hata mesajı gelir: <em>dependency conflict</em>. Üstelik bağımlılıklar çoğunlukla ağaç değil, ortak paketlerin bulunduğu yönlü bir graf oluşturur. Küçük görünen bir güncelleme, grafın uzak bir köşesindeki paketi bozabilir.</p>

<table>
  <thead>
    <tr>
      <th>Dönem</th>
      <th>Temel yaklaşım</th>
      <th>Ana problem</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Elle kurulum</td>
      <td>Dosya ve kaynak kod kopyalama</td>
      <td>Tekrarlanamaz kurulumlar</td>
    </tr>
    <tr>
      <td>apt/yum</td>
      <td>Sistem genelinde paket veritabanı</td>
      <td>Sürüm çakışmaları</td>
    </tr>
    <tr>
      <td>npm/pip</td>
      <td>Proje tabanlı bağımlılıklar</td>
      <td>Kilit dosyası ve transitif karmaşa</td>
    </tr>
    <tr>
      <td>Nix</td>
      <td>İzole, içerik-adresli paketler</td>
      <td>Öğrenme eğrisi</td>
    </tr>
  </tbody>
</table>

<h2 id="apt-dağıtım-merkezli-düzen">apt: Dağıtım Merkezli Düzen</h2>

<p>Debian ekosisteminin <code class="language-plaintext highlighter-rouge">apt</code> aracı, paket yönetimini merkezi depolara ve sistem genelindeki bir veritabanına bağladı. Bir paket, başka paketleri <code class="language-plaintext highlighter-rouge">Depends</code>, <code class="language-plaintext highlighter-rouge">Recommends</code> veya <code class="language-plaintext highlighter-rouge">Conflicts</code> alanlarıyla tarif eder. <code class="language-plaintext highlighter-rouge">apt</code>, uygun <code class="language-plaintext highlighter-rouge">.deb</code> paketlerini indirir, kurar ve hangi dosyanın hangi pakete ait olduğunu kaydeder.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>curl build-essential
apt-cache depends curl
</code></pre></div></div>

<p>Bu komutlar depoyu günceller, <code class="language-plaintext highlighter-rouge">curl</code> ile derleme araçlarını kurar ve <code class="language-plaintext highlighter-rouge">curl</code>ün bağımlılıklarını gösterir. Yaklaşım kullanıcı dostudur: işletim sistemi tek, tutarlı bir paket dünyası gibi davranır. Ancak bunun bedeli paylaşılmış durumdur. Sistem genelindeki bir yükseltme, başka bir aracın beklediği sürümü değiştirebilir.</p>

<h2 id="dil-ekosistemleri-node_modules-ve-sanal-ortamlar">Dil Ekosistemleri: node_modules ve Sanal Ortamlar</h2>

<p>Uygulama geliştirme hızlandıkça işletim sistemi paketleri yetersiz kaldı. JavaScript için <code class="language-plaintext highlighter-rouge">npm</code>, Python için <code class="language-plaintext highlighter-rouge">pip</code>, Ruby için <code class="language-plaintext highlighter-rouge">Bundler</code> gibi araçlar bağımlılıkları proje düzeyinde tanımlamaya başladı. Böylece iki proje farklı sürümleri birlikte kullanabildi.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python <span class="nt">-m</span> venv .venv
<span class="nb">source</span> .venv/bin/activate
pip <span class="nb">install </span><span class="nv">requests</span><span class="o">==</span>2.32.3
pip freeze <span class="o">&gt;</span> requirements.txt
</code></pre></div></div>

<p>Buradaki sanal ortam, Python paketlerini sistemden ayırır; <code class="language-plaintext highlighter-rouge">requirements.txt</code> ise kurulumu tarif etmeye çalışır. Fakat “çalışan makinede” oluşan dosya, her zaman “başka makinede” aynı sonucu üretmez. İşletim sistemi kütüphaneleri, platform farkları ve gevşek sürüm aralıkları hâlâ denklemdedir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>apt</th>
      <th>npm/pip</th>
      <th>Nix</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İzolasyon</td>
      <td>Sistem geneli</td>
      <td>Genellikle proje bazlı</td>
      <td>Paket ve ortam bazlı</td>
    </tr>
    <tr>
      <td>Sürüm çoğaltma</td>
      <td>Zor</td>
      <td>Kısmen mümkün</td>
      <td>Doğal olarak mümkün</td>
    </tr>
    <tr>
      <td>Tekrarlanabilirlik</td>
      <td>Depoya bağlı</td>
      <td>Kilit dosyasına bağlı</td>
      <td>Bildirime ve hash’e bağlı</td>
    </tr>
    <tr>
      <td>Geri alma</td>
      <td>Sınırlı</td>
      <td>Manuel</td>
      <td>Nesil tabanlı kolay</td>
    </tr>
  </tbody>
</table>

<h2 id="nix-paketi-dosya-değil-fonksiyon-gibi-düşünmek">Nix: Paketi Dosya Değil, Fonksiyon Gibi Düşünmek</h2>

<p>Nix’in dikkat çekici fikri, bir paketin sonucunu girdilerinden üretmesidir. Derleyici, kaynak kod, yamalar ve bağımlılıklar değişirse sonuç da değişir. Paketler <code class="language-plaintext highlighter-rouge">/nix/store</code> altında girdilerinin karmasına göre saklanır. Basitleştirilmiş biçimde:</p>

\[\text{storePath} = H(\text{source}, \text{dependencies}, \text{build instructions})\]

<p>Bu nedenle aynı makinede iki farklı <code class="language-plaintext highlighter-rouge">openssl</code> sürümü çakışmadan bulunabilir. Nix ifadesi de niyeti açıkça bildirir:</p>

<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span> <span class="nv">pkgs</span> <span class="o">?</span> <span class="kr">import</span> <span class="o">&lt;</span><span class="nv">nixpkgs</span><span class="o">&gt;</span> <span class="p">{}</span> <span class="p">}:</span>
<span class="nv">pkgs</span><span class="o">.</span><span class="nv">mkShell</span> <span class="p">{</span>
  <span class="nv">packages</span> <span class="o">=</span> <span class="p">[</span> <span class="nv">pkgs</span><span class="o">.</span><span class="nv">python312</span> <span class="nv">pkgs</span><span class="o">.</span><span class="nv">python312Packages</span><span class="o">.</span><span class="nv">requests</span> <span class="p">];</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu geliştirme kabuğu, belirli Python sürümünü ve <code class="language-plaintext highlighter-rouge">requests</code> paketini tanımlar. <code class="language-plaintext highlighter-rouge">nix-shell</code> veya modern akışta <code class="language-plaintext highlighter-rouge">nix develop</code>, bu çevreyi projeye özel biçimde kurar. Nix sihirli değildir: paketleme dili, önbellek mantığı ve “saflık” kavramı ilk başta zorlayıcıdır. Buna rağmen bağımlılık grafını açık, izole ve yeniden üretilebilir hale getirmesi; CI sistemleri, ekip çalışması ve uzun ömürlü projeler için güçlü bir karşılıktır.</p>

<p>Paket yöneticilerinin evrimi, daha çok paket indirmekten çok daha fazlasıdır. Amaç, “benim bilgisayarımda çalışıyor” cümlesini ölçülebilir bir yapı tarifine dönüştürmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="paket yöneticileri" /><category term="apt" /><category term="nix" /><category term="bağımlılık yönetimi" /><category term="linux" /><summary type="html"><![CDATA[Bir yazılımı çalıştırmak eskiden “dosyayı kopyala ve aç” kadar basitti. Sonra kütüphaneler, sürüm beklentileri, derleyiciler ve işletim sistemi paketleri sahneye çıktı. Bugün bir projenin çalışması için yalnızca kodun değil, kodun konuştuğu bütün çevrenin de doğru biçimde kurulması gerekir. Paket yöneticilerinin tarihi, aslında bu görünmez bağımlılık ağını evcilleştirme girişimlerinin kısa ama oldukça hareketli tarihidir.]]></summary></entry><entry><title type="html">C++ Akıllı İşaretçiler: RAII ile Güvenli Bellek Yönetimi</title><link href="https://sonsuzus.github.io/posts/c-akilli-isaretciler-raii-ile-guvenli-bellek-yonetimi/" rel="alternate" type="text/html" title="C++ Akıllı İşaretçiler: RAII ile Güvenli Bellek Yönetimi" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/c-akilli-isaretciler-raii-ile-guvenli-bellek-yonetimi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/c-akilli-isaretciler-raii-ile-guvenli-bellek-yonetimi/"><![CDATA[<p>C++’ta <code class="language-plaintext highlighter-rouge">new</code> ile bellek ayırmak kolay, onu her yürütme yolunda doğru zamanda <code class="language-plaintext highlighter-rouge">delete</code> etmek ise şaşırtıcı derecede zordur. Erken <code class="language-plaintext highlighter-rouge">return</code>, fırlatılan bir istisna veya sahipliği belirsiz bir işaretçi; bellek sızıntısı, çift silme ve geçersiz belleğe erişim gibi klasik hatalara davetiye çıkarır. Modern C++’ın cevabı akıllı işaretçilerdir: Kaynağın ömrünü nesnenin ömrüne bağlayan, RAII tabanlı küçük ama güçlü sınıflar.
``</p>

<h2 id="sorunun-kökü-sahiplik">Sorunun kökü: sahiplik</h2>

<p>Ham işaretçi (<code class="language-plaintext highlighter-rouge">T*</code>) bir adres taşır; fakat bu adresin <strong>kime ait olduğunu</strong> söylemez. İşaretçi nesneyi mi yönetiyor, yalnızca ödünç mü alıyor, yoksa başka bir yerde silinmiş mi? Bu belirsizlik, özellikle büyük kod tabanlarında maliyetlidir.</p>

<p>RAII (Resource Acquisition Is Initialization) yaklaşımında kaynak edinimi kurucuda, bırakılması ise yıkıcıda gerçekleşir. Bir nesne kapsam dışına çıktığında yıkıcısı otomatik çağrılır. Böylece kaynak ömrü deterministik olur:</p>

\[\text{Kaynak ömrü} = \text{RAII nesnesinin kapsam ömrü}\]

<p>İstisna fırlatılsa bile C++ kapsam temizliği yapar. Akıllı işaretçi de sahip olduğu nesne için uygun zamanda <code class="language-plaintext highlighter-rouge">delete</code> çağıran bir RAII sarmalayıcısıdır. Bu, çöp toplayıcı değildir: temizlik zamanı tahmin edilebilir ve çoğunlukla ek çalışma zamanı maliyeti yoktur.</p>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Sahiplik modeli</th>
      <th style="text-align: right">Kopyalanabilir mi?</th>
      <th>Tipik kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">T*</code></td>
      <td>Belirsiz / gözlemci</td>
      <td style="text-align: right">Evet</td>
      <td>Sahip olmayan erişim</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::unique_ptr&lt;T&gt;</code></td>
      <td>Tek sahip</td>
      <td style="text-align: right">Hayır, taşınabilir</td>
      <td>Varsayılan sahiplik tercihi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::shared_ptr&lt;T&gt;</code></td>
      <td>Ortak sahiplik</td>
      <td style="text-align: right">Evet</td>
      <td>Gerçekten paylaşılan yaşam süresi</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::weak_ptr&lt;T&gt;</code></td>
      <td>Sahip olmayan zayıf referans</td>
      <td style="text-align: right">Evet</td>
      <td>Döngü kırma, güvenli gözlem</td>
    </tr>
  </tbody>
</table>

<h2 id="unique_ptr-tek-kaptan-sıfır-drama"><code class="language-plaintext highlighter-rouge">unique_ptr</code>: tek kaptan, sıfır drama</h2>

<p><code class="language-plaintext highlighter-rouge">std::unique_ptr</code>, bir nesnenin yalnızca bir sahibi olmasını garanti eder. Kopyalama yasaktır; sahiplik <code class="language-plaintext highlighter-rouge">std::move</code> ile açıkça devredilir. Bu kural, “Bu nesneyi kim silecek?” sorusunu derleme zamanında cevaplar. Nesne, <code class="language-plaintext highlighter-rouge">unique_ptr</code> yok edildiğinde otomatik silinir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;memory&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">Dosya</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="k">explicit</span> <span class="n">Dosya</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">ad</span><span class="p">)</span> <span class="o">:</span> <span class="n">ad_</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">ad</span><span class="p">))</span> <span class="p">{}</span>
    <span class="kt">void</span> <span class="n">yaz</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span> <span class="cm">/* dosyaya veri yaz */</span> <span class="p">}</span>
<span class="k">private</span><span class="o">:</span>
    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">ad_</span><span class="p">;</span>
<span class="p">};</span>

<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o">&lt;</span><span class="n">Dosya</span><span class="o">&gt;</span> <span class="n">dosyaAc</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">auto</span> <span class="n">dosya</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o">&lt;</span><span class="n">Dosya</span><span class="o">&gt;</span><span class="p">(</span><span class="s">"rapor.txt"</span><span class="p">);</span>
    <span class="n">dosya</span><span class="o">-&gt;</span><span class="n">yaz</span><span class="p">();</span>
    <span class="k">return</span> <span class="n">dosya</span><span class="p">;</span> <span class="c1">// sahiplik taşınır; kopyalama yoktur</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">make_unique</code>, C++14 ile geldi ve <code class="language-plaintext highlighter-rouge">new</code> yazma ihtiyacını büyük ölçüde kaldırdı. İstisna güvenliği açısından da üstündür: nesne oluşturma ve sahipliğe alma tek ifadede tamamlanır. Diziler için <code class="language-plaintext highlighter-rouge">std::make_unique&lt;int[]&gt;(10)</code> kullanılabilir; ancak çoğu durumda boyut bilgisini de taşıdığı için <code class="language-plaintext highlighter-rouge">std::vector</code> daha anlamlıdır.</p>

<h2 id="shared_ptr-paylaşım-gerekli-olduğunda"><code class="language-plaintext highlighter-rouge">shared_ptr</code>: paylaşım gerekli olduğunda</h2>

<p><code class="language-plaintext highlighter-rouge">std::shared_ptr</code>, aynı nesnenin birden fazla sahibi olduğunda kullanılır. Bir kontrol bloğu referans sayısını tutar. Sahip sayısı $n$ iken nesne yaşar; $n = 0$ olduğunda silinir. Kopyalama sayacı artırır, yok etme ise azaltır:</p>

\[n_{yeni} = n_{eski} + 1 \quad \text{veya} \quad n_{yeni} = n_{eski} - 1\]

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;memory&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="nc">Oturum</span> <span class="p">{</span>
    <span class="kt">void</span> <span class="n">baglan</span><span class="p">()</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Baglandi</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="p">}</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="nf">kullan</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Oturum</span><span class="o">&gt;</span> <span class="n">oturum</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">oturum</span><span class="o">-&gt;</span><span class="n">baglan</span><span class="p">();</span> <span class="c1">// fonksiyon boyunca ortak sahiplik sürer</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">auto</span> <span class="n">oturum</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o">&lt;</span><span class="n">Oturum</span><span class="o">&gt;</span><span class="p">();</span>
    <span class="n">kullan</span><span class="p">(</span><span class="n">oturum</span><span class="p">);</span>
<span class="p">}</span> <span class="c1">// son shared_ptr burada yok olursa Oturum temizlenir</span>
</code></pre></div></div>

<p>Ancak <code class="language-plaintext highlighter-rouge">shared_ptr</code>, varsayılan seçim olmamalıdır. Kontrol bloğu, atomik sayaç işlemleri ve belirsiz sahiplik mimari maliyet yaratabilir. Daha önemlisi, iki nesne birbirini <code class="language-plaintext highlighter-rouge">shared_ptr</code> ile tutarsa sayaçlar sıfıra inmez: döngüsel sızıntı oluşur. Bu senaryoda bir yön <code class="language-plaintext highlighter-rouge">weak_ptr</code> olmalıdır.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Doğru tercih</th>
      <th>Neden</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Nesnenin tek, açık sahibi var</td>
      <td><code class="language-plaintext highlighter-rouge">unique_ptr</code></td>
      <td>Basit ve düşük maliyetli</td>
    </tr>
    <tr>
      <td>Birden çok bileşen yaşam süresini paylaşır</td>
      <td><code class="language-plaintext highlighter-rouge">shared_ptr</code></td>
      <td>Ortak sahiplik modeli</td>
    </tr>
    <tr>
      <td>Nesneyi yalnızca gözlemliyorsunuz</td>
      <td><code class="language-plaintext highlighter-rouge">T*</code> veya <code class="language-plaintext highlighter-rouge">T&amp;</code></td>
      <td>Sahiplik iddiası yok</td>
    </tr>
    <tr>
      <td>Geri referans / ebeveyn bağlantısı</td>
      <td><code class="language-plaintext highlighter-rouge">weak_ptr</code></td>
      <td>Döngüsel sahipliği önler</td>
    </tr>
  </tbody>
</table>

<p>Özet kural nettir: Önce <code class="language-plaintext highlighter-rouge">unique_ptr</code> düşünün, zorunlu ortak sahiplik varsa <code class="language-plaintext highlighter-rouge">shared_ptr</code> seçin ve ham <code class="language-plaintext highlighter-rouge">new</code>/<code class="language-plaintext highlighter-rouge">delete</code> ikilisini uygulama kodundan uzak tutun. Akıllı işaretçiler yalnızca belleği temizlemez; sahiplik niyetini kodun bir parçası hâline getirerek hataları daha oluşmadan görünür kılar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="C++" /><category term="Smart Pointers" /><category term="RAII" /><summary type="html"><![CDATA[C++’ta new ile bellek ayırmak kolay, onu her yürütme yolunda doğru zamanda delete etmek ise şaşırtıcı derecede zordur. Erken return, fırlatılan bir istisna veya sahipliği belirsiz bir işaretçi; bellek sızıntısı, çift silme ve geçersiz belleğe erişim gibi klasik hatalara davetiye çıkarır. Modern C++’ın cevabı akıllı işaretçilerdir: Kaynağın ömrünü nesnenin ömrüne bağlayan, RAII tabanlı küçük ama güçlü sınıflar.]]></summary></entry><entry><title type="html">Dağıtım Savaşları: Ubuntu, Arch ve Debian Neden Uzlaşamıyor?</title><link href="https://sonsuzus.github.io/posts/dagitim-savaslari-ubuntu-arch-ve-debian-neden-uzlasamiyor/" rel="alternate" type="text/html" title="Dağıtım Savaşları: Ubuntu, Arch ve Debian Neden Uzlaşamıyor?" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/dagitim-savaslari-ubuntu-arch-ve-debian-neden-uzlasamiyor</id><content type="html" xml:base="https://sonsuzus.github.io/posts/dagitim-savaslari-ubuntu-arch-ve-debian-neden-uzlasamiyor/"><![CDATA[<p>Linux dünyasında “en iyi dağıtım hangisi?” sorusu, teknik bir öneri istemekten çok kimlik, alışkanlık ve değerler hakkında konuşma başlatır. Ubuntu kullanıcısı bilgisayarın işini kolaylaştırmasını beklerken, Arch kullanıcısı sistemin her vidasını tanımak isteyebilir; Debian kullanıcısı ise yıllarca değişmeden çalışan bir altyapıyı en büyük başarı sayabilir. Bu yüzden tartışmanın tek bir kazananı yoktur: “en iyi”, kullanıcının öncelik fonksiyonuna bağlıdır.
``</p>

<p>Bu farklılığı anlamak için Linux dağıtımını yalnızca paketlerden oluşan bir ürün değil, bir <strong>sosyal sözleşme</strong> gibi düşünmek gerekir. Her dağıtım; güncellemelerin hızı, özgür yazılıma yaklaşım, varsayılanların miktarı ve kullanıcının üstlendiği sorumluluk konusunda farklı cevaplar verir. Basitçe şöyle modelleyebiliriz:</p>

\[U = w_kK + w_sS + w_cC + w_fF\]

<p>Burada $K$ kolaylık, $S$ stabilite, $C$ kontrol ve $F$ güncelliktir. Katsayılar olan $w$ değerleri herkes için farklıdır. Dolayısıyla bir geliştiricinin “mükemmel” dediği Arch, üretim sunucusu yöneten biri için gereksiz risk; Debian’ın “sıkıcı” sürüm politikası da başka biri için huzur kaynağı olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Dağıtım</th>
      <th>Baskın öncelik</th>
      <th>Güncelleme modeli</th>
      <th>Kullanıcıdan beklenti</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ubuntu</td>
      <td>Erişilebilirlik ve hazır deneyim</td>
      <td>Düzenli sürümler, LTS</td>
      <td>Düşük-orta seviye yönetim</td>
    </tr>
    <tr>
      <td>Arch Linux</td>
      <td>Kontrol ve güncellik</td>
      <td>Rolling release</td>
      <td>Yüksek merak ve manuel kurulum</td>
    </tr>
    <tr>
      <td>Debian</td>
      <td>Öngörülebilirlik ve özgürlük</td>
      <td>Kararlı, yavaş sürümler</td>
      <td>Sabır ve muhafazakâr tercih</td>
    </tr>
  </tbody>
</table>

<h2 id="ubuntu-bilgisayar-araçtır-yaklaşımı">Ubuntu: “Bilgisayar araçtır” yaklaşımı</h2>

<p>Ubuntu’nun ideolojisi, Linux’u uzman kulübünden çıkarıp gündelik kullanıcıya ulaştırmaktır. Grafik kurulum sihirbazı, geniş donanım desteği, varsayılan masaüstü deneyimi ve LTS sürümleri bu hedefe hizmet eder. Ubuntu tercih eden biri için terminalde saatler geçirmek çoğu zaman özgürlük değil, zaman kaybıdır.</p>

<p>Ancak bu kolaylık bazı Arch ve Debian kullanıcılarında kuşku uyandırır. Canonical’ın Snap paketleri, ticari kararları ve merkezi yönlendirmeleri, “masaüstü Linux’un fazla kurumsallaşması” eleştirisini doğurur. Buna rağmen Ubuntu’nun başarısı küçümsenemez: Yeni başlayanların büyük bölümü için sürücüyle değil, üretkenlikle ilgilenebilmek ideolojik olarak da değerlidir.</p>

<h2 id="arch-sistemi-ben-kurdum-ben-anlarım-yaklaşımı">Arch: “Sistemi ben kurdum, ben anlarım” yaklaşımı</h2>

<p>Arch Linux, minimal kurulum ve rolling release modeliyle kullanıcıyı sistemin merkezine koyar. Varsayılanlar azdır; seçimler kullanıcıya bırakılır. Bu, Arch topluluğunda güçlü bir öğrenme ve sahiplik hissi yaratır. Arch Wiki’nin efsaneleşmesinin nedeni de budur: Sistem, belgeleri okuyarak bilinçli biçimde inşa edilir.</p>

<p>Örneğin temel bir paketi kurmak son derece doğrudandır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>pacman <span class="nt">-S</span> neovim git
</code></pre></div></div>

<p>Bu komut <code class="language-plaintext highlighter-rouge">pacman</code> paket yöneticisiyle Neovim ve Git’i kurar. Fakat Arch deneyimi yalnızca komut kolaylığı değildir; güncelleme notlarını takip etmek, yapılandırma değişikliklerini anlamak ve gerektiğinde müdahale etmek de paketin parçasıdır. “KISS” ilkesi burada “basit kullanım” değil, <strong>basit ve şeffaf tasarım</strong> anlamına gelir.</p>

<h2 id="debian-önce-güven-sonra-yenilik-yaklaşımı">Debian: “Önce güven, sonra yenilik” yaklaşımı</h2>

<p>Debian’ın kimliği, özellikle sosyal sözleşmesi ve özgür yazılım ilkeleri etrafında şekillenir. Stable deposundaki paketler çoğu zaman yeni değildir; çünkü paketler uzun test süreçlerinden geçer. Bu durum masaüstünde eski hissettirebilir, fakat sunucuda çok değerlidir. Bir gece güncellemesinin sabah üretim sistemini bozma olasılığı düşük olsun istenir.</p>

<table>
  <thead>
    <tr>
      <th>Soru</th>
      <th>Ubuntu cevabı</th>
      <th>Arch cevabı</th>
      <th>Debian cevabı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yeni kullanıcı?</td>
      <td>Hemen başla</td>
      <td>Öğrenmeye hazır ol</td>
      <td>Önce stabiliteyi seç</td>
    </tr>
    <tr>
      <td>En yeni paket?</td>
      <td>Makul denge</td>
      <td>Evet, hızla</td>
      <td>Genellikle hayır</td>
    </tr>
    <tr>
      <td>Varsayılanlar?</td>
      <td>Çok sayıda</td>
      <td>Minimum</td>
      <td>Temkinli miktarda</td>
    </tr>
    <tr>
      <td>Sorun çözme biçimi</td>
      <td>Topluluk ve araçlar</td>
      <td>Wiki ve müdahale</td>
      <td>Dokümantasyon ve test</td>
    </tr>
  </tbody>
</table>

<p>Sonuçta dağıtım savaşları çoğu zaman teknik kıyaslama kılığına girmiş değer çatışmalarıdır. Ubuntu pratikliği, Arch özerkliği, Debian ise dayanıklılığı savunur. En iyi Linux; en çok övülen değil, sizin $w_k$, $w_s$, $w_c$ ve $w_f$ ağırlıklarınıza en iyi uyan Linux’tur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Linux" /><category term="Ubuntu" /><category term="Arch Linux" /><category term="Debian" /><category term="açık kaynak" /><summary type="html"><![CDATA[Linux dünyasında “en iyi dağıtım hangisi?” sorusu, teknik bir öneri istemekten çok kimlik, alışkanlık ve değerler hakkında konuşma başlatır. Ubuntu kullanıcısı bilgisayarın işini kolaylaştırmasını beklerken, Arch kullanıcısı sistemin her vidasını tanımak isteyebilir; Debian kullanıcısı ise yıllarca değişmeden çalışan bir altyapıyı en büyük başarı sayabilir. Bu yüzden tartışmanın tek bir kazananı yoktur: “en iyi”, kullanıcının öncelik fonksiyonuna bağlıdır.]]></summary></entry><entry><title type="html">Dotfiles Kültürü: .bashrc Dosyanız Dijital Kişiliğinizi Ele Verir mi?</title><link href="https://sonsuzus.github.io/posts/dotfiles-kulturu-bashrc-dosyaniz-dijital-kisiliginizi-ele-verir-mi/" rel="alternate" type="text/html" title="Dotfiles Kültürü: .bashrc Dosyanız Dijital Kişiliğinizi Ele Verir mi?" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/dotfiles-kulturu-bashrc-dosyaniz-dijital-kisiliginizi-ele-verir-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/dotfiles-kulturu-bashrc-dosyaniz-dijital-kisiliginizi-ele-verir-mi/"><![CDATA[<p>Bir geliştiricinin bilgisayarına kısa süreliğine oturduğunuzda, terminal açılır açılmaz karakteri hakkında ipuçları toplamaya başlarsınız: rengârenk bir prompt, dikkatle seçilmiş takma adlar, sessizce çalışan araçlar ve belki de yıllardır taşınan bir ASCII sanat eseri. Dotfiles — <code class="language-plaintext highlighter-rouge">.bashrc</code>, <code class="language-plaintext highlighter-rouge">.zshrc</code>, <code class="language-plaintext highlighter-rouge">.gitconfig</code>, <code class="language-plaintext highlighter-rouge">vimrc</code> ve benzerleri — yalnızca ayar deposu değildir; çalışma alışkanlıklarının, estetik tercihlerin ve teknik dünya görüşünün küçük bir arşividir.
``</p>

<p>Elbette bir <code class="language-plaintext highlighter-rouge">.bashrc</code> dosyasından insanın tüm kişiliğini çıkarmak bilimsel bir karakter analizi değildir. Ancak bu dosya, kullanıcının bilgisayarla nasıl ilişki kurduğunu gösterir. Terminali yalnızca komut yazılan bir araç olarak gören biriyle, onu kişisel bir çalışma stüdyosuna dönüştüren biri aynı yapılandırmayı yazmaz. Dotfiles kültürünün çekiciliği de burada başlar: Tekrarlanan işleri azaltırken kişinin dijital ortamına bir imza atmasına izin verir.</p>

<h2 id="dotfiles-neden-kimlik-ifadesidir">Dotfiles neden kimlik ifadesidir?</h2>

<p>Yapılandırma dosyaları çoğu zaman görünmez emek içerir. Bir geliştirici, her yeni makinede aynı ortamı kurmak istemez; bu nedenle tercihlerini sürüm kontrolüne alır. Böylece dotfiles, taşınabilir bir alışkanlık setine dönüşür. Basitçe şöyle düşünebiliriz:</p>

\[\text{Verimlilik} = \frac{\text{Sık yapılan iş sayısı} \times \text{Kısalan süre}}{\text{Yapılandırma bakım maliyeti}}\]

<p>Bu formül kesin bir ölçüm değildir, fakat önemli bir gerilimi anlatır: Her alias zaman kazandırmaz; bazen unutulmuş kısayollar ve karmaşık koşullar bakım maliyetini büyütür. İyi bir <code class="language-plaintext highlighter-rouge">.bashrc</code>, kişiselleştirme ile anlaşılabilirlik arasındaki dengedir.</p>

<table>
  <thead>
    <tr>
      <th><code class="language-plaintext highlighter-rouge">.bashrc</code> tercihi</th>
      <th>Olası çalışma tarzı</th>
      <th>Dikkat edilmesi gereken nokta</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Az sayıda alias</td>
      <td>Açıklık ve standart araçlara bağlılık</td>
      <td>Tekrarlayan uzun komutlar yorabilir</td>
    </tr>
    <tr>
      <td>Git odaklı kısayollar</td>
      <td>Sık commit alan, akış odaklı çalışma</td>
      <td>Kısayollar ekip komutlarını gizleyebilir</td>
    </tr>
    <tr>
      <td>Renkli, bilgi dolu prompt</td>
      <td>Durumsal farkındalık ve görsel düzen</td>
      <td>Çok fazla bilgi terminali yorar</td>
    </tr>
    <tr>
      <td>Fonksiyon koleksiyonu</td>
      <td>Otomasyon merakı</td>
      <td>Fonksiyonlar belgelenmezse unutulur</td>
    </tr>
    <tr>
      <td>Minimal dosya</td>
      <td>Taşınabilirlik ve düşük bakım</td>
      <td>Kişisel hız avantajları sınırlı kalabilir</td>
    </tr>
  </tbody>
</table>

<p>Örneğin <code class="language-plaintext highlighter-rouge">ll</code> alias’ı neredeyse evrensel bir alışkanlıktır; fakat <code class="language-plaintext highlighter-rouge">gs</code>, <code class="language-plaintext highlighter-rouge">gp</code>, <code class="language-plaintext highlighter-rouge">kctx</code> gibi kısaltmalar kullanıcının araç ekosistemini ele verir. Git, Docker, Kubernetes veya Node.js etrafında dönen komutlar, hangi problemlerin günlük hayatın merkezinde olduğunu gösterir. Prompt içindeki aktif Git dalı ise yalnızca şık bir detay değil, bağlam değiştirme maliyetini azaltan bir arayüz tercihidir.</p>

<h2 id="kişisellik-ile-sürdürülebilirlik-arasında">Kişisellik ile sürdürülebilirlik arasında</h2>

<p>Aşağıdaki örnek, gösterişli olmaktan çok okunabilir kalmayı hedefleyen orta düzey bir <code class="language-plaintext highlighter-rouge">.bashrc</code> parçasıdır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Geçmişteki tekrarları azaltır ve oturumlar arasında paylaşır.</span>
<span class="nv">HISTCONTROL</span><span class="o">=</span>ignoreboth:erasedups
<span class="nv">HISTSIZE</span><span class="o">=</span>10000
<span class="nb">shopt</span> <span class="nt">-s</span> histappend

<span class="c"># Sık kullanılan komutları daha güvenli ve kısa hale getirir.</span>
<span class="nb">alias </span><span class="nv">ll</span><span class="o">=</span><span class="s1">'ls -lah --color=auto'</span>
<span class="nb">alias </span><span class="nv">gs</span><span class="o">=</span><span class="s1">'git status -sb'</span>
<span class="nb">alias</span> ..<span class="o">=</span><span class="s1">'cd ..'</span>

<span class="c"># Proje klasörüne geçip editörü açan küçük bir iş akışı fonksiyonu.</span>
workon<span class="o">()</span> <span class="o">{</span>
  <span class="nb">local </span><span class="nv">project</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/projects/</span><span class="nv">$1</span><span class="s2">"</span>
  <span class="o">[</span> <span class="nt">-d</span> <span class="s2">"</span><span class="nv">$project</span><span class="s2">"</span> <span class="o">]</span> <span class="o">||</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">"Proje bulunamadı: </span><span class="nv">$1</span><span class="s2">"</span><span class="p">;</span> <span class="k">return </span>1<span class="p">;</span> <span class="o">}</span>
  <span class="nb">cd</span> <span class="s2">"</span><span class="nv">$project</span><span class="s2">"</span> <span class="o">&amp;&amp;</span> code <span class="nb">.</span>
<span class="o">}</span>

<span class="c"># Prompt, klasörü ve Git dalını gösterir.</span>
parse_git_branch<span class="o">()</span> <span class="o">{</span>
  git branch <span class="nt">--show-current</span> 2&gt;/dev/null
<span class="o">}</span>
<span class="nv">PS1</span><span class="o">=</span><span class="s1">'\u@\h:\W [$(parse_git_branch)]\$ '</span>
</code></pre></div></div>

<p>Burada alias’lar tekrar eden komutları kısaltır, <code class="language-plaintext highlighter-rouge">workon</code> ise küçük bir ritüeli otomatikleştirir. Buna karşılık her satırın bir bedeli vardır: <code class="language-plaintext highlighter-rouge">code</code> komutu her makinede bulunmayabilir, Git sorgusu çok büyük depolarda prompt’u yavaşlatabilir. Bu yüzden dotfiles yazmak biraz da ürün geliştirmektir: Kullanıcısı sizsiniz, ama gelecekteki siz de bakım ekibidir.</p>

<p>Sağlıklı dotfiles kültürünün temel ilkesi paylaşılabilir kişiselliktir. Gizli anahtarları dosyaya koymamak, makineye özgü ayarları ayrı tutmak, açıklama satırları eklemek ve Git ile sürümlemek bu kültürü olgunlaştırır. <code class="language-plaintext highlighter-rouge">.bashrc</code> dosyanız kişiliğinizi tamamen ele vermez; ama hangi sürtünmeleri ortadan kaldırmak istediğinizi, hangi araçlara güvendiğinizi ve dijital masanızı nasıl düzenlediğinizi gayet samimi biçimde anlatır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="dotfiles" /><category term="bashrc" /><category term="linux" /><category term="geliştirici kültürü" /><category term="kişiselleştirme" /><summary type="html"><![CDATA[Bir geliştiricinin bilgisayarına kısa süreliğine oturduğunuzda, terminal açılır açılmaz karakteri hakkında ipuçları toplamaya başlarsınız: rengârenk bir prompt, dikkatle seçilmiş takma adlar, sessizce çalışan araçlar ve belki de yıllardır taşınan bir ASCII sanat eseri. Dotfiles — .bashrc, .zshrc, .gitconfig, vimrc ve benzerleri — yalnızca ayar deposu değildir; çalışma alışkanlıklarının, estetik tercihlerin ve teknik dünya görüşünün küçük bir arşividir.]]></summary></entry><entry><title type="html">Eşzamanlılık ve İş Parçacıkları: Çok Çekirdeği Akıllıca Kullanmak</title><link href="https://sonsuzus.github.io/posts/eszamanlilik-ve-is-parcaciklari-cok-cekirdegi-akillica-kullanmak/" rel="alternate" type="text/html" title="Eşzamanlılık ve İş Parçacıkları: Çok Çekirdeği Akıllıca Kullanmak" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/eszamanlilik-ve-is-parcaciklari-cok-cekirdegi-akillica-kullanmak</id><content type="html" xml:base="https://sonsuzus.github.io/posts/eszamanlilik-ve-is-parcaciklari-cok-cekirdegi-akillica-kullanmak/"><![CDATA[<p>Modern işlemciler artık saat hızını sınırsız artırmak yerine birden fazla çekirdekle güçleniyor. Bir uygulamanın bu gücü kullanabilmesi için işleri bağımsız parçalara bölmesi, bu parçaları iş parçacıklarında (thread) çalıştırması ve ortak belleğe erişimi dikkatle düzenlemesi gerekir. Ancak multithreading, uygulamayı otomatik olarak hızlandıran sihirli bir değnek değildir; doğru tasarlanmadığında yarış koşulları, kilitlenmeler ve zor tekrarlanan hatalar üretir.
``</p>

<h2 id="thread-süreç-ve-eşzamanlılık">Thread, süreç ve eşzamanlılık</h2>

<p><strong>Süreç</strong> (process), kendi bellek alanına sahip çalışan program örneğidir. Aynı süreçteki thread’ler ise kodu, heap alanını ve açık kaynakları paylaşır; yalnızca çağrı yığını ve register durumları özeldir. Bu paylaşım, thread oluşturmayı hafifletir ve veri alışverişini hızlandırır. Bedeli ise ortak verinin korunmasıdır.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Bellek modeli</th>
      <th>Güçlü yanı</th>
      <th>Temel risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Process</td>
      <td>İzole bellek</td>
      <td>Hata yalıtımı</td>
      <td>IPC maliyeti</td>
    </tr>
    <tr>
      <td>Thread</td>
      <td>Ortak bellek</td>
      <td>Hızlı iletişim</td>
      <td>Data race</td>
    </tr>
    <tr>
      <td>Async I/O</td>
      <td>Genellikle tek/az thread</td>
      <td>I/O verimliliği</td>
      <td>Akış karmaşıklığı</td>
    </tr>
  </tbody>
</table>

<p>Eşzamanlılık (concurrency), birden çok işin zaman içinde ilerlemesidir. Paralellik (parallelism) ise işlerin gerçekten aynı anda, ayrı çekirdeklerde yürütülmesidir. Tek çekirdekli bir makine eşzamanlı davranabilir; fakat gerçek paralellik için birden fazla yürütme kaynağı gerekir.</p>

<h2 id="hızlanmanın-matematiği-amdahl-kanunu">Hızlanmanın matematiği: Amdahl kanunu</h2>

<p>Programın yalnızca paralelleştirilebilen kısmı hızlanır. Amdahl kanunu, teorik üst sınırı şöyle verir:</p>

\[S(N) = \frac{1}{(1-P) + \frac{P}{N}}\]

<p>Burada $P$ paralelleştirilebilir oran, $N$ çekirdek sayısıdır. Örneğin işin %90’ı paralelse ve 8 çekirdek kullanılıyorsa, $S(8) \approx 4.7$ olur; yani sekiz kat değil. Seri bölüm, thread oluşturma maliyeti, cache etkileri ve senkronizasyon bu sonucu daha da düşürebilir. Bu nedenle önce profil çıkarın: darboğaz CPU mu, disk mi, ağ mı, yoksa kilit bekleme süresi mi?</p>

<h2 id="ortak-belleğin-tehlikesi-yarış-koşulu">Ortak belleğin tehlikesi: yarış koşulu</h2>

<p>Aşağıdaki sayaç artırma işlemi masum görünür; fakat <code class="language-plaintext highlighter-rouge">counter++</code> tek ve bölünemez bir işlem değildir. Okuma, artırma ve yazma adımlarına ayrılabilir.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;thread&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;mutex&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">mutex</span> <span class="n">counterMutex</span><span class="p">;</span>

<span class="kt">void</span> <span class="nf">increment</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">100000</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">lock_guard</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">mutex</span><span class="o">&gt;</span> <span class="n">lock</span><span class="p">(</span><span class="n">counterMutex</span><span class="p">);</span>
        <span class="o">++</span><span class="n">counter</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="kr">thread</span> <span class="n">a</span><span class="p">(</span><span class="n">increment</span><span class="p">),</span> <span class="n">b</span><span class="p">(</span><span class="n">increment</span><span class="p">);</span>
    <span class="n">a</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
    <span class="n">b</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">std::lock_guard</code>, mutex’i kapsam boyunca kilitler ve kapsam bitince otomatik serbest bırakır. Böylece iki thread aynı anda sayaç güncelleyemez. Basit sayaçlar için <code class="language-plaintext highlighter-rouge">std::atomic&lt;int&gt;</code> çoğu zaman daha uygun ve daha düşük maliyetli bir seçenektir.</p>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Ne zaman tercih edilir?</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mutex</td>
      <td>Birden çok veriyi tutarlı güncelleme</td>
      <td>Uzun kritik bölge performansı düşürür</td>
    </tr>
    <tr>
      <td>Atomic</td>
      <td>Sayaç, bayrak, tekil atomik durum</td>
      <td>Karmaşık invariant’ları korumaz</td>
    </tr>
    <tr>
      <td>Condition variable</td>
      <td>Bir olayın oluşmasını bekleme</td>
      <td>Her zaman koşulla birlikte kullanılmalı</td>
    </tr>
    <tr>
      <td>Semaphore</td>
      <td>Sınırlı kaynak havuzu</td>
      <td>İzin sayısı doğru yönetilmeli</td>
    </tr>
  </tbody>
</table>

<h2 id="sağlam-mimari-için-pratik-ilkeler">Sağlam mimari için pratik ilkeler</h2>

<p>Kritik bölgeleri kısa tutun; kilit altındayken ağ isteği, dosya işlemi veya ağır hesaplama yapmayın. Kilitleri birden fazlaysa her yerde aynı sırayla alın; bu, iki thread’in birbirini sonsuza dek beklediği deadlock riskini azaltır. Paylaşılan değişken sayısını azaltmak için mesaj kuyruğu, immutable veri ve iş kuyruğu (thread pool) gibi yaklaşımları değerlendirin.</p>

<p>Son olarak thread sayısını çekirdek sayısının rastgele katı yapmayın. CPU ağırlıklı işler için çekirdek sayısına yakın bir havuz, I/O ağırlıklı işler için ise bekleme sürelerini tolere eden daha geniş bir havuz mantıklıdır. Başarılı multithreading tasarımı, en çok thread’i açmak değil; en az paylaşım ve en net senkronizasyonla doğru işi paralelleştirmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="multithreading" /><category term="eşzamanlılık" /><category term="thread" /><category term="senkronizasyon" /><category term="çok çekirdekli" /><summary type="html"><![CDATA[Modern işlemciler artık saat hızını sınırsız artırmak yerine birden fazla çekirdekle güçleniyor. Bir uygulamanın bu gücü kullanabilmesi için işleri bağımsız parçalara bölmesi, bu parçaları iş parçacıklarında (thread) çalıştırması ve ortak belleğe erişimi dikkatle düzenlemesi gerekir. Ancak multithreading, uygulamayı otomatik olarak hızlandıran sihirli bir değnek değildir; doğru tasarlanmadığında yarış koşulları, kilitlenmeler ve zor tekrarlanan hatalar üretir.]]></summary></entry><entry><title type="html">Linux Çekirdeğinin Demokrasisi: Binlerce Gönüllü Bir Sistemi Nasıl Yönetiyor?</title><link href="https://sonsuzus.github.io/posts/linux-cekirdeginin-demokrasisi-binlerce-gonullu-bir-sistemi-nasil-yonetiyor/" rel="alternate" type="text/html" title="Linux Çekirdeğinin Demokrasisi: Binlerce Gönüllü Bir Sistemi Nasıl Yönetiyor?" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/linux-cekirdeginin-demokrasisi-binlerce-gonullu-bir-sistemi-nasil-yonetiyor</id><content type="html" xml:base="https://sonsuzus.github.io/posts/linux-cekirdeginin-demokrasisi-binlerce-gonullu-bir-sistemi-nasil-yonetiyor/"><![CDATA[<p>Linux çekirdeği, tek bir merkezî otoritenin yazdığı dev bir program değildir; şirket çalışanları, bağımsız geliştiriciler, akademisyenler ve donanım üreticilerinden oluşan küresel bir ağın ortak ürünüdür. Bu ağın başarısı, “herkes eşit oy kullanır” türünden saf bir demokrasiye değil; teknik uzmanlık, itibar, şeffaf müzakere ve yetki devrine dayanan karma bir yönetişim modeline dayanır. Dolayısıyla Linux’u anlamak, yalnızca C kodu okumak değil, dijital çağda katılımın nasıl örgütlenebileceğini incelemektir.
``</p>

<p>Siyasi katılım kuramları vatandaşların karar alma süreçlerine hangi araçlarla katıldığını sorgular. Linux dünyasında vatandaşın karşılığı katkıcıdır; dilekçe yerine <strong>patch</strong> gönderir, meclis tartışması yerine e-posta listelerinde teknik gerekçe sunar. Katılımın temel birimi oy değil, denetlenebilir emektir. Bir değişiklik önerisinin değeri, öneriyi yapan kişinin ününden çok kodun kalitesi, test sonuçları ve mevcut mimariyle uyumuyla ölçülür.</p>

<p>Bu süreçte Git, yalnızca sürüm kontrol sistemi değil, aynı zamanda bir tür anayasal kayıt defteridir. Her commit; kim tarafından, ne zaman ve hangi açıklamayla önerildiğini saklar. İnceleme zincirindeki <code class="language-plaintext highlighter-rouge">Reviewed-by</code>, <code class="language-plaintext highlighter-rouge">Acked-by</code> ve <code class="language-plaintext highlighter-rouge">Signed-off-by</code> satırları da kararın sosyal tarihçesini görünür kılar. Böylece tartışmalı bir karar geriye dönük olarak incelenebilir; bu, demokratik kurumların hesap verebilirlik ilkesine benzer.</p>

<table>
  <thead>
    <tr>
      <th>Siyasi katılım kavramı</th>
      <th>Linux çekirdeğindeki karşılığı</th>
      <th>Gücü</th>
      <th>Riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temsili demokrasi</td>
      <td>Alt sistem bakımcıları</td>
      <td>Hızlı uzmanlaşmış kararlar</td>
      <td>Bakımcı darboğazı</td>
    </tr>
    <tr>
      <td>Müzakereci demokrasi</td>
      <td>E-posta listesi tartışmaları</td>
      <td>Gerekçeler açıktır</td>
      <td>Yeni katılımcı için yüksek eşik</td>
    </tr>
    <tr>
      <td>Meritokrasi</td>
      <td>Sürekli, kaliteli katkı</td>
      <td>Teknik güven üretir</td>
      <td>Görünmez emek dışarıda kalabilir</td>
    </tr>
    <tr>
      <td>Federalizm</td>
      <td>Alt sistemlerin özerkliği</td>
      <td>Karmaşıklık bölünür</td>
      <td>Politikalar tutarsızlaşabilir</td>
    </tr>
  </tbody>
</table>

<p>Linux’un hiyerarşisi bu nedenle paradoksal biçimde hem merkezî hem dağıtıktır. Bir sürücü alt sisteminin bakımcısı kendi alanında yüksek özerkliğe sahiptir; ancak değişiklikler sonunda üst düzey bakımcıların ve çekirdek sürüm yöneticisinin ağacına akar. Bu yapı, federal devletlerdeki yerel yönetim–merkez ilişkisini andırır. Yetki, coğrafyaya göre değil, teknik sınıra göre dağıtılır.</p>

<p>Karar kalitesini basitleştirilmiş bir modelle şöyle düşünebiliriz:</p>

\[K = U \times I \times S\]

<p>Burada $K$ karar kalitesi, $U$ uzmanlık, $I$ inceleme yoğunluğu ve $S$ süreç şeffaflığıdır. Bir değişiklik çok parlak olsa bile yeterince incelenmezse ($I$ düşükse) çekirdeğe girmesi zorlaşır. Bu yaklaşım, çoğunluğun anlık tercihinden ziyade hataya dayanıklı karar üretmeyi hedefler.</p>

<p>Örneğin orta düzeyde bir katkı akışı şöyledir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Çalışma dalında değişikliği kaydet</span>
git add drivers/foo.c
git commit <span class="nt">-s</span> <span class="nt">-m</span> <span class="s2">"foo: correct timeout handling"</span>

<span class="c"># Patch serisini bakımcıya gönder</span>
git format-patch <span class="nt">-1</span> <span class="nt">--cover-letter</span>
git send-email 0000-cover-letter.patch 0001-foo-correct-timeout-handling.patch
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">-s</code> seçeneği, geliştiricinin katkı sertifikasını ekler; <code class="language-plaintext highlighter-rouge">format-patch</code> ise değişikliği e-posta ile tartışılabilir bir belgeye dönüştürür. Ardından inceleme yorumları gelir, geliştirici yeni sürüm gönderir ve bakımcı uygun bulursa değişikliği kendi dalına alır. Bu döngü, kanun tasarısının komisyonlarda olgunlaşmasına benzer; fakat burada nihai test çoğu zaman çalışan koddur.</p>

<p>Yine de Linux kusursuz bir dijital cumhuriyet değildir. Teknik dil, zaman maliyeti, sert inceleme kültürü ve kurumsal sponsorların ağırlığı katılımı eşitsizleştirebilir. “Kim konuşabilir?” sorusu kadar “kimin kod yazmaya zamanı var?” sorusu da politiktir. Açık kaynak yönetişiminin büyük dersi şudur: Açıklık, yalnızca deponun herkese açık olması değildir; itirazın duyulabildiği, kararın gerekçelendirildiği ve katkının iz bırakabildiği süreçler kurmaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Linux" /><category term="Açık Kaynak" /><category term="Yönetişim" /><category term="Demokrasi" /><category term="Git" /><summary type="html"><![CDATA[Linux çekirdeği, tek bir merkezî otoritenin yazdığı dev bir program değildir; şirket çalışanları, bağımsız geliştiriciler, akademisyenler ve donanım üreticilerinden oluşan küresel bir ağın ortak ürünüdür. Bu ağın başarısı, “herkes eşit oy kullanır” türünden saf bir demokrasiye değil; teknik uzmanlık, itibar, şeffaf müzakere ve yetki devrine dayanan karma bir yönetişim modeline dayanır. Dolayısıyla Linux’u anlamak, yalnızca C kodu okumak değil, dijital çağda katılımın nasıl örgütlenebileceğini incelemektir.]]></summary></entry><entry><title type="html">Linux’un Felsefesi: “Her Şey Bir Dosyadır” ve Zihinsel Sadelik</title><link href="https://sonsuzus.github.io/posts/linuxun-felsefesi-her-sey-bir-dosyadir-ve-zihinsel-sadelik/" rel="alternate" type="text/html" title="Linux’un Felsefesi: “Her Şey Bir Dosyadır” ve Zihinsel Sadelik" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/linuxun-felsefesi-her-sey-bir-dosyadir-ve-zihinsel-sadelik</id><content type="html" xml:base="https://sonsuzus.github.io/posts/linuxun-felsefesi-her-sey-bir-dosyadir-ve-zihinsel-sadelik/"><![CDATA[<p>Linux terminalinde bir aygıtla konuşmak, bir günlük kaydını izlemek ve bir yapılandırmayı değiştirmek çoğu zaman aynı tanıdık araçlarla yapılır: <code class="language-plaintext highlighter-rouge">cat</code>, <code class="language-plaintext highlighter-rouge">echo</code>, <code class="language-plaintext highlighter-rouge">grep</code>, <code class="language-plaintext highlighter-rouge">read</code>, <code class="language-plaintext highlighter-rouge">write</code>. Bunun arkasındaki güçlü fikir, Unix dünyasının meşhur ilkesi olan <strong>“her şey bir dosyadır”</strong> yaklaşımıdır. Elbette bu ifade teknik olarak mutlak değildir; süreçler, soketler ve aygıtlar farklı çekirdek nesneleridir. Ancak kullanıcı alanında bunların önemli bir bölümü dosya benzeri arayüzlerle temsil edilir. Bu temsil tercihi, yalnızca mühendislik zarafeti değil, bilişsel ekonominin de başarılı bir örneğidir.
``
Bilişsel ekonomi, zihnin sınırlı dikkat, bellek ve karar verme kapasitesini mümkün olan en az maliyetle kullanma eğilimidir. Yeni bir sistem öğrenirken her nesne türü için ayrı bir etkileşim modeli öğrenmek pahalıdır. Linux ise farklı kaynakları ortak bir soyutlamada buluşturarak zihinsel model sayısını azaltır. Kullanıcının temel fikri şudur: “Bir şeye erişmek istiyorsam, önce onun yolunu bulur; sonra okur, yazar veya filtrelerim.”</p>

<p>Bu sadeleştirmenin kaba bir maliyet modeli şöyle düşünülebilir:</p>

\[C_{öğrenme} \approx N_{model} \times C_{model} + N_{istisna} \times C_{istisna}\]

<p>Burada $N_{model}$ öğrenilmesi gereken etkileşim modeli sayısını, $N_{istisna}$ ise özel durumları ifade eder. Unix, her şeyi gerçekten aynı yapıya zorlamak yerine, kullanıcıya görünen katmanda $N_{model}$ değerini düşürmeyi hedefler. Sonuç: daha az komut ezberi, daha hızlı keşif ve araçlar arasında daha kolay bilgi transferi.</p>

<table>
  <thead>
    <tr>
      <th>Kaynak türü</th>
      <th>Linux’taki yaygın temsil</th>
      <th>Tanıdık işlem</th>
      <th>Zihinsel kazanç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Metin günlükleri</td>
      <td><code class="language-plaintext highlighter-rouge">/var/log/...</code></td>
      <td><code class="language-plaintext highlighter-rouge">tail</code>, <code class="language-plaintext highlighter-rouge">grep</code></td>
      <td>Olayları dosya gibi tarama</td>
    </tr>
    <tr>
      <td>Donanım aygıtı</td>
      <td><code class="language-plaintext highlighter-rouge">/dev/...</code></td>
      <td>okuma/yazma</td>
      <td>Aygıta ortak arayüz</td>
    </tr>
    <tr>
      <td>Süreç bilgisi</td>
      <td><code class="language-plaintext highlighter-rouge">/proc/...</code></td>
      <td><code class="language-plaintext highlighter-rouge">cat</code>, <code class="language-plaintext highlighter-rouge">less</code></td>
      <td>Sistem durumunu inceleme</td>
    </tr>
    <tr>
      <td>Sistem ayarları</td>
      <td><code class="language-plaintext highlighter-rouge">/sys/...</code></td>
      <td><code class="language-plaintext highlighter-rouge">read</code>, <code class="language-plaintext highlighter-rouge">echo</code></td>
      <td>Yapılandırmayı keşfetme</td>
    </tr>
  </tbody>
</table>

<p>Örneğin çalışan süreçlerin CPU istatistiklerine bakmak için özel bir grafik arayüz zorunlu değildir. <code class="language-plaintext highlighter-rouge">/proc</code> sanal dosya sistemi, çekirdeğin anlık bilgisini dosya görünümünde sunar:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># İşlemci hakkında çekirdek tarafından sunulan bilgileri gösterir</span>
<span class="nb">cat</span> /proc/cpuinfo | <span class="nb">grep</span> <span class="s2">"model name"</span> | <span class="nb">head</span> <span class="nt">-n</span> 1

<span class="c"># Bellek özetini insan tarafından okunabilir biçimde filtreler</span>
<span class="nb">grep</span> <span class="nt">-E</span> <span class="s2">"MemTotal|MemAvailable"</span> /proc/meminfo
</code></pre></div></div>

<p>Bu komutların orta düzeydeki güzelliği, veriyi üretme, filtreleme ve sunma sorumluluklarını ayırmasıdır. <code class="language-plaintext highlighter-rouge">cat</code> veriyi okur, <code class="language-plaintext highlighter-rouge">grep</code> ilgilenilen satırları seçer, <code class="language-plaintext highlighter-rouge">head</code> ise çıktıyı sınırlar. Unix felsefesindeki “bir işi iyi yap” ilkesi burada devreye girer. Büyük, her şeyi yapan tek bir uygulama yerine küçük programlar boru hattıyla birleşir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Son hata kayıtlarını seçer, zaman sırasını ters çevirir ve ilk 10 sonucu gösterir</span>
journalctl <span class="nt">-p</span> err <span class="nt">--no-pager</span> | <span class="nb">tail</span> <span class="nt">-n</span> 50 | <span class="nb">grep</span> <span class="nt">-i</span> <span class="s2">"error"</span> | <span class="nb">head</span> <span class="nt">-n</span> 10
</code></pre></div></div>

<p>Boru hattı (<code class="language-plaintext highlighter-rouge">|</code>), bilişsel açıdan bir cümle kurmaya benzer: önce veri gelir, sonra sıfatlar ve sınırlamalar eklenir. Her adım gözlemlenebilir olduğundan hata ayıklama da kolaylaşır. Komutun tamamı beklenmedik davranırsa ara parçaları tek tek çalıştırabilirsiniz.</p>

<p>Yine de ilkenin sınırları vardır. Bir aygıta <code class="language-plaintext highlighter-rouge">echo</code> ile yazmak her zaman güvenli değildir; <code class="language-plaintext highlighter-rouge">/sys</code> altındaki değerler donanım davranışını değiştirebilir. Ayrıca modern Linux’ta ağ soketleri, DBus servisleri ve konteyner katmanları dosya metaforunun ötesine geçen soyutlamalar sunar. Ama metafor hâlâ güçlüdür: karmaşıklığı yok etmez, onu yönetilebilir bir yüzeye taşır.</p>

<p>Linux’un minimalizmi, az özellik sunmak demek değildir. Asıl amaç, çok sayıda özelliği az sayıda tekrar eden fikirle kavranabilir kılmaktır. “Her şey bir dosyadır” ilkesi de bu yüzden bir teknik sloganın ötesindedir: zihnin sistemi daha az sürprizle, daha çok merakla keşfetmesini sağlayan bir tasarım sözleşmesidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Linux" /><category term="Unix felsefesi" /><category term="bilişsel ekonomi" /><summary type="html"><![CDATA[Linux terminalinde bir aygıtla konuşmak, bir günlük kaydını izlemek ve bir yapılandırmayı değiştirmek çoğu zaman aynı tanıdık araçlarla yapılır: cat, echo, grep, read, write. Bunun arkasındaki güçlü fikir, Unix dünyasının meşhur ilkesi olan “her şey bir dosyadır” yaklaşımıdır. Elbette bu ifade teknik olarak mutlak değildir; süreçler, soketler ve aygıtlar farklı çekirdek nesneleridir. Ancak kullanıcı alanında bunların önemli bir bölümü dosya benzeri arayüzlerle temsil edilir. Bu temsil tercihi, yalnızca mühendislik zarafeti değil, bilişsel ekonominin de başarılı bir örneğidir.]]></summary></entry><entry><title type="html">Root Yetkisinin Psikolojisi: Mutlak Kontrol Kullanıcıyı Nasıl Değiştirir?</title><link href="https://sonsuzus.github.io/posts/root-yetkisinin-psikolojisi-mutlak-kontrol-kullaniciyi-nasil-degistirir/" rel="alternate" type="text/html" title="Root Yetkisinin Psikolojisi: Mutlak Kontrol Kullanıcıyı Nasıl Değiştirir?" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/root-yetkisinin-psikolojisi-mutlak-kontrol-kullaniciyi-nasil-degistirir</id><content type="html" xml:base="https://sonsuzus.github.io/posts/root-yetkisinin-psikolojisi-mutlak-kontrol-kullaniciyi-nasil-degistirir/"><![CDATA[<p>Root yetkisi teknik olarak bir erişim seviyesi, psikolojik olarak ise kararların sonuçlarını doğrudan üretme gücüdür. Bir dosyayı silmek, servisi durdurmak veya güvenlik politikasını değiştirmek için onay beklemeyen kişi, zamanla sistemi yalnızca yönetilen bir yapı değil, kendi iradesinin uzantısı gibi algılayabilir. Bu algı verimliliği artırırken dikkat, sorumluluk ve risk değerlendirmesi üzerinde beklenmedik etkiler yaratır.
``</p>

<p>Unix dünyasında root, erişim kontrolünün tepesindedir: izin denetimlerini aşabilir, süreçleri sonlandırabilir ve çekirdek davranışını dolaylı biçimde etkileyebilir. Bu güç teknik açıdan <code class="language-plaintext highlighter-rouge">UID=0</code> ile temsil edilse de davranışsal sonuçları daha geniştir. Kullanıcının algıladığı kontrol seviyesi yükseldikçe, bir işlemin geri döndürülemez maliyetini küçümseme riski de artabilir.</p>

<p>Bunu basit bir risk modeliyle düşünebiliriz:</p>

\[R = P(hata) \times E(etki)\]

<p>Root kullanıcısında küçük bir komut hatasının etki değeri yüksektir. Örneğin normal kullanıcıyla yanlış dizini silmek kişisel çalışma alanını etkileyebilir; root ile aynı hata tüm sistemin kullanılmaz hâle gelmesine yol açabilir. Buna rağmen deneyimli yöneticilerde $P(hata)$ her zaman sıfıra yaklaşmaz; çünkü rutinleşme dikkati azaltabilir.</p>

<table>
  <thead>
    <tr>
      <th>Davranış boyutu</th>
      <th>Standart kullanıcı</th>
      <th>Root/yönetici kullanıcı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İşlem kapsamı</td>
      <td>Kendi alanıyla sınırlı</td>
      <td>Sistem geneline yayılabilir</td>
    </tr>
    <tr>
      <td>Hata geri alma</td>
      <td>Genellikle daha kolay</td>
      <td>Yedek, kurtarma ve kesinti gerektirebilir</td>
    </tr>
    <tr>
      <td>Kontrol hissi</td>
      <td>Kısıtlı ve görünür</td>
      <td>Yüksek, bazen yanıltıcı</td>
    </tr>
    <tr>
      <td>Karar hızı</td>
      <td>Onay ve izinlerle yavaşlar</td>
      <td>Hızlıdır; aceleciliğe açık olabilir</td>
    </tr>
    <tr>
      <td>Sorumluluk</td>
      <td>Dağıtılmış</td>
      <td>Teknik ve etik olarak yoğunlaşmış</td>
    </tr>
  </tbody>
</table>

<p>Psikolojideki <strong>kontrol yanılsaması</strong>, kişinin sonuçlar üzerindeki etkisini olduğundan büyük değerlendirmesidir. Root yetkisi bu yanılsamayı besleyebilir: Kullanıcı birçok sorunu tek komutla çözebildiği için, her sistem davranışını aynı açıklıkla öngördüğünü düşünebilir. Oysa dağıtık servisler, bağımlılıklar, yarış koşulları ve yanlış yapılandırmalar kontrolün her zaman tam olmadığını hatırlatır.</p>

<p>Bu nedenle iyi sistem yöneticiliği, “her şeyi yapabilirim” yaklaşımı değil, “yapabiliyorum; ama önce etkisini modellemeliyim” disiplinidir. Özellikle üretim ortamında komut öncesi duraklama, bilişsel bir emniyet kemeridir. Aşağıdaki kabuk örneği, yıkıcı olabilecek işlemler öncesinde hedefi görünür kılar ve açık onay ister:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/usr/bin/env bash</span>
<span class="c"># Silme işleminden önce hedefi doğrular ve kullanıcıdan açık onay alır.</span>
<span class="nv">target</span><span class="o">=</span><span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>

<span class="k">if</span> <span class="o">[[</span> <span class="nv">$EUID</span> <span class="nt">-ne</span> 0 <span class="o">]]</span><span class="p">;</span> <span class="k">then
  </span><span class="nb">echo</span> <span class="s2">"Bu işlem yönetici yetkisi gerektirir."</span>
  <span class="nb">exit </span>1
<span class="k">fi

</span><span class="nb">read</span> <span class="nt">-r</span> <span class="nt">-p</span> <span class="s2">"Silinecek hedef: </span><span class="nv">$target</span><span class="s2">. Devam? (EVET): "</span> answer
<span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$answer</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">"EVET"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
  </span><span class="nb">rm</span> <span class="nt">-rf</span> <span class="nt">--</span> <span class="s2">"</span><span class="nv">$target</span><span class="s2">"</span>
  <span class="nb">echo</span> <span class="s2">"İşlem tamamlandı."</span>
<span class="k">else
  </span><span class="nb">echo</span> <span class="s2">"İşlem iptal edildi."</span>
<span class="k">fi</span>
</code></pre></div></div>

<p>Bu betik kusursuz koruma sağlamaz; yanlış hedef girildiyse root yine siler. Ancak otomatik pilotu keser. Dikkat araştırmalarında kritik olan, kararın yavaşlatılması değil, riskli kararın bilinçli hâle getirilmesidir. Başka bir deyişle amaç sürtünme yaratmak değil, doğru noktada sürtünme yaratmaktır.</p>

<table>
  <thead>
    <tr>
      <th>Koruma yaklaşımı</th>
      <th>Psikolojik etkisi</th>
      <th>Teknik katkısı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">sudo</code> ile geçici yetki</td>
      <td>Gücün sürekli olmadığını hatırlatır</td>
      <td>Yetki süresini sınırlar</td>
    </tr>
    <tr>
      <td>Komut kaydı/audit log</td>
      <td>Hesap verebilirlik oluşturur</td>
      <td>Olay incelemesini kolaylaştırır</td>
    </tr>
    <tr>
      <td>Ayrı yönetici hesabı</td>
      <td>Günlük alışkanlığı böler</td>
      <td>Yanlışlıkla yapılan işlemleri azaltır</td>
    </tr>
    <tr>
      <td>Eşli inceleme</td>
      <td>Aşırı güveni dengeler</td>
      <td>Kritik değişiklikleri doğrular</td>
    </tr>
  </tbody>
</table>

<p>Sorumluluk algısı, yetki arttığında otomatik olarak artmaz; süreçlerle desteklenmelidir. İyi yönetici, root kabuğunu bir ödül veya statü simgesi olarak değil, yüksek etkili bir araç olarak görür. En güvenli refleks çoğu zaman komutu hemen çalıştırmak değil; ortamı, hedefi, geri dönüş planını ve logları önce kontrol etmektir. Mutlak kontrolün olgun kullanımı, sınırsız hareket etmek değil, sınırların neden gerekli olduğunu bilmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="siber güvenlik" /><category term="root yetkisi" /><category term="sistem yönetimi" /><category term="insan faktörleri" /><category term="psikoloji" /><summary type="html"><![CDATA[Root yetkisi teknik olarak bir erişim seviyesi, psikolojik olarak ise kararların sonuçlarını doğrudan üretme gücüdür. Bir dosyayı silmek, servisi durdurmak veya güvenlik politikasını değiştirmek için onay beklemeyen kişi, zamanla sistemi yalnızca yönetilen bir yapı değil, kendi iradesinin uzantısı gibi algılayabilir. Bu algı verimliliği artırırken dikkat, sorumluluk ve risk değerlendirmesi üzerinde beklenmedik etkiler yaratır.]]></summary></entry><entry><title type="html">Systemd Tartışması: Bir Init Sisteminin Nasıl İdeolojik Bir Savaş Alanına Dönüştüğü</title><link href="https://sonsuzus.github.io/posts/systemd-tartismasi-bir-init-sisteminin-nasil-ideolojik-bir-savas-alanina-donustugu/" rel="alternate" type="text/html" title="Systemd Tartışması: Bir Init Sisteminin Nasıl İdeolojik Bir Savaş Alanına Dönüştüğü" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/systemd-tartismasi-bir-init-sisteminin-nasil-ideolojik-bir-savas-alanina-donustugu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/systemd-tartismasi-bir-init-sisteminin-nasil-ideolojik-bir-savas-alanina-donustugu/"><![CDATA[<p>Linux dünyasında <code class="language-plaintext highlighter-rouge">systemd</code> tartışması, ilk bakışta önyükleme süresini, servis yönetimini ve günlük kayıtlarını ilgilendiren teknik bir ayrıntı gibi görünür. Ancak konu hızla “Unix felsefesi mi, entegre platform mu?” sorusuna; oradan da özgürlük, kontrol, gelenek ve topluluk kimliği üzerine bir mücadeleye dönüşmüştür. Bir init sisteminin neden bu kadar hararetli tartışıldığını anlamak için yalnızca kodun ne yaptığına değil, toplulukların teknolojiye yüklediği anlama da bakmak gerekir.
``</p>

<p>Bir init sistemi, çekirdek çalışmaya başladıktan sonra kullanıcı alanındaki süreçleri başlatır, servisleri izler ve kapanış sırasını yönetir. Klasik SysV init yaklaşımında bu iş, çoğunlukla sıralı kabuk betikleriyle yapılırdı. <code class="language-plaintext highlighter-rouge">systemd</code> ise servis tanımlarını birim dosyalarına taşır, bağımlılık grafikleri kurar, paralel başlatma yapar ve zamanla günlükleme, ağ yapılandırması, zaman senkronizasyonu gibi alanlara da dokunur.</p>

<p>Teorik olarak önyükleme süresi, bağımsız işlerin paralel yürütülmesiyle kabaca şöyle ifade edilebilir:</p>

\[T_{boot} \approx \max(T_1, T_2, \dots, T_n) + T_{critical}\]

<p>Sıralı yaklaşımda ise süre daha çok $\sum T_i$ davranışı gösterir. Elbette gerçek sistemlerde disk G/Ç, donanım algılama ve bağımlılıklar bu hesabı karmaşıklaştırır. Yine de <code class="language-plaintext highlighter-rouge">systemd</code> savunucularının teknik argümanı nettir: bağımlılıkları açıkça modellemek, makinenin hangi durumda olduğunu daha güvenilir biçimde yönetmeyi sağlar.</p>

<table>
  <thead>
    <tr>
      <th>Başlık</th>
      <th>Klasik init / betikler</th>
      <th>systemd yaklaşımı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Servis tanımı</td>
      <td>Kabuk betikleri</td>
      <td>Bildirimsel unit dosyaları</td>
    </tr>
    <tr>
      <td>Başlatma</td>
      <td>Çoğunlukla sıralı</td>
      <td>Bağımlılık grafiği ve paralellik</td>
    </tr>
    <tr>
      <td>Hata ayıklama</td>
      <td>Dağınık loglar, betik takibi</td>
      <td><code class="language-plaintext highlighter-rouge">systemctl</code> ve <code class="language-plaintext highlighter-rouge">journalctl</code> ile merkezi görünüm</td>
    </tr>
    <tr>
      <td>Tasarım bedeli</td>
      <td>Küçük, değiştirilebilir parçalar</td>
      <td>Daha geniş kapsam ve daha fazla bileşen</td>
    </tr>
  </tbody>
</table>

<p>Örneğin aşağıdaki unit dosyası, “servisi başlatan komut” fikrini süreç yaşam döngüsü, yeniden başlatma politikası ve hedef bağımlılığıyla birlikte tanımlar:</p>

<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[Unit]</span><span class="w">
</span><span class="py">Description</span><span class="p">=</span><span class="s">Örnek Web Uygulaması</span>
<span class="py">After</span><span class="p">=</span><span class="s">network-online.target</span>
<span class="py">Wants</span><span class="p">=</span><span class="s">network-online.target</span>
<span class="w">
</span><span class="nn">[Service]</span><span class="w">
</span><span class="py">Type</span><span class="p">=</span><span class="s">simple</span>
<span class="py">User</span><span class="p">=</span><span class="s">www-data</span>
<span class="py">WorkingDirectory</span><span class="p">=</span><span class="s">/srv/ornek-uygulama</span>
<span class="py">ExecStart</span><span class="p">=</span><span class="s">/usr/bin/python3 app.py</span>
<span class="py">Restart</span><span class="p">=</span><span class="s">on-failure</span>
<span class="py">RestartSec</span><span class="p">=</span><span class="s">3</span>
<span class="w">
</span><span class="nn">[Install]</span><span class="w">
</span><span class="py">WantedBy</span><span class="p">=</span><span class="s">multi-user.target</span>
</code></pre></div></div>

<p>Bu dosya, uygulama çökerse yeniden deneme (<code class="language-plaintext highlighter-rouge">Restart=on-failure</code>) ve ağ hazır olmadan başlatmama gibi davranışları tanımlar. Savunucular için bu, operasyonel standardizasyondur; karşıtları için ise basit bir betiğin anlaşılabilirliğinin yerini daha büyük bir çerçevenin almasıdır.</p>

<p>Tartışmanın sosyolojik tarafı burada başlar. Açık kaynak toplulukları yalnızca kullanıcı toplulukları değildir; ortak normlar, tarihsel hafıza ve statü mekanizmaları üretirler. Unix geleneğinde “tek iş yapan küçük araçlar” estetik bir tercih olmanın ötesinde, denetlenebilirlik ve kişisel egemenlik vaadidir. Bu yüzden <code class="language-plaintext highlighter-rouge">systemd</code>nin kapsamının genişlemesi, bazı kişilerce teknik kolaylık değil, mimari merkezileşme olarak okunur.</p>

<table>
  <thead>
    <tr>
      <th>Sosyolojik eksen</th>
      <th>systemd yanlısı okuma</th>
      <th>systemd eleştirel okuma</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Standardizasyon</td>
      <td>Dağıtımlar arası ortak operasyon dili</td>
      <td>Yerel tercihlerin ve çeşitliliğin aşınması</td>
    </tr>
    <tr>
      <td>Entegrasyon</td>
      <td>Daha az uyumsuz parça</td>
      <td>Tek projeye artan bağımlılık</td>
    </tr>
    <tr>
      <td>Öğrenme eğrisi</td>
      <td>Tutarlı araçlar sayesinde hızlanma</td>
      <td>Gizli karmaşıklık ve uzmanlaşma baskısı</td>
    </tr>
    <tr>
      <td>Güç</td>
      <td>Bakımı kolay ekosistem</td>
      <td>Karar gücünün merkezileşmesi</td>
    </tr>
  </tbody>
</table>

<p>Kutuplaşma, teknik maliyet-fayda hesabının kimlik sinyallerine dönüşmesiyle büyür. Basitleştirilmiş biçimde bir kişinin tutumu şöyle düşünülebilir:</p>

\[Tutum = Teknik\ fayda - Algılanan\ risk + Kimlik\ uyumu\]

<p>Buradaki “kimlik uyumu”, kişinin kendini minimalist, gelenekçi, pragmatist ya da kurumsal altyapı odaklı görmesiyle ilgilidir. Bu nedenle aynı hata kaydı sistemi bir kullanıcıya verimlilik, diğerine ise bağımsızlığın kaybı gibi görünebilir.</p>

<p>Sağlıklı sonuç, taraflardan birini cahil ya da kötü niyetli ilan etmek değildir. <code class="language-plaintext highlighter-rouge">systemd</code>, modern Linux operasyonlarında gerçek avantajlar sunar; alternatif init sistemleri de sadelik, değiştirilebilirlik ve farklı güvenlik modelleri açısından değer taşır. Asıl ders şudur: Altyapı yazılımı hiçbir zaman yalnızca altyapı değildir. Kodun mimarisi, topluluğun güç dağılımı ve özgürlük tasavvuruyla birlikte tartışılır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="systemd" /><category term="linux" /><category term="açık kaynak" /><category term="sosyoloji" /><category term="init sistemi" /><summary type="html"><![CDATA[Linux dünyasında systemd tartışması, ilk bakışta önyükleme süresini, servis yönetimini ve günlük kayıtlarını ilgilendiren teknik bir ayrıntı gibi görünür. Ancak konu hızla “Unix felsefesi mi, entegre platform mu?” sorusuna; oradan da özgürlük, kontrol, gelenek ve topluluk kimliği üzerine bir mücadeleye dönüşmüştür. Bir init sisteminin neden bu kadar hararetli tartışıldığını anlamak için yalnızca kodun ne yaptığına değil, toplulukların teknolojiye yüklediği anlama da bakmak gerekir.]]></summary></entry><entry><title type="html">Terminalin Estetiği: Komut Satırı Neden Bazı İnsanlara Huzur Veriyor?</title><link href="https://sonsuzus.github.io/posts/terminalin-estetigi-komut-satiri-neden-bazi-insanlara-huzur-veriyor/" rel="alternate" type="text/html" title="Terminalin Estetiği: Komut Satırı Neden Bazı İnsanlara Huzur Veriyor?" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/terminalin-estetigi-komut-satiri-neden-bazi-insanlara-huzur-veriyor</id><content type="html" xml:base="https://sonsuzus.github.io/posts/terminalin-estetigi-komut-satiri-neden-bazi-insanlara-huzur-veriyor/"><![CDATA[<p>Bir terminal penceresinin siyah ya da koyu renkli zemini, yanıp sönen imleci ve birkaç satır metni ilk bakışta soğuk görünebilir. Buna rağmen pek çok geliştirici, sistem yöneticisi ve meraklı kullanıcı için terminal yalnızca bir araç değildir: düzen, odak ve hatta küçük bir sığınaktır. Bunun nedeni nostalji kadar, minimal arayüzlerin zihnimizde yarattığı bilişsel ekonomi ve kontrol duygusudur.</p>

<p>``</p>

<p>Grafiksel arayüzler aynı anda çok sayıda sinyal gönderir: simgeler, araç çubukları, bildirim rozetleri, renkler, geçişler ve menüler. Terminal ise çoğunlukla tek bir ana soruya indirger: <strong>Ne yapmak istiyorsun?</strong> Kullanıcı bu soruya bir komutla cevap verir. Görsel gürültünün azalması, beynin arayüzü taramak için ayırdığı dikkati asıl probleme yönlendirebilir.</p>

<p>Bunu basit bir bilişsel yük modeliyle düşünebiliriz:</p>

\[L_{toplam} = L_{öz} + L_{dışsal} + L_{yapıcı}\]

<p>Burada $L_{öz}$ görevin kaçınılmaz zorluğunu, $L_{dışsal}$ arayüzün eklediği gereksiz yükü, $L_{yapıcı}$ ise öğrenmeye ve zihinsel model kurmaya ayrılan faydalı çabayı temsil eder. Bir dizindeki dosyayı bulmak zaten belirli bir zihinsel emek ister. Ancak hangi ikona tıklanacağını, açılan menünün nereye kaydığını veya pencerenin hangi sekmede olduğunu takip etmek ek yük yaratabilir. Terminal, doğru tasarlandığında özellikle $L_{dışsal}$ değerini düşürür.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Grafiksel arayüz</th>
      <th>Terminal</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Keşfedilebilirlik</td>
      <td>Yüksek; seçenekler görünür</td>
      <td>Başta düşük; komut bilgisi gerekir</td>
    </tr>
    <tr>
      <td>Görsel dikkat ihtiyacı</td>
      <td>Genellikle yüksek</td>
      <td>Düşük ve metin odaklı</td>
    </tr>
    <tr>
      <td>Tekrarlanabilirlik</td>
      <td>Tıklama adımlarına bağlı olabilir</td>
      <td>Komut geçmişi ve betiklerle güçlü</td>
    </tr>
    <tr>
      <td>Kontrol hissi</td>
      <td>Dolaylı, menüler aracılığıyla</td>
      <td>Doğrudan, açık talimatlarla</td>
    </tr>
    <tr>
      <td>Öğrenme eşiği</td>
      <td>Başlangıçta yumuşak</td>
      <td>Başlangıçta daha dik</td>
    </tr>
  </tbody>
</table>

<p>Terminalin huzur verici tarafı, <strong>öngörülebilirlik</strong> ile de ilgilidir. <code class="language-plaintext highlighter-rouge">ls</code> yazarsınız, dosyalar listelenir; <code class="language-plaintext highlighter-rouge">git status</code> yazarsınız, çalışma alanının durumu gelir. Aynı komut, aynı bağlamda benzer davranır. İnsan zihni belirsizliği maliyetli bulur. Bu nedenle açık neden-sonuç ilişkileri, küçük de olsa bir güvenlik hissi üretir. Komut satırında eylem ile sonuç arasındaki mesafe çoğu zaman kısadır.</p>

<p>Örneğin aşağıdaki küçük komut dizisi, bir projenin durumunu kontrol edip son değişiklikleri görmeyi hedefler:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Proje klasörüne geçer</span>
<span class="nb">cd</span> ~/projeler/ornek-uygulama

<span class="c"># Git çalışma ağacındaki değişiklikleri gösterir</span>
git status

<span class="c"># Son beş kaydı tek satırlık özetlerle listeler</span>
git log <span class="nt">--oneline</span> <span class="nt">-5</span>
</code></pre></div></div>

<p>Bu örneğin estetik değeri, renkli bir panel üretmesinde değil; niyetin okunabilir olmasındadır. Komutlar aynı zamanda bir tür belge işlevi görür. Bir ekip arkadaşınıza “şu üç komutu çalıştır” demek, ekran görüntülerindeki kırmızı okları takip ettirmekten daha aktarılabilir olabilir.</p>

<p>Elbette minimalizm her zaman huzur demek değildir. Terminalde yanlış bir komutun etkisi büyük olabilir; ayrıca komut ezberleme gereksinimi yeni başlayanlarda kaygı yaratabilir. Özellikle <code class="language-plaintext highlighter-rouge">rm</code>, izinler veya üretim ortamı işlemlerinde kontrol hissi, dikkatli olunmazsa sahte bir güvene dönüşebilir. Minimal arayüzün iyi çalışması için hata mesajlarının anlaşılır, varsayılanların güvenli ve geri alma yollarının erişilebilir olması gerekir.</p>

<p>Sonuçta terminalin çekiciliği, ekranın boş olmasından çok <strong>anlamlı biçimde boş</strong> olmasında yatar. Kullanıcıya yüz seçenek sunmak yerine, birkaç kesin araç ve net bir dil verir. Bu dil öğrenildikçe kişi yalnızca komut çalıştırmaz; bilgisayarla pazarlık etmeden, ne istediğini tarif edebildiğini hisseder. Huzur da çoğu zaman tam burada başlar: daha az dikkat dağıtıcı unsur, daha çok niyet ve daha görünür bir kontrol alanı.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="terminal" /><category term="minimalizm" /><category term="bilişsel yük" /><category term="komut satırı" /><category term="yazılım kültürü" /><summary type="html"><![CDATA[Bir terminal penceresinin siyah ya da koyu renkli zemini, yanıp sönen imleci ve birkaç satır metni ilk bakışta soğuk görünebilir. Buna rağmen pek çok geliştirici, sistem yöneticisi ve meraklı kullanıcı için terminal yalnızca bir araç değildir: düzen, odak ve hatta küçük bir sığınaktır. Bunun nedeni nostalji kadar, minimal arayüzlerin zihnimizde yarattığı bilişsel ekonomi ve kontrol duygusudur.]]></summary></entry></feed>