<?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-07T18:05:39+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">Abonelik Yönetiminde Üç Güçlü Seçenek: Kill Bill, Invoice Ninja ve Lago</title><link href="https://program.sonsuz.us/posts/abonelik-yonetiminde-uc-guclu-secenek-kill-bill-invoice-ninja-ve-lago/" rel="alternate" type="text/html" title="Abonelik Yönetiminde Üç Güçlü Seçenek: Kill Bill, Invoice Ninja ve Lago" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/abonelik-yonetiminde-uc-guclu-secenek-kill-bill-invoice-ninja-ve-lago</id><content type="html" xml:base="https://program.sonsuz.us/posts/abonelik-yonetiminde-uc-guclu-secenek-kill-bill-invoice-ninja-ve-lago/"><![CDATA[<p>Abonelik tabanlı bir ürün geliştirirken kredi kartından ödeme almak işin yalnızca görünen kısmıdır. Plan değişiklikleri, kullanım ölçümü, vergi, kupon, dönem ortası ücretlendirme ve başarısız tahsilatlar devreye girdiğinde küçük fatura modülü hızla minik bir muhasebe canavarına dönüşür. Kill Bill, Invoice Ninja ve Lago bu canavarı evcilleştirmeyi amaçlar; ancak aynı problemi farklı açılardan ele alırlar.</p>

<p><img src="/img/abonelik-yonetiminde-uc-33.svg" alt="abonelik-yonetiminde-uc-33" /></p>

<p>``</p>

<h2 id="önce-problemi-doğru-tanımlayalım">Önce problemi doğru tanımlayalım</h2>

<p>Bir abonelik sisteminde <strong>billing</strong>, müşterinin ne kadar borçlandığını hesaplar; <strong>invoicing</strong>, bu borcu resmi veya ticari bir belgeye dönüştürür; <strong>payment processing</strong> ise paranın tahsil edilmesini sağlar. Bu kavramları tek sepete atmak, ileride mimari karmaşaya yol açabilir.</p>

<p>Basit bir aylık ücret şu şekilde gösterilebilir:</p>

\[T = S + (q \times p) - d + v\]

<p>Burada $S$ sabit abonelik ücreti, $q$ tüketilen miktar, $p$ birim fiyat, $d$ indirim ve $v$ vergi tutarıdır. Kullanım bazlı bir SaaS ürününde asıl zorluk, $q$ değerini güvenilir biçimde toplamak ve doğru döneme yerleştirmektir.</p>

<h2 id="üç-aracın-karakteri">Üç aracın karakteri</h2>

<table>
  <thead>
    <tr>
      <th>Araç</th>
      <th>Temel odak</th>
      <th>Güçlü olduğu senaryo</th>
      <th>Dikkat edilmesi gereken nokta</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kill Bill</td>
      <td>Abonelik, katalog, ödeme ve faturalandırma altyapısı</td>
      <td>Karmaşık yaşam döngüsü ve ödeme akışları</td>
      <td>Kurulum ve operasyon bilgisi ister</td>
    </tr>
    <tr>
      <td>Invoice Ninja</td>
      <td>Teklif, fatura ve müşteri yönetimi</td>
      <td>Serbest çalışanlar ve hizmet şirketleri</td>
      <td>İleri düzey kullanım ölçümü ana odağı değildir</td>
    </tr>
    <tr>
      <td>Lago</td>
      <td>Kullanım bazlı ve hibrit ücretlendirme</td>
      <td>API tabanlı modern SaaS ürünleri</td>
      <td>Tahsilat ve muhasebe entegrasyonları ayrıca tasarlanmalıdır</td>
    </tr>
  </tbody>
</table>

<h3 id="kill-bill-ağır-sıklet-motor">Kill Bill: Ağır sıklet motor</h3>

<p>Kill Bill, abonelik yaşam döngüsünü ayrıntılı yönetmek isteyen ekipler için güçlüdür. Deneme süresi, yükseltme, düşürme, iptal, ödeme eklentileri ve gecikmiş hesap politikaları gibi konularda geniş bir model sunar. Birden fazla ödeme sağlayıcısını destekleyen, kuralları zamanla karmaşıklaşacak bir platform kuruyorsanız iyi bir adaydır.</p>

<p>Bunun bedeli operasyonel karmaşıklıktır. Kill Bill yalnızca birkaç API çağrısı yapıp unutacağınız hafif bir araç değildir. Katalog tasarımı, eklentiler, veri tabanı, olaylar ve sürüm yükseltmeleri için sahiplik gerekir.</p>

<h3 id="invoice-ninja-fatura-tarafının-pratik-ustası">Invoice Ninja: Fatura tarafının pratik ustası</h3>

<p>Invoice Ninja daha çok müşteriye teklif hazırlama, fatura gönderme, ödeme takibi ve gider yönetimi gibi iş süreçlerinde parlar. Ajanslar, danışmanlar ve küçük işletmeler için anlaşılır bir merkez oluşturur. Müşteri portalı ve yinelenen faturalar sayesinde klasik abonelik ihtiyaçlarını da karşılayabilir.</p>

<p>Ancak saniyede binlerce kullanım olayı üreten bir API platformunda, karmaşık ölçüm ve kademeli fiyatlama için tek başına ideal motor olmayabilir. Burada Invoice Ninja son belgeyi oluşturan katman olarak değerlendirilebilir.</p>

<h3 id="lago-kullanım-bazlı-saas-yaklaşımı">Lago: Kullanım bazlı SaaS yaklaşımı</h3>

<p>Lago; API çağrısı, depolama miktarı veya aktif kullanıcı sayısı gibi olaylardan ücret üretmeye odaklanır. Sabit ücret ile tüketimi birleştiren hibrit modellerde esnektir. Örneğin ilk 10.000 isteğin pakete dahil, sonraki her 1.000 isteğin ücretli olduğu bir plan modellenebilir.</p>

<p>Uygulamanın Lago’ya tutarlı olay göndermesi gerekir:</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">transaction_id</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">evt_98421</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">external_customer_id</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">customer_42</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">code</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">api_request</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">properties</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">requests</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1250</span><span class="p">}</span>
<span class="p">}</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">https://billing.example.com/api/v1/events</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">5</span>
<span class="p">).</span><span class="nf">raise_for_status</span><span class="p">()</span>
</code></pre></div></div>

<p>Bu kod, müşterinin ölçülen API kullanımını tekil işlem kimliğiyle faturalandırma sistemine iletir. <code class="language-plaintext highlighter-rouge">transaction_id</code>, tekrar gönderilen olayların çift ücret üretmesini önlemeye yardımcı olur. Üretimde kuyruk, yeniden deneme ve gözlemlenebilirlik de eklenmelidir.</p>

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

