<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-10T00:05:40+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Açık Kaynak Çeviri Üçlüsü: LibreTranslate, Argos Translate ve Apertium</title><link href="https://program.sonsuz.us/posts/acik-kaynak-ceviri-uclusu-libretranslate-argos-translate-ve-apertium/" rel="alternate" type="text/html" title="Açık Kaynak Çeviri Üçlüsü: LibreTranslate, Argos Translate ve Apertium" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/acik-kaynak-ceviri-uclusu-libretranslate-argos-translate-ve-apertium</id><content type="html" xml:base="https://program.sonsuz.us/posts/acik-kaynak-ceviri-uclusu-libretranslate-argos-translate-ve-apertium/"><![CDATA[<p><img src="/img/acik-kaynak-ceviri-19.svg" alt="acik-kaynak-ceviri-19" /></p>

<p>Bir metni başka bir dile çevirmek kolay görünür: kelimeyi bul, karşılığını yaz, kahveni yudumla! Gerçekteyse dil; bağlam, sözcük sırası, çekim ve kültürel ifadelerle dolu karmaşık bir sistemdir. Açık kaynak dünyasında LibreTranslate, Argos Translate ve Apertium bu probleme farklı katmanlardan yaklaşır. Biri kullanışlı bir web API’si sunarken diğeri çevrimdışı sinir ağı modellerine, ötekiyse dilbilgisi kurallarına güvenir.</p>

<p>``</p>

<h2 id="makine-çevirisinin-temel-mantığı">Makine çevirisinin temel mantığı</h2>

<p>Makine çevirisi sistemleri genel olarak <strong>kural tabanlı</strong>, <strong>istatistiksel</strong> veya <strong>sinir ağı tabanlı</strong> çalışır. Kural tabanlı yöntemde kaynak cümle sözcük ve biçimbirimlerine ayrılır; ardından sözlükler ile dilbilgisi kuralları uygulanır. Sinir ağı tabanlı yöntemdeyse model, bütün cümlenin bağlamını sayısal vektörlerle temsil ederek hedef cümleyi üretir.</p>

<p>Bir sinir ağı modelinde en olası çeviri basitleştirilmiş biçimde şöyle aranır:</p>

\[\hat{Y} = \arg\max_Y P(Y \mid X)\]

<p>Burada $X$ kaynak cümleyi, $Y$ olası hedef cümleyi ve $\hat{Y}$ modelin seçtiği çeviriyi ifade eder. Model yalnızca kelime karşılıklarını değil, hedef dilde doğal görünme olasılığını da hesaba katar.</p>

<h2 id="üç-araç-arasındaki-farklar">Üç araç arasındaki farklar</h2>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Temel yaklaşım</th>
      <th style="text-align: right">Çevrimdışı kullanım</th>
      <th>Güçlü yanı</th>
      <th>Uygun senaryo</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>LibreTranslate</td>
      <td>Argos tabanlı sinirsel çeviri ve HTTP API</td>
      <td style="text-align: right">Evet</td>
      <td>Web servislerine kolay entegrasyon</td>
      <td>Uygulama ve mikroservisler</td>
    </tr>
    <tr>
      <td>Argos Translate</td>
      <td>OpenNMT tabanlı sinirsel modeller</td>
      <td style="text-align: right">Evet</td>
      <td>Yerel ve gizlilik odaklı çalışma</td>
      <td>Masaüstü araçları, otomasyon</td>
    </tr>
    <tr>
      <td>Apertium</td>
      <td>Kural tabanlı makine çevirisi</td>
      <td style="text-align: right">Evet</td>
      <td>Dil yapısının denetlenebilmesi</td>
      <td>Özellikle yakın akraba diller</td>
    </tr>
  </tbody>
</table>

<h3 id="libretranslate">LibreTranslate</h3>

<p>LibreTranslate, kendi sunucunuza kurabileceğiniz açık kaynaklı bir çeviri API’sidir. Tarayıcı arayüzü bulunsa da asıl yıldızı REST API desteğidir. Verilerin üçüncü taraf bir servise gönderilmemesi; şirket içi belgeler, kişisel notlar ve eğitim projeleri için önemli bir avantajdır.</p>

<p>Aşağıdaki Python kodu, çalışan bir LibreTranslate sunucusuna istek gönderir:</p>

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

<span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">q</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Açık kaynak yazılımlar özgürlük sağlar.</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">source</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">tr</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">target</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">en</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">format</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">text</span><span class="sh">"</span>
<span class="p">}</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span>
    <span class="sh">"</span><span class="s">http://localhost:5000/translate</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span>
    <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span>
<span class="p">)</span>

<span class="n">response</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="nf">json</span><span class="p">()[</span><span class="sh">"</span><span class="s">translatedText</span><span class="sh">"</span><span class="p">])</span>
</code></pre></div></div>

<p>Kod, kaynak metni ve dil kodlarını JSON olarak API’ye yollar; dönen sonuçtan çevrilmiş metni çıkarır. Üretim ortamında zaman aşımı, kimlik doğrulama ve hata yönetimi ayrıca planlanmalıdır.</p>

<h3 id="argos-translate">Argos Translate</h3>

<p>Argos Translate, indirilebilir dil paketleriyle tamamen yerel çalışabilir. İnternet bağlantısı olmadan çeviri yapması hem gizlilik hem de taşınabilirlik sağlar. Ancak bir dil çiftinin desteklenmesi için uygun model paketinin kurulması gerekir. Ayrıca doğrudan bir model yoksa Türkçeden belirli bir dile çeviri, İngilizce gibi ara bir dil üzerinden gerçekleştirilebilir. Bu zincirleme yaklaşım erişimi artırırken hataları da biriktirebilir.</p>

<h3 id="apertium">Apertium</h3>

<p>Apertium’un dünyası biraz daha “dilbilim laboratuvarı” gibidir. Sistem sözlükler, biçimbirimsel çözümleyiciler ve aktarım kuralları kullanır. Özellikle İspanyolca–Katalanca gibi yapısal olarak yakın dillerde güçlü sonuçlar verebilir. Kurallar incelenebilir ve düzeltilebilir; buna karşılık yeni bir dil çifti hazırlamak ciddi dilbilim emeği ister.</p>

<h2 id="kaliteyi-nasıl-değerlendirmeli">Kaliteyi nasıl değerlendirmeli?</h2>

<p>Çeviri kalitesi yalnızca “doğru görünüyor” hissiyle ölçülmez. BLEU gibi metrikler, üretilen çevirideki sözcük dizilerini referans çevirilerle karşılaştırır. Yine de yüksek puan her zaman doğal veya anlamca kusursuz sonuç demek değildir. Deyimler, teknik terimler ve alan bilgisi için insan değerlendirmesi gereklidir.</p>

