<?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-10T23:30: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">Açık Kaynakta Statü: Commit Sayısı Saygının Kısayolu mu?</title><link href="https://sonsuzus.github.io/posts/acik-kaynakta-statu-commit-sayisi-sayginin-kisayolu-mu/" rel="alternate" type="text/html" title="Açık Kaynakta Statü: Commit Sayısı Saygının Kısayolu mu?" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/acik-kaynakta-statu-commit-sayisi-sayginin-kisayolu-mu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/acik-kaynakta-statu-commit-sayisi-sayginin-kisayolu-mu/"><![CDATA[<p>Açık kaynak dünyası ilk bakışta çekici bir vaatte bulunur: Kodun iyiyse, katkın görünürse ve problemi çözüyorsan saygıyı hak edersin. Bu anlatı, unvanlardan çok emeğin konuştuğu bir meritokrasi hayali kurar. Fakat bir depodaki commit sayısı, bir kişinin topluluk içindeki etkisini veya saygınlığını gerçekten ölçer mi? Sosyolojik açıdan yanıt, rahatsız edici derecede karmaşıktır.</p>

<p>``</p>

<p>Meritokrasi, ödül ve statünün bireysel yetenek ile çabaya göre dağıtılması fikridir. Açık kaynakta bu fikir genellikle GitHub sinyalleriyle somutlaşır: commit, pull request, yıldız, takipçi, issue yanıtı ve review. Basitleştirilmiş bir algı modeli şöyle yazılabilir:</p>

\[S = \alpha C + \beta Q + \gamma V + \delta R\]

<p>Burada $S$ algılanan statü; $C$ katkı miktarı, $Q$ katkının kalitesi, $V$ görünürlük ve $R$ ilişkisel sermayedir. Meritokrasi anlatısı $\alpha$ ve $\beta$ katsayılarını öne çıkarır. Pratikte ise özellikle büyük projelerde $V$ ve $R$ çoğu zaman beklenenden daha belirleyicidir.</p>

<table>
  <thead>
    <tr>
      <th>Sinyal</th>
      <th>Ne ölçüyor gibi görünür?</th>
      <th>Gerçekte kaçırabileceği şey</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Commit sayısı</td>
      <td>Süreklilik ve emek</td>
      <td>Küçük değişiklikler, squash stratejileri, bakım emeği</td>
    </tr>
    <tr>
      <td>Pull request</td>
      <td>Teknik üretkenlik</td>
      <td>PR inceleme, mentorluk, topluluk arabuluculuğu</td>
    </tr>
    <tr>
      <td>Takipçi/yıldız</td>
      <td>Tanınırlık</td>
      <td>Popülerlik döngüsü ve platform görünürlüğü</td>
    </tr>
    <tr>
      <td>Maintainer yetkisi</td>
      <td>Güven ve uzmanlık</td>
      <td>Tarihsel yakınlık, erişim ve karar gücü</td>
    </tr>
  </tbody>
</table>

<p>Örneğin tek satırlık bir belge düzeltmesi teknik olarak commit sayısını artırır; ancak erişilebilirlik denetimi yapan, yeni katılımcıya sabırla rehberlik eden veya zehirli bir tartışmayı yatıştıran kişi çoğu zaman daha az görünür iz bırakır. Buna <strong>görünmez emek</strong> denir. Topluluğun sürdürülebilirliği için kritik olan bu faaliyetler, Git geçmişinde kolayca sayılmaz.</p>

<p>Statü ayrıca yalnızca üretilmez, tanınır. Pierre Bourdieu’nün sermaye yaklaşımı burada kullanışlıdır: Teknik beceri bir tür kültürel sermayeyken, tanınmış geliştiricilerle ilişki kurmak sosyal sermayedir. Konferanslarda konuşmak, doğru kanallarda görünmek ve proje tarihinin erken döneminde yer almak ise sembolik sermayeye dönüşebilir. Dolayısıyla iki geliştirici aynı kalitede yama yazsa bile, yamalarının gördüğü ilgi eşit olmayabilir.</p>