<p>Kararı özellik listesinden önce iş modeline göre verin. Karmaşık abonelik ve tahsilat orkestrasyonu için <strong>Kill Bill</strong>, kolay fatura ve müşteri operasyonları için <strong>Invoice Ninja</strong>, olay tabanlı ücretlendirme için <strong>Lago</strong> daha doğal seçimdir. Bazı mimarilerde Lago kullanım tutarını hesaplar, Invoice Ninja belgeyi üretir; Kill Bill ise ödeme yaşam döngüsünü yönetir. Yani bunlar her zaman rakip değil, doğru sınırlar çizildiğinde aynı orkestranın farklı enstrümanlarıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="abonelik" /><category term="faturalandırma" /><category term="kill bill" /><category term="invoice ninja" /><category term="lago" /><category term="saas" /><category term="fintech" /><summary type="html"><![CDATA[Abonelik tabanlı bir ürün geliştirirken kredi kartından ödeme almak işin yalnızca görünen kısmıdır. Plan değişiklikleri, kullanım ölçümü, vergi, kupon, dönem ortası ücretlendirme ve başarısız tahsilatlar devreye girdiğinde küçük fatura modülü hızla minik bir muhasebe canavarına dönüşür. Kill Bill, Invoice Ninja ve Lago bu canavarı evcilleştirmeyi amaçlar; ancak aynı problemi farklı açılardan ele alırlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/abonelik-yonetiminde-uc-33.png" /><media:content medium="image" url="https://program.sonsuz.us/img/abonelik-yonetiminde-uc-33.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Açık Kaynak Fatura Sistemleri: Invoice Ninja, Akaunting ve Crater Karşılaştırması</title><link href="https://program.sonsuz.us/posts/acik-kaynak-fatura-sistemleri-invoice-ninja-akaunting-ve-crater-karsilastirmasi/" rel="alternate" type="text/html" title="Açık Kaynak Fatura Sistemleri: Invoice Ninja, Akaunting ve Crater Karşılaştırması" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/acik-kaynak-fatura-sistemleri-invoice-ninja-akaunting-ve-crater-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/acik-kaynak-fatura-sistemleri-invoice-ninja-akaunting-ve-crater-karsilastirmasi/"><![CDATA[<p><img src="/img/acik-kaynak-fatura-68.svg" alt="acik-kaynak-fatura-68" /></p>

<p>Fatura hazırlamak yalnızca birkaç ürünü alt alta yazıp toplamı göstermek değildir. Müşteri kayıtları, vergiler, para birimleri, ödeme durumları ve yasal numaralandırma kuralları işin içine girdiğinde küçük bir tablo hızla mini bir muhasebe sistemine dönüşür. Neyse ki Invoice Ninja, Akaunting ve Crater gibi açık kaynak araçlar bu karmaşayı yönetilebilir hâle getiriyor.</p>

<p>``</p>

<h2 id="fatura-sisteminin-temel-mantığı">Fatura sisteminin temel mantığı</h2>

<p>Bir fatura uygulamasında müşteri, ürün ve ödeme birbirinden bağımsız veriler olarak saklanır. Fatura ise bunları belirli bir tarihte bir araya getiren belgedir. Bu yaklaşım aynı müşteriyi veya ürünü her işlemde yeniden yazmayı önler.</p>

<p>Temel hesaplama şu şekilde ifade edilebilir:</p>

\[Ara\ Toplam = \sum_{i=1}^{n}(Miktar_i \times Birim\ Fiyat_i)\]

<p>Vergi ve indirim eklendiğinde ödenecek tutar:</p>

\[Genel\ Toplam = Ara\ Toplam - İndirim + Vergi\]

<p>Örneğin 500 TL tutarındaki bir hizmete yüzde 10 indirim ve ardından yüzde 20 vergi uygulanırsa sonuç $500-50+90=540$ TL olur. Burada işlem sırası önemlidir; verginin indirimden önce hesaplanması farklı bir sonuç üretir.</p>

<h2 id="üç-güçlü-aday">Üç güçlü aday</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Invoice Ninja</th>
      <th>Akaunting</th>
      <th>Crater</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ana odak</td>
      <td>Faturalama ve ödeme</td>
      <td>Muhasebe yönetimi</td>
      <td>Sade faturalama</td>
    </tr>
    <tr>
      <td>Teknoloji</td>
      <td>Laravel, Flutter</td>
      <td>Laravel, Vue.js</td>
      <td>Laravel, Vue.js</td>
    </tr>
    <tr>
      <td>Çoklu şirket</td>
      <td>Güçlü</td>
      <td>Güçlü</td>
      <td>Daha sınırlı</td>
    </tr>
    <tr>
      <td>Muhasebe özellikleri</td>
      <td>Orta</td>
      <td>Gelişmiş</td>
      <td>Temel</td>
    </tr>
    <tr>
      <td>Kullanım kolaylığı</td>
      <td>Orta</td>
      <td>Orta</td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Eklenti yaklaşımı</td>
      <td>Entegrasyon ağırlıklı</td>
      <td>Uygulama mağazası</td>
      <td>Daha yalın</td>
    </tr>
  </tbody>
</table>

<h3 id="invoice-ninja">Invoice Ninja</h3>

<p>Invoice Ninja; teklif oluşturma, yinelenen faturalar, zaman takibi ve çevrim içi ödeme konularında öne çıkar. Serbest çalışanlar ve ajanslar için oldukça uygundur. Müşteriye özel portal sunması sayesinde faturalar görüntülenebilir, indirilebilir ve desteklenen ağ geçitleri üzerinden ödenebilir.</p>

<p>Özellik sayısı fazla olduğundan ilk yapılandırma biraz zaman alabilir. Buna karşılık otomatik hatırlatmalar ve yinelenen faturalar, düzenli hizmet veren işletmelerin ciddi zaman kazanmasını sağlar.</p>

<h3 id="akaunting">Akaunting</h3>

<p>Akaunting yalnızca fatura kesmek isteyenlerden ziyade gelir, gider, banka hesabı ve nakit akışı takibi yapmak isteyen işletmelere hitap eder. Çift taraflı muhasebe gibi gelişmiş ihtiyaçlar eklentilerle karşılanabilir.</p>

<p>Modüler yapı önemli bir avantajdır; ancak ihtiyaç duyulan bazı özelliklerin ücretli uygulamalar olarak sunulabileceği unutulmamalıdır. “Fatura da keseyim, şirketin finansal durumunu da izleyeyim” diyorsanız güçlü aday budur.</p>

<h3 id="crater">Crater</h3>

<p>Crater modern arayüzü ve sade kurulumu ile dikkat çeker. Fatura, teklif, gider ve ödeme yönetimi gibi temel işlevleri gereksiz kalabalık yaratmadan sunar. Küçük işletmeler veya kendi sunucusunda hafif bir çözüm isteyen geliştiriciler için güzel bir başlangıçtır.</p>

<p>Bununla birlikte proje seçerken güncelleme sıklığını, topluluk etkinliğini ve güvenlik yamalarını kontrol etmek gerekir. Açık kaynak dünyasında iyi görünen bir arayüz kadar sürdürülebilir bakım da değerlidir.</p>

<h2 id="basit-bir-fatura-hesabı">Basit bir fatura hesabı</h2>

<p>Aşağıdaki JavaScript fonksiyonu satır toplamlarını hesaplar, indirimi uygular ve vergi ekler:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">calculateInvoice</span><span class="p">(</span><span class="nx">items</span><span class="p">,</span> <span class="nx">discountRate</span><span class="p">,</span> <span class="nx">taxRate</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">subtotal</span> <span class="o">=</span> <span class="nx">items</span><span class="p">.</span><span class="nf">reduce</span><span class="p">(</span>
    <span class="p">(</span><span class="nx">sum</span><span class="p">,</span> <span class="nx">item</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">sum</span> <span class="o">+</span> <span class="nx">item</span><span class="p">.</span><span class="nx">quantity</span> <span class="o">*</span> <span class="nx">item</span><span class="p">.</span><span class="nx">unitPrice</span><span class="p">,</span>
    <span class="mi">0</span>
  <span class="p">);</span>

  <span class="kd">const</span> <span class="nx">discount</span> <span class="o">=</span> <span class="nx">subtotal</span> <span class="o">*</span> <span class="nx">discountRate</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">taxableAmount</span> <span class="o">=</span> <span class="nx">subtotal</span> <span class="o">-</span> <span class="nx">discount</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">tax</span> <span class="o">=</span> <span class="nx">taxableAmount</span> <span class="o">*</span> <span class="nx">taxRate</span><span class="p">;</span>

  <span class="k">return</span> <span class="p">{</span>
    <span class="nx">subtotal</span><span class="p">,</span>
    <span class="nx">discount</span><span class="p">,</span>
    <span class="nx">tax</span><span class="p">,</span>
    <span class="na">total</span><span class="p">:</span> <span class="nx">taxableAmount</span> <span class="o">+</span> <span class="nx">tax</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="nf">calculateInvoice</span><span class="p">(</span>
  <span class="p">[{</span> <span class="na">quantity</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="na">unitPrice</span><span class="p">:</span> <span class="mi">750</span> <span class="p">}],</span>
  <span class="mf">0.10</span><span class="p">,</span>
  <span class="mf">0.20</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">total</span><span class="p">);</span> <span class="c1">// 1620</span>
</code></pre></div></div>

<p>Bu kod eğitim amaçlıdır. Gerçek sistemlerde kayan nokta hatalarını önlemek için para tutarları kuruş cinsinden tam sayı olarak veya hassas ondalık kütüphaneleriyle saklanmalıdır.</p>

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

<p>Yinelenen faturalar, müşteri portalı ve ödeme entegrasyonları öncelikliyse <strong>Invoice Ninja</strong>; kapsamlı finans takibi isteniyorsa <strong>Akaunting</strong>; hızlı, sade ve geliştirici dostu bir deneyim aranıyorsa <strong>Crater</strong> daha uygundur. Son karardan önce yedekleme, e-posta teslimatı, yerel vergi mevzuatı, Türkçe desteği ve projenin güncelliği mutlaka test edilmelidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="fatura" /><category term="invoice ninja" /><category term="akaunting" /><category term="crater" /><category term="açık kaynak" /><category term="muhasebe" /><summary type="html"><![CDATA[Fatura hazırlamak yalnızca birkaç ürünü alt alta yazıp toplamı göstermek değildir. Müşteri kayıtları, vergiler, para birimleri, ödeme durumları ve yasal numaralandırma kuralları işin içine girdiğinde küçük bir tablo hızla mini bir muhasebe sistemine dönüşür. Neyse ki Invoice Ninja, Akaunting ve Crater gibi açık kaynak araçlar bu karmaşayı yönetilebilir hâle getiriyor.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/acik-kaynak-fatura-68.png" /><media:content medium="image" url="https://program.sonsuz.us/img/acik-kaynak-fatura-68.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital Ürün Satış Sistemi Kurmak: WooCommerce, Easy Digital Downloads ve PrestaShop</title><link href="https://program.sonsuz.us/posts/dijital-urun-satis-sistemi-kurmak-woocommerce-easy-digital-downloads-ve-prestashop/" rel="alternate" type="text/html" title="Dijital Ürün Satış Sistemi Kurmak: WooCommerce, Easy Digital Downloads ve PrestaShop" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-urun-satis-sistemi-kurmak-woocommerce-easy-digital-downloads-ve-prestashop</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-urun-satis-sistemi-kurmak-woocommerce-easy-digital-downloads-ve-prestashop/"><![CDATA[<p><img src="/img/dijital-urun-satis-95.svg" alt="dijital-urun-satis-95" /></p>

<p>E-kitap, yazılım lisansı, tasarım şablonu veya çevrim içi eğitim satmak kulağa basit gelir: Dosyayı yükle, fiyatı belirle ve satışları bekle! Fakat güvenli teslimat, ödeme doğrulama, vergi, lisans yönetimi ve müşteri deneyimi devreye girdiğinde küçük dükkânımız gerçek bir yazılım projesine dönüşür. Bu yazıda WooCommerce, Easy Digital Downloads ve PrestaShop seçeneklerini karşılaştırarak doğru sistemi nasıl kurabileceğimizi inceleyeceğiz.</p>

<p>``</p>

<h2 id="dijital-satışın-temel-mantığı">Dijital satışın temel mantığı</h2>

<p>Dijital ürünlerde fiziksel stok bulunmasa da erişim hakkı bir çeşit stok gibi düşünülmelidir. Başarılı bir siparişin yaşam döngüsü şöyledir:</p>

<ol>
  <li>Müşteri ürünü sepete ekler.</li>
  <li>Ödeme sağlayıcısı işlemi doğrular.</li>
  <li>Sistem siparişi tamamlandı durumuna geçirir.</li>
  <li>Kullanıcıya süreli veya indirme sayısı sınırlı bir bağlantı verir.</li>
  <li>İşlem fatura, e-posta ve kayıt mekanizmalarına aktarılır.</li>
</ol>

<p>Dosyanın herkese açık bir klasörde tutulması büyük hatadır. Teslimat bağlantısı tahmin edilemez, kullanıcıya özel ve mümkünse zaman aşımına sahip olmalıdır. Örneğin bağlantının geçerliliği $T = 24$ saat, indirme limiti ise $L = 3$ olarak tanımlanabilir.</p>

<p>Satışın ekonomik tarafını da unutmamalıyız. Basitleştirilmiş net gelir hesabı:</p>

\[N = F - K - V - I\]

<p>Burada $F$ satış fiyatını, $K$ ödeme komisyonunu, $V$ vergiyi, $I$ ise iade maliyetini temsil eder. Platform seçerken yalnızca kurulum ücretine değil, bu değişkenlerin nasıl yönetildiğine de bakılmalıdır.</p>

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

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>WooCommerce</th>
      <th>Easy Digital Downloads</th>
      <th>PrestaShop</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Altyapı</td>
      <td>WordPress eklentisi</td>
      <td>WordPress eklentisi</td>
      <td>Bağımsız e-ticaret sistemi</td>
    </tr>
    <tr>
      <td>Ana yaklaşım</td>
      <td>Fiziksel ve dijital ürün</td>
      <td>Dijital ürüne odaklı</td>
      <td>Geniş kapsamlı mağaza</td>
    </tr>
    <tr>
      <td>Kurulum kolaylığı</td>
      <td>Kolay</td>
      <td>Çok kolay</td>
      <td>Orta</td>
    </tr>
    <tr>
      <td>Özelleştirme</td>
      <td>Çok yüksek</td>
      <td>Yüksek</td>
      <td>Yüksek</td>
    </tr>
    <tr>
      <td>Kaynak tüketimi</td>
      <td>Eklentilere bağlı</td>
      <td>Genellikle düşük</td>
      <td>Görece yüksek</td>
    </tr>
    <tr>
      <td>Uygun senaryo</td>
      <td>Karma mağaza</td>
      <td>Dosya ve lisans satışı</td>
      <td>Büyük katalog, çoklu mağaza</td>
    </tr>
  </tbody>
</table>

<p><strong>WooCommerce</strong>, ileride fiziksel ürün satmayı düşünenler için esnek bir seçimdir. Tema ve eklenti ekosistemi oldukça geniştir; ancak gereksiz eklentiler performansı ve güvenliği olumsuz etkileyebilir.</p>

<p><strong>Easy Digital Downloads</strong>, kısaca EDD, dijital teslimatı merkeze alır. İndirme kayıtları, müşteri geçmişi ve dosya erişimi daha sade biçimde yönetilir. Yazılım lisansı, üyelik veya abonelik için ücretli eklentiler gerekebilir.</p>

<p><strong>PrestaShop</strong> ise bağımsız ve kapsamlı bir mağaza motorudur. Çoklu dil, para birimi ve büyük katalog yönetiminde güçlüdür. Yalnızca birkaç PDF satılacaksa biraz top ile sivrisinek avlamak sayılabilir!</p>

<h2 id="woocommerce-ile-örnek-erişim-kontrolü">WooCommerce ile örnek erişim kontrolü</h2>

<p>Aşağıdaki PHP kodu, tamamlanan sipariş sonrasında basit bir kayıt oluşturur. Gerçek projede kayıt; lisans anahtarı, süre sonu ve ürün kimliğiyle genişletilmelidir.</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">'woocommerce_order_status_completed'</span><span class="p">,</span> <span class="s1">'urun_erisim_kaydi'</span><span class="p">);</span>

<span class="k">function</span> <span class="n">urun_erisim_kaydi</span><span class="p">(</span><span class="nv">$order_id</span><span class="p">)</span> <span class="p">{</span>
    <span class="nv">$order</span> <span class="o">=</span> <span class="nf">wc_get_order</span><span class="p">(</span><span class="nv">$order_id</span><span class="p">);</span>

    <span class="k">foreach</span> <span class="p">(</span><span class="nv">$order</span><span class="o">-&gt;</span><span class="nf">get_items</span><span class="p">()</span> <span class="k">as</span> <span class="nv">$item</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="nv">$item</span><span class="o">-&gt;</span><span class="nf">get_product</span><span class="p">()</span><span class="o">-&gt;</span><span class="nf">is_downloadable</span><span class="p">())</span> <span class="p">{</span>
            <span class="nf">update_post_meta</span><span class="p">(</span>
                <span class="nv">$order_id</span><span class="p">,</span>
                <span class="s1">'_dijital_erisim_zamani'</span><span class="p">,</span>
                <span class="nf">current_time</span><span class="p">(</span><span class="s1">'mysql'</span><span class="p">)</span>
            <span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">woocommerce_order_status_completed</code> kancası sipariş tamamlandığında çalışır. Kod, siparişte indirilebilir ürün bulunursa erişim zamanını meta veri olarak saklar. Böylece destek, denetim veya özel lisans süreçleri için iz bırakılır.</p>

<h2 id="hangi-platformu-seçmelisin">Hangi platformu seçmelisin?</h2>

<p>Hızlıca e-kitap, müzik veya şablon satacaksan EDD en temiz başlangıçtır. Dijital ve fiziksel ürünleri aynı sepette buluşturmak istiyorsan WooCommerce daha mantıklıdır. Çok dilli, kapsamlı ve bağımsız bir mağaza hedefliyorsan PrestaShop öne çıkar.</p>

<p>Platform ne olursa olsun SSL, düzenli yedekleme, güvenli ödeme altyapısı, KVKK uyumu ve test siparişleri zorunlu kabul edilmelidir. En iyi sistem, en fazla özelliğe sahip olan değil; müşterinin ödemeden indirmeye kadar sorunsuz ilerlediği sistemdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="woocommerce" /><category term="easy-digital-downloads" /><category term="prestashop" /><category term="dijital-ürün" /><category term="e-ticaret" /><category term="wordpress" /><summary type="html"><![CDATA[E-kitap, yazılım lisansı, tasarım şablonu veya çevrim içi eğitim satmak kulağa basit gelir: Dosyayı yükle, fiyatı belirle ve satışları bekle! Fakat güvenli teslimat, ödeme doğrulama, vergi, lisans yönetimi ve müşteri deneyimi devreye girdiğinde küçük dükkânımız gerçek bir yazılım projesine dönüşür. Bu yazıda WooCommerce, Easy Digital Downloads ve PrestaShop seçeneklerini karşılaştırarak doğru sistemi nasıl kurabileceğimizi inceleyeceğiz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-urun-satis-95.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-urun-satis-95.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">E-Ticaret Arenası: WooCommerce, PrestaShop ve OpenCart Karşılaştırması</title><link href="https://program.sonsuz.us/posts/e-ticaret-arenasi-woocommerce-prestashop-ve-opencart-karsilastirmasi/" rel="alternate" type="text/html" title="E-Ticaret Arenası: WooCommerce, PrestaShop ve OpenCart Karşılaştırması" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/e-ticaret-arenasi-woocommerce-prestashop-ve-opencart-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/e-ticaret-arenasi-woocommerce-prestashop-ve-opencart-karsilastirmasi/"><![CDATA[<p>Bir e-ticaret mağazası kurmaya karar verdiğinizde ürünlerden önce seçmeniz gereken önemli bir şey vardır: mağazanın çalışacağı altyapı. WooCommerce, PrestaShop ve OpenCart bu alandaki en popüler açık kaynak seçeneklerdir. Üçü de ürün satabilir, sipariş yönetebilir ve ödeme alabilir; ancak bunu farklı mimariler, maliyetler ve yönetim deneyimleriyle gerçekleştirir.</p>

<p><img src="/img/e-ticaret-arenasi-79.svg" alt="e-ticaret-arenasi-79" /></p>

<p>``</p>

<h2 id="temel-yaklaşımları">Temel Yaklaşımları</h2>

<p>WooCommerce bağımsız bir e-ticaret yazılımı değil, WordPress üzerine kurulan bir eklentidir. WordPress içerik yönetiminde güçlüyken WooCommerce ona ürün, sepet, sipariş ve ödeme özellikleri kazandırır. Blog ile mağazayı aynı çatı altında yönetmek isteyenler için doğal bir seçimdir.</p>

<p>PrestaShop doğrudan e-ticaret amacıyla geliştirilmiştir. Katalog, stok, vergi, para birimi ve çoklu mağaza gibi özelliklere daha merkezi yaklaşır. Özellikle orta ölçekli ve büyüme hedefleyen mağazalarda ayrıntılı yönetim araçları sunar.</p>

<p>OpenCart ise sade ve görece hafif bir e-ticaret sistemidir. Yönetim paneli kolay öğrenilir, temel sunucularda çalışabilir ve hızlı başlangıç sağlar. Bununla birlikte gelişmiş ihtiyaçlar ortaya çıktığında eklenti veya özel geliştirme gerekebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>WooCommerce</th>
      <th>PrestaShop</th>
      <th>OpenCart</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel yapı</td>
      <td>WordPress eklentisi</td>
      <td>Bağımsız e-ticaret sistemi</td>
      <td>Bağımsız e-ticaret sistemi</td>
    </tr>
    <tr>
      <td>Öğrenme eğrisi</td>
      <td>Düşük-orta</td>
      <td>Orta-yüksek</td>
      <td>Düşük-orta</td>
    </tr>
    <tr>
      <td>İçerik yönetimi</td>
      <td>Çok güçlü</td>
      <td>Orta</td>
      <td>Temel</td>
    </tr>
    <tr>
      <td>Büyük kataloglar</td>
      <td>Optimizasyon ister</td>
      <td>Güçlü</td>
      <td>Uygun yapılandırma ister</td>
    </tr>
    <tr>
      <td>Eklenti çeşitliliği</td>
      <td>Çok geniş</td>
      <td>Geniş</td>
      <td>Geniş</td>
    </tr>
    <tr>
      <td>İdeal kullanım</td>
      <td>İçerik odaklı mağaza</td>
      <td>Profesyonel ve büyüyen mağaza</td>
      <td>Küçük veya sade mağaza</td>
    </tr>
  </tbody>
</table>

<h2 id="maliyet-yalnızca-kurulum-değildir">Maliyet Yalnızca Kurulum Değildir</h2>

<p>Üç platform da ücretsiz indirilebilir. Ancak “açık kaynak” ifadesi mağazanın tamamen ücretsiz olacağı anlamına gelmez. Toplam sahip olma maliyetini şu şekilde düşünebiliriz:</p>

\[TCO = H + E + G + B + O\]

<p>Burada $H$ barındırma, $E$ eklenti ve tema, $G$ geliştirme, $B$ bakım, $O$ ise operasyon maliyetidir. Örneğin WooCommerce ucuz bir hosting ile başlayabilir; fakat trafik arttıkça önbellekleme, güvenlik ve veritabanı optimizasyonu gerekebilir. PrestaShop’un bazı modülleri bütçeyi yükseltebilir. OpenCart ekonomik başlayabilir, ancak özel entegrasyonlar geliştirici maliyeti oluşturabilir.</p>

<p>Platform seçiminde beklenen işlem yükü de önemlidir:</p>

\[Yuk = Ziyaretci \times DonusumOrani \times OrtalamaSepetIslemi\]

<p>Ziyaretçi sayısı tek başına yeterli bir ölçü değildir. Filtreleme, arama, kampanya kuralları ve eş zamanlı ödeme işlemleri sunucu yükünü ciddi biçimde etkileyebilir.</p>

<h2 id="entegrasyon-mantığı">Entegrasyon Mantığı</h2>

<p>Modern mağazalar yalnızca ürün göstermez; kargo, muhasebe, ödeme ve pazaryeri servisleriyle konuşur. Bu nedenle API ve kanca mekanizmaları önemlidir. Aşağıdaki basitleştirilmiş WooCommerce örneği, sipariş tamamlandığında kayıt 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">'woocommerce_order_status_completed'</span><span class="p">,</span> <span class="k">function</span> <span class="p">(</span><span class="nv">$orderId</span><span class="p">)</span> <span class="p">{</span>
    <span class="nv">$order</span> <span class="o">=</span> <span class="nf">wc_get_order</span><span class="p">(</span><span class="nv">$orderId</span><span class="p">);</span>

    <span class="nb">error_log</span><span class="p">(</span><span class="nb">sprintf</span><span class="p">(</span>
        <span class="s1">'Sipariş tamamlandı: #%d, Toplam: %s'</span><span class="p">,</span>
        <span class="nv">$orderId</span><span class="p">,</span>
        <span class="nv">$order</span><span class="o">-&gt;</span><span class="nf">get_total</span><span class="p">()</span>
    <span class="p">));</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Bu kod, sipariş durumu tamamlandığında çalışır ve sipariş numarasıyla toplam tutarı sunucu günlüğüne yazar. Gerçek bir projede aynı nokta ERP sistemine veri göndermek veya müşteriye özel bildirim üretmek için kullanılabilir. PrestaShop “hooks”, OpenCart ise “events” sistemiyle benzer genişletme noktaları sağlar.</p>

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

<p>Yoğun içerik, SEO ve blog çalışmaları planlıyorsanız WooCommerce avantajlıdır. Çoklu dil, para birimi, ayrıntılı katalog ve büyüme senaryoları ön plandaysa PrestaShop güçlü bir adaydır. Hızlı kurulan, sade yönetilen ve kaynak tüketimi görece düşük bir mağaza arıyorsanız OpenCart mantıklıdır.</p>

<p>Son karar yalnızca özellik listesine göre verilmemelidir. Ekibinizin deneyimi, yerel ödeme modülleri, güncelleme sıklığı, güvenlik takibi ve geliştirici erişimi değerlendirilmelidir. En iyi platform, en fazla özelliğe sahip olan değil; işletmenin bugünkü ihtiyaçlarını karşılarken yarının büyümesine gereksiz teknik borç oluşturmadan eşlik edendir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="e-ticaret" /><category term="woocommerce" /><category term="prestashop" /><category term="opencart" /><category term="php" /><category term="web geliştirme" /><summary type="html"><![CDATA[Bir e-ticaret mağazası kurmaya karar verdiğinizde ürünlerden önce seçmeniz gereken önemli bir şey vardır: mağazanın çalışacağı altyapı. WooCommerce, PrestaShop ve OpenCart bu alandaki en popüler açık kaynak seçeneklerdir. Üçü de ürün satabilir, sipariş yönetebilir ve ödeme alabilir; ancak bunu farklı mimariler, maliyetler ve yönetim deneyimleriyle gerçekleştirir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/e-ticaret-arenasi-79.png" /><media:content medium="image" url="https://program.sonsuz.us/img/e-ticaret-arenasi-79.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">E-Ticarette Açık Artırma: OpenCart Auction ve WooCommerce Auction Eklentileri</title><link href="https://program.sonsuz.us/posts/e-ticarette-acik-artirma-opencart-auction-ve-woocommerce-auction-eklentileri/" rel="alternate" type="text/html" title="E-Ticarette Açık Artırma: OpenCart Auction ve WooCommerce Auction Eklentileri" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/e-ticarette-acik-artirma-opencart-auction-ve-woocommerce-auction-eklentileri</id><content type="html" xml:base="https://program.sonsuz.us/posts/e-ticarette-acik-artirma-opencart-auction-ve-woocommerce-auction-eklentileri/"><![CDATA[<p>Bir ürünü sabit fiyatla satmak kolaydır; etiketi yapıştırır, müşteriyi beklersiniz. Açık artırmada ise işin içine rekabet, zaman baskısı ve biraz da heyecan girer. OpenCart Auction veya WooCommerce Auction eklentileri, klasik mağazanızı dijital bir müzayede salonuna dönüştürebilir. Ancak doğru eklentiyi seçmek kadar teklif mekanizmasını, zamanlamayı ve ödeme sürecini anlamak da önemlidir.</p>

<p>``</p>

<h2 id="açık-artırmanın-temel-mantığı">Açık artırmanın temel mantığı</h2>

<p>En yaygın model İngiliz tipi açık artırmadır. Satıcı bir başlangıç fiyatı belirler, katılımcılar giderek daha yüksek teklifler verir ve süre sonunda en yüksek teklif kazanır. Basit görünse de sistemin arkasında birkaç kritik değişken bulunur:</p>

<ul>
  <li>Başlangıç fiyatı</li>
  <li>Minimum teklif artışı</li>
  <li>Rezerv fiyat</li>
  <li>Başlangıç ve bitiş zamanı</li>
  <li>Otomatik teklif üst sınırı</li>
  <li>Kazananın ödeme süresi</li>
</ul>

<p>Mevcut en yüksek teklif $B$, minimum artış miktarı $I$ ise yeni teklifin sağlaması gereken koşul şöyledir:</p>

\[B_{yeni} \geq B + I\]

<p>Örneğin güncel fiyat 1.000 TL ve artış 50 TL ise sistem 1.049 TL’lik teklifi reddetmeli, 1.050 TL veya üzerini kabul etmelidir. Rezerv fiyat ise satıcının ürünü satmayı kabul ettiği gizli alt sınırdır. En yüksek teklif bu değere ulaşmazsa açık artırma kazanan olmadan kapanabilir.</p>

<h2 id="opencart-ve-woocommerce-karşılaştırması">OpenCart ve WooCommerce karşılaştırması</h2>

<p>Her iki platformda da özellikler doğrudan çekirdeğe değil, çoğunlukla üçüncü taraf eklentilere bağlıdır. Bu nedenle satın almadan önce sürüm uyumluluğu ve geliştirici desteği mutlaka kontrol edilmelidir.</p>

<table>
  <thead>
    <tr>
      <th>Kriter</th>
      <th>OpenCart Auction</th>
      <th>WooCommerce Auction</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Altyapı</td>
      <td>OpenCart modül sistemi</td>
      <td>WordPress ve WooCommerce</td>
    </tr>
    <tr>
      <td>Kurulum</td>
      <td>OCMOD veya Extension Installer</td>
      <td>WordPress eklenti kurulumu</td>
    </tr>
    <tr>
      <td>Tema uyumu</td>
      <td>Temaya göre düzenleme gerekebilir</td>
      <td>Tema ve sayfa oluşturucularla esnek</td>
    </tr>
    <tr>
      <td>İçerik yönetimi</td>
      <td>Mağaza odaklı</td>
      <td>Blog ve mağaza birlikte güçlü</td>
    </tr>
    <tr>
      <td>Kaynak tüketimi</td>
      <td>Genellikle daha yalın</td>
      <td>Eklenti sayısıyla artabilir</td>
    </tr>
    <tr>
      <td>Geliştirici ekosistemi</td>
      <td>Daha sınırlı</td>
      <td>Daha geniş</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/e-ticarette-acik-17.svg" alt="e-ticarette-acik-17" /></p>

<p>OpenCart, yalnızca satışa odaklanan sade bir mağaza isteyenler için avantajlı olabilir. WooCommerce ise açık artırmaları blog içerikleri, üyelik paketleri, SEO araçları ve pazarlama otomasyonlarıyla birleştirmek isteyenlere daha geniş bir oyun alanı sunar.</p>

<h2 id="otomatik-teklif-nasıl-çalışır">Otomatik teklif nasıl çalışır?</h2>

<p>Proxy bidding adı verilen yöntemde kullanıcı, ödemeye razı olduğu maksimum tutarı sisteme bildirir. Sistem bu tutarı herkese göstermez; rakip teklif geldikçe minimum artış kadar otomatik yükseltme yapar. Böylece kullanıcının ekran başında sürekli nöbet tutması gerekmez.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="n">sonrakiTeklif</span><span class="p">(</span><span class="nv">$mevcut</span><span class="p">,</span> <span class="nv">$artis</span><span class="p">,</span> <span class="nv">$kullaniciLimiti</span><span class="p">)</span> <span class="p">{</span>
    <span class="nv">$aday</span> <span class="o">=</span> <span class="nv">$mevcut</span> <span class="o">+</span> <span class="nv">$artis</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="nv">$aday</span> <span class="o">&gt;</span> <span class="nv">$kullaniciLimiti</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="nv">$aday</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu örnek, mevcut fiyata artış miktarını ekler ve sonucun kullanıcının gizli limitini geçip geçmediğini denetler. Gerçek projede aynı anda gelen tekliflere karşı veritabanı işlemi ve satır kilitleme de kullanılmalıdır. Aksi hâlde iki kullanıcı kendisini kazanan sanabilir; dijital müzayede salonunda sandalye kavgası çıkar.</p>

<h2 id="kritik-eklenti-özellikleri">Kritik eklenti özellikleri</h2>

<p>Tercih edeceğiniz çözüm şu yetenekleri mümkün olduğunca sunmalıdır:</p>

<ol>
  <li>Rezerv fiyat ve şimdi satın al seçeneği</li>
  <li>Otomatik teklif ve teklif geçmişi</li>
  <li>E-posta veya SMS bildirimleri</li>
  <li>Son saniye tekliflerine karşı süre uzatma</li>
  <li>Kazanana otomatik sipariş oluşturma</li>
  <li>Ödeme yapmayan kullanıcılar için yaptırım</li>
  <li>Saat dilimi ve zamanlanmış görev desteği</li>
</ol>

<p>Son saniyede gelen teklif sonrası süreyi $T$ dakika uzatan anti-sniping yaklaşımı, botların ve hızlı bağlantı avantajının etkisini azaltır. Zaman kontrolü tarayıcı saatine göre değil, mutlaka sunucu saatine göre yapılmalıdır.</p>

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

<p>Mevcut mağazanız OpenCart üzerindeyse yalnızca açık artırma uğruna platform değiştirmek çoğu zaman gereksizdir. İçerik pazarlaması, çok sayıda entegrasyon ve kolay yönetim önceliğinizse WooCommerce daha uygun olabilir. Kararı verirken demo ortamında teklif verme, süre bitimi, sipariş oluşumu, iade ve e-posta senaryolarını test edin. İyi bir açık artırma sistemi yalnızca en yüksek fiyatı bulmaz; kullanıcıya adil, şeffaf ve teknik olarak güvenilir bir yarış sunduğunu da hissettirir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="opencart" /><category term="woocommerce" /><category term="açık artırma" /><category term="e-ticaret" /><category term="wordpress" /><category term="php" /><category term="ödeme sistemleri" /><summary type="html"><![CDATA[Bir ürünü sabit fiyatla satmak kolaydır; etiketi yapıştırır, müşteriyi beklersiniz. Açık artırmada ise işin içine rekabet, zaman baskısı ve biraz da heyecan girer. OpenCart Auction veya WooCommerce Auction eklentileri, klasik mağazanızı dijital bir müzayede salonuna dönüştürebilir. Ancak doğru eklentiyi seçmek kadar teklif mekanizmasını, zamanlamayı ve ödeme sürecini anlamak da önemlidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/e-ticarette-acik-17.png" /><media:content medium="image" url="https://program.sonsuz.us/img/e-ticarette-acik-17.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">İlan Sitesi Kurmak: Osclass, OpenClassify ve WordPress Temaları Karşılaştırması</title><link href="https://program.sonsuz.us/posts/ilan-sitesi-kurmak-osclass-openclassify-ve-wordpress-temalari-karsilastirmasi/" rel="alternate" type="text/html" title="İlan Sitesi Kurmak: Osclass, OpenClassify ve WordPress Temaları Karşılaştırması" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ilan-sitesi-kurmak-osclass-openclassify-ve-wordpress-temalari-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/ilan-sitesi-kurmak-osclass-openclassify-ve-wordpress-temalari-karsilastirmasi/"><![CDATA[<p>Bir ilan sitesi kurmak, birkaç form alanı ekleyip “Yayınla” düğmesine basmaktan ibaret değildir. Kullanıcı yönetimi, kategori ağacı, konum filtreleri, fotoğraf yükleme, moderasyon ve ödeme gibi parçalar işin içine girince proje küçük bir dijital çarşıya dönüşür. Neyse ki Osclass, OpenClassify ve WordPress ilan temaları bu çarşıyı sıfırdan inşa etme zahmetini azaltır.</p>

<p><img src="/img/ilan-sitesi-kurmak-90.svg" alt="ilan-sitesi-kurmak-90" /></p>

<p>``</p>
<h2 id="önce-ilan-sitesinin-mantığı">Önce ilan sitesinin mantığı</h2>

<p>Bir ilan platformunun merkezinde <strong>ilan</strong> varlığı bulunur. Her ilan genellikle kullanıcı, kategori ve konum kayıtlarıyla ilişkilidir. Basitleştirilmiş veri modeli şöyle düşünülebilir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Kullanıcı 1 --- N İlan N --- 1 Kategori
                    |
                    N
                    |
                 Fotoğraf
</code></pre></div></div>

<p>Arama performansı da önemlidir. Toplam $N$ ilan içinde doğrusal arama yaklaşık $O(N)$ maliyetliyken, doğru indekslenmiş kategori veya fiyat alanlarında arama pratikte $O(\log N)$ seviyesine yaklaşabilir. Yani on bin ilanınız olduğunda veritabanı indeksleri süs değil, can simididir.</p>

<p>Platform seçerken yaklaşık toplam maliyeti şu şekilde modelleyebiliriz:</p>

\[T = K + G \times S + B + U\]

<p>Burada $K$ kurulum, $G$ geliştirme süresi, $S$ saatlik maliyet, $B$ bakım ve $U$ üçüncü taraf uzantı ücretidir. “Ücretsiz yazılım” ifadesi, bu denklemin tamamının sıfır olduğu anlamına gelmez.</p>

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

<table>
  <thead>
    <tr>
      <th>Seçenek</th>
      <th>Güçlü yanı</th>
      <th>Zayıf yanı</th>
      <th>Uygun senaryo</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Osclass</td>
      <td>İlan odaklı çekirdek ve sade yönetim</td>
      <td>Eklenti kalitesi değişken olabilir</td>
      <td>Hızlı ve klasik ilan portalı</td>
    </tr>
    <tr>
      <td>OpenClassify</td>
      <td>Geliştirici dostu, özelleştirilebilir yapı</td>
      <td>Kurulum ve bakım daha teknik olabilir</td>
      <td>Özel iş kuralları bulunan proje</td>
    </tr>
    <tr>
      <td>WordPress temaları</td>
      <td>Büyük tema ve eklenti ekosistemi</td>
      <td>Eklenti çatışması ve performans riski</td>
      <td>İçerik ile ilanı birleştiren site</td>
    </tr>
  </tbody>
</table>

<h3 id="osclass">Osclass</h3>

<p>Osclass doğrudan seri ilan mantığı için tasarlanmıştır. Kategori, kullanıcı, konum ve ilan yönetimi çekirdeğin doğal parçalarıdır. Bu nedenle genel amaçlı bir içerik yönetim sistemini ilana dönüştürmek için daha az uğraşırsınız. Küçük ekipler ve hızlı MVP çalışmaları için güçlü bir adaydır.</p>

<p>Ancak tema veya eklenti satın almadan önce kullanılan Osclass sürümüyle uyumluluğu, geliştiricinin güncelleme geçmişini ve güvenlik desteğini kontrol edin. Ucuz bir eklenti bazen pahalı bir hafta sonuna dönüşebilir.</p>

<h3 id="openclassify">OpenClassify</h3>

<p>OpenClassify, daha fazla teknik kontrol isteyen geliştiricilere hitap eder. Kod tabanı üzerinde yeni ilan türleri, özel filtreler veya kurumsal iş akışları geliştirilebilir. Buna karşılık sunucu yapılandırması, bağımlılık yönetimi ve güncelleme süreçleri daha fazla yazılım bilgisi gerektirir.</p>

<p>Projenin sürümünü, depo etkinliğini ve güncel PHP bağımlılıklarını kurulumdan önce doğrulamak özellikle önemlidir. Bakımı yavaşlamış bir paketle başlamak, gelecekte teknik borcu büyütebilir.</p>

<h3 id="wordpress-ilan-temaları">WordPress ilan temaları</h3>

<p>WordPress tarafında ilan özellikleri çoğunlukla tema ve eklentilerle sağlanır. Blog, rehber içerikleri, SEO sayfaları ve ilanları aynı panelden yönetmek büyük avantajdır. Buna karşın iş mantığını yalnızca temaya bağlamak risklidir; tema değiştiğinde ilan özellikleri kaybolabilir. Mümkünse ilan veri modeli bir eklentide, görsel sunum ise temada tutulmalıdır.</p>

<p>Örneğin özel ilan türü oluşturan basit bir WordPress kodu şöyledir:</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">'ilan'</span><span class="p">,</span> <span class="p">[</span>
        <span class="s1">'label'</span> <span class="o">=&gt;</span> <span class="s1">'İlanlar'</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">'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">'thumbnail'</span><span class="p">,</span> <span class="s1">'author'</span><span class="p">],</span>
        <span class="s1">'show_in_rest'</span> <span class="o">=&gt;</span> <span class="kc">true</span><span class="p">,</span>
    <span class="p">]);</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Bu kod, yönetim paneline ilan bölümü ekler ve REST API desteğini açar. Fiyat, şehir ve durum gibi alanlar için ayrıca özel alanlar ve doğrulama kuralları gerekir.</p>

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

<p>Hızlı, yalnızca ilana odaklı bir portal için <strong>Osclass</strong>; yoğun özelleştirme ve geliştirici kontrolü için güncelliği doğrulanmış <strong>OpenClassify</strong>; blog, SEO ve ilanı birlikte yönetecek ekipler için <strong>WordPress</strong> mantıklıdır. Seçimden önce mobil uyumluluk, spam koruması, yedekleme, KVKK süreçleri ve ödeme altyapısını test edin. En güzel tema ziyaretçiyi getirir; iyi veri modeli, güvenlik ve performans ise onun kaçmasını engeller.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="ilan sitesi" /><category term="osclass" /><category term="openclassify" /><category term="wordpress" /><category term="web geliştirme" /><category term="pazar yeri" /><summary type="html"><![CDATA[Bir ilan sitesi kurmak, birkaç form alanı ekleyip “Yayınla” düğmesine basmaktan ibaret değildir. Kullanıcı yönetimi, kategori ağacı, konum filtreleri, fotoğraf yükleme, moderasyon ve ödeme gibi parçalar işin içine girince proje küçük bir dijital çarşıya dönüşür. Neyse ki Osclass, OpenClassify ve WordPress ilan temaları bu çarşıyı sıfırdan inşa etme zahmetini azaltır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ilan-sitesi-kurmak-90.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ilan-sitesi-kurmak-90.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">İş İlanı Sitesi Kurmak: Jobberbase, OpenCATS ve WP Job Manager Karşılaştırması</title><link href="https://program.sonsuz.us/posts/is-ilani-sitesi-kurmak-jobberbase-opencats-ve-wp-job-manager-karsilastirmasi/" rel="alternate" type="text/html" title="İş İlanı Sitesi Kurmak: Jobberbase, OpenCATS ve WP Job Manager Karşılaştırması" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/is-ilani-sitesi-kurmak-jobberbase-opencats-ve-wp-job-manager-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/is-ilani-sitesi-kurmak-jobberbase-opencats-ve-wp-job-manager-karsilastirmasi/"><![CDATA[<p>Bir iş ilanı sitesi kurmak, yalnızca ilan başlığı ve “Başvur” düğmesi yerleştirmekten ibaret değildir. İşveren yönetimi, aday takibi, arama, yetkilendirme ve veri güvenliği gibi parçalar da sistemin omurgasını oluşturur. Bu noktada Jobberbase, OpenCATS ve WP Job Manager farklı ihtiyaçlara hitap eden üç güçlü seçenek olarak karşımıza çıkar.</p>

<p>``</p>

<h2 id="önce-temel-modeli-anlayalım">Önce temel modeli anlayalım</h2>

<p>İş ilanı platformlarında genellikle üç ana aktör bulunur: ziyaretçi, aday ve işveren. Daha kapsamlı sistemlerde bunlara insan kaynakları uzmanı ile yönetici rolleri de eklenir. En basit veri ilişkisi şöyle ifade edilebilir:</p>

\[İşveren \rightarrow İlan \rightarrow Başvuru \leftarrow Aday\]

<p>Bir platformun gerçek maliyetini hesaplarken yalnızca kurulum ücretine bakmak yanıltıcıdır. Daha doğru bir yaklaşım şudur:</p>

\[TCO = K + Ö + B + E\]

<p>Burada $TCO$ toplam sahip olma maliyetini, $K$ kurulum ve geliştirmeyi, $Ö$ özelleştirmeyi, $B$ bakımı, $E$ ise eklenti ve altyapı giderlerini temsil eder. “Ücretsiz yazılım” bazen bolca geliştirici kahvesi gerektirebilir!</p>

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

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Jobberbase</th>
      <th>OpenCATS</th>
      <th>WP Job Manager</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel amaç</td>
      <td>Sade iş ilanı panosu</td>
      <td>Aday takip sistemi</td>
      <td>WordPress tabanlı ilan sitesi</td>
    </tr>
    <tr>
      <td>Kurulum kolaylığı</td>
      <td>Orta</td>
      <td>Orta-zor</td>
      <td>Kolay</td>
    </tr>
    <tr>
      <td>Aday takibi</td>
      <td>Sınırlı</td>
      <td>Güçlü</td>
      <td>Eklentilere bağlı</td>
    </tr>
    <tr>
      <td>Tema ve tasarım</td>
      <td>Eski, özelleştirilebilir</td>
      <td>Yönetim odaklı</td>
      <td>Çok geniş seçenek</td>
    </tr>
    <tr>
      <td>Ekosistem</td>
      <td>Küçük</td>
      <td>Niş</td>
      <td>Çok büyük</td>
    </tr>
    <tr>
      <td>Uygun kullanıcı</td>
      <td>Teknik ekip</td>
      <td>İK departmanı</td>
      <td>Girişimci ve ajans</td>
    </tr>
  </tbody>
</table>

<h2 id="jobberbase-sadelik-arayanlara">Jobberbase: Sadelik arayanlara</h2>

<p>Jobberbase, klasik bir açık kaynak iş ilanı panosudur. İlan yayınlama, kategori oluşturma ve konuma göre listeleme gibi temel işlevleri sunar. Kod tabanı üzerinde çalışabilen bir geliştiriciniz varsa yalın bir ürün ortaya çıkarabilirsiniz.</p>

<p>Ancak projenin yaşı önemli bir dezavantajdır. Modern PHP sürümleri, güvenlik beklentileri ve mobil tasarım için ek çalışma gerekebilir. Jobberbase’i hazır bir ürün yerine geliştirilecek bir başlangıç iskeleti olarak değerlendirmek daha gerçekçidir.</p>

<h2 id="opencats-i̇lan-sitesinden-fazlası">OpenCATS: İlan sitesinden fazlası</h2>

<p>OpenCATS, doğrudan ilan panosundan çok bir <strong>ATS</strong>, yani Applicant Tracking System’dır. Adayların özgeçmişlerini saklama, görüşme süreçlerini izleme, not ekleme ve pozisyonlarla adayları eşleştirme özellikleri sunar.</p>

<p>Bu nedenle amaç yalnızca halka açık ilan yayınlamaksa arayüzü gereğinden karmaşık gelebilir. Buna karşılık işe alım ekibiniz onlarca pozisyon ve yüzlerce aday yönetiyorsa OpenCATS çok daha anlamlıdır. Kısacası Jobberbase vitrinken OpenCATS mutfaktır; tabakların nerede olduğunu bile takip eder.</p>

<h2 id="wp-job-manager-wordpress-gücü">WP Job Manager: WordPress gücü</h2>

<p>WP Job Manager, mevcut bir WordPress sitesine iş ilanı özellikleri ekleyen modüler bir eklentidir. Kısa kodlar ve bloklar sayesinde ilan listeleri, gönderim formları ve işveren panelleri hazırlanabilir.</p>

<p>Örneğin ilan listesini bir sayfaya eklemek oldukça kolaydır:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[jobs location="İstanbul" keywords="PHP"]
</code></pre></div></div>

<p>Bu kısa kod, İstanbul konumundaki ve PHP anahtar kelimesiyle ilişkili ilanları filtreleyerek gösterir. Özgeçmiş yönetimi, ücretli ilanlar ve başvuru akışları için ek eklentiler gerekebilir. Bu durum maliyeti artırsa da WordPress’in tema, SEO ve ödeme altyapısı seçenekleri büyük esneklik sağlar.</p>

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

<ul>
  <li>Minimal, geliştirici kontrolünde bir ilan panosu istiyorsanız <strong>Jobberbase</strong> düşünülebilir.</li>
  <li>Şirket içi işe alım ve aday süreçleri öncelikliyse <strong>OpenCATS</strong> daha uygundur.</li>
  <li>Hızlı kurulum, modern tasarım, SEO ve gelir modeli hedefleniyorsa <strong>WP Job Manager</strong> öne çıkar.</li>
</ul>

<p>Yeni başlayacak çoğu proje için WP Job Manager en pratik seçimdir. OpenCATS operasyonel derinlik, Jobberbase ise kod üzerinde tam kontrol isteyen ekipler için değerlidir. Son karardan önce bakım sıklığını, güvenlik güncellemelerini ve ihtiyaç duyacağınız eklentileri test ortamında incelemek, ileride “Bu başvuru nereye kayboldu?” gizemlerini önemli ölçüde azaltır.</p>

<p><img src="/img/is-ilani-sitesi-83.svg" alt="is-ilani-sitesi-83" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="iş ilanı sitesi" /><category term="jobberbase" /><category term="opencats" /><category term="wordpress" /><category term="wp job manager" /><category term="açık kaynak" /><summary type="html"><![CDATA[Bir iş ilanı sitesi kurmak, yalnızca ilan başlığı ve “Başvur” düğmesi yerleştirmekten ibaret değildir. İşveren yönetimi, aday takibi, arama, yetkilendirme ve veri güvenliği gibi parçalar da sistemin omurgasını oluşturur. Bu noktada Jobberbase, OpenCATS ve WP Job Manager farklı ihtiyaçlara hitap eden üç güçlü seçenek olarak karşımıza çıkar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/is-ilani-sitesi-83.png" /><media:content medium="image" url="https://program.sonsuz.us/img/is-ilani-sitesi-83.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kendi Dosya Dönüştürme Siteni Kur: ConvertX, Stirling PDF ve CloudConvert Alternatifleri</title><link href="https://program.sonsuz.us/posts/kendi-dosya-donusturme-siteni-kur-convertx-stirling-pdf-ve-cloudconvert-alternatifleri/" rel="alternate" type="text/html" title="Kendi Dosya Dönüştürme Siteni Kur: ConvertX, Stirling PDF ve CloudConvert Alternatifleri" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kendi-dosya-donusturme-siteni-kur-convertx-stirling-pdf-ve-cloudconvert-alternatifleri</id><content type="html" xml:base="https://program.sonsuz.us/posts/kendi-dosya-donusturme-siteni-kur-convertx-stirling-pdf-ve-cloudconvert-alternatifleri/"><![CDATA[<p>Bir DOCX dosyasını PDF’ye, PNG görselini WebP’ye veya videoyu MP3’e çevirmek basit görünür. Ancak perde arkasında farklı araçların yönetilmesi, dosya güvenliği, kuyruk sistemi ve kaynak sınırlandırması bulunur. ConvertX, Stirling PDF ve CloudConvert gibi servisler bu karmaşayı kullanıcıdan gizler. Peki gizliliği önceleyen, kendi sunucumuzda çalışan benzer bir sistem kurmak istersek hangi yaklaşımı seçmeliyiz?</p>

<p>``</p>

<h2 id="dönüştürme-işleminin-temel-mantığı">Dönüştürme işleminin temel mantığı</h2>

<p>Dosya dönüştürme, yalnızca uzantıyı değiştirmek değildir. Kaynak dosya önce ayrıştırılır, içindeki veri uygun bir ara modele aktarılır ve hedef biçimin kurallarına göre yeniden kodlanır. Örneğin bir görsel dönüştürülürken piksel verisi korunabilir fakat sıkıştırma algoritması değişir.</p>

<p>Kayıplı dönüşümlerde kalite ile dosya boyutu arasında denge kurulur. Basitleştirilmiş biçimde bu ilişkiyi şöyle gösterebiliriz:</p>

\[Q \propto \frac{1}{C}\]

<p>Burada $Q$ algılanan kaliteyi, $C$ ise sıkıştırma miktarını temsil eder. Sıkıştırma yükseldikçe dosya küçülür; ancak özellikle JPEG, MP3 ve video biçimlerinde kalite kaybı artabilir.</p>

<h2 id="hangi-çözüm-ne-sunuyor">Hangi çözüm ne sunuyor?</h2>

<table>
  <thead>
    <tr>
      <th>Çözüm</th>
      <th>Çalışma modeli</th>
      <th>Güçlü tarafı</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ConvertX</td>
      <td>Self-hosted</td>
      <td>Sade arayüz ve çoklu format</td>
      <td>Kişisel veya ekip içi dönüşümler</td>
    </tr>
    <tr>
      <td>Stirling PDF</td>
      <td>Self-hosted</td>
      <td>Kapsamlı PDF araçları</td>
      <td>Birleştirme, OCR, bölme ve imzalama</td>
    </tr>
    <tr>
      <td>CloudConvert</td>
      <td>Bulut/SaaS</td>
      <td>Geniş format ve API desteği</td>
      <td>Ölçeklenebilir ticari uygulamalar</td>
    </tr>
    <tr>
      <td>Özel servis</td>
      <td>Self-hosted</td>
      <td>Tam kontrol ve özelleştirme</td>
      <td>Ürüne özel iş akışları</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/kendi-dosya-donusturme-80.svg" alt="kendi-dosya-donusturme-80" /></p>

<p>Yalnızca PDF işlemleri gerekiyorsa Stirling PDF oldukça güçlüdür. Çok sayıda dosya türü için ConvertX daha genel bir başlangıç sunar. Bakım yapmak istemeyen ekipler CloudConvert’i değerlendirebilir. Hassas belgeler söz konusuysa self-hosted yaklaşım öne çıkar.</p>

<h2 id="küçük-bir-dönüştürme-mimarisi">Küçük bir dönüştürme mimarisi</h2>

<p>Pratik bir sistem dört parçadan oluşabilir: dosyayı alan web API’si, işleri sıraya koyan Redis, dönüşümü gerçekleştiren worker ve sonuçları geçici olarak saklayan depolama alanı. Worker tarafında LibreOffice, FFmpeg, ImageMagick ve Pandoc gibi kanıtlanmış araçlardan yararlanılabilir.</p>

<p>Ortalama işlem süresi $t$, worker sayısı $w$ ve bekleyen iş sayısı $n$ ise yaklaşık tamamlanma süresi şöyle tahmin edilebilir:</p>

\[T \approx \frac{n \times t}{w}\]

<p>Dolayısıyla worker sayısını artırmak kuyruğu hızlandırır; fakat CPU ve bellek tüketimini de büyütür. Sunucunun bir tost makinesine dönüşmesini istemiyorsak kaynak limitleri şarttır.</p>

<h2 id="fastapi-ile-docx--pdf-örneği">FastAPI ile DOCX → PDF örneği</h2>

<p>Aşağıdaki uç nokta yüklenen DOCX dosyasını geçici bir dizine kaydeder ve LibreOffice’i arayüzsüz modda çalıştırır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
<span class="kn">from</span> <span class="n">tempfile</span> <span class="kn">import</span> <span class="n">TemporaryDirectory</span>
<span class="kn">from</span> <span class="n">fastapi</span> <span class="kn">import</span> <span class="n">FastAPI</span><span class="p">,</span> <span class="n">UploadFile</span><span class="p">,</span> <span class="n">HTTPException</span>
<span class="kn">from</span> <span class="n">fastapi.responses</span> <span class="kn">import</span> <span class="n">FileResponse</span>
<span class="kn">import</span> <span class="n">subprocess</span>

<span class="n">app</span> <span class="o">=</span> <span class="nc">FastAPI</span><span class="p">()</span>

<span class="nd">@app.post</span><span class="p">(</span><span class="sh">"</span><span class="s">/convert/docx-to-pdf</span><span class="sh">"</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">convert</span><span class="p">(</span><span class="nb">file</span><span class="p">:</span> <span class="n">UploadFile</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="nb">file</span><span class="p">.</span><span class="n">filename</span><span class="p">.</span><span class="nf">lower</span><span class="p">().</span><span class="nf">endswith</span><span class="p">(</span><span class="sh">"</span><span class="s">.docx</span><span class="sh">"</span><span class="p">):</span>
        <span class="k">raise</span> <span class="nc">HTTPException</span><span class="p">(</span><span class="mi">400</span><span class="p">,</span> <span class="sh">"</span><span class="s">Yalnızca DOCX kabul edilir</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">temp</span> <span class="o">=</span> <span class="nc">TemporaryDirectory</span><span class="p">()</span>
    <span class="n">workdir</span> <span class="o">=</span> <span class="nc">Path</span><span class="p">(</span><span class="n">temp</span><span class="p">.</span><span class="n">name</span><span class="p">)</span>
    <span class="n">source</span> <span class="o">=</span> <span class="n">workdir</span> <span class="o">/</span> <span class="sh">"</span><span class="s">input.docx</span><span class="sh">"</span>
    <span class="n">source</span><span class="p">.</span><span class="nf">write_bytes</span><span class="p">(</span><span class="k">await</span> <span class="nb">file</span><span class="p">.</span><span class="nf">read</span><span class="p">())</span>

    <span class="n">subprocess</span><span class="p">.</span><span class="nf">run</span><span class="p">(</span>
        <span class="p">[</span><span class="sh">"</span><span class="s">libreoffice</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">--headless</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">--convert-to</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">pdf</span><span class="sh">"</span><span class="p">,</span>
         <span class="sh">"</span><span class="s">--outdir</span><span class="sh">"</span><span class="p">,</span> <span class="nf">str</span><span class="p">(</span><span class="n">workdir</span><span class="p">),</span> <span class="nf">str</span><span class="p">(</span><span class="n">source</span><span class="p">)],</span>
        <span class="n">check</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
        <span class="n">timeout</span><span class="o">=</span><span class="mi">60</span>
    <span class="p">)</span>

    <span class="n">result</span> <span class="o">=</span> <span class="n">workdir</span> <span class="o">/</span> <span class="sh">"</span><span class="s">input.pdf</span><span class="sh">"</span>
    <span class="k">return</span> <span class="nc">FileResponse</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="sh">"</span><span class="s">converted.pdf</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod öğretici bir iskelettir. Gerçek projede geçici dizinin yanıt tamamlanmadan silinmemesi, dosya boyutu sınırı, benzersiz adlandırma ve hata kayıtları ayrıca ele alınmalıdır.</p>

<h2 id="güvenlik-projenin-görünmez-kahramanıdır">Güvenlik, projenin görünmez kahramanıdır</h2>

<p>Kullanıcı dosyaları güvenilir kabul edilmemelidir. Dönüştürücüleri ayrı Docker konteynerlerinde, yetkisiz kullanıcıyla ve sınırlı CPU/bellek altında çalıştırın. Dosya uzantısına değil MIME türüne bakın; makroları engelleyin, işlem zaman aşımı belirleyin ve sonuçları otomatik silin. Komut oluştururken kullanıcı girdisini kabuk metnine eklemek yerine argüman listesi kullanmak komut enjeksiyonunu önler.</p>

<p>Sonuç olarak hızlı kurulum için ConvertX, PDF odaklı kullanım için Stirling PDF, yönetilen API için CloudConvert mantıklıdır. Öğrenmek ve tam kontrol kazanmak istiyorsanız FastAPI, Redis ve konteyner tabanlı worker’lardan oluşan özel çözüm en eğlenceli rotadır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="dosya dönüştürme" /><category term="self-hosted" /><category term="docker" /><category term="python" /><category term="pdf" /><category term="açık kaynak" /><summary type="html"><![CDATA[Bir DOCX dosyasını PDF’ye, PNG görselini WebP’ye veya videoyu MP3’e çevirmek basit görünür. Ancak perde arkasında farklı araçların yönetilmesi, dosya güvenliği, kuyruk sistemi ve kaynak sınırlandırması bulunur. ConvertX, Stirling PDF ve CloudConvert gibi servisler bu karmaşayı kullanıcıdan gizler. Peki gizliliği önceleyen, kendi sunucumuzda çalışan benzer bir sistem kurmak istersek hangi yaklaşımı seçmeliyiz?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kendi-dosya-donusturme-80.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kendi-dosya-donusturme-80.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kendi URL Kısaltıcını Seç: YOURLS, Shlink ve Kutt Karşılaştırması</title><link href="https://program.sonsuz.us/posts/kendi-url-kisalticini-sec-yourls-shlink-ve-kutt-karsilastirmasi/" rel="alternate" type="text/html" title="Kendi URL Kısaltıcını Seç: YOURLS, Shlink ve Kutt Karşılaştırması" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kendi-url-kisalticini-sec-yourls-shlink-ve-kutt-karsilastirmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/kendi-url-kisalticini-sec-yourls-shlink-ve-kutt-karsilastirmasi/"><![CDATA[<p>Uzun bağlantıları birkaç karakterlik adreslere dönüştürmek basit görünür; ancak işin arkasında yönlendirme, benzersiz kod üretimi, analitik, önbellekleme ve güvenlik gibi önemli bileşenler bulunur. YOURLS, Shlink ve Kutt, bu sistemi kendi sunucusunda çalıştırmak isteyenler için öne çıkan açık kaynak seçeneklerdir. Gelin, bağlantıların küçüldüğü fakat mimari kararların büyüdüğü bu dünyaya yakından bakalım.
``</p>
<h2 id="url-kısaltma-sistemi-nasıl-çalışır">URL kısaltma sistemi nasıl çalışır?</h2>

<p>Bir kullanıcı <code class="language-plaintext highlighter-rouge">https://kisa.site/abc42</code> adresini ziyaret ettiğinde uygulama <code class="language-plaintext highlighter-rouge">abc42</code> anahtarını veri tabanında arar. Eşleşen uzun URL bulunduğunda sunucu genellikle <code class="language-plaintext highlighter-rouge">301</code>, <code class="language-plaintext highlighter-rouge">302</code>, <code class="language-plaintext highlighter-rouge">307</code> veya <code class="language-plaintext highlighter-rouge">308</code> yanıtıyla tarayıcıyı hedefe yönlendirir. Aynı sırada ziyaret zamanı, IP adresinin anonimleştirilmiş biçimi, yönlendiren sayfa ve kullanıcı aracısı gibi analitik bilgiler kaydedilebilir.</p>

<p>Rastgele üretilen bir kodun olası kombinasyon sayısı, kullanılan alfabe büyüklüğü $A$ ve kod uzunluğu $L$ ile yaklaşık olarak şöyle hesaplanır:</p>

\[N = A^L\]

<p>Örneğin 62 karakterlik <code class="language-plaintext highlighter-rouge">a-z</code>, <code class="language-plaintext highlighter-rouge">A-Z</code> ve <code class="language-plaintext highlighter-rouge">0-9</code> alfabesiyle altı karakter kullanılırsa $62^6 \approx 56{,}8$ milyar kombinasyon elde edilir. Fakat doğum günü paradoksu nedeniyle rastgele üretimde çakışma olasılığı beklenenden önce yükselir. Bu nedenle sistem kodu veri tabanında doğrulamalı, benzersiz indeks kullanmalı ve çakışma durumunda yeniden üretmelidir.</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>YOURLS</th>
      <th>Shlink</th>
      <th>Kutt</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel teknoloji</td>
      <td>PHP, MySQL</td>
      <td>PHP, çeşitli veri tabanları</td>
      <td>Node.js, PostgreSQL</td>
    </tr>
    <tr>
      <td>Kurulum yaklaşımı</td>
      <td>Geleneksel hosting dostu</td>
      <td>Docker ve CLI odaklı</td>
      <td>Modern web uygulaması</td>
    </tr>
    <tr>
      <td>Yönetim arayüzü</td>
      <td>Dahili ve sade</td>
      <td>Ayrı web istemcisi kullanılabilir</td>
      <td>Dahili, kullanıcı dostu</td>
    </tr>
    <tr>
      <td>API</td>
      <td>Eklentilerle genişletilebilir</td>
      <td>Güçlü REST API</td>
      <td>REST API</td>
    </tr>
    <tr>
      <td>Güçlü tarafı</td>
      <td>Basitlik ve eklenti ekosistemi</td>
      <td>Otomasyon, analitik ve ölçeklenebilirlik</td>
      <td>Modern görünüm ve kolay kullanım</td>
    </tr>
    <tr>
      <td>Uygun senaryo</td>
      <td>Kişisel veya küçük ekip</td>
      <td>Profesyonel servis ve entegrasyon</td>
      <td>Hızlı, görsel odaklı kurulum</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/kendi-url-kisalticini-51.svg" alt="kendi-url-kisalticini-51" /></p>

<h2 id="yourls-klasik-ve-hafif">YOURLS: Klasik ve hafif</h2>

<p>YOURLS, özellikle PHP tabanlı paylaşımlı hosting kullananlar için pratik bir seçenektir. WordPress benzeri kurulumu, sade yönetim paneli ve eklenti sistemi sayesinde hızlıca kişiselleştirilebilir. Küçük bir marka, kişisel alan adında bağlantı üretmek istiyorsa gereksiz karmaşıklık yaratmaz.</p>

<p>Buna karşılık gelişmiş yetkilendirme, ayrıntılı analitik veya yüksek trafikli dağıtık mimari gerektiğinde ek geliştirme isteyebilir. Gücü sadeliğidir; aynı özellik büyük projelerde sınır hâline gelebilir.</p>

<h2 id="shlink-api-önce-gelir">Shlink: API önce gelir</h2>

<p>Shlink, komut satırı araçları ve kapsamlı API’siyle otomasyon seven geliştiricilere göz kırpar. QR kod üretimi, etiketleme, ziyaret analitiği, alan adı yönetimi ve webhook benzeri entegrasyon ihtiyaçlarında güçlüdür. Arka uç ile yönetim arayüzünün ayrılması, servisi farklı istemcilerden yönetmeyi kolaylaştırır.</p>

<p>Docker ile örnek bir başlangıç şöyle yapılabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">--name</span> shlink <span class="se">\</span>
  <span class="nt">-p</span> 8080:8080 <span class="se">\</span>
  <span class="nt">-e</span> <span class="nv">DEFAULT_DOMAIN</span><span class="o">=</span>kisa.example.com <span class="se">\</span>
  <span class="nt">-e</span> <span class="nv">IS_HTTPS_ENABLED</span><span class="o">=</span><span class="nb">true</span> <span class="se">\</span>
  shlinkio/shlink:stable
</code></pre></div></div>

<p>Bu komut Shlink sunucusunu <code class="language-plaintext highlighter-rouge">8080</code> portunda başlatır. Gerçek kullanımda kalıcı veri tabanı, HTTPS sağlayan ters proxy ve güçlü API anahtarları ayrıca yapılandırılmalıdır.</p>

<h2 id="kutt-modern-arayüz-isteyenlere">Kutt: Modern arayüz isteyenlere</h2>

<p>Kutt, Node.js ekosistemi ve temiz arayüzüyle kullanıcıların hızla adapte olabileceği bir çözümdür. Özel kısa kodlar, hesap yönetimi, istatistikler ve API desteği sunar. Bununla birlikte kurulumdan önce projenin güncel bakım durumunu, bağımlılıklarını ve güvenlik yamalarını kontrol etmek önemlidir; açık kaynak projelerde geliştirme temposu zaman içinde değişebilir.</p>

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

<p>Basit PHP hosting ve eklenti esnekliği için <strong>YOURLS</strong>, API merkezli otomasyon ve ciddi analitik ihtiyaçları için <strong>Shlink</strong>, modern bir kullanıcı deneyimi için <strong>Kutt</strong> mantıklı adaydır. Hangi aracı seçerseniz seçin HTTPS, kötü amaçlı URL engelleme, hız sınırlama, yedekleme ve gizlilik politikası zorunlu kabul edilmelidir. Çünkü kısa bağlantı küçük olabilir, fakat taşıdığı güvenlik sorumluluğu hiç de kısa değildir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="url-kısaltma" /><category term="yourls" /><category term="shlink" /><category term="kutt" /><category term="self-hosted" /><category term="web-geliştirme" /><summary type="html"><![CDATA[Uzun bağlantıları birkaç karakterlik adreslere dönüştürmek basit görünür; ancak işin arkasında yönlendirme, benzersiz kod üretimi, analitik, önbellekleme ve güvenlik gibi önemli bileşenler bulunur. YOURLS, Shlink ve Kutt, bu sistemi kendi sunucusunda çalıştırmak isteyenler için öne çıkan açık kaynak seçeneklerdir. Gelin, bağlantıların küçüldüğü fakat mimari kararların büyüdüğü bu dünyaya yakından bakalım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kendi-url-kisalticini-51.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kendi-url-kisalticini-51.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Kod Gibi Yönetilen CV’ler: Reactive Resume, JSON Resume ve ResumeBuilder</title><link href="https://program.sonsuz.us/posts/kod-gibi-yonetilen-cvler-reactive-resume-json-resume-ve-resumebuilder/" rel="alternate" type="text/html" title="Kod Gibi Yönetilen CV’ler: Reactive Resume, JSON Resume ve ResumeBuilder" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/kod-gibi-yonetilen-cvler-reactive-resume-json-resume-ve-resumebuilder</id><content type="html" xml:base="https://program.sonsuz.us/posts/kod-gibi-yonetilen-cvler-reactive-resume-json-resume-ve-resumebuilder/"><![CDATA[<p>CV hazırlamak bazen yazılım geliştirmekten daha yorucu olabilir: Bir başlığı düzeltirsiniz, tarih sağa kaçar; yeni proje eklersiniz, ikinci sayfa ortaya çıkar. Reactive Resume, JSON Resume ve ResumeBuilder bu karmaşayı farklı yaklaşımlarla çözer. Biri görsel düzenleyiciye, biri standart veri modeline, diğeri ise hızlı şablon üretimine odaklanır.</p>

<p><img src="/img/kod-gibi-yonetilen-64.svg" alt="kod-gibi-yonetilen-64" /></p>

<p>``</p>

<h2 id="cv-oluşturma-sistemlerinin-temel-mantığı">CV oluşturma sistemlerinin temel mantığı</h2>

<p>Modern CV sistemlerinde içerik ile sunumun ayrılması hedeflenir. İsim, deneyim ve eğitim gibi bilgiler <strong>veri katmanında</strong>; renkler, yazı tipleri ve sütunlar ise <strong>sunum katmanında</strong> tutulur. Bu yaklaşım, web geliştirmedeki HTML ve CSS ayrımına benzer.</p>

<p>Bir CV’nin kalitesini basitleştirilmiş biçimde şöyle modelleyebiliriz:</p>

\[Q = 0.45C + 0.30R + 0.15D + 0.10P\]

<p>Burada $C$ içerik kalitesini, $R$ okunabilirliği, $D$ tasarım tutarlılığını ve $P$ taşınabilirliği temsil eder. Görsel olarak şahane fakat içeriği zayıf bir CV’nin neden yeterli olmadığını bu ağırlıklar açıklar.</p>

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

<table>
  <thead>
    <tr>
      <th>Sistem</th>
      <th>Temel yaklaşım</th>
      <th>Güçlü yönü</th>
      <th>En uygun kullanıcı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Reactive Resume</td>
      <td>Görsel editör ve yapılandırılmış veri</td>
      <td>Kullanım kolaylığı, özelleştirme ve self-hosting</td>
      <td>Tasarım kontrolü isteyen geliştirici</td>
    </tr>
    <tr>
      <td>JSON Resume</td>
      <td>Açık JSON şeması ve tema ekosistemi</td>
      <td>Taşınabilirlik ve otomasyon</td>
      <td>CV’sini kod gibi yönetmek isteyen kişi</td>
    </tr>
    <tr>
      <td>ResumeBuilder</td>
      <td>Form tabanlı hızlı oluşturma</td>
      <td>Düşük öğrenme eşiği</td>
      <td>Hızlıca standart CV hazırlamak isteyen kullanıcı</td>
    </tr>
  </tbody>
</table>

<p><strong>Reactive Resume</strong>, sürükleyip düzenlemeye yakın bir deneyim sunarken verileri yapılandırılmış biçimde saklar. Açık kaynaklı olması ve kendi sunucunuza kurulabilmesi, gizlilik açısından önemli bir avantajdır. Birden fazla CV sürümü üretmek isteyenler için de pratiktir.</p>

<p><strong>JSON Resume</strong> ise tek başına klasik bir tasarım aracı değil, standartlaştırılmış bir öz geçmiş veri formatıdır. Aynı JSON dosyasını farklı temalarla HTML, PDF veya web sayfasına dönüştürebilirsiniz. Böylece CV’niz Git deposunda sürüm kontrollü şekilde yaşayabilir.</p>

<p><strong>ResumeBuilder</strong> adıyla sunulan araçlar çoğunlukla kullanıcıyı adım adım yönlendiren form ve şablon sistemleridir. Teknik bilgi gerektirmezler; ancak veri dışa aktarma, tema özgürlüğü ve self-hosting seçenekleri ürüne göre sınırlı olabilir.</p>

<h2 id="json-ile-cv-hazırlamak">JSON ile CV hazırlamak</h2>

<p>Aşağıdaki örnek, kişisel bilgiler ile iş deneyimini makine tarafından okunabilir biçimde saklar:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"basics"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Deniz Kaya"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"label"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Backend Developer"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"email"</span><span class="p">:</span><span class="w"> </span><span class="s2">"deniz@example.com"</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"work"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Örnek Teknoloji"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"position"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Yazılım Geliştirici"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"startDate"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2023-01"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"summary"</span><span class="p">:</span><span class="w"> </span><span class="s2">"API performansını yüzde 35 artırdı."</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Bu blokta <code class="language-plaintext highlighter-rouge">basics</code> iletişim bilgilerini, <code class="language-plaintext highlighter-rouge">work</code> ise deneyimleri taşır. Veriyi ayrı tutmanın güzelliği şudur: Yazım hatasını bir kez düzeltir, bütün temalara otomatik yansıtırsınız. Ayrıca Git sayesinde değişiklik geçmişini görebilir ve farklı pozisyonlar için dallar oluşturabilirsiniz.</p>

<p>Örneğin JSON Resume komut satırı araçlarıyla tema kullanarak çıktı üretme fikri şöyledir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># CV verisini doğrular</span>
resume validate resume.json

<span class="c"># Seçilen tema ile HTML çıktısı oluşturur</span>
resume <span class="nb">export </span>cv.html <span class="nt">--theme</span> elegant
</code></pre></div></div>

<p>Komutlar, kullanılan CLI sürümüne ve temaya göre değişebilir; bu nedenle ilgili aracın güncel belgeleri kontrol edilmelidir.</p>

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

<p>Görsel arayüz, gizlilik ve kişiselleştirme istiyorsanız <strong>Reactive Resume</strong> güçlü bir dengedir. CI/CD, Git ve otomatik yayınlama gibi geliştirici alışkanlıklarını CV’ye taşımak istiyorsanız <strong>JSON Resume</strong> daha uygundur. Sadece bilgileri girip dakikalar içinde PDF indirmek istiyorsanız <strong>ResumeBuilder</strong> tarzı araçlar yeterlidir.</p>

<p>En esnek yöntem ise hibrit yaklaşımdır: Ana veriyi JSON biçiminde saklayın, görsel düzenleme veya son rötuş için Reactive Resume benzeri bir araca aktarın. Böylece CV’niz yalnızca bir belge değil; güncellenebilir, taşınabilir ve sürüm kontrollü küçük bir yazılım projesi olur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="cv" /><category term="reactive-resume" /><category term="json-resume" /><category term="resumebuilder" /><category term="açık-kaynak" /><category term="kariyer" /><summary type="html"><![CDATA[CV hazırlamak bazen yazılım geliştirmekten daha yorucu olabilir: Bir başlığı düzeltirsiniz, tarih sağa kaçar; yeni proje eklersiniz, ikinci sayfa ortaya çıkar. Reactive Resume, JSON Resume ve ResumeBuilder bu karmaşayı farklı yaklaşımlarla çözer. Biri görsel düzenleyiciye, biri standart veri modeline, diğeri ise hızlı şablon üretimine odaklanır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/kod-gibi-yonetilen-64.png" /><media:content medium="image" url="https://program.sonsuz.us/img/kod-gibi-yonetilen-64.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>