<p>Hızlı bir API ve kolay entegrasyon istiyorsanız <strong>LibreTranslate</strong>, gömülü ya da çevrimdışı bir çözüm arıyorsanız <strong>Argos Translate</strong>, kuralları denetlemek ve yakın diller üzerinde çalışmak istiyorsanız <strong>Apertium</strong> mantıklı seçimdir. Kısacası en iyi araç mutlak değildir; dil çiftine, donanıma, gizlilik beklentisine ve “bu cümle neden böyle çevrildi?” sorusuna ne kadar ayrıntılı cevap istediğinize bağlıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="çeviri" /><category term="libretranslate" /><category term="argos-translate" /><category term="apertium" /><category term="doğal-dil-işleme" /><category term="açık-kaynak" /><summary type="html"><![CDATA[Bir metni başka bir dile çevirmek kolay görünür: kelimeyi bul, karşılığını yaz, kahveni yudumla! Gerçekteyse dil; bağlam, sözcük sırası, çekim ve kültürel ifadelerle dolu karmaşık bir sistemdir. Açık kaynak dünyasında LibreTranslate, Argos Translate ve Apertium bu probleme farklı katmanlardan yaklaşır. Biri kullanışlı bir web API’si sunarken diğeri çevrimdışı sinir ağı modellerine, ötekiyse dilbilgisi kurallarına güvenir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/acik-kaynak-ceviri-19.png" /><media:content medium="image" url="https://program.sonsuz.us/img/acik-kaynak-ceviri-19.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Akış Şeması Üçlüsü: draw.io, Mermaid ve PlantUML</title><link href="https://program.sonsuz.us/posts/akis-semasi-uclusu-drawio-mermaid-ve-plantuml/" rel="alternate" type="text/html" title="Akış Şeması Üçlüsü: draw.io, Mermaid ve PlantUML" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akis-semasi-uclusu-drawio-mermaid-ve-plantuml</id><content type="html" xml:base="https://program.sonsuz.us/posts/akis-semasi-uclusu-drawio-mermaid-ve-plantuml/"><![CDATA[<p>Bir yazılım projesini anlatırken bazen yüz satır koddan daha etkili olan şey, birkaç kutu ve oktur. Akış şemaları; algoritmaları, iş süreçlerini ve sistem davranışlarını görünür hâle getirir. Peki bu şemaları fareyle mi çizmeliyiz, kodla mı üretmeliyiz? İşte bu noktada draw.io, Mermaid ve PlantUML sahneye çıkıyor.</p>

<p><img src="/img/akis-semasi-uclusu-31.svg" alt="akis-semasi-uclusu-31" /></p>

<p>``</p>
<h2 id="akış-şemasının-temel-mantığı">Akış şemasının temel mantığı</h2>

<p>Akış şeması, bir süreci <strong>düğümler</strong> ve bu düğümler arasındaki <strong>yönlendirilmiş bağlantılar</strong> ile temsil eder. Matematiksel olarak bir şemayı $G=(V,E)$ biçiminde düşünebiliriz. Burada $V$ işlem, karar veya başlangıç gibi düğümleri; $E$ ise düğümler arasındaki geçişleri ifade eder.</p>

<p>Örneğin kullanıcı girişini denetleyen bir süreçte düğümler; “bilgileri al”, “doğru mu?” ve “paneli aç” olabilir. Karar düğümünden iki farklı yol çıkması, algoritmadaki <code class="language-plaintext highlighter-rouge">if/else</code> yapısının görsel karşılığıdır.</p>

<p>Bir şemadaki olası yürütme yollarının sayısı karar noktalarıyla büyür. Her karar iki seçeneğe sahipse, kaba bir üst sınır olarak $P=2^d$ yazılabilir. Buradaki $d$, karar düğümü sayısıdır. Beş karar noktası teorik olarak $2^5=32$ farklı yol oluşturabilir. Şemalar tam da bu karmaşıklığı fark etmeyi kolaylaştırır.</p>

<h2 id="üç-aracın-kısa-karşılaştırması">Üç aracın kısa karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>draw.io</th>
      <th>Mermaid</th>
      <th>PlantUML</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kullanım biçimi</td>
      <td>Sürükle-bırak</td>
      <td>Metin tabanlı</td>
      <td>Metin tabanlı</td>
    </tr>
    <tr>
      <td>Öğrenme eşiği</td>
      <td>Düşük</td>
      <td>Düşük-orta</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Git uyumu</td>
      <td>Sınırlı-orta</td>
      <td>Çok iyi</td>
      <td>Çok iyi</td>
    </tr>
    <tr>
      <td>Hızlı görsel düzenleme</td>
      <td>Çok iyi</td>
      <td>Orta</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Diyagram çeşitliliği</td>
      <td>Çok geniş</td>
      <td>Geniş</td>
      <td>Çok geniş</td>
    </tr>
    <tr>
      <td>Dokümantasyona gömme</td>
      <td>Görsel dosyayla</td>
      <td>Doğrudan</td>
      <td>Eklenti veya çıktı ile</td>
    </tr>
  </tbody>
</table>

<h2 id="drawio-görsel-özgürlük">draw.io: Görsel özgürlük</h2>

<p>draw.io, günümüzde diagrams.net adıyla da bilinen görsel bir diyagram aracıdır. Kutuları çalışma alanına bırakır, okları bağlar ve renkleri arayüz üzerinden ayarlarsınız. Teknik sözdizimi öğrenmek istemeyen ekipler için oldukça rahattır.</p>

<p>En büyük avantajı, karmaşık yerleşimleri elle hassas biçimde düzenleyebilmenizdir. Ağ topolojileri, organizasyon şemaları ve bulut mimarileri için geniş bir şekil kütüphanesi sunar. Buna karşılık XML tabanlı dosyalarında yapılan değişiklikleri Git karşılaştırmalarında okumak pek keyifli değildir. “Kutuyu üç piksel sola aldım” değişikliği, kod incelemesinde küçük bir destana dönüşebilir.</p>

<h2 id="mermaid-markdownın-diyagram-arkadaşı">Mermaid: Markdown’ın diyagram arkadaşı</h2>

<p>Mermaid, diyagramları kısa bir metinle tanımlamanızı sağlar. GitHub ve birçok dokümantasyon sistemi tarafından desteklenmesi önemli bir avantajdır.</p>

<pre><code class="language-mermaid">flowchart TD
    A[Bilgileri al] --&gt; B{Bilgiler doğru mu?}
    B -- Evet --&gt; C[Paneli aç]
    B -- Hayır --&gt; D[Hata göster]
    D --&gt; A
</code></pre>

<p>Bu kod; giriş bilgilerini alan, doğrulama yapan ve sonuca göre yönlenen bir akış üretir. Metin tabanlı olduğu için değişiklikler Git üzerinde satır satır izlenebilir. Ancak çok büyük şemalarda otomatik yerleşim her zaman hayalinizdeki estetik sonucu vermeyebilir.</p>

<h2 id="plantuml-diyagramların-i̇sviçre-çakısı">PlantUML: Diyagramların İsviçre çakısı</h2>

<p>PlantUML; akışların yanında sınıf, sıra, durum ve bileşen diyagramları üretmekte güçlüdür. Sözdizimi Mermaid’e göre biraz daha ayrıntılıdır, fakat büyük yazılım sistemlerinde daha fazla kontrol sağlar.</p>

<pre><code class="language-plantuml">@startuml
start
:Bilgileri al;
if (Bilgiler doğru mu?) then (Evet)
  :Paneli aç;
else (Hayır)
  :Hata göster;
endif
stop
@enduml
</code></pre>

<p>Burada <code class="language-plaintext highlighter-rouge">start</code> ve <code class="language-plaintext highlighter-rouge">stop</code> sürecin sınırlarını, <code class="language-plaintext highlighter-rouge">if</code> bloğu karar noktasını, iki nokta arasındaki ifadeler ise işlem adımlarını belirtir. Kod dokümantasyon deposunda saklanabilir ve otomatik derleme süreçlerinde PNG veya SVG çıktısına dönüştürülebilir.</p>

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

<p>Toplantıda hızlıca kutu çizmek, özel ikonlar kullanmak ve görsel kontrolü tamamen elinizde tutmak istiyorsanız <strong>draw.io</strong> iyi seçimdir. README veya teknik belgelerde küçük ve sürümlenebilir şemalar gerekiyorsa <strong>Mermaid</strong> daha pratiktir. UML ağırlıklı, kapsamlı ve otomatik üretilecek mimari dokümantasyon içinse <strong>PlantUML</strong> öne çıkar.</p>

<p>Kısacası en iyi araç mutlak değildir: Şemanız sunum odaklıysa fareyi, dokümantasyon odaklıysa kodu seçin. Hatta ekipler çoğu zaman ilk taslağı draw.io ile hazırlayıp kalıcı teknik belgeyi Mermaid veya PlantUML ile yeniden üreterek üç dünyanın da avantajından yararlanabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="akış şeması" /><category term="draw.io" /><category term="mermaid" /><category term="plantuml" /><category term="diyagram" /><category term="yazılım tasarımı" /><summary type="html"><![CDATA[Bir yazılım projesini anlatırken bazen yüz satır koddan daha etkili olan şey, birkaç kutu ve oktur. Akış şemaları; algoritmaları, iş süreçlerini ve sistem davranışlarını görünür hâle getirir. Peki bu şemaları fareyle mi çizmeliyiz, kodla mı üretmeliyiz? İşte bu noktada draw.io, Mermaid ve PlantUML sahneye çıkıyor.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akis-semasi-uclusu-31.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akis-semasi-uclusu-31.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bağış Toplama Sistemleri Karşılaştırması: CiviCRM, GiveWP ve Open Collective</title><link href="https://program.sonsuz.us/posts/bagis-toplama-sistemleri-karsilastirmasi-civicrm-givewp-ve-open-collective/" rel="alternate" type="text/html" title="Bağış Toplama Sistemleri Karşılaştırması: CiviCRM, GiveWP ve Open Collective" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bagis-toplama-sistemleri-karsilastirmasi-civicrm-givewp-ve-open-collective</id><content type="html" xml:base="https://program.sonsuz.us/posts/bagis-toplama-sistemleri-karsilastirmasi-civicrm-givewp-ve-open-collective/"><![CDATA[<p>Bir bağış sistemi seçmek, web sitesine yalnızca renkli bir “Destek Ol” düğmesi eklemekten çok daha fazlasıdır. Bağışçı ilişkileri, ödeme altyapısı, kampanya takibi, şeffaflık ve raporlama gibi parçalar doğru biçimde birleşmelidir. CiviCRM, GiveWP ve Open Collective aynı amaca hizmet ediyor gibi görünse de farklı organizasyon modellerine hitap eder: biri kapsamlı bir ilişki yönetim sistemi, biri WordPress odaklı bağış eklentisi, diğeri ise şeffaf topluluk finansmanı platformudur.</p>

<p>``</p>

<h2 id="önce-temel-mantık-bağış-sistemi-nasıl-çalışır">Önce temel mantık: Bağış sistemi nasıl çalışır?</h2>

<p>Tipik bir bağış akışı; bağışçı, form, ödeme sağlayıcısı, işlem kaydı ve raporlama katmanlarından oluşur. Kullanıcı formu doldurduğunda sistem ödeme sağlayıcısına bir istek gönderir. Başarılı işlem sonrasında bağış kaydedilir, makbuz oluşturulur ve gerekiyorsa bağışçıya otomatik e-posta gönderilir.</p>

<p>Bir kampanyanın net geliri basitçe şöyle modellenebilir:</p>

\[G_{net} = G_{brüt} - (G_{brüt} \times o_{komisyon}) - M_{sabit} - G_{iade}\]

<p>Burada $o_{komisyon}$ ödeme sağlayıcısının oransal kesintisini, $M_{sabit}$ işlem başına sabit maliyetleri temsil eder. Dolayısıyla yalnızca yazılımın fiyatını değil, ödeme komisyonlarını ve operasyon yükünü de karşılaştırmak gerekir.</p>

<h2 id="üç-sistemin-karakteri">Üç sistemin karakteri</h2>

<table>
  <thead>
    <tr>
      <th>Sistem</th>
      <th>Temel yaklaşım</th>
      <th>Güçlü olduğu alan</th>
      <th>Teknik ihtiyaç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>CiviCRM</td>
      <td>CRM ve bağış yönetimi</td>
      <td>STK, dernek, üyelik ve etkinlik takibi</td>
      <td>Orta-yüksek</td>
    </tr>
    <tr>
      <td>GiveWP</td>
      <td>WordPress bağış eklentisi</td>
      <td>Hızlı kampanya sayfaları ve formlar</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Open Collective</td>
      <td>Şeffaf mali yönetim platformu</td>
      <td>Açık kaynak ve topluluk projeleri</td>
      <td>Düşük-orta</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/bagis-toplama-sistemleri-54.svg" alt="bagis-toplama-sistemleri-54" /></p>

<h3 id="civicrm-kurumsal-hafıza-isteyenlere">CiviCRM: Kurumsal hafıza isteyenlere</h3>

<p>CiviCRM yalnızca ödeme almakla kalmaz; bağışçıları, üyelikleri, etkinlikleri, e-postaları ve geçmiş etkileşimleri tek profilde toplar. Drupal, Joomla veya WordPress ile çalışabilir. Özellikle aynı destekçiyle yıllar boyunca ilişki kuran kuruluşlar için güçlüdür.</p>

<p>Bunun karşılığında kurulum ve bakım daha zahmetlidir. Veri modeli, roller, izinler ve zamanlanmış görevler doğru yapılandırılmalıdır. Küçük bir kampanya için ağır gelebilir; fakat binlerce kişiyle çalışan bir STK için adeta dijital genel merkezdir.</p>

<h3 id="givewp-wordpress-içinde-pratik-çözüm">GiveWP: WordPress içinde pratik çözüm</h3>

<p>GiveWP, mevcut WordPress sitesini bağış platformuna dönüştürür. Kampanya formları, hedef göstergeleri, bağışçı panelleri ve tekrarlayan ödeme özellikleri sunar. İçerik ekibinin WordPress’e aşina olması önemli bir avantajdır.</p>

<p>Basit bir entegrasyon mantığı şu şekilde düşünülebilir:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">add_action</span><span class="p">(</span><span class="s1">'give_insert_payment'</span><span class="p">,</span> <span class="k">function</span> <span class="p">(</span><span class="nv">$payment_id</span><span class="p">)</span> <span class="p">{</span>
    <span class="nv">$amount</span> <span class="o">=</span> <span class="nf">give_get_payment_total</span><span class="p">(</span><span class="nv">$payment_id</span><span class="p">);</span>
    <span class="nb">error_log</span><span class="p">(</span><span class="s1">'Yeni bağış tutarı: '</span> <span class="mf">.</span> <span class="nv">$amount</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Bu örnek, yeni ödeme kaydedildiğinde bağış tutarını günlük dosyasına yazar. Gerçek projede aynı kanca CRM bildirimi göndermek veya özel bir teşekkür süreci başlatmak için kullanılabilir. Ancak ücretli eklentiler, ödeme ağ geçitleri ve WordPress güvenliği toplam maliyete eklenmelidir.</p>

<h3 id="open-collective-şeffaflık-varsayılan-ayar">Open Collective: Şeffaflık varsayılan ayar</h3>

<p>Open Collective özellikle açık kaynak projeleri, yerel topluluklar ve gayriresmî gruplar için dikkat çekicidir. Gelirler ve giderler herkese açık gösterilebilir. Bir mali sponsor kullanıldığında topluluk, ayrı bir tüzel kişilik kurmadan para kabul etme ve harcama olanağı bulabilir.</p>

<p>Platformun en güçlü tarafı şeffaflıktır; ancak klasik CRM özellikleri veya tamamen özelleştirilebilir bağış deneyimi bekleyen kuruluşlar için sınırlı kalabilir.</p>

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

<table>
  <thead>
    <tr>
      <th>İhtiyaç</th>
      <th>Önerilen seçenek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ayrıntılı bağışçı geçmişi ve üyelik yönetimi</td>
      <td>CiviCRM</td>
    </tr>
    <tr>
      <td>WordPress üzerinde hızlı bağış kampanyası</td>
      <td>GiveWP</td>
    </tr>
    <tr>
      <td>Herkese açık gelir-gider takibi</td>
      <td>Open Collective</td>
    </tr>
    <tr>
      <td>İleri düzey özelleştirme ve veri sahipliği</td>
      <td>CiviCRM veya GiveWP</td>
    </tr>
    <tr>
      <td>Minimum altyapı yönetimi</td>
      <td>Open Collective</td>
    </tr>
  </tbody>
</table>

<p>Karar verirken bağış hacmi, ekip kapasitesi, veri gizliliği ve raporlama gereksinimleri birlikte değerlendirilmelidir. Kısacası CiviCRM ilişkiyi, GiveWP dönüşümü, Open Collective ise güveni ve şeffaflığı merkeze koyar. En iyi sistem en fazla özelliğe sahip olan değil, kuruluşunuzun günlük iş akışına en az sürtünmeyle uyum sağlayandır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="bağış" /><category term="civicrm" /><category term="givewp" /><category term="open-collective" /><category term="wordpress" /><category term="açık-kaynak" /><category term="fintech" /><summary type="html"><![CDATA[Bir bağış sistemi seçmek, web sitesine yalnızca renkli bir “Destek Ol” düğmesi eklemekten çok daha fazlasıdır. Bağışçı ilişkileri, ödeme altyapısı, kampanya takibi, şeffaflık ve raporlama gibi parçalar doğru biçimde birleşmelidir. CiviCRM, GiveWP ve Open Collective aynı amaca hizmet ediyor gibi görünse de farklı organizasyon modellerine hitap eder: biri kapsamlı bir ilişki yönetim sistemi, biri WordPress odaklı bağış eklentisi, diğeri ise şeffaf topluluk finansmanı platformudur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bagis-toplama-sistemleri-54.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bagis-toplama-sistemleri-54.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">ConvertAll ve MathJS ile Akıllı Birim Dönüştürme Sitesi Geliştirmek</title><link href="https://program.sonsuz.us/posts/convertall-ve-mathjs-ile-akilli-birim-donusturme-sitesi-gelistirmek/" rel="alternate" type="text/html" title="ConvertAll ve MathJS ile Akıllı Birim Dönüştürme Sitesi Geliştirmek" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/convertall-ve-mathjs-ile-akilli-birim-donusturme-sitesi-gelistirmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/convertall-ve-mathjs-ile-akilli-birim-donusturme-sitesi-gelistirmek/"><![CDATA[<p><img src="/img/convertall-ve-mathjs-59.svg" alt="convertall-ve-mathjs-59" /></p>

<p>Birim dönüştürme uygulamaları ilk bakışta yalnızca “metreyi kilometreye böl” seviyesinde görünür. Ancak sıcaklık, alan, hacim, hız ve türetilmiş bilimsel birimler işin içine girince küçük hesap makinemiz adeta laboratuvar önlüğü giymeye başlar. ConvertAll yaklaşımını örnek alan ve MathJS kullanan bir web sitesi; kullanıcıya esnek, güvenilir ve genişletilebilir bir dönüştürme deneyimi sunabilir.
``</p>
<h2 id="birim-dönüşümünün-temel-mantığı">Birim dönüşümünün temel mantığı</h2>

<p>Aynı fiziksel büyüklüğü temsil eden birimler arasında genellikle bir ölçek katsayısı bulunur. Örneğin metre ile santimetre arasındaki ilişki şöyledir:</p>

\[1\,m = 100\,cm\]

<p>Dolayısıyla $x$ metreyi santimetreye dönüştürmek için $x \times 100$ hesaplanır. Genel doğrusal dönüşüm modeli şu şekilde ifade edilebilir:</p>

\[y = ax + b\]

<p>Burada $a$ ölçek katsayısı, $b$ ise başlangıç noktası farkıdır. Uzunluk dönüşümlerinde çoğunlukla $b=0$ olur. Sıcaklıkta ise durum farklıdır. Celsius’tan Fahrenheit’a dönüşüm:</p>

\[F = C \times 1.8 + 32\]

<p>Bu ayrım önemlidir; her birimi yalnızca bir sayıyla çarpmak doğru sonuç üretmez.</p>

<table>
  <thead>
    <tr>
      <th>Dönüşüm türü</th>
      <th>Örnek</th>
      <th>Matematiksel yapı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ölçek tabanlı</td>
      <td>metre → santimetre</td>
      <td>$y=ax$</td>
    </tr>
    <tr>
      <td>Ofsetli</td>
      <td>Celsius → Fahrenheit</td>
      <td>$y=ax+b$</td>
    </tr>
    <tr>
      <td>Ters orantılı</td>
      <td>yakıt ekonomisi gösterimleri</td>
      <td>$y=a/x$</td>
    </tr>
    <tr>
      <td>Bileşik</td>
      <td>km/saat → m/saniye</td>
      <td>birden fazla katsayı</td>
    </tr>
  </tbody>
</table>

<h2 id="convertall-yaklaşımı-nedir">ConvertAll yaklaşımı nedir?</h2>

<p>ConvertAll, kullanıcının kaynak ve hedef birimleri özgürce seçebilmesini sağlayan masaüstü odaklı bir dönüştürme aracıdır. En güçlü fikri, yalnızca hazır dönüşüm düğmeleri sunmak yerine birim ifadelerini ayrıştırmasıdır. Böylece <code class="language-plaintext highlighter-rouge">km/hour</code>, <code class="language-plaintext highlighter-rouge">meter/second</code> veya <code class="language-plaintext highlighter-rouge">kg*m/s^2</code> gibi bileşik ifadeler anlamlandırılabilir.</p>

<p>Bir web projesinde aynı yaklaşımı uygulamak için üç temel katman gerekir:</p>

<ol>
  <li>Kullanıcı ifadesini ayrıştıran giriş katmanı,</li>
  <li>Birimlerin uyumluluğunu denetleyen hesaplama motoru,</li>
  <li>Sonucu anlaşılır biçimde gösteren arayüz.</li>
</ol>

<p>Kütle ile uzunluğu dönüştürmeye çalışmak matematiksel olarak anlamsızdır. Sistem, <code class="language-plaintext highlighter-rouge">5 kg → metre</code> isteğine rastgele bir sayı vermek yerine boyut uyuşmazlığı hatası göstermelidir.</p>

<h2 id="mathjs-ile-dönüşüm-motoru">MathJS ile dönüşüm motoru</h2>

<p>MathJS; JavaScript için ifadeler, matrisler, büyük sayılar ve birimler konusunda kapsamlı özellikler sunar. Tarayıcıda veya Node.js ortamında kullanılabilir. Temel bir dönüşüm oldukça kısa yazılır:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">create</span><span class="p">,</span> <span class="nx">all</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">mathjs</span><span class="dl">"</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">math</span> <span class="o">=</span> <span class="nf">create</span><span class="p">(</span><span class="nx">all</span><span class="p">);</span>

<span class="kd">function</span> <span class="nf">donustur</span><span class="p">(</span><span class="nx">deger</span><span class="p">,</span> <span class="nx">kaynak</span><span class="p">,</span> <span class="nx">hedef</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">miktar</span> <span class="o">=</span> <span class="nx">math</span><span class="p">.</span><span class="nf">unit</span><span class="p">(</span><span class="nx">deger</span><span class="p">,</span> <span class="nx">kaynak</span><span class="p">);</span>
  <span class="k">return</span> <span class="nx">miktar</span><span class="p">.</span><span class="nf">toNumber</span><span class="p">(</span><span class="nx">hedef</span><span class="p">);</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">donustur</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="dl">"</span><span class="s2">km</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">m</span><span class="dl">"</span><span class="p">));</span> <span class="c1">// 10000</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">donustur</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="dl">"</span><span class="s2">degC</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">degF</span><span class="dl">"</span><span class="p">));</span> <span class="c1">// 77</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">math.unit()</code> sayıyı birimiyle birlikte temsil eder. <code class="language-plaintext highlighter-rouge">toNumber()</code> ise miktarı hedef birime çevirerek sayısal sonucu döndürür. Bu yöntem, dönüşüm katsayılarını elle yazmaktan daha güvenlidir.</p>

<p>Kullanıcı girişleri doğrudan işlenmemeli; hata yakalama mekanizması eklenmelidir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">guvenliDonustur</span><span class="p">(</span><span class="nx">deger</span><span class="p">,</span> <span class="nx">kaynak</span><span class="p">,</span> <span class="nx">hedef</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">try</span> <span class="p">{</span>
    <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nb">Number</span><span class="p">.</span><span class="nf">isFinite</span><span class="p">(</span><span class="nx">deger</span><span class="p">))</span> <span class="p">{</span>
      <span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Geçerli bir sayı girilmedi.</span><span class="dl">"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="kd">const</span> <span class="nx">sonuc</span> <span class="o">=</span> <span class="nx">math</span><span class="p">.</span><span class="nf">unit</span><span class="p">(</span><span class="nx">deger</span><span class="p">,</span> <span class="nx">kaynak</span><span class="p">).</span><span class="nf">toNumber</span><span class="p">(</span><span class="nx">hedef</span><span class="p">);</span>
    <span class="k">return</span> <span class="p">{</span> <span class="na">basarili</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">sonuc</span> <span class="p">};</span>
  <span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">hata</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="p">{</span> <span class="na">basarili</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span> <span class="na">mesaj</span><span class="p">:</span> <span class="nx">hata</span><span class="p">.</span><span class="nx">message</span> <span class="p">};</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu fonksiyon arayüzün çökmesini önler ve kullanıcıya açıklayıcı geri bildirim sağlar.</p>

<h2 id="arayüz-ve-geliştirme-fikirleri">Arayüz ve geliştirme fikirleri</h2>

<p>Başarılı bir dönüştürme sitesi; kategori seçimi, iki birim listesi, değer alanı ve birimleri ters çevirme düğmesi içermelidir. Son kullanılan dönüşümleri yerel depolamada saklamak da kullanıcı deneyimini iyileştirir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Basit sistem</th>
      <th>Gelişmiş sistem</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Birim seçimi</td>
      <td>sabit liste</td>
      <td>arama ve filtreleme</td>
    </tr>
    <tr>
      <td>Hesaplama</td>
      <td>elle yazılmış katsayılar</td>
      <td>MathJS motoru</td>
    </tr>
    <tr>
      <td>Sonuç</td>
      <td>tek sayı</td>
      <td>hassasiyet ve bilimsel gösterim</td>
    </tr>
    <tr>
      <td>Geçmiş</td>
      <td>yok</td>
      <td>favoriler ve son işlemler</td>
    </tr>
  </tbody>
</table>

<p>Özel birimler <code class="language-plaintext highlighter-rouge">math.createUnit()</code> ile tanımlanabilir. Böylece uygulamaya yerel ölçüler veya projeye özgü teknik birimler eklenebilir. Son aşamada otomatik testlerle bilinen eşitlikler doğrulanmalıdır: $1\,inch=2.54\,cm$ ve $0\,^{\circ}C=32\,^{\circ}F$ gibi. Böylece siteniz yalnızca şık görünmez; hesap yaparken de cetveli ters tutmaz.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="javascript" /><category term="mathjs" /><category term="birim-dönüştürme" /><category term="web-geliştirme" /><category term="convertall" /><summary type="html"><![CDATA[Birim dönüştürme uygulamaları ilk bakışta yalnızca “metreyi kilometreye böl” seviyesinde görünür. Ancak sıcaklık, alan, hacim, hız ve türetilmiş bilimsel birimler işin içine girince küçük hesap makinemiz adeta laboratuvar önlüğü giymeye başlar. ConvertAll yaklaşımını örnek alan ve MathJS kullanan bir web sitesi; kullanıcıya esnek, güvenilir ve genişletilebilir bir dönüştürme deneyimi sunabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/convertall-ve-mathjs-59.png" /><media:content medium="image" url="https://program.sonsuz.us/img/convertall-ve-mathjs-59.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital Katılım Platformları: Decidim, CONSUL DEMOCRACY ve FixMyStreet</title><link href="https://program.sonsuz.us/posts/dijital-katilim-platformlari-decidim-consul-democracy-ve-fixmystreet/" rel="alternate" type="text/html" title="Dijital Katılım Platformları: Decidim, CONSUL DEMOCRACY ve FixMyStreet" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-katilim-platformlari-decidim-consul-democracy-ve-fixmystreet</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-katilim-platformlari-decidim-consul-democracy-ve-fixmystreet/"><![CDATA[<p>Bir mahalledeki bozuk kaldırımı bildirmek, belediyeye yeni bir bisiklet yolu önermek veya belirli bir konuda binlerce imza toplamak istiyorsanız sıradan bir formdan fazlasına ihtiyacınız vardır. Decidim, CONSUL DEMOCRACY ve FixMyStreet; vatandaşlarla kurumlar arasında dijital köprü kuran açık kaynaklı platformlardır. Ancak aynı aileden görünseler de farklı problemleri çözerler.</p>

<p>``</p>

<h2 id="üç-platform-üç-yaklaşım">Üç platform, üç yaklaşım</h2>

<p><strong>Decidim</strong>, Barselona çıkışlı kapsamlı bir katılımcı demokrasi altyapısıdır. Teklif oluşturma, destek toplama, toplantı düzenleme, anket, bütçeleme ve sonuç takibi gibi süreçleri modüler biçimde sunar. Bir dilekçe sistemi kurmanın yanında tüm karar alma döngüsünü yönetmek isteyen kurumlara uygundur.</p>

<p><strong>CONSUL DEMOCRACY</strong>, vatandaş önerileri, tartışmalar, oylamalar ve katılımcı bütçeleme üzerine yoğunlaşır. Teklif belirli bir destek eşiğine ulaştığında değerlendirme ya da oylama aşamasına geçirilebilir. Bu nedenle klasik “öneri ver, imza topla, gündeme taşı” modeliyle oldukça uyumludur.</p>

<p><strong>FixMyStreet</strong> ise doğrudan bir dilekçe platformu değildir. Vatandaşların harita üzerinde çukur, kırık sokak lambası veya kaçak döküm gibi yerel sorunları bildirmesini sağlar. Bildirim, konuma göre sorumlu kuruma yönlendirilir ve çözüm durumu kamuya açık şekilde izlenebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Decidim</th>
      <th>CONSUL DEMOCRACY</th>
      <th>FixMyStreet</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel amaç</td>
      <td>Çok yönlü katılım</td>
      <td>Öneri ve oylama</td>
      <td>Coğrafi sorun bildirimi</td>
    </tr>
    <tr>
      <td>İmza/destek toplama</td>
      <td>Güçlü</td>
      <td>Güçlü</td>
      <td>Doğal özelliği değil</td>
    </tr>
    <tr>
      <td>Harita odaklı çalışma</td>
      <td>Ek modüllerle</td>
      <td>Sınırlı</td>
      <td>Çok güçlü</td>
    </tr>
    <tr>
      <td>Katılımcı bütçe</td>
      <td>Var</td>
      <td>Var</td>
      <td>Yok</td>
    </tr>
    <tr>
      <td>Uygun ölçek</td>
      <td>Kurum ve şehir</td>
      <td>Belediye ve ülke</td>
      <td>Belediye ve mahalle</td>
    </tr>
  </tbody>
</table>

<h2 id="i̇mza-sistemi-nasıl-düşünülmeli">İmza sistemi nasıl düşünülmeli?</h2>

<p>Basit modelde her dilekçenin bir destek sayısı ve hedefi bulunur. İlerleme oranı şöyle hesaplanabilir:</p>

\[P = 100 * S / H\]

<p>Burada $S$ doğrulanmış destek sayısını, $H$ hedeflenen desteği, $P$ ise yüzde ilerlemeyi ifade eder. Örneğin 2.000 destek hedefleyen bir öneri 1.250 doğrulanmış imzaya ulaştığında ilerleme oranı yüzde 62,5 olur.</p>

<p>Fakat yalnızca sayaç tutmak yeterli değildir. Aynı kişinin tekrar imza atması engellenmeli, e-posta veya kimlik doğrulaması yapılmalı ve kişisel veriler gereksiz yere yayımlanmamalıdır. İdeal süreç şu durum makinesini izleyebilir:</p>

<p><code class="language-plaintext highlighter-rouge">Taslak → Moderasyon → Yayında → Eşik Aşıldı → Kurumsal İnceleme → Sonuçlandı</code></p>

<p>Aşağıdaki basitleştirilmiş Python fonksiyonu, doğrulanmış ve benzersiz destekleri sayar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">petition_progress</span><span class="p">(</span><span class="n">signatures</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
    <span class="c1"># Doğrulanmış kullanıcı kimliklerini kümeye alarak tekrarları eler.
</span>    <span class="n">verified_users</span> <span class="o">=</span> <span class="p">{</span>
        <span class="n">item</span><span class="p">[</span><span class="sh">"</span><span class="s">user_id</span><span class="sh">"</span><span class="p">]</span>
        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">signatures</span>
        <span class="k">if</span> <span class="n">item</span><span class="p">[</span><span class="sh">"</span><span class="s">verified</span><span class="sh">"</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">True</span>
    <span class="p">}</span>

    <span class="n">support_count</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">verified_users</span><span class="p">)</span>
    <span class="n">percentage</span> <span class="o">=</span> <span class="nf">min</span><span class="p">((</span><span class="n">support_count</span> <span class="o">/</span> <span class="n">target</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">support_count</span><span class="sh">"</span><span class="p">:</span> <span class="n">support_count</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">percentage</span><span class="sh">"</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="n">percentage</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span>
        <span class="sh">"</span><span class="s">threshold_reached</span><span class="sh">"</span><span class="p">:</span> <span class="n">support_count</span> <span class="o">&gt;=</span> <span class="n">target</span>
    <span class="p">}</span>
</code></pre></div></div>

<p>Gerçek sistemde <code class="language-plaintext highlighter-rouge">user_id</code> değerleri herkese açık gösterilmemeli; mümkünse tek yönlü özetler, yetkilendirme katmanları ve kayıt saklama politikaları kullanılmalıdır. Ayrıca kötüye kullanım önleme mekanizması erişilebilirliği bozmamalıdır: aşırı CAPTCHA kullanımı gerçek vatandaşları da kaçırabilir.</p>

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

<table>
  <thead>
    <tr>
      <th>İhtiyaç</th>
      <th>Önerilen platform</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dilekçe, toplantı ve bütçe tek yerde olsun</td>
      <td>Decidim</td>
    </tr>
    <tr>
      <td>Öneriler destek eşiğiyle oylamaya geçsin</td>
      <td>CONSUL DEMOCRACY</td>
    </tr>
    <tr>
      <td>Sorunlar haritada işaretlenip kuruma gönderilsin</td>
      <td>FixMyStreet</td>
    </tr>
  </tbody>
</table>

<p>Seçimde yalnızca özellik listesini değil; kurulum ekibinin Ruby/Rails deneyimini, barındırma bütçesini, moderasyon kapasitesini, çok dillilik ihtiyacını ve kurum içi süreçleri de değerlendirmek gerekir. En parlak arayüz bile arka tarafta dilekçeyi yanıtlayacak bir iş akışı yoksa dijital bir öneri kutusuna dönüşür.</p>

<p>Sonuç olarak Decidim geniş kapsamlı bir demokrasi laboratuvarı, CONSUL DEMOCRACY yapılandırılmış bir öneri ve oylama motoru, FixMyStreet ise konum tabanlı belediye sorunları için uzmanlaşmış bir araçtır. Başarılı seçim, “Hangisi daha güçlü?” sorusundan önce “Vatandaş hangi sürece katılacak?” sorusunu yanıtlamakla başlar.</p>

<p><img src="/img/dijital-katilim-platformlari-83.svg" alt="dijital-katilim-platformlari-83" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="decidim" /><category term="consul-democracy" /><category term="fixmystreet" /><category term="e-demokrasi" /><category term="açık-kaynak" /><category term="dijital-katılım" /><summary type="html"><![CDATA[Bir mahalledeki bozuk kaldırımı bildirmek, belediyeye yeni bir bisiklet yolu önermek veya belirli bir konuda binlerce imza toplamak istiyorsanız sıradan bir formdan fazlasına ihtiyacınız vardır. Decidim, CONSUL DEMOCRACY ve FixMyStreet; vatandaşlarla kurumlar arasında dijital köprü kuran açık kaynaklı platformlardır. Ancak aynı aileden görünseler de farklı problemleri çözerler.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-katilim-platformlari-83.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-katilim-platformlari-83.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital Oylama Arenası: Helios Voting, Decidim ve CIVS</title><link href="https://program.sonsuz.us/posts/dijital-oylama-arenasi-helios-voting-decidim-ve-civs/" rel="alternate" type="text/html" title="Dijital Oylama Arenası: Helios Voting, Decidim ve CIVS" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-oylama-arenasi-helios-voting-decidim-ve-civs</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-oylama-arenasi-helios-voting-decidim-ve-civs/"><![CDATA[<p>Bir dijital oylama sistemi seçmek, yalnızca “en çok oy alan kazansın” kodu yazmaktan ibaret değildir. Gizlilik, doğrulanabilirlik, kimlik denetimi ve seçim yöntemleri işin içine girdiğinde küçük bir anket hızla kriptografi laboratuvarına dönüşebilir. Bu yazıda Helios Voting, Decidim ve CIVS’nin farklı yaklaşımlarını karşılaştıracağız.</p>

<p>``</p>

<h2 id="oylamanın-teorik-temeli">Oylamanın teorik temeli</h2>

<p>Basit çoğunluk oylamasında aday $i$ için kullanılan oy sayısını $v_i$ ile gösterirsek kazanan şöyle bulunur:</p>

\[kazanan = argmax_i(v_i)\]

<p>Ancak gerçek dünyadaki her karar “tek aday seç” biçiminde değildir. Seçmenler adayları sıralayabilir, birden fazla seçeneği destekleyebilir veya bütçe önerilerine oy verebilir. Ayrıca sistemin dört temel beklentiyi dengelemesi gerekir:</p>

<ul>
  <li><strong>Gizlilik:</strong> Bir oyun kime ait olduğu açıklanmamalıdır.</li>
  <li><strong>Bütünlük:</strong> Oylar değiştirilememeli veya silinememelidir.</li>
  <li><strong>Doğrulanabilirlik:</strong> Seçmen, oyunun sayıma katıldığını kontrol edebilmelidir.</li>
  <li><strong>Uygunluk:</strong> Yalnızca yetkili kişiler ve izin verilen sayıda oy kullanabilmelidir.</li>
</ul>

<p>Bu özellikler bazen çatışır. Kimlik doğrulamasını güçlendirmek gizlilik riskini artırabilir; tamamen anonim katılım ise mükerrer oyları engellemeyi zorlaştırabilir.</p>

<h2 id="üç-platform-üç-farklı-karakter">Üç platform, üç farklı karakter</h2>

<table>
  <thead>
    <tr>
      <th>Platform</th>
      <th>Temel yaklaşım</th>
      <th>Güçlü olduğu alan</th>
      <th>Dikkat edilmesi gereken nokta</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Helios Voting</strong></td>
      <td>Uçtan uca doğrulanabilir kriptografik seçim</td>
      <td>Üniversite, dernek ve kurul seçimleri</td>
      <td>Zorlayıcıya karşı dayanıklılık ve cihaz güvenliği ayrıca değerlendirilmelidir</td>
    </tr>
    <tr>
      <td><strong>Decidim</strong></td>
      <td>Katılımcı demokrasi platformu</td>
      <td>Öneriler, toplantılar, süreçler ve katılımcı bütçeleme</td>
      <td>Tek başına özel amaçlı kriptografik seçim motoru değildir</td>
    </tr>
    <tr>
      <td><strong>CIVS</strong></td>
      <td>Condorcet tabanlı sıralamalı oylama</td>
      <td>Alternatifleri tercih sırasına koyma</td>
      <td>Sonuç yöntemi kullanıcıya önceden açıklanmalıdır</td>
    </tr>
  </tbody>
</table>

<h2 id="helios-voting-matematik-sandık-başında">Helios Voting: Matematik sandık başında</h2>

<p>Helios, oyları açık anahtarlı şifreleme ile korur ve seçim sonucunun doğrulanabilmesi için kriptografik kanıtlar üretir. Homomorfik şifrelemenin sadeleştirilmiş fikri şudur:</p>

\[E(v_1) \otimes E(v_2) = E(v_1 + v_2)\]

<p>Yani sistem, tek tek oyların içeriğini açmadan şifreli oyları birleştirip toplamı elde edebilir. Seçmen genellikle oyuna karşılık gelen bir takip değeri alır ve bu değerin yayımlanan sandık kayıtlarında bulunup bulunmadığını denetler. Böylece “oyum kayboldu mu?” sorusu teknik olarak kontrol edilebilir.</p>

<p>Bununla birlikte uçtan uca doğrulanabilirlik, seçmenin cihazında zararlı yazılım bulunmadığını otomatik olarak garanti etmez. Resmî ve yüksek riskli seçimlerde bağımsız güvenlik incelemesi şarttır.</p>

<h2 id="decidim-oylamadan-daha-büyük-bir-sahne">Decidim: Oylamadan daha büyük bir sahne</h2>

<p>Ruby on Rails tabanlı açık kaynak Decidim, yalnızca sandık kurmaz; karar alma sürecini baştan sona modellemeye çalışır. Katılımcılar öneri oluşturabilir, tartışabilir, toplantılara katılabilir ve bütçe projelerini destekleyebilir.</p>

<p>Bu nedenle Decidim’i “seçim uygulaması” yerine <strong>katılım altyapısı</strong> olarak düşünmek daha doğrudur. Bir belediyenin park önerilerini toplaması, projeleri tartışmaya açması ve ardından bütçe oylaması yapması için uygundur. Süreç şeffaflığı güçlüdür; fakat gizli oy gerektiren kritik seçimlerde kullanılacak özel bileşenler ayrıca incelenmelidir.</p>

<h2 id="civs-tercih-sıralarının-gücü">CIVS: Tercih sıralarının gücü</h2>

<p>CIVS, seçmenlerin adayları sıralamasına dayanır. Condorcet yaklaşımında bir aday, diğer her adayı ikili karşılaştırmada yeniyorsa kazanan kabul edilir. $P(a,b)$, $a$ adayını $b$ adayına tercih edenlerin sayısı olsun:</p>

\[a \succ b \quad eğer \quad P(a,b) &gt; P(b,a)\]

<p>Bu yöntem, yalnızca birinci tercihleri saymak yerine seçmenlerin genel eğilimini yakalar. Ancak döngüler oluşabilir: A, B’yi; B, C’yi; C de A’yı yenebilir. CIVS bu durumları çözmek için belirli Condorcet tamamlayıcı yöntemlerinden yararlanır.</p>

<p>Aşağıdaki Python kodu, iki aday arasındaki basit ikili üstünlüğü hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">pairwise_winner</span><span class="p">(</span><span class="n">rankings</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="n">scores</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="mi">0</span><span class="p">}</span>

    <span class="k">for</span> <span class="n">ranking</span> <span class="ow">in</span> <span class="n">rankings</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">ranking</span><span class="p">.</span><span class="nf">index</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">ranking</span><span class="p">.</span><span class="nf">index</span><span class="p">(</span><span class="n">b</span><span class="p">):</span>
            <span class="n">scores</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">scores</span><span class="p">[</span><span class="n">b</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>

    <span class="k">if</span> <span class="n">scores</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">==</span> <span class="n">scores</span><span class="p">[</span><span class="n">b</span><span class="p">]:</span>
        <span class="k">return</span> <span class="sh">'</span><span class="s">berabere</span><span class="sh">'</span>
    <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="n">scores</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">scores</span><span class="p">.</span><span class="n">get</span><span class="p">)</span>
</code></pre></div></div>

<p>Fonksiyon, her sıralamada hangi adayın daha yukarıda bulunduğunu kontrol eder. Gerçek bir Condorcet sistemi, bu işlemi bütün aday çiftleri için yaparak bir karşılaştırma matrisi oluşturur.</p>

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

<p>Kriptografik doğrulanabilirlik önceliğinizse <strong>Helios</strong>, kapsamlı katılımcı süreçler tasarlıyorsanız <strong>Decidim</strong>, seçenekleri adil biçimde sıralamak istiyorsanız <strong>CIVS</strong> güçlü adaylardır. Son karar; tehdit modeline, seçmen kitlesine, kimlik doğrulama ihtiyacına ve kullanılan seçim yönteminin anlaşılabilirliğine dayanmalıdır. Unutmayın: İyi bir dijital sandık yalnızca doğru sonucu üretmez, sonucun neden güvenilir olduğunu da gösterebilir.</p>

<p><img src="/img/dijital-oylama-arenasi-92.svg" alt="dijital-oylama-arenasi-92" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oylama" /><category term="helios-voting" /><category term="decidim" /><category term="civs" /><category term="e-demokrasi" /><category term="açık-kaynak" /><summary type="html"><![CDATA[Bir dijital oylama sistemi seçmek, yalnızca “en çok oy alan kazansın” kodu yazmaktan ibaret değildir. Gizlilik, doğrulanabilirlik, kimlik denetimi ve seçim yöntemleri işin içine girdiğinde küçük bir anket hızla kriptografi laboratuvarına dönüşebilir. Bu yazıda Helios Voting, Decidim ve CIVS’nin farklı yaklaşımlarını karşılaştıracağız.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-oylama-arenasi-92.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-oylama-arenasi-92.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital Sözlük Kurmak: WordPress Glossary, MediaWiki ve DictPress Karşılaştırması</title><link href="https://program.sonsuz.us/posts/dijital-sozluk-kurmak-wordpress-glossary-mediawiki-ve-dictpress-karsilastirmasi/" rel="alternate" type="text/html" title="Dijital Sözlük Kurmak: WordPress Glossary, MediaWiki ve DictPress Karşılaştırması" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-sozluk-kurmak-wordpress-glossary-mediawiki-ve-dictpress-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-sozluk-kurmak-wordpress-glossary-mediawiki-ve-dictpress-karsilastirmasi/"><![CDATA[<p>Bir sözlük sistemi dışarıdan yalnızca “kelime ve açıklama” ikilisi gibi görünür. Oysa eş anlamlılar, yönlendirmeler, kategoriler, kaynaklar, sürümler ve güçlü arama özellikleri devreye girdiğinde küçük çaplı bir bilgi mimarisine dönüşür. WordPress Glossary, MediaWiki ve DictPress bu probleme farklı yönlerden yaklaşır: biri içerik yönetimini, biri ortak üretimi, diğeri ise sözlük odaklı veri organizasyonunu öne çıkarır.</p>

<p><img src="/img/dijital-sozluk-kurmak-46.svg" alt="dijital-sozluk-kurmak-46" /></p>

<p>``</p>

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

<p>En basit sözlük girdisini matematiksel olarak şöyle gösterebiliriz:</p>

\[G = (T, D, C, R, M)\]

<p>Burada $T$ terimi, $D$ tanımı, $C$ kategorileri, $R$ ilişkili girdileri ve $M$ kaynak, yazar, tarih gibi meta verileri temsil eder. Gerçek projelerde bir terimin birden fazla anlamı bulunabileceğinden ilişki çoğu zaman $T \rightarrow {D_1, D_2, \ldots, D_n}$ biçimindedir.</p>

<p>Arama başarısını ölçmek için de iki temel kavram kullanılır:</p>

\[Precision = \frac{İlgili\ bulunan\ sonuçlar}{Bulunan\ tüm\ sonuçlar}\]

\[Recall = \frac{İlgili\ bulunan\ sonuçlar}{Sistemdeki\ tüm\ ilgili\ sonuçlar}\]

<p>Yani kullanıcı doğru yazdığında sonuç göstermek yetmez; yazım hataları, çekim ekleri ve eş anlamlılar da düşünülmelidir.</p>

<h2 id="üç-yaklaşımın-karşılaştırması">Üç yaklaşımın karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>WordPress Glossary</th>
      <th>MediaWiki</th>
      <th>DictPress</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel yaklaşım</td>
      <td>CMS ve eklenti tabanlı</td>
      <td>İş birliğine açık wiki</td>
      <td>Sözlük odaklı yayınlama</td>
    </tr>
    <tr>
      <td>Kurulum kolaylığı</td>
      <td>Yüksek</td>
      <td>Orta</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Editör deneyimi</td>
      <td>Blog yönetimine benzer</td>
      <td>Wiki sözdizimi ağırlıklı</td>
      <td>Girdi ve alan odaklı</td>
    </tr>
    <tr>
      <td>Sürüm geçmişi</td>
      <td>WordPress revizyonları</td>
      <td>Çok güçlü ve ayrıntılı</td>
      <td>Uygulamaya göre değişir</td>
    </tr>
    <tr>
      <td>Tema esnekliği</td>
      <td>Çok yüksek</td>
      <td>Görünüm sistemiyle esnek</td>
      <td>Daha sınırlı olabilir</td>
    </tr>
    <tr>
      <td>Büyük topluluk katkısı</td>
      <td>Ek geliştirme gerekir</td>
      <td>Doğal kullanım senaryosu</td>
      <td>Genellikle kontrollü editörlük</td>
    </tr>
    <tr>
      <td>En uygun senaryo</td>
      <td>Kurumsal terimler, SEO</td>
      <td>Topluluk ansiklopedisi</td>
      <td>Yapılandırılmış sözlük</td>
    </tr>
  </tbody>
</table>

<h3 id="wordpress-glossary">WordPress Glossary</h3>

<p>WordPress tabanlı çözümde terimler genellikle özel yazı türü, yani <code class="language-plaintext highlighter-rouge">custom post type</code>, olarak tutulur. Kategoriler için taxonomy, ek bilgiler için özel alanlar kullanılabilir. En büyük avantaj, yönetim panelinin tanıdık olması ve SEO, önbellek, kullanıcı rolü gibi ihtiyaçların eklentilerle çözülebilmesidir.</p>

<p>Aşağıdaki kod basit bir <code class="language-plaintext highlighter-rouge">terim</code> içerik türü oluşturur:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">add_action</span><span class="p">(</span><span class="s1">'init'</span><span class="p">,</span> <span class="k">function</span> <span class="p">()</span> <span class="p">{</span>
    <span class="nf">register_post_type</span><span class="p">(</span><span class="s1">'terim'</span><span class="p">,</span> <span class="p">[</span>
        <span class="s1">'label'</span> <span class="o">=&gt;</span> <span class="s1">'Terimler'</span><span class="p">,</span>
        <span class="s1">'public'</span> <span class="o">=&gt;</span> <span class="kc">true</span><span class="p">,</span>
        <span class="s1">'has_archive'</span> <span class="o">=&gt;</span> <span class="kc">true</span><span class="p">,</span>
        <span class="s1">'rewrite'</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="s1">'slug'</span> <span class="o">=&gt;</span> <span class="s1">'sozluk'</span><span class="p">],</span>
        <span class="s1">'supports'</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="s1">'title'</span><span class="p">,</span> <span class="s1">'editor'</span><span class="p">,</span> <span class="s1">'revisions'</span><span class="p">]</span>
    <span class="p">]);</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Bu yapı her sözlük maddesine ayrı URL verir ve WordPress revizyon sistemini etkinleştirir. Ancak binlerce özel alanla karmaşık dilbilimsel ilişkiler kurulacaksa veri tabanı sorguları dikkatle tasarlanmalıdır.</p>

<h3 id="mediawiki">MediaWiki</h3>

<p>MediaWiki, çok sayıda kullanıcının içerik üretmesi ve değişikliklerin şeffaf biçimde izlenmesi gereken projelerde parlar. Şablonlar sayesinde girdiler standartlaştırılabilir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{{Terim
|ad=Özyineleme
|tanım=Bir işlevin kendisini çağırmasıdır.
|kategori=Programlama
|eşanlamlı=Rekürsiyon
}}
</code></pre></div></div>

<p>Bu şablon, editörlerin aynı alanları tutarlı biçimde doldurmasını sağlar. Tartışma sayfaları, değişiklik karşılaştırmaları ve geri alma mekanizması büyük avantajdır. Buna karşılık ziyaretçiye sade bir sözlük deneyimi sunmak için tema, şablon ve arama yapılandırması gerekebilir.</p>

<h3 id="dictpress">DictPress</h3>

<p>DictPress yaklaşımı, genel amaçlı sayfalardan çok madde, anlam, örnek ve çapraz başvuru ilişkilerine odaklanır. Bu nedenle iki dilli sözlükler veya dilbilimsel projeler için daha doğal bir model sunabilir. Dezavantajı, WordPress ve MediaWiki kadar geniş eklenti ekosistemine sahip olmayabilmesi ve seçilen sürüme göre bakım durumunun mutlaka incelenmesidir.</p>

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

<p>Hızlı yayın, modern tema ve SEO istiyorsanız <strong>WordPress Glossary</strong>; açık katkı, güçlü geçmiş takibi ve topluluk yönetimi istiyorsanız <strong>MediaWiki</strong> daha uygundur. Anlam, köken, telaffuz ve çeviri gibi alanların birinci sınıf veri olarak saklanması gerekiyorsa <strong>DictPress</strong> değerlendirilebilir.</p>

<p>Son kararı yalnız özellik listesine göre vermeyin. Önce 50 örnek terim girin, arama senaryolarını deneyin ve dışa aktarma imkânını kontrol edin. Çünkü iyi bir sözlük yalnız kelimeleri saklamaz; kelimeler arasındaki görünmez köprüleri de korur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="sözlük" /><category term="wordpress" /><category term="mediawiki" /><category term="dictpress" /><category term="veri-modelleme" /><category term="arama" /><summary type="html"><![CDATA[Bir sözlük sistemi dışarıdan yalnızca “kelime ve açıklama” ikilisi gibi görünür. Oysa eş anlamlılar, yönlendirmeler, kategoriler, kaynaklar, sürümler ve güçlü arama özellikleri devreye girdiğinde küçük çaplı bir bilgi mimarisine dönüşür. WordPress Glossary, MediaWiki ve DictPress bu probleme farklı yönlerden yaklaşır: biri içerik yönetimini, biri ortak üretimi, diğeri ise sözlük odaklı veri organizasyonunu öne çıkarır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-sozluk-kurmak-46.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-sozluk-kurmak-46.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dosya Arama Sistemi Kurmak: Elasticsearch, Meilisearch ve Typesense Karşılaştırması</title><link href="https://program.sonsuz.us/posts/dosya-arama-sistemi-kurmak-elasticsearch-meilisearch-ve-typesense-karsilastirmasi/" rel="alternate" type="text/html" title="Dosya Arama Sistemi Kurmak: Elasticsearch, Meilisearch ve Typesense Karşılaştırması" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dosya-arama-sistemi-kurmak-elasticsearch-meilisearch-ve-typesense-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/dosya-arama-sistemi-kurmak-elasticsearch-meilisearch-ve-typesense-karsilastirmasi/"><![CDATA[<p>Binlerce PDF, Word belgesi ve metin dosyası arasında doğru dosyayı bulmaya çalışmak, dijital samanlıkta iğne aramaya benzeyebilir. Neyse ki Elasticsearch, Meilisearch ve Typesense gibi arama motorları; dosya içeriklerini indeksleyerek milisaniyeler içinde alakalı sonuçlar sunabilir. Peki bu üçlüden hangisi projenize daha uygun?</p>

<p>``</p>

<h2 id="dosya-arama-sistemi-nasıl-çalışır">Dosya arama sistemi nasıl çalışır?</h2>

<p>Bir arama motoru dosyaları doğrudan sihirli biçimde anlamaz. Önce dosyanın metni çıkarılır, temizlenir ve indekslenebilir bir belgeye dönüştürülür. Tipik veri akışı şöyledir:</p>

<ol>
  <li>Dosya sisteme yüklenir.</li>
  <li>Apache Tika, PDF.js veya benzeri bir araçla metin çıkarılır.</li>
  <li>Başlık, dosya yolu, uzantı ve kullanıcı izinleri gibi metadata eklenir.</li>
  <li>Belge arama motoruna gönderilir.</li>
  <li>Kullanıcı sorgusu indeks üzerinde çalıştırılır.</li>
</ol>

<p>Bu sistemlerin temelinde <strong>ters indeks</strong> bulunur. Geleneksel bir listede her belgenin içindeki kelimeler tutulurken ters indeks, her kelimenin hangi belgelerde geçtiğini saklar:</p>

<table>
  <thead>
    <tr>
      <th>Kelime</th>
      <th>Geçtiği belgeler</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>docker</td>
      <td>belge-1, belge-7</td>
    </tr>
    <tr>
      <td>güvenlik</td>
      <td>belge-2, belge-7</td>
    </tr>
    <tr>
      <td>yedekleme</td>
      <td>belge-3</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/dosya-arama-sistemi-35.svg" alt="dosya-arama-sistemi-35" /></p>

<p>Böylece motor, bütün dosyaları tek tek okumak yerine ilgili kayıtları doğrudan bulur. Alaka sıralamasında sık kullanılan BM25 yaklaşımının basitleştirilmiş fikri şöyledir:</p>

\[\text{skor}(q,d) = \sum_{t \in q} IDF(t) \cdot TF(t,d)\]

<p>Burada $TF$, kelimenin belgede ne kadar sık geçtiğini; $IDF$ ise kelimenin tüm koleksiyon içindeki ayırt ediciliğini temsil eder. Örneğin “dosya” kelimesi sıradanken “Kubernetes” daha yüksek ayırt ediciliğe sahip olabilir.</p>

<h2 id="üç-arama-motorunun-karşılaştırması">Üç arama motorunun karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Elasticsearch</th>
      <th>Meilisearch</th>
      <th>Typesense</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kurulum</td>
      <td>Daha karmaşık</td>
      <td>Çok kolay</td>
      <td>Kolay</td>
    </tr>
    <tr>
      <td>Ölçeklenebilirlik</td>
      <td>Çok yüksek</td>
      <td>Orta-yüksek</td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Yazım hatası toleransı</td>
      <td>Yapılandırılabilir</td>
      <td>Varsayılan olarak güçlü</td>
      <td>Varsayılan olarak güçlü</td>
    </tr>
    <tr>
      <td>Gelişmiş sorgular</td>
      <td>Çok kapsamlı</td>
      <td>Daha sade</td>
      <td>Dengeli</td>
    </tr>
    <tr>
      <td>Kaynak tüketimi</td>
      <td>Görece yüksek</td>
      <td>Düşük</td>
      <td>Düşük</td>
    </tr>
    <tr>
      <td>Uygun senaryo</td>
      <td>Büyük ve karmaşık sistemler</td>
      <td>Hızlı ürün geliştirme</td>
      <td>Hızlı, kontrollü arama</td>
    </tr>
  </tbody>
</table>

<p><strong>Elasticsearch</strong>, devasa veri kümeleri, dağıtık mimari ve ayrıntılı sorgu ihtiyacı olduğunda güçlüdür. Ancak shard, analyzer ve mapping gibi kavramları öğrenmek gerekir. Küçük bir proje için uzay mekiğiyle markete gitmek gibi hissedilebilir.</p>

<p><strong>Meilisearch</strong>, geliştirici deneyimine odaklanır. Yazım hatalarını otomatik tolere eder ve iyi sonuçlara ulaşmak için uzun yapılandırmalar istemez. MVP, kurum içi doküman araması ve içerik siteleri için oldukça pratiktir.</p>

<p><strong>Typesense</strong> ise sadelik ile kontrol arasında güzel bir denge kurar. Şema tanımı zorunludur; bu yaklaşım ilk aşamada ek iş çıkarsa da veri yapısının tutarlı kalmasını sağlar.</p>

<h2 id="örnek-belge-indeksleme">Örnek belge indeksleme</h2>

<p>Aşağıdaki JavaScript kodu, metni çıkarılmış bir dosyayı Meilisearch indeksine ekler:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">MeiliSearch</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">meilisearch</span><span class="dl">'</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">MeiliSearch</span><span class="p">({</span>
  <span class="na">host</span><span class="p">:</span> <span class="dl">'</span><span class="s1">http://localhost:7700</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">apiKey</span><span class="p">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">MEILI_MASTER_KEY</span>
<span class="p">});</span>

<span class="kd">const</span> <span class="nx">documents</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">index</span><span class="p">(</span><span class="dl">'</span><span class="s1">documents</span><span class="dl">'</span><span class="p">);</span>

<span class="k">await</span> <span class="nx">documents</span><span class="p">.</span><span class="nf">addDocuments</span><span class="p">([</span>
  <span class="p">{</span>
    <span class="na">id</span><span class="p">:</span> <span class="dl">'</span><span class="s1">rapor-2026</span><span class="dl">'</span><span class="p">,</span>
    <span class="na">title</span><span class="p">:</span> <span class="dl">'</span><span class="s1">2026 Güvenlik Raporu</span><span class="dl">'</span><span class="p">,</span>
    <span class="na">path</span><span class="p">:</span> <span class="dl">'</span><span class="s1">/raporlar/guvenlik.pdf</span><span class="dl">'</span><span class="p">,</span>
    <span class="na">extension</span><span class="p">:</span> <span class="dl">'</span><span class="s1">pdf</span><span class="dl">'</span><span class="p">,</span>
    <span class="na">content</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Sunucu güvenliği, erişim kontrolü ve yedekleme...</span><span class="dl">'</span><span class="p">,</span>
    <span class="na">allowedUsers</span><span class="p">:</span> <span class="p">[</span><span class="dl">'</span><span class="s1">user-17</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">user-42</span><span class="dl">'</span><span class="p">]</span>
  <span class="p">}</span>
<span class="p">]);</span>

<span class="kd">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">documents</span><span class="p">.</span><span class="nf">search</span><span class="p">(</span><span class="dl">'</span><span class="s1">sunucu güvenligi</span><span class="dl">'</span><span class="p">,</span> <span class="p">{</span>
  <span class="na">filter</span><span class="p">:</span> <span class="dl">'</span><span class="s1">allowedUsers = user-17</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">limit</span><span class="p">:</span> <span class="mi">10</span>
<span class="p">});</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">result</span><span class="p">.</span><span class="nx">hits</span><span class="p">);</span>
</code></pre></div></div>

<p>Kod, belgeyi <code class="language-plaintext highlighter-rouge">documents</code> indeksine ekler ve yazım hatası içeren bir sorgu çalıştırır. Gerçek projede erişim filtresi kritik önemdedir: Kullanıcının göremediği bir dosya, arama sonucunda da görünmemelidir. Ayrıca API anahtarını istemci tarafına koymak yerine backend üzerinde saklamak gerekir.</p>

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

<p>Milyonlarca belge, karmaşık filtreler ve ayrıntılı analiz gerekiyorsa <strong>Elasticsearch</strong> doğru adaydır. Birkaç saatte çalışan, kullanıcı dostu bir arama deneyimi hedefleniyorsa <strong>Meilisearch</strong> öne çıkar. Düşük gecikme, güçlü yazım toleransı ve açık bir veri şeması isteniyorsa <strong>Typesense</strong> tercih edilebilir.</p>

<p>Motor seçiminden bağımsız olarak başarıyı belirleyen asıl unsurlar; kaliteli metin çıkarma, doğru metadata, Türkçe dil analizi, yetkilendirme ve düzenli indeks güncellemesidir. Motor arabanın kalbidir; fakat tekerlekler yoksa hiçbir yere gidemezsiniz.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="elasticsearch" /><category term="meilisearch" /><category term="typesense" /><category term="arama-motoru" /><category term="dosya-indeksleme" /><category term="backend" /><summary type="html"><![CDATA[Binlerce PDF, Word belgesi ve metin dosyası arasında doğru dosyayı bulmaya çalışmak, dijital samanlıkta iğne aramaya benzeyebilir. Neyse ki Elasticsearch, Meilisearch ve Typesense gibi arama motorları; dosya içeriklerini indeksleyerek milisaniyeler içinde alakalı sonuçlar sunabilir. Peki bu üçlüden hangisi projenize daha uygun?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dosya-arama-sistemi-35.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dosya-arama-sistemi-35.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Düşünceleri Görselleştirmek: Mindmaps, draw.io ve Excalidraw ile Zihin Haritası Sistemi</title><link href="https://program.sonsuz.us/posts/dusunceleri-gorsellestirmek-mindmaps-drawio-ve-excalidraw-ile-zihin-haritasi-sistemi/" rel="alternate" type="text/html" title="Düşünceleri Görselleştirmek: Mindmaps, draw.io ve Excalidraw ile Zihin Haritası Sistemi" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dusunceleri-gorsellestirmek-mindmaps-drawio-ve-excalidraw-ile-zihin-haritasi-sistemi</id><content type="html" xml:base="https://program.sonsuz.us/posts/dusunceleri-gorsellestirmek-mindmaps-drawio-ve-excalidraw-ile-zihin-haritasi-sistemi/"><![CDATA[<p>Bir fikir bazen zihnimizde şahane görünür; kâğıda döküldüğünde ise kabloları birbirine karışmış bir sunucu odasına dönüşür. Zihin haritası sistemi, düşünceleri merkezî bir kavramın etrafında dallandırarak bu karmaşayı görünür ve yönetilebilir hâle getirir. Mindmaps yaklaşımı hızlı düşünmek, draw.io düzenli diyagramlar üretmek, Excalidraw ise özgürce karalamak için farklı avantajlar sunar.
``</p>

<h2 id="zihin-haritasının-teorik-mantığı">Zihin haritasının teorik mantığı</h2>

<p>İnsan zihni bilgileri yalnızca doğrusal listeler şeklinde saklamaz. Kavramlar arasında çağrışımlar, hiyerarşiler ve neden-sonuç bağlantıları kurar. Zihin haritası da bu yapıyı taklit eder: merkezde ana konu, çevresinde alt başlıklar ve onların altında ayrıntılar bulunur.</p>

<p>Bir haritanın kullanılabilirliğini basitçe şöyle düşünebiliriz:</p>

\[V = B - (K + G)\]

<p>Burada $V$ haritanın sağladığı zihinsel verim, $B$ görünür bağlantıların faydası, $K$ görsel karmaşıklık ve $G$ gereksiz ayrıntıdır. Daha fazla düğüm eklemek her zaman daha iyi değildir. Amaç, beynin yükünü başka bir yere taşırken yeni bir görsel canavar oluşturmamaktır.</p>

<p>İyi bir sistem üç katmandan oluşabilir:</p>

<ol>
  <li><strong>Yakalama:</strong> Fikirleri sansürlemeden hızla kaydetmek.</li>
  <li><strong>Düzenleme:</strong> Benzer fikirleri gruplamak ve ilişkileri tanımlamak.</li>
  <li><strong>Sunma:</strong> Haritayı başkalarının anlayabileceği temiz bir çıktıya dönüştürmek.</li>
</ol>

<h2 id="hangi-araç-ne-zaman-kullanılmalı">Hangi araç ne zaman kullanılmalı?</h2>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Güçlü olduğu alan</th>
      <th>Zayıf olduğu alan</th>
      <th>İdeal kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Mindmaps</td>
      <td>Hızlı dallanma ve odaklanma</td>
      <td>Karmaşık teknik gösterimler</td>
      <td>Beyin fırtınası, içerik planı</td>
    </tr>
    <tr>
      <td>draw.io</td>
      <td>Hassas hizalama ve zengin şekiller</td>
      <td>Serbest düşünmede yavaş kalabilir</td>
      <td>Mimari, süreç ve UML diyagramları</td>
    </tr>
    <tr>
      <td>Excalidraw</td>
      <td>Doğal, samimi ve hızlı çizim</td>
      <td>Büyük haritalarda düzen zorlaşabilir</td>
      <td>Toplantı, eğitim ve taslak anlatım</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/dusunceleri-gorsellestirmek-mindmaps-71.svg" alt="dusunceleri-gorsellestirmek-mindmaps-71" /></p>

<p>Mindmaps türü araçlarda <code class="language-plaintext highlighter-rouge">Tab</code> ile alt dal, <code class="language-plaintext highlighter-rouge">Enter</code> ile kardeş dal açmak düşünce akışını hızlandırır. draw.io, ızgara ve bağlayıcıları sayesinde düzenli sonuç verir. Excalidraw’ın el çizimi görünümü ise taslağın henüz değişebilir olduğunu hissettirir; böylece ekip üyeleri kusursuz görünen bir diyagramı eleştirmekten çekinmez.</p>

<h2 id="tek-araç-yerine-iş-akışı-kurmak">Tek araç yerine iş akışı kurmak</h2>

<p>En verimli yöntem, araçları rakip değil aşama olarak görmektir. Örneğin yeni bir yazılım projesinde fikirleri önce Mindmaps veya Excalidraw üzerinde toplayabilir, ardından kalıcı mimariyi draw.io ile çizebilirsin.</p>

<p>Akışı kodla ifade etmek, sistemin tekrar kullanılmasını kolaylaştırır. Aşağıdaki Mermaid şeması fikirden dokümantasyona giden süreci tanımlar:</p>

<pre><code class="language-mermaid">flowchart LR
    A[Ham fikirler] --&gt; B[Mindmap ile dallandır]
    B --&gt; C{Harita karmaşık mı?}
    C -- Hayır --&gt; D[Excalidraw ile anlat]
    C -- Evet --&gt; E[draw.io ile yapılandır]
    D --&gt; F[Ekiple gözden geçir]
    E --&gt; F
    F --&gt; G[Dokümantasyona ekle]
</code></pre>

<p>Bu kod, desteklenen Markdown ortamlarında görsel diyagrama dönüşür. Ayrıca draw.io içindeki Mermaid ekleme özelliğiyle başlangıç şeması olarak kullanılabilir. Böylece kutuları tek tek oluşturmadan yapıyı kodla kurup daha sonra görsel olarak düzenlersin.</p>

<h2 id="sürdürülebilir-haritalar-için-kurallar">Sürdürülebilir haritalar için kurallar</h2>

<p>Her düğümde mümkünse <strong>üç ila beş kelime</strong> kullan. Renkleri dekorasyon için değil, anlam taşımak için seç: kırmızı risk, yeşil tamamlanan iş, mavi bilgi gibi. Çapraz bağlantıları yalnızca gerçekten ilişki varsa ekle; aksi hâlde harita örümcek ağına döner.</p>

<p>Dosya adlarında da ortak bir düzen benimse:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>proje-konu-asama-tarih.ext
odeme-sistemi-fikirler-2026-09.excalidraw
odeme-sistemi-mimari-v2.drawio
</code></pre></div></div>

<p>Son olarak her haritaya bir amaç sorusu yaz: “Bu harita hangi kararı vermeme yardım edecek?” Cevap yoksa muhtemelen düşünce üretmiyor, yalnızca renkli kutular biriktiriyorsundur. Doğru araç ve sade kurallarla zihin haritası, fikir mezarlığı değil yaşayan bir düşünme sistemi olur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="zihin haritası" /><category term="mindmaps" /><category term="draw.io" /><category term="excalidraw" /><category term="görsel düşünme" /><category term="üretkenlik" /><summary type="html"><![CDATA[Bir fikir bazen zihnimizde şahane görünür; kâğıda döküldüğünde ise kabloları birbirine karışmış bir sunucu odasına dönüşür. Zihin haritası sistemi, düşünceleri merkezî bir kavramın etrafında dallandırarak bu karmaşayı görünür ve yönetilebilir hâle getirir. Mindmaps yaklaşımı hızlı düşünmek, draw.io düzenli diyagramlar üretmek, Excalidraw ise özgürce karalamak için farklı avantajlar sunar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dusunceleri-gorsellestirmek-mindmaps-71.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dusunceleri-gorsellestirmek-mindmaps-71.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Excel’den Özgürlüğe: EtherCalc, Baserow ve NocoDB Karşılaştırması</title><link href="https://program.sonsuz.us/posts/excelden-ozgurluge-ethercalc-baserow-ve-nocodb-karsilastirmasi/" rel="alternate" type="text/html" title="Excel’den Özgürlüğe: EtherCalc, Baserow ve NocoDB Karşılaştırması" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/excelden-ozgurluge-ethercalc-baserow-ve-nocodb-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/excelden-ozgurluge-ethercalc-baserow-ve-nocodb-karsilastirmasi/"><![CDATA[<p>Elektronik tablolar küçük ekiplerin İsviçre çakısıdır: stok tutulur, görevler izlenir, hatta müşteri ilişkileri yönetilmeye çalışılır. Ancak dosyalar büyüdükçe formüller kırılır, kopyalar çoğalır ve “son sürüm hangisi?” sorusu yankılanmaya başlar. Açık kaynaklı EtherCalc, Baserow ve NocoDB; bu karmaşaya farklı seviyelerde düzen getiren, tarayıcı üzerinden kullanılabilen üç güçlü alternatiftir.</p>

<p>``</p>

<h2 id="aynı-tablo-farklı-düşünce-biçimleri">Aynı tablo, farklı düşünce biçimleri</h2>

<p>Bu araçları karşılaştırmadan önce elektronik tablo ile veritabanı arasındaki temel farkı anlamalıyız. Elektronik tabloda hücreler merkezdedir; veritabanında ise kayıtlar, alanlar ve aralarındaki ilişkiler önemlidir.</p>

<p>Bir sipariş tablosunun toplam tutarı basitçe şöyle hesaplanabilir:</p>

\[T = \sum_{i=1}^{n} q_i \times p_i\]

<p>Burada $q_i$ ürün miktarını, $p_i$ birim fiyatı temsil eder. EtherCalc bu hesabı doğrudan hücre formülleriyle yapar. Baserow ve NocoDB ise miktar ile fiyatı yapılandırılmış alanlarda saklayıp hesaplanan alanlar veya sorgular üzerinden işler. Veri büyüdüğünde bu ayrım oldukça önemlidir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>EtherCalc</th>
      <th>Baserow</th>
      <th>NocoDB</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel yaklaşım</td>
      <td>Ortak elektronik tablo</td>
      <td>No-code veritabanı</td>
      <td>Veritabanına tablo arayüzü</td>
    </tr>
    <tr>
      <td>Öğrenme eğrisi</td>
      <td>Çok düşük</td>
      <td>Düşük</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>İlişkisel veri</td>
      <td>Sınırlı</td>
      <td>Güçlü</td>
      <td>Çok güçlü</td>
    </tr>
    <tr>
      <td>Mevcut SQL desteği</td>
      <td>Yok</td>
      <td>Ana odak değil</td>
      <td>Temel kullanım amacı</td>
    </tr>
    <tr>
      <td>İdeal kullanıcı</td>
      <td>Hızlı iş birliği isteyen ekip</td>
      <td>Teknik olmayan ürün ekipleri</td>
      <td>SQL altyapısı bulunan ekipler</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/excelden-ozgurluge-ethercalc-70.svg" alt="excelden-ozgurluge-ethercalc-70" /></p>

<h2 id="ethercalc-hemen-aç-birlikte-yaz">EtherCalc: Hemen aç, birlikte yaz</h2>

<p>EtherCalc, Google Sheets benzeri gerçek zamanlı bir çalışma deneyimi sunar. Hesap oluşturma zorunluluğu olmadan tablo paylaşabilmesi, toplantılar, geçici listeler ve ortak hesaplamalar için büyük kolaylıktır. Formül bilen biri araca neredeyse anında uyum sağlar.</p>

<p>Bununla birlikte EtherCalc bir veritabanı değildir. Karmaşık kayıt ilişkileri, ayrıntılı yetkilendirme veya gelişmiş otomasyon gerektiğinde sınırlarına çabuk ulaşır. Kısacası hızlıdır; fakat kurumsal veri mimarisinin omurgası olmaya çalışmaz.</p>

<h2 id="baserow-tablodan-uygulamaya-geçiş">Baserow: Tablodan uygulamaya geçiş</h2>

<p>Baserow, elektronik tablo rahatlığını ilişkisel veritabanı disipliniyle birleştirir. Metin, sayı, seçim, dosya ve bağlantılı kayıt gibi alan türleri tanımlanabilir. Örneğin müşteriler ile siparişleri ayrı tablolarda tutup birbirine bağlayabilirsiniz. Böylece müşteri adı değiştiğinde yüzlerce satırı elle düzeltmeniz gerekmez.</p>

<p>Basit bir otomasyon istemcisi şu şekilde kayıt ekleyebilir:</p>

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

<span class="n">url</span> <span class="o">=</span> <span class="sh">"</span><span class="s">https://baserow.example/api/database/rows/table/42/</span><span class="sh">"</span>
<span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">Authorization</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Token API_ANAHTARI</span><span class="sh">"</span><span class="p">}</span>
<span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">Musteri</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Ada Yazılım</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Tutar</span><span class="sh">"</span><span class="p">:</span> <span class="mi">4800</span><span class="p">,</span> <span class="sh">"</span><span class="s">Durum</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Yeni</span><span class="sh">"</span><span class="p">}</span>

<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">data</span><span class="p">)</span>
<span class="n">response</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="nf">json</span><span class="p">())</span>
</code></pre></div></div>

<p>Bu kod, Baserow API’sine yeni bir satış kaydı gönderir. Gerçek projelerde anahtarın kaynak kod yerine ortam değişkeninde saklanması gerekir.</p>

<h2 id="nocodb-sql-veritabanına-kullanıcı-dostu-yüz">NocoDB: SQL veritabanına kullanıcı dostu yüz</h2>

<p>NocoDB’nin yıldızlaştığı nokta, mevcut SQL veritabanlarını anlaşılır bir tablo arayüzüne dönüştürmesidir. PostgreSQL veya MySQL kullanan bir ekip, teknik olmayan çalışanlara doğrudan SQL öğretmeden veriye erişim sağlayabilir. Görünümler, ilişkiler, API erişimi ve rol tabanlı izinler operasyon araçları geliştirmeyi kolaylaştırır.</p>

<table>
  <thead>
    <tr>
      <th>Senaryo</th>
      <th>En uygun seçim</th>
      <th>Neden?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Anlık ortak bütçe hesabı</td>
      <td>EtherCalc</td>
      <td>Kurulum ve öğrenme yükü azdır</td>
    </tr>
    <tr>
      <td>İçerik takvimi veya CRM</td>
      <td>Baserow</td>
      <td>Alan türleri ve ilişkiler pratiktir</td>
    </tr>
    <tr>
      <td>Mevcut PostgreSQL’i yönetmek</td>
      <td>NocoDB</td>
      <td>SQL altyapısını görsel arayüze taşır</td>
    </tr>
  </tbody>
</table>

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

<p>Karar formülünü basitleştirirsek, seçim puanı $S$; kullanım kolaylığı $K$, veri ilişkisi ihtiyacı $R$ ve mevcut altyapıyla uyum $U$ üzerinden düşünülebilir:</p>

\[S = 0.3K + 0.4R + 0.3U\]

<p>Sadece birlikte hücre düzenlemek istiyorsanız EtherCalc yeterlidir. Kod yazmadan düzenli bir iş uygulaması kuracaksanız Baserow daha dengeli bir seçimdir. Halihazırda SQL veritabanınız varsa NocoDB en doğal köprüdür. Üçü de kendi sunucunuza kurulabildiği için veri kontrolü sağlar; ancak yedekleme, güncelleme ve erişim güvenliği sorumluluğunu da size bırakır. Yani özgürlük ücretsizdir, fakat sistem yöneticisi kahvesi bütçeye dahildir!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ethercalc" /><category term="baserow" /><category term="nocodb" /><category term="veritabanı" /><category term="no-code" /><category term="açık-kaynak" /><summary type="html"><![CDATA[Elektronik tablolar küçük ekiplerin İsviçre çakısıdır: stok tutulur, görevler izlenir, hatta müşteri ilişkileri yönetilmeye çalışılır. Ancak dosyalar büyüdükçe formüller kırılır, kopyalar çoğalır ve “son sürüm hangisi?” sorusu yankılanmaya başlar. Açık kaynaklı EtherCalc, Baserow ve NocoDB; bu karmaşaya farklı seviyelerde düzen getiren, tarayıcı üzerinden kullanılabilen üç güçlü alternatiftir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/excelden-ozgurluge-ethercalc-70.png" /><media:content medium="image" url="https://program.sonsuz.us/img/excelden-ozgurluge-ethercalc-70.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>