<p>Aşağıdaki küçük örnek, niceliksel metriğin neden tek başına zayıf olduğunu anlatır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">contributors</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">ad</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Deniz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">commit</span><span class="sh">"</span><span class="p">:</span> <span class="mi">80</span><span class="p">,</span> <span class="sh">"</span><span class="s">review</span><span class="sh">"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="sh">"</span><span class="s">mentorluk</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">ad</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Ece</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">commit</span><span class="sh">"</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="sh">"</span><span class="s">review</span><span class="sh">"</span><span class="p">:</span> <span class="mi">45</span><span class="p">,</span> <span class="sh">"</span><span class="s">mentorluk</span><span class="sh">"</span><span class="p">:</span> <span class="mi">18</span><span class="p">},</span>
<span class="p">]</span>

<span class="k">for</span> <span class="n">kisi</span> <span class="ow">in</span> <span class="n">contributors</span><span class="p">:</span>
    <span class="n">skor</span> <span class="o">=</span> <span class="n">kisi</span><span class="p">[</span><span class="sh">"</span><span class="s">commit</span><span class="sh">"</span><span class="p">]</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">kisi</span><span class="p">[</span><span class="sh">"</span><span class="s">review</span><span class="sh">"</span><span class="p">]</span> <span class="o">+</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">kisi</span><span class="p">[</span><span class="sh">"</span><span class="s">mentorluk</span><span class="sh">"</span><span class="p">]</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">kisi</span><span class="p">[</span><span class="sh">"</span><span class="s">ad</span><span class="sh">"</span><span class="p">],</span> <span class="n">skor</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod teknik bir “gerçek statü” hesabı değildir; yalnızca ağırlıkların politik olduğunu gösterir. Review için neden $2$, mentorluk için neden $3$ verildi? Bu kararı kim alıyor? Bir topluluğun değerleri, tam da bu katsayılarda saklıdır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantajı</th>
      <th>Riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Salt katkı sayısı</td>
      <td>Ölçmesi kolaydır</td>
      <td>Oyunlaştırılabilir ve dar görüşlüdür</td>
    </tr>
    <tr>
      <td>Teknik kalite odaklı değerlendirme</td>
      <td>Mühendislik standardını korur</td>
      <td>Bakım ve iletişim emeğini dışlayabilir</td>
    </tr>
    <tr>
      <td>Çok boyutlu katkı modeli</td>
      <td>Daha adil bir tablo sunar</td>
      <td>Değerlendirmesi zaman ve özen ister</td>
    </tr>
  </tbody>
</table>

<p>Sağlıklı bir açık kaynak topluluğu, commit sayılarını tamamen çöpe atmak zorunda değildir. Ancak onları statünün nihai kanıtı değil, bağlam isteyen bir sinyal olarak görmelidir. İyi bir proje; kod yazmayı, hata raporlamayı, inceleme yapmayı, dokümantasyonu, çeviriyi ve nazik iletişimi birlikte ödüllendirir. Gerçek meritokrasi, en çok görünenin değil, topluluğu gerçekten ileri taşıyan emeğin tanınmasıyla başlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="açık kaynak" /><category term="meritokrasi" /><category term="yazılım toplulukları" /><category term="sosyoloji" /><summary type="html"><![CDATA[Açık kaynak dünyası ilk bakışta çekici bir vaatte bulunur: Kodun iyiyse, katkın görünürse ve problemi çözüyorsan saygıyı hak edersin. Bu anlatı, unvanlardan çok emeğin konuştuğu bir meritokrasi hayali kurar. Fakat bir depodaki commit sayısı, bir kişinin topluluk içindeki etkisini veya saygınlığını gerçekten ölçer mi? Sosyolojik açıdan yanıt, rahatsız edici derecede karmaşıktır.]]></summary></entry><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">Bir Dağıtımdan Diğerine Göç Etmek: Dijital Bir Yer Değiştirme Ritüeli mi?</title><link href="https://sonsuzus.github.io/posts/bir-dagitimdan-digerine-goc-etmek-dijital-bir-yer-degistirme-ritueli-mi/" rel="alternate" type="text/html" title="Bir Dağıtımdan Diğerine Göç Etmek: Dijital Bir Yer Değiştirme Ritüeli 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/bir-dagitimdan-digerine-goc-etmek-dijital-bir-yer-degistirme-ritueli-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/bir-dagitimdan-digerine-goc-etmek-dijital-bir-yer-degistirme-ritueli-mi/"><![CDATA[<p>Bir Linux dağıtımından diğerine geçmek, çoğu zaman yalnızca paket yöneticisini değiştirmek değildir. Fedora’dan Debian’a, Arch’tan NixOS’a ya da Ubuntu’dan openSUSE’ye giden kişi; komutlarını, hata çözme reflekslerini, masaüstü düzenini ve hatta bilgisayarıyla kurduğu güven ilişkisini yeniden müzakere eder. Bu nedenle sistem göçü, teknik bir kurulum işlemi olmanın yanında küçük ölçekli bir dijital yer değiştirme ritüelidir.</p>

<p>``</p>

<p>Bir işletim sistemi, kullanıcı için bir tür <strong>bilişsel ev</strong> üretir. Dosyaların nerede durduğunu bilmek, <code class="language-plaintext highlighter-rouge">apt</code> yazınca ne olacağını sezmek veya bir sorun çıktığında hangi topluluğa danışacağını tahmin etmek görünmez konfor alanlarıdır. Alışkanlık gücünü basitçe şöyle düşünebiliriz:</p>

\[A = f(T, R, C)\]

<p>Burada $A$ alışkanlık bağını; $T$ kullanım süresini, $R$ tekrar sıklığını ve $C$ ise çevresel tutarlılığı temsil eder. Yıllarca aynı dağıtımı kullanmak, bu değişkenleri artırır. Yeni dağıtıma geçildiğinde teknik bilgi kaybolmaz; fakat bilgiye ulaşma yolları, yani refleksler geçici olarak boşa düşer.</p>

<table>
  <thead>
    <tr>
      <th>Eski sistemdeki güven hissi</th>
      <th>Yeni sistemdeki karşılığı</th>
      <th>Kullanıcının duygusu</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bilinen paket yöneticisi</td>
      <td>Yeni komut sözdizimi</td>
      <td>Tereddüt</td>
    </tr>
    <tr>
      <td>Ezberlenmiş dosya yolları</td>
      <td>Farklı varsayılanlar</td>
      <td>Yön kaybı</td>
    </tr>
    <tr>
      <td>Tanıdık topluluk ve wiki</td>
      <td>Yeni dokümantasyon kültürü</td>
      <td>Yabancılık</td>
    </tr>
    <tr>
      <td>Oturmuş masaüstü akışı</td>
      <td>Yeniden yapılandırma</td>
      <td>Kontrol arayışı</td>
    </tr>
  </tbody>
</table>

<p>Örneğin <code class="language-plaintext highlighter-rouge">apt</code>, <code class="language-plaintext highlighter-rouge">dnf</code> ve <code class="language-plaintext highlighter-rouge">pacman</code> aynı temel işi yapar: paketleri yönetir. Yine de kullanıcının zihninde bunlar eşdeğer düğmeler değildir. Her biri farklı çıktı biçimleri, çözümleme davranışları ve hata mesajlarıyla ayrı bir karakter kazanır. Bu yüzden göç sırasında yaşanan sürtünme, sadece öğrenme maliyeti değil, <strong>alışılmış geri bildirimlerin kaybıdır</strong>.</p>

<p>Aşağıdaki küçük betik, geçiş öncesi kişisel yapılandırmaları yedeklemek için kullanılabilir. Teknik olarak basit görünse de ritüel değeri yüksektir: Eski dijital evden taşınacak eşyaları seçer.</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"># Temel kullanıcı yapılandırmalarını tarih damgalı bir arşive alır.</span>
<span class="nb">set</span> <span class="nt">-e</span>

<span class="nv">DATE</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +%Y-%m-%d<span class="si">)</span>
<span class="nv">BACKUP</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/migration-backup-</span><span class="nv">$DATE</span><span class="s2">"</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="s2">"</span><span class="nv">$BACKUP</span><span class="s2">"</span>

<span class="k">for </span>item <span class="k">in</span> .bashrc .gitconfig .config .ssh<span class="p">;</span> <span class="k">do
  if</span> <span class="o">[</span> <span class="nt">-e</span> <span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/</span><span class="nv">$item</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
    </span><span class="nb">cp</span> <span class="nt">-a</span> <span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/</span><span class="nv">$item</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$BACKUP</span><span class="s2">/"</span>
    <span class="nb">echo</span> <span class="s2">"Yedeklendi: </span><span class="nv">$item</span><span class="s2">"</span>
  <span class="k">fi
done

</span><span class="nb">tar</span> <span class="nt">-czf</span> <span class="s2">"</span><span class="nv">$BACKUP</span><span class="s2">.tar.gz"</span> <span class="nt">-C</span> <span class="s2">"</span><span class="nv">$HOME</span><span class="s2">"</span> <span class="s2">"</span><span class="si">$(</span><span class="nb">basename</span> <span class="s2">"</span><span class="nv">$BACKUP</span><span class="s2">"</span><span class="si">)</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"Arşiv hazır: </span><span class="nv">$BACKUP</span><span class="s2">.tar.gz"</span>
</code></pre></div></div>

<p>Ancak her şeyi taşımak her zaman iyi fikir değildir. Eski yapılandırmalar, yeni sistemin felsefesiyle çatışabilir. Özellikle NixOS gibi bildirgesel yapılandırmayı önceleyen sistemlerde, yıllarca birikmiş elle yapılmış ayarlar yerine tekrarlanabilir bir konfigürasyon tanımlamak daha değerlidir. Göçün başarısı, eski düzeni kusursuz kopyalamakla değil; hangi alışkanlıkların gerçekten gerekli olduğunu ayırt etmekle ölçülür.</p>

<table>
  <thead>
    <tr>
      <th>Göç yaklaşımı</th>
      <th>Avantajı</th>
      <th>Riski</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bire bir kopyalama</td>
      <td>Hızlı tanışıklık hissi</td>
      <td>Eski sorunları taşımak</td>
    </tr>
    <tr>
      <td>Sıfırdan kurulum</td>
      <td>Temiz ve tutarlı başlangıç</td>
      <td>Üretkenlikte geçici düşüş</td>
    </tr>
    <tr>
      <td>Seçici taşıma</td>
      <td>Esneklik ve bilinçli sadeleşme</td>
      <td>Daha fazla karar verme yükü</td>
    </tr>
  </tbody>
</table>

<p>Kimlik boyutu burada belirginleşir. “Arch kullanıcısıyım” ya da “Debian kararlılığını severim” cümleleri, araç tercihinden fazlasını anlatır: öğrenme biçimi, risk toleransı ve toplulukla ilişki biçimi hakkında ipucu verir. Dağıtım değiştirmek bazen bu kimlik etiketini bırakmak, bazen de onu daha bilinçli yeniden kurmaktır.</p>

<p>Sonuçta dijital göçte kaybedilen şey çoğunlukla dosyalar değil, otomatikleşmiş küçük davranışlardır. Kazanılan şey ise yeni bir sistemden çok, kendi çalışma düzenine dışarıdan bakabilme fırsatıdır. En iyi geçiş planı; yedek alan, not tutan, eski alışkanlıkları sorgulayan ve ilk hafta biraz kaybolmayı normal kabul eden plandır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Linux" /><category term="dağıtım" /><category term="dijital kimlik" /><category term="alışkanlıklar" /><category term="sistem yönetimi" /><summary type="html"><![CDATA[Bir Linux dağıtımından diğerine geçmek, çoğu zaman yalnızca paket yöneticisini değiştirmek değildir. Fedora’dan Debian’a, Arch’tan NixOS’a ya da Ubuntu’dan openSUSE’ye giden kişi; komutlarını, hata çözme reflekslerini, masaüstü düzenini ve hatta bilgisayarıyla kurduğu güven ilişkisini yeniden müzakere eder. Bu nedenle sistem göçü, teknik bir kurulum işlemi olmanın yanında küçük ölçekli bir dijital yer değiştirme ritüelidir.]]></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">Kernel Panic Anının Fenomenolojisi: Bir Sistemin Çökmesini İzlemek Neden Rahatsız Eder?</title><link href="https://sonsuzus.github.io/posts/kernel-panic-aninin-fenomenolojisi-bir-sistemin-cokmesini-izlemek-neden-rahatsiz-eder/" rel="alternate" type="text/html" title="Kernel Panic Anının Fenomenolojisi: Bir Sistemin Çökmesini İzlemek Neden Rahatsız Eder?" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kernel-panic-aninin-fenomenolojisi-bir-sistemin-cokmesini-izlemek-neden-rahatsiz-eder</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kernel-panic-aninin-fenomenolojisi-bir-sistemin-cokmesini-izlemek-neden-rahatsiz-eder/"><![CDATA[<p>Bir kernel panic ekranı teknik olarak yalnızca işletim sisteminin devam etmenin güvenli olmadığına karar verdiği andır. Fakat ekrana düşen anlaşılmaz adresler, donmuş imleç ve tepki vermeyen klavye; kullanıcıda basit bir hata mesajından çok daha güçlü bir his uyandırır: Kontrol kaybı. Bu deneyim, dijital araçlarla kurduğumuz ilişkinin ne kadar duygusal ve bedensel olabildiğini gösterir.</p>

<p>``</p>

<p>Kernel panic, çekirdeğin kritik bir tutarsızlık, erişilemeyen bellek alanı ya da onarılamaz bir sürücü hatası tespit ettiğinde sistemi durdurmasıdır. Bu durma aslında koruyucu bir mekanizmadır: Bozuk durumda çalışmaya devam etmek veriyi daha fazla riske atabilir. Ancak kullanıcı açısından görünür olan şey koruma değil, ani kesintidir. Bir saniye önce düzenlenmekte olan belge, çalışan derleme süreci veya açık oyun vardır; sonraki saniye ise sistem artık pazarlık kabul etmez.</p>

<p>Bu rahatsızlığın ilk kaynağı <strong>öngörülebilirlik ihlalidir</strong>. İnsanlar karmaşık sistemlerle çalışırken bile zihinsel modeller kurar: “Kaydedersem dosya korunur”, “Fare hareket ediyorsa bilgisayar çalışıyordur”, “Yeniden başlatmak sorunu çözer.” Panic bu modelin dışına taşar. Kullanıcı, giriş aygıtlarına komut verdiği ama sonuç alamadığı bir geri bildirim döngüsünde kalır.</p>

<p>Basitleştirilmiş biçimde, algılanan kontrolü şöyle düşünebiliriz:</p>

\[C = \frac{E \times G}{B}\]

<p>Burada $C$ algılanan kontrolü, $E$ kullanıcının eylem seçeneklerini, $G$ eylemlerden alınan geri bildirimin güvenilirliğini, $B$ ise belirsizliği temsil eder. Kernel panic anında $E$ neredeyse sıfıra iner; tıklama, kısayol ve terminal komutu etkisizdir. Geri bildirim de donduğu için $G$ azalır, belirsizlik $B$ yükselir. Sonuç: kontrol hissi dramatik biçimde çöker.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Kullanıcının beklentisi</th>
      <th>Sistemden gelen sinyal</th>
      <th>Psikolojik sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Uygulama çöktü</td>
      <td>Uygulamayı kapatıp açabilirim</td>
      <td>İşletim sistemi çalışır</td>
      <td>Sınırlı ama sürdürülen kontrol</td>
    </tr>
    <tr>
      <td>Sistem yavaşladı</td>
      <td>Bekler, görev yöneticisini açarım</td>
      <td>Gecikmeli yanıt</td>
      <td>Sabırsızlık ve endişe</td>
    </tr>
    <tr>
      <td>Kernel panic</td>
      <td>Ne yapacağımı bilmiyorum</td>
      <td>Tam veya kritik yanıt kaybı</td>
      <td>Çaresizlik, tehdit algısı</td>
    </tr>
  </tbody>
</table>

<p>İkinci kaynak, <strong>emeğin görünmezliği</strong>dir. Bir geliştirici için panic yalnızca makinenin kapanması değildir; kaydedilmemiş değişiklikler, yarıda kalan testler, yeniden kurulacak bağlam ve bozulmuş akış demektir. Özellikle “flow” hâlinde çalışırken kişi problemin zihinsel haritasını aktif belleğinde taşır. Çöküş, dosyayı değil bu bağlamı da keser. Yeniden başlatma süresi kısa olsa bile işe zihinsel geri dönüş maliyeti yüksek olabilir.</p>

<p>Bu maliyet kabaca şu şekilde modellenebilir:</p>

\[T_{geri\ dönüş} = T_{boot} + T_{ortam} + T_{bağlam}\]

<p>Çoğu zaman en pahalı terim, işletim sisteminin açılış süresi değil $T_{bağlam}$, yani “Neredeydim, sıradaki hipotezim neydi?” sorularına yeniden cevap verme süresidir.</p>

<p>Teknik ekiplerin panic sonrasında ilk işi duygusal tepkiyi bastırmak değil, belirsizliği azaltmaktır. Örneğin Linux üzerinde önceki açılışın kritik günlüklerini incelemek, olayın kişisel bir beceriksizlik değil, gözlemlenebilir bir sistem durumu olduğunu hatırlatır:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Bir önceki açılıştaki çekirdek kayıtlarında hata seviyesini filtreler</span>
journalctl <span class="nt">-k</span> <span class="nt">-b</span> <span class="nt">-1</span> <span class="nt">-p</span> err

<span class="c"># Donanım veya sürücü ipuçları için son çekirdek mesajlarını gösterir</span>
dmesg <span class="nt">--level</span><span class="o">=</span>err,warn | <span class="nb">tail</span> <span class="nt">-n</span> 50
</code></pre></div></div>

<p>Bu komutlar sorunu sihirli biçimde çözmez; ama belirsiz “bilgisayar öldü” anlatısını sürücü, bellek, disk veya çekirdek modülü gibi test edilebilir hipotezlere dönüştürür. Psikolojik açıdan bu dönüşüm değerlidir: Ajans duygusu geri gelir.</p>

<table>
  <thead>
    <tr>
      <th>Müdahale</th>
      <th>Teknik etkisi</th>
      <th>Duygusal etkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Otomatik kayıt</td>
      <td>Veri kaybını azaltır</td>
      <td>Kaybetme korkusunu düşürür</td>
    </tr>
    <tr>
      <td>Yedek ve sürüm kontrolü</td>
      <td>Geri dönüş noktası sağlar</td>
      <td>Hata toleransını artırır</td>
    </tr>
    <tr>
      <td>Log toplama</td>
      <td>Nedene dair kanıt üretir</td>
      <td>Belirsizliği azaltır</td>
    </tr>
    <tr>
      <td>Olay sonrası not alma</td>
      <td>Tekrar eden örüntüleri yakalar</td>
      <td>Kaosu anlatıya dönüştürür</td>
    </tr>
  </tbody>
</table>

<p>Kernel panic’in rahatsız edici yanı, makinenin hata vermesi değil; alıştığımız karşılıklılık sözleşmesini aniden bozmasıdır. Yine de iyi gözlemlenmiş loglar, düzenli kayıt alışkanlığı ve geri dönüş planı bu anı felaket olmaktan çıkarır. Sistem çökerken kontrol tamamen kaybolmaz; yalnızca fareden, klavyeden ve anlık müdahaleden tanılama, hazırlık ve öğrenme araçlarına taşınır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="kernel panic" /><category term="psikoloji" /><category term="sistem yönetimi" /><summary type="html"><![CDATA[Bir kernel panic ekranı teknik olarak yalnızca işletim sisteminin devam etmenin güvenli olmadığına karar verdiği andır. Fakat ekrana düşen anlaşılmaz adresler, donmuş imleç ve tepki vermeyen klavye; kullanıcıda basit bir hata mesajından çok daha güçlü bir his uyandırır: Kontrol kaybı. Bu deneyim, dijital araçlarla kurduğumuz ilişkinin ne kadar duygusal ve bedensel olabildiğini gösterir.]]></summary></entry><entry><title type="html">Konteyner Devrimi: Docker Linux’u Nasıl Yeniden İcat Etti?</title><link href="https://sonsuzus.github.io/posts/konteyner-devrimi-docker-linuxu-nasil-yeniden-icat-etti/" rel="alternate" type="text/html" title="Konteyner Devrimi: Docker Linux’u Nasıl Yeniden İcat Etti?" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/konteyner-devrimi-docker-linuxu-nasil-yeniden-icat-etti</id><content type="html" xml:base="https://sonsuzus.github.io/posts/konteyner-devrimi-docker-linuxu-nasil-yeniden-icat-etti/"><![CDATA[<p>Docker, Linux’a yeni bir çekirdek eklemedi; daha ilginç bir şey yaptı: Çekirdeğin yıllardır sunduğu izolasyon mekanizmalarını geliştiricinin günlük iş akışına taşıdı. Böylece “benim makinemde çalışıyor” cümlesi, yazılım dünyasının en meşhur mazeretlerinden biri olmaktan çıkmaya başladı. Konteynerler, uygulamayı kodu, bağımlılıkları, çalışma zamanı ve yapılandırmasıyla birlikte paketleyerek işletim sistemi tasarımına daha modüler bir bakış getirdi.
``</p>

<h2 id="sanal-makine-mi-konteyner-mi">Sanal makine mi, konteyner mi?</h2>

<p>Klasik sanallaştırmada bir hipervizör üzerinde birden fazla sanal makine (VM) çalışır. Her VM, kendi misafir işletim sistemi çekirdeğine, sürücülerine ve kullanıcı alanına sahiptir. Bu yaklaşım güçlü bir izolasyon sağlar; ancak her makinenin ayrı bir işletim sistemi yüklemesi maliyetlidir.</p>

<p>Docker konteynerleri ise ana makinenin Linux çekirdeğini paylaşır. Her konteyner, kullanıcı alanında bağımsız bir Linux sistemi gibi görünür; fakat gerçek anlamda ayrı bir çekirdek çalıştırmaz. Bu nedenle açılış süreleri saniyelerden milisaniyelere iner ve aynı donanım üzerinde çok daha fazla iş yükü barındırılabilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Sanal Makine</th>
      <th>Docker Konteyneri</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Çekirdek</td>
      <td>Her VM için ayrı</td>
      <td>Ana makineyle ortak</td>
    </tr>
    <tr>
      <td>Başlatma süresi</td>
      <td>Saniyeler veya dakikalar</td>
      <td>Milisaniyeler veya saniyeler</td>
    </tr>
    <tr>
      <td>Kaynak maliyeti</td>
      <td>Daha yüksek</td>
      <td>Daha düşük</td>
    </tr>
    <tr>
      <td>İzolasyon seviyesi</td>
      <td>Çok güçlü</td>
      <td>Çekirdek paylaşımı nedeniyle göreli</td>
    </tr>
    <tr>
      <td>Taşınabilirlik</td>
      <td>Disk imajı odaklı</td>
      <td>İmaj katmanları odaklı</td>
    </tr>
  </tbody>
</table>

<p>Bu farkı kabaca şöyle düşünebiliriz: Bir sunucunun kullanılabilir kaynağı $R$ ve tek bir iş yükünün ihtiyacı $r$ olsun. Sanal makinede işletim sistemi ek yükü $o_{vm}$ iken konteynerde bu maliyet $o_c$ olur. Yaklaşık kapasite:</p>

\[N_{vm} = \left\lfloor \frac{R}{r + o_{vm}} \right\rfloor, \qquad N_c = \left\lfloor \frac{R}{r + o_c} \right\rfloor\]

<p>Genellikle $o_c \ll o_{vm}$ olduğundan, konteyner yoğunluğu daha yüksektir.</p>

<h2 id="dockerın-linux-sihri-namespace-ve-cgroup">Docker’ın Linux sihri: namespace ve cgroup</h2>

<p>Docker’ın “her uygulama kendi makinesindeymiş gibi” davranmasını sağlayan iki temel Linux özelliği vardır. <strong>Namespace</strong>‘ler süreçlerin gördüğü dünyayı ayırır: işlem kimlikleri (PID), ağ arabirimleri, kullanıcılar, dosya sistemi bağlama noktaları ve IPC kaynakları ayrı görünür. Bir konteynerdeki süreç, dışarıdaki yüzlerce süreci göremez.</p>

<p><strong>Control group</strong> ya da cgroup’lar ise kaynak tüketimini düzenler. Bir uygulamaya kaç CPU döngüsü, ne kadar bellek veya ne kadar disk I/O verileceğini belirleyebilirsiniz. Örneğin bir servis tüm belleği tüketip komşu servisleri deviremesin diye limit koymak mümkündür.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Nginx'i arka planda çalıştırır ve belleği 256 MB ile sınırlar</span>
docker run <span class="nt">-d</span> <span class="se">\</span>
  <span class="nt">--name</span> web-gateway <span class="se">\</span>
  <span class="nt">--memory</span><span class="o">=</span>256m <span class="se">\</span>
  <span class="nt">-p</span> 8080:80 <span class="se">\</span>
  nginx:alpine
</code></pre></div></div>

<p>Bu komutta Docker, imajı katmanlardan oluşturur, yeni namespace’ler üretir ve cgroup üzerinden bellek sınırını uygular. <code class="language-plaintext highlighter-rouge">-p 8080:80</code> ise ana makinenin 8080 numaralı portunu konteyner içindeki 80 numaralı porta bağlar.</p>

<h2 id="i̇maj-katmanları-tekrarın-önündeki-akıllı-engel">İmaj katmanları: tekrarın önündeki akıllı engel</h2>

<p>Docker imajları tek parça dev diskler değildir; katmanlı dosya sistemi kullanırlar. Bir <code class="language-plaintext highlighter-rouge">FROM python:3.12-slim</code> satırı, daha önce indirilmiş katmanlardan yararlanabilir. Aynı tabanı kullanan on farklı uygulama, taban katmanını on kez saklamak zorunda kalmaz.</p>

<div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">FROM</span><span class="s"> python:3.12-slim</span>
<span class="k">WORKDIR</span><span class="s"> /app</span>
<span class="k">COPY</span><span class="s"> requirements.txt .</span>
<span class="k">RUN </span>pip <span class="nb">install</span> <span class="nt">--no-cache-dir</span> <span class="nt">-r</span> requirements.txt
<span class="k">COPY</span><span class="s"> . .</span>
<span class="k">CMD</span><span class="s"> ["python", "app.py"]</span>
</code></pre></div></div>

<p>Bu Dockerfile’ın önemli noktası sıralamasıdır: Bağımlılık listesi önce kopyalanır. Uygulama kodu değişse bile <code class="language-plaintext highlighter-rouge">requirements.txt</code> değişmediyse Docker bağımlılık katmanını önbellekten kullanabilir. Bu, derleme sürelerini ciddi biçimde azaltır.</p>

<h2 id="i̇şletim-sistemi-tasarımına-etkisi">İşletim sistemi tasarımına etkisi</h2>

<p>Docker, Linux’u tek bir büyük sunucu olarak değil, paylaşılabilir bir uygulama çalıştırma platformu olarak düşünmemizi sağladı. Süreç izolasyonu, kaynak kotaları ve deklaratif imajlar; mikroservisler, CI/CD hatları ve Kubernetes gibi orkestrasyon araçlarının temelini oluşturdu. Yine de konteyner bir güvenlik duvarı değildir: çekirdek ortak olduğu için güncel imajlar, en az yetki ilkesi ve güvenlik profilleri kritik önem taşır. Konteyner devriminin asıl başarısı, Linux’un eski ama güçlü yapıtaşlarını modern yazılım üretiminin ortak diline çevirmesidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Docker" /><category term="Linux" /><category term="Konteyner" /><category term="Sanallaştırma" /><category term="DevOps" /><summary type="html"><![CDATA[Docker, Linux’a yeni bir çekirdek eklemedi; daha ilginç bir şey yaptı: Çekirdeğin yıllardır sunduğu izolasyon mekanizmalarını geliştiricinin günlük iş akışına taşıdı. Böylece “benim makinemde çalışıyor” cümlesi, yazılım dünyasının en meşhur mazeretlerinden biri olmaktan çıkmaya başladı. Konteynerler, uygulamayı kodu, bağımlılıkları, çalışma zamanı ve yapılandırmasıyla birlikte paketleyerek işletim sistemi tasarımına daha modüler bir bakış getirdi.]]></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></feed>