<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Harun's Dev Log]]></title><description><![CDATA[A Developer's Notebook.]]></description><link>https://echo.harungecit.dev</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 06:24:55 GMT</lastBuildDate><atom:link href="https://echo.harungecit.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Docker'dan Sonraki Büyük Adım: WasmEdge ve Cloud-Native WebAssembly Rehberi]]></title><description><![CDATA[Bulut bilişim dünyasında "devrim" kelimesi sık kullanılır ama nadiren tam karşılığını bulur. Ancak WebAssembly (Wasm) sunucu tarafına (server-side) geçtiğinden beri işler gerçekten değişiyor. Konteynerlerin (Containers) çok ağır, JVM'in çok hantal ka...]]></description><link>https://echo.harungecit.dev/wasmedge-cloud-native-webassembly-rehberi</link><guid isPermaLink="true">https://echo.harungecit.dev/wasmedge-cloud-native-webassembly-rehberi</guid><category><![CDATA[WebAssembly]]></category><category><![CDATA[wasmedge]]></category><category><![CDATA[Rust]]></category><category><![CDATA[Docker]]></category><category><![CDATA[cloud native]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Harun Geçit]]></dc:creator><pubDate>Fri, 02 Jan 2026 14:48:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767365159987/00f4d4b6-8d7a-4c0a-a5af-ff16e24a98f4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Bulut bilişim dünyasında "devrim" kelimesi sık kullanılır ama nadiren tam karşılığını bulur. Ancak <strong>WebAssembly (Wasm)</strong> sunucu tarafına (server-side) geçtiğinden beri işler gerçekten değişiyor. Konteynerlerin (Containers) çok ağır, JVM'in çok hantal kaldığı noktalarda sahneye yeni bir oyuncu çıkıyor: <strong>WasmEdge</strong>.</p>
<p>Bu yazıda, CNCF (Cloud Native Computing Foundation) bünyesindeki en hızlı büyüyen projelerden biri olan WasmEdge'i derinlemesine inceleyeceğiz. Mimarisi nasıl çalışır, neden Docker'ın yerini (veya yanını) alıyor ve kendi Wasm mikroservisimizi nasıl yazarız? Gelin kaputun altına bakalım.</p>
<h2 id="heading-wasmedge-nedir-sadece-tarayici-icin-degil">WasmEdge Nedir? (Sadece Tarayıcı İçin Değil)</h2>
<p>WebAssembly'yi sadece tarayıcıda oyun oynatan bir teknoloji sanıyorsanız, tekrar düşünün. WasmEdge, WebAssembly formatına derlenmiş kodları Linux, Windows, macOS gibi işletim sistemlerinde ve hatta gerçek zamanlı işletim sistemlerinde (RTOS) çalıştırmanızı sağlayan hafif, yüksek performanslı ve güvenli bir <strong>Runtime (Çalışma Zamanı)</strong> ortamıdır.</p>
<p>Basitçe: <strong>Node.js JavaScript için neyse, WasmEdge de WebAssembly için odur.</strong> Ancak çok daha hızlısı ve güvenlisi.</p>
<h3 id="heading-neden-wasmedge">Neden WasmEdge?</h3>
<p>Geleneksel Linux konteynerleri (Docker gibi) harikadır ama bir bedeli vardır:</p>
<ol>
<li><p><strong>Soğuk Başlatma (Cold Start):</strong> Bir konteynerin ayağa kalkması saniyeler sürebilir.</p>
</li>
<li><p><strong>Boyut:</strong> En basit "Hello World" imajı bile yüzlerce MB olabilir.</p>
</li>
<li><p><strong>Güvenlik:</strong> Çekirdek (kernel) seviyesinde izolasyon her zaman risk barındırır.</p>
</li>
</ol>
<p>WasmEdge ise milisaniyeler içinde başlar, sadece birkaç MB yer kaplar ve varsayılan olarak "Sandbox" (izole kutu) içinde çalışır.</p>
<h2 id="heading-mimari-bakis-nasil-bu-kadar-hizli">Mimari Bakış: Nasıl Bu Kadar Hızlı?</h2>
<p>WasmEdge'in mimarisi, performans ve genişletilebilirlik üzerine kuruludur. İşte onu diğer runtimelardan ayıran teknik detay:</p>
<h3 id="heading-1-aot-ahead-of-time-derleyici">1. AOT (Ahead-of-Time) Derleyici</h3>
<p>WasmEdge, kodu çalıştırırken yorumlamak (interpret) yerine, çalıştırmadan önce makine koduna (native machine code) derler. LLVM tabanlı bu optimizasyon sayesinde, C/C++ veya Rust ile yazılmış native bir uygulama ile neredeyse <strong>aynı performansı</strong> verir.</p>
<h3 id="heading-2-wasi-ve-eklentiler">2. WASI ve Eklentiler</h3>
<p>WebAssembly System Interface (WASI), Wasm kodunun dosya sistemine veya ağa erişmesi için bir standarttır. Ancak WasmEdge bunu bir adım öteye taşır:</p>
<ul>
<li><p><strong>WASI-NN:</strong> Yapay zeka modellerini (TensorFlow, PyTorch, OpenVINO) Wasm içinden donanım hızlandırmalı olarak çağırmayı sağlar.</p>
</li>
<li><p><strong>Networking:</strong> Standart dışı soket desteği ile asenkron HTTP sunucuları kurmanıza olanak tanır.</p>
</li>
</ul>
<h2 id="heading-gelistirme-sureci-hello-wasmedge">Geliştirme Süreci: "Hello WasmEdge"</h2>
<p>Teori güzeldir ama biz geliştiriciyiz, koda bakalım. WasmEdge "Polyglot" bir yapıdır; yani Rust, C++, JavaScript, Python veya Go kullanabilirsiniz. En iyi performans için <strong>Rust</strong> örneği üzerinden gidelim.</p>
<h3 id="heading-1-rust-ile-mikroservis-gelistirme">1. Rust ile Mikroservis Geliştirme</h3>
<p>Öncelikle Rust ve Wasm target'ını yükleyelim:</p>
<pre><code class="lang-bash">rustup target add wasm32-wasi
</code></pre>
<p>Basit bir Rust projesi (<code>Cargo.toml</code> dosyanıza bağımlılık eklemeden):</p>
<pre><code class="lang-rust"><span class="hljs-comment">// main.rs</span>
<span class="hljs-function"><span class="hljs-keyword">fn</span> <span class="hljs-title">main</span></span>() {
    <span class="hljs-built_in">println!</span>(<span class="hljs-string">"Merhaba Hashnode! WasmEdge üzerinden çalışıyorum."</span>);

    <span class="hljs-comment">// Basit bir hesaplama yapalım</span>
    <span class="hljs-keyword">let</span> a = <span class="hljs-number">10</span>;
    <span class="hljs-keyword">let</span> b = <span class="hljs-number">20</span>;
    <span class="hljs-built_in">println!</span>(<span class="hljs-string">"Toplam: {}"</span>, a + b);
}
</code></pre>
<p>Şimdi bunu <code>.wasm</code> formatına derleyelim:</p>
<pre><code class="lang-bash">cargo build --target wasm32-wasi --release
</code></pre>
<p>Artık elimizde <code>target/wasm32-wasi/release/proje_adi.wasm</code> dosyası var.</p>
<h3 id="heading-2-calistirma">2. Çalıştırma</h3>
<p>WasmEdge yüklü makinede (veya Docker içinde) çalıştırmak bu kadar basit:</p>
<pre><code class="lang-bash">wasmedge proje_adi.wasm
<span class="hljs-comment"># Çıktı:</span>
<span class="hljs-comment"># Merhaba Hashnode! WasmEdge üzerinden çalışıyorum.</span>
<span class="hljs-comment"># Toplam: 30</span>
</code></pre>
<h3 id="heading-3-javascript-ile-calistirma-quickjs">3. JavaScript ile Çalıştırma (QuickJS)</h3>
<p>Rust bilmiyor musunuz? Sorun değil. WasmEdge, içine gömülü bir JavaScript motoruyla gelir.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// hello.js</span>
<span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> std <span class="hljs-keyword">from</span> <span class="hljs-string">'std'</span>;

print(<span class="hljs-string">'Merhaba JavaScript ve WasmEdge!'</span>);
</code></pre>
<p>Bunu çalıştırmak için:</p>
<pre><code class="lang-bash">wasmedge --dir .:. qjs_tf.wasm hello.js
</code></pre>
<h2 id="heading-deployment-ve-operasyon-docker-entegrasyonu">Deployment ve Operasyon: Docker Entegrasyonu</h2>
<p>"Güzel ama ben Kubernetes kullanıyorum, <code>wasmedge</code> komutuyla tek tek uğraşamam" diyorsanız, WasmEdge burada parlıyor.</p>
<p>WasmEdge, <strong>OCI (Open Container Initiative)</strong> uyumludur. Yani Docker Desktop veya Kubernetes (crun, containerd) kullanarak Wasm uygulamalarını, sanki birer Docker konteyneriymiş gibi yönetebilirsiniz.</p>
<h3 id="heading-ornek-dockerfile">Örnek Dockerfile</h3>
<p>Bir Wasm uygulamasını Docker imajı haline getirmek için:</p>
<pre><code class="lang-dockerfile"><span class="hljs-comment"># Temel imaj olarak scratch (boş) kullanabiliriz çünkü işletim sistemine ihtiyacımız yok!</span>
<span class="hljs-keyword">FROM</span> scratch
<span class="hljs-keyword">COPY</span><span class="bash"> target/wasm32-wasi/release/proje_adi.wasm /proje_adi.wasm</span>
<span class="hljs-keyword">ENTRYPOINT</span><span class="bash"> [<span class="hljs-string">"/proje_adi.wasm"</span>]</span>
</code></pre>
<p>Bu imaj <strong>sadece birkaç megabayt</strong> olacaktır. İçinde Alpine Linux veya Ubuntu gibi bir OS katmanı yoktur. Sadece kodunuz vardır.</p>
<p>Docker ile çalıştırmak (Docker Desktop Wasm entegrasyonu aktifse):</p>
<pre><code class="lang-bash">docker run --runtime=io.containerd.wasmedge.v1 --platform=wasi/wasm32 my-wasm-app
</code></pre>
<h2 id="heading-hangi-senaryolarda-kullanilmali">Hangi Senaryolarda Kullanılmalı?</h2>
<p>WasmEdge her şeyin çözümü değildir. Ancak şu senaryolarda rakipsizdir:</p>
<ol>
<li><p><strong>Edge Computing (Kenar Bilişim):</strong> Kaynakları kısıtlı IoT cihazlarında Python/ML modelleri çalıştırmak.</p>
</li>
<li><p><strong>Serverless Functions:</strong> AWS Lambda gibi yapılarda "Cold Start" süresini sıfıra indirmek.</p>
</li>
<li><p><strong>Yapay Zeka (AI Inference):</strong> Büyük Python kütüphanelerini kurmadan, hafif bir Wasm modülü ile görüntü işleme yapmak.</p>
</li>
<li><p><strong>Service Mesh:</strong> Linkerd veya Envoy gibi proxy'lerin yanında çok hafif filtreler (filter) çalıştırmak.</p>
</li>
</ol>
<h2 id="heading-sonuc">Sonuç</h2>
<p>WasmEdge, yazılım geliştirme ve dağıtım süreçlerimizde yeni bir sayfa açıyor. "Bir kere yaz, her yerde çalıştır" vaadini Java'dan on yıllar sonra, bu sefer çok daha hafif ve bulutla uyumlu bir şekilde gerçekleştiriyor.</p>
<p>Eğer hala denemediyseniz, basit bir Rust fonksiyonunu Wasm'a çevirip Docker ile çalıştırmayı deneyin. Hız farkı sizi şaşırtacak.</p>
<hr />
<h3 id="heading-kaynaklar-ve-linkler">Kaynaklar ve Linkler</h3>
<ul>
<li><p><a target="_blank" href="https://wasmedge.org">WasmEdge Resmi Sitesi</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/WasmEdge/WasmEdge">GitHub Reposu</a></p>
</li>
<li><p><a target="_blank" href="https://landscape.cncf.io/">CNCF Landscape</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[UUID mi? ULID mi? Auto Increment mi? Snowflake mi?]]></title><description><![CDATA[Uygulamalarda verilerin benzersiz şekilde tanımlanması her zaman kritik bir konudur.Yıllardır en klasik yöntem Auto Increment ID olsa da, modern sistemler artık dağıtık mimari, yüksek ölçeklenebilirlik, güvenlik ve performans gibi farklı gereksinimle...]]></description><link>https://echo.harungecit.dev/uuid-mi-ulid-mi-auto-increment-mi-snowflake-mi</link><guid isPermaLink="true">https://echo.harungecit.dev/uuid-mi-ulid-mi-auto-increment-mi-snowflake-mi</guid><category><![CDATA[snowflake id]]></category><category><![CDATA[uuid]]></category><category><![CDATA[ULID]]></category><category><![CDATA[snowflake]]></category><category><![CDATA[sequence id]]></category><category><![CDATA[auto-increment]]></category><category><![CDATA[PostgreSQL]]></category><category><![CDATA[MySQL]]></category><category><![CDATA[MariaDB]]></category><category><![CDATA[SQLite]]></category><category><![CDATA[id]]></category><category><![CDATA[Security]]></category><category><![CDATA[performance]]></category><dc:creator><![CDATA[Harun Geçit]]></dc:creator><pubDate>Tue, 25 Nov 2025 13:37:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764077589655/d7d81862-b9b3-4220-8414-d1195176c004.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Uygulamalarda verilerin benzersiz şekilde tanımlanması her zaman kritik bir konudur.<br />Yıllardır en klasik yöntem <strong>Auto Increment</strong> ID olsa da, modern sistemler artık <strong>dağıtık mimari</strong>, <strong>yüksek ölçeklenebilirlik</strong>, <strong>güvenlik</strong> ve <strong>performans</strong> gibi farklı gereksinimlere sahip.</p>
<p>Bu yazıda şu ID türlerini teknik olarak en net şekilde karşılaştırıyoruz:</p>
<ul>
<li><p>Auto Increment (INT / BIGINT)</p>
</li>
<li><p>UUID (v1, v4)</p>
</li>
<li><p>ULID</p>
</li>
<li><p>Snowflake ID (Supabase / Firebase mantığı)</p>
</li>
<li><p>Alternatif yaklaşımlar: NanoID, KSUID</p>
</li>
<li><p>Benchmark + Boyut + Performans + Güvenlik karşılaştırmaları</p>
</li>
<li><p>Hangi veritabanı neyi destekler?</p>
</li>
<li><p>Laravel için en doğru seçim (Laravel kullandığımdan bunu özellikle ekledim)</p>
</li>
</ul>
<p>Hazırsan başlıyoruz.</p>
<hr />
<h1 id="heading-1-auto-increment-id">1) Auto Increment ID</h1>
<p><strong>(INT / BIGINT)</strong></p>
<p>Yıllardır MySQL, PostgreSQL, MariaDB, SQLite gibi veritabanlarının varsayılan ID tipidir.</p>
<h2 id="heading-avantajlar">Avantajlar</h2>
<ul>
<li><p>🔥 <strong>En yüksek performans</strong> (tek işlem → artış)</p>
</li>
<li><p>📦 <strong>En küçük depolama boyutu</strong></p>
<ul>
<li><p>INT = 4 byte</p>
</li>
<li><p>BIGINT = 8 byte</p>
</li>
</ul>
</li>
<li><p>🔢 Sıralı → indekslerde mükemmel performans</p>
</li>
<li><p>Basit &amp; hızlı</p>
</li>
</ul>
<h2 id="heading-dezavantajlar">Dezavantajlar</h2>
<ul>
<li><p>❌ URL’ler tahmin edilebilir → güvenlik zayıf</p>
</li>
<li><p>❌ Dağıtık sistemlerde çakışır</p>
</li>
<li><p>❌ Node/sunucu ayrışması zordur (tek sayaç gerekir)</p>
</li>
<li><p>❌ Sharding için uygun değildir</p>
</li>
</ul>
<h2 id="heading-en-uygun-kullanim">En uygun kullanım</h2>
<blockquote>
<p><strong>Basit tek sunuculu CRUD projeler.</strong><br />E-ticaret, CRM, panel, küçük API gibi projelerde idealdir.</p>
</blockquote>
<hr />
<h1 id="heading-2-uuid">2) UUID</h1>
<p><strong>(v1 ve v4 — 128 bit / 16 byte)</strong></p>
<p>Modern uygulamalarda en sık kullanılan benzersiz ID yöntemidir.</p>
<h2 id="heading-uuid-v4-rastgele">UUID v4 (Rastgele)</h2>
<ul>
<li><p>🔐 En güvenli UUID türü</p>
</li>
<li><p>🌍 Dağıtık sistemlerde çakışmaz</p>
</li>
<li><p>🗄 16 byte → INT’e göre çok büyük</p>
</li>
</ul>
<h2 id="heading-uuid-v1-zaman-mac-adresi">UUID v1 (Zaman + MAC adresi)</h2>
<ul>
<li><p>Zaman bazlıdır → sıralıdır</p>
</li>
<li><p>Ama MAC adresi içerdiği için <strong>mahremiyet zayıf</strong></p>
</li>
</ul>
<h2 id="heading-avantajlar-1">Avantajlar</h2>
<ul>
<li><p>Tüm dillerde destek var</p>
</li>
<li><p>Çakışma ihtimali yok</p>
</li>
<li><p>Merkezi sistem gerekmez</p>
</li>
</ul>
<h2 id="heading-dezavantajlar-1">Dezavantajlar</h2>
<ul>
<li><p>16 byte → <strong>INT'e göre 2–4 kat büyük</strong></p>
</li>
<li><p>Rastgele UUID v4 indekslerde <strong>parçalanmaya yol açar</strong>, daha yavaş</p>
</li>
<li><p>URL’ler uzun görünür</p>
</li>
</ul>
<h2 id="heading-veritabani-destegi">Veritabanı desteği</h2>
<ul>
<li><p>PostgreSQL → native UUID tipi + en iyi performans</p>
</li>
<li><p>MySQL / MariaDB → CHAR(36) veya BINARY(16)</p>
</li>
<li><p>SQLite → TEXT</p>
</li>
</ul>
<hr />
<h1 id="heading-3-ulid">3) ULID</h1>
<p><strong>(Lexicographically sortable — sıralı UUID alternatifi)</strong></p>
<p>ULID, UUID’nin dezavantajlarını çözen modern bir ID formatıdır.<br /><strong>26 karakterlik base32</strong>, 128-bit sınıfındadır.</p>
<h2 id="heading-avantajlar-2">Avantajlar</h2>
<ul>
<li><p>⏱ Zaman bazlı → <strong>sıralıdır</strong></p>
</li>
<li><p>🔐 UUID kadar güvenli</p>
</li>
<li><p>🧩 Okunabilir, kısa, URL dostu</p>
</li>
<li><p>📦 16 byte → UUID ile aynı boyut</p>
</li>
<li><p>Dağıtık sistemlerde çok başarılı</p>
</li>
</ul>
<h2 id="heading-dezavantajlar-2">Dezavantajlar</h2>
<ul>
<li><p>UUID kadar büyük</p>
</li>
<li><p>Native veritabanı tipi yok (ama gerek de yok)</p>
</li>
</ul>
<h2 id="heading-destek-durumu">Destek durumu</h2>
<blockquote>
<p>Her veritabanında string veya binary olarak sorunsuz çalışır.</p>
</blockquote>
<h2 id="heading-neden-populer">Neden popüler?</h2>
<p>Supabase, Prisma, Laravel 10+, PlanetScale, Drizzle ORM ULID tavsiye ediyor.</p>
<hr />
<h1 id="heading-4-snowflake-id">4) Snowflake ID</h1>
<p><strong>(Twitter, Firebase, Supabase, Discord, Sony, Instagram mantığı)</strong></p>
<p>Snowflake ID, 64-bitlik (8 byte) bir tam sayıdır.<br />Bu nedenle ULID/UUID’den <strong>yarı yarıya daha küçük</strong>.</p>
<h3 id="heading-yapisi">Yapısı:</h3>
<pre><code class="lang-plaintext">41 bit → timestamp
10 bit → worker ID
12 bit → sequence
</code></pre>
<h2 id="heading-avantajlar-3">Avantajlar</h2>
<ul>
<li><p>⚡ <strong>En yüksek performanslı ID stratejilerinden biri</strong></p>
</li>
<li><p>📦 <strong>Sadece 8 byte</strong> → BIGINT kadar</p>
</li>
<li><p>⏱ Sıralı → indeks verimliliği ULID kadar iyi</p>
</li>
<li><p>🌍 Dağıtık sistemler için doğmuş</p>
</li>
<li><p>Çakışma olasılığı pratikte sıfır</p>
</li>
</ul>
<h2 id="heading-dezavantajlar-3">Dezavantajlar</h2>
<ul>
<li><p>Üretim için bir algoritma gerekir</p>
</li>
<li><p>Timestamp rollback sorunları yaşanabilir (çözümleri var)</p>
</li>
</ul>
<h2 id="heading-destek-durumu-1">Destek durumu</h2>
<blockquote>
<p>Her veritabanı destekler (BIGINT olarak kaydedilir).<br />Snowflake ID veritabanına bağlı değildir → uygulama seviyesinde üretilir.</p>
</blockquote>
<hr />
<h1 id="heading-5-alternatifler">5) Alternatifler</h1>
<p>Kısa ama popüler birkaç seçenek daha:</p>
<h2 id="heading-nanoid">NanoID</h2>
<ul>
<li><p>Kısa, hızlı, URL-safe</p>
</li>
<li><p>10–20 karakter arası kullanılabilir</p>
</li>
<li><p>UUID’den çok daha küçük</p>
</li>
<li><p>Sıralı değil → indeks performansı ULID kadar iyi değil</p>
</li>
</ul>
<h2 id="heading-ksuid-shopify">KSUID (Shopify)</h2>
<ul>
<li><p>ULID’in bir varyantı</p>
</li>
<li><p>Sıralı ve güvenli</p>
</li>
<li><p>UUID’den biraz büyük (20 byte)</p>
</li>
</ul>
<hr />
<h1 id="heading-6-benchmark-ve-boyut-karsilastirmasi">6) Benchmark ve Boyut Karşılaştırması</h1>
<h2 id="heading-depolama-boyutu">📦 Depolama Boyutu</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>ID Türü</td><td>Boyut</td></tr>
</thead>
<tbody>
<tr>
<td>INT</td><td>4 byte</td></tr>
<tr>
<td>BIGINT</td><td>8 byte</td></tr>
<tr>
<td>Snowflake</td><td>8 byte</td></tr>
<tr>
<td>UUID / ULID / KSUID</td><td>16–20 byte</td></tr>
<tr>
<td>NanoID</td><td>10–20 karakter</td></tr>
</tbody>
</table>
</div><h2 id="heading-performans-karsilastirmasi">⚡ Performans Karşılaştırması</h2>
<p>(Genel DB index performansı ölçümlerine göre)</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>ID Türü</td><td>Insert</td><td>Index Performansı</td><td>Not</td></tr>
</thead>
<tbody>
<tr>
<td>Auto Increment</td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐⭐⭐⭐</td><td>En hızlı</td></tr>
<tr>
<td>Snowflake</td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐⭐⭐⭐</td><td>Sıralı ve küçük</td></tr>
<tr>
<td>ULID</td><td>⭐⭐⭐⭐</td><td>⭐⭐⭐⭐</td><td>Sıralı ama daha büyük</td></tr>
<tr>
<td>UUID v1</td><td>⭐⭐⭐</td><td>⭐⭐⭐</td><td>Sıralı ama MAC riski</td></tr>
<tr>
<td>UUID v4</td><td>⭐⭐</td><td>⭐</td><td>Rastgele → index bozulur</td></tr>
<tr>
<td>NanoID</td><td>⭐⭐⭐</td><td>⭐⭐</td><td>Rastgele</td></tr>
</tbody>
</table>
</div><hr />
<h1 id="heading-7-hangi-veritabani-ne-destekliyor">7) Hangi Veritabanı Ne Destekliyor?</h1>
<h2 id="heading-mysql">MySQL</h2>
<ul>
<li><p>Auto Increment → ✔</p>
</li>
<li><p>UUID → ✔ (binary 16 önerilir)</p>
</li>
<li><p>ULID → ✔</p>
</li>
<li><p>Snowflake → ✔</p>
</li>
</ul>
<h2 id="heading-postgresql">PostgreSQL</h2>
<ul>
<li><p>Auto Increment → ✔</p>
</li>
<li><p>UUID → ✔ <strong>(native)</strong></p>
</li>
<li><p>ULID → ✔</p>
</li>
<li><p>Snowflake → ✔</p>
</li>
</ul>
<h2 id="heading-mariadb">MariaDB</h2>
<ul>
<li><p>Auto Increment → ✔</p>
</li>
<li><p>UUID → ✔</p>
</li>
<li><p>ULID → ✔</p>
</li>
<li><p>Snowflake → ✔</p>
</li>
</ul>
<h2 id="heading-sqlite">SQLite</h2>
<ul>
<li><p>Auto Increment → ✔</p>
</li>
<li><p>UUID → string olarak ✔</p>
</li>
<li><p>ULID → ✔</p>
</li>
<li><p>Snowflake → ✔</p>
</li>
</ul>
<hr />
<h1 id="heading-8-laravel-icin-en-dogru-tercih-hangisi">8) Laravel İçin En Doğru Tercih Hangisi?</h1>
<h2 id="heading-1-ulid-modern-projeler-icin-en-dengeli-tercih">🥇 1) ULID → Modern projeler için en dengeli tercih</h2>
<ul>
<li><p>Laravel 10+ native destek</p>
</li>
<li><p>Sıralı → yüksek performans</p>
</li>
<li><p>Güvenli</p>
</li>
<li><p>Human-friendly</p>
</li>
</ul>
<h2 id="heading-2-snowflake-id-yuksek-trafik-dagitik-mimariler-icin-en-iyi-cozum">🥈 2) Snowflake ID → Yüksek trafik + dağıtık mimariler için en iyi çözüm</h2>
<ul>
<li><p>Çok hızlı</p>
</li>
<li><p>En küçük güçlü ID (8 byte)</p>
</li>
<li><p>Dağıtık sistem dostu</p>
</li>
<li><p>Büyük ölçekli projelerde en iyi seçim</p>
</li>
</ul>
<h2 id="heading-3-auto-increment-kucuk-ve-orta-olcekli-tek-sunuculu-projeler-icin-ideal">🥉 3) Auto Increment → Küçük ve orta ölçekli, tek sunuculu projeler için ideal</h2>
<ul>
<li><p>En hızlı</p>
</li>
<li><p>En basit</p>
</li>
<li><p>Ama güvenlik açısından zayıf</p>
</li>
</ul>
<hr />
<h1 id="heading-9-onerilen-sonuc">9) Önerilen Sonuç</h1>
<p>Eğer modern ve uzun ömürlü bir API / SaaS / sosyal platform geliştiriyorsan:</p>
<blockquote>
<p><strong>ULID → en doğru dengeli seçim</strong><br /><strong>Snowflake → performans &amp; ölçek için en iyisi</strong><br /><strong>Auto Increment → sadece küçük sistemlerde</strong><br /><strong>UUID → ağır kaldığı için artık gereksiz</strong></p>
</blockquote>
<hr />
<h1 id="heading-10-son-soz">10) Son Söz</h1>
<p>ID stratejisi doğru seçilmediğinde veritabanı performansı, indeksler, güvenlik ve ölçeklenebilirlik doğrudan etkilenir.</p>
<p>Bu kapsamlı karşılaştırma ile projene en uygun ID yapısını rahatlıkla seçebilirsin.</p>
<p><em>Kapak görseli Gemini tarafından oluşturulmuştur. Blog içeriği biçimlendirmesi için ChatGPT kullanılmıştır.</em></p>
]]></content:encoded></item><item><title><![CDATA[PHP 8.5 Geldi! Kod Yazmak Artık Daha Akıcı]]></title><description><![CDATA[Beklenen gün geldi! PHP 8.5, 20 Kasım itibarıyla resmen hayatımıza girdi. "Yine mi güncelleme?" demeyin; çünkü bu sürüm, sadece performans iyileştirmeleriyle değil, kod yazarken "Keşke şöyle bir şey olsa" dediğimiz pek çok özelliği (syntax sugar) get...]]></description><link>https://echo.harungecit.dev/php-85-geldi-kod-yazmak-artik-daha-akici</link><guid isPermaLink="true">https://echo.harungecit.dev/php-85-geldi-kod-yazmak-artik-daha-akici</guid><category><![CDATA[php 8.5 released]]></category><category><![CDATA[PHP 8.5]]></category><category><![CDATA[PHP 8.5 new features]]></category><category><![CDATA[PHP]]></category><category><![CDATA[Whats new]]></category><dc:creator><![CDATA[Harun Geçit]]></dc:creator><pubDate>Fri, 21 Nov 2025 08:05:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1763712118415/cfa086d8-583c-481a-829f-3341dad87dc1.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Beklenen gün geldi! <strong>PHP 8.5</strong>, 20 Kasım itibarıyla resmen hayatımıza girdi. "Yine mi güncelleme?" demeyin; çünkü bu sürüm, sadece performans iyileştirmeleriyle değil, kod yazarken "Keşke şöyle bir şey olsa" dediğimiz pek çok özelliği (syntax sugar) getirmesiyle öne çıkıyor.</p>
<p>Teknik terimlere boğulmadan, en havalı 5 yeni özelliği senin için inceledim. Kahveni al, başlıyoruz! ☕️</p>
<hr />
<h2 id="heading-1-boru-operatoru-pipe-operator-gt">1. Boru Operatörü (Pipe Operator) <code>|&gt;</code> 🚀</h2>
<p><strong>Nedir?</strong> Kod yazarken iç içe geçmiş fonksiyonlardan (nesting hell) kurtulmanın yolu.</p>
<p><strong>Eskiden (PHP 8.4 ve öncesi):</strong> Bir veriyi alıp sırasıyla filtrelemek, map'lemek ve birleştirmek istediğimizde kodumuz "Rus Matruşkası" gibi iç içe geçerdi. Okuması zordur, çünkü mantık <strong>içten dışa</strong> doğru işler.</p>
<pre><code class="lang-php"><span class="hljs-comment">// Okumak için en içten (array_filter) başlamanız lazım 🤯</span>
$sonuc = implode(<span class="hljs-string">', '</span>, 
    array_map(
        <span class="hljs-function"><span class="hljs-keyword">fn</span>(<span class="hljs-params">$u</span>) =&gt; $<span class="hljs-title">u</span>-&gt;<span class="hljs-title">name</span>, 
        <span class="hljs-title">array_filter</span>(<span class="hljs-params">$users, fn(<span class="hljs-params">$u</span>) =&gt; $u-&gt;isActive</span>)
    )
)</span>;
</code></pre>
<p><strong>Şimdi (PHP 8.5):</strong> Artık veriyi bir <strong>boru hattına</strong> (pipeline) sokuyoruz. Veri soldan giriyor, işlemlerden geçip sağdan çıkıyor. Okuması <strong>soldan sağa</strong> ve <strong>yukarıdan aşağıya</strong> çok daha doğal!</p>
<pre><code class="lang-php"><span class="hljs-comment">// Veri akışını şelale gibi izleyin 🌊</span>
$sonuc = $users
    |&gt; array_filter(..., <span class="hljs-function"><span class="hljs-keyword">fn</span>(<span class="hljs-params">$u</span>) =&gt; $<span class="hljs-title">u</span>-&gt;<span class="hljs-title">isActive</span>)
    |&gt; <span class="hljs-title">array_map</span>(<span class="hljs-params">..., fn(<span class="hljs-params">$u</span>) =&gt; $u-&gt;name</span>)
    |&gt; <span class="hljs-title">implode</span>(<span class="hljs-params"><span class="hljs-string">', '</span>, ...</span>)</span>;
</code></pre>
<blockquote>
<p><strong>Mantık:</strong> <code>|&gt;</code> işareti, solundaki sonucu, sağındaki fonksiyonun içine (genellikle <code>...</code> ile belirtilen yere) argüman olarak fırlatır.</p>
</blockquote>
<hr />
<h2 id="heading-2-clone-with-degistirerek-kopyalama">2. <code>clone with</code> (Değiştirerek Kopyalama) ✨</h2>
<p><strong>Nedir?</strong> Bir nesnenin kopyasını alırken, "sadece şu özelliğini değiştir" demenin en kısa yolu. Özellikle <em>Immutable</em> (değişmez) nesnelerle çalışırken hayat kurtarır.</p>
<p><strong>Eskiden:</strong> Önce klonla, sonra değiştir. İki iş.</p>
<pre><code class="lang-php">$eskiProfil = <span class="hljs-keyword">new</span> UserProfile(<span class="hljs-string">'Harun'</span>, <span class="hljs-string">'Dark Mode'</span>);

<span class="hljs-comment">// Önce kopyala</span>
$yeniProfil = <span class="hljs-keyword">clone</span> $eskiProfil;
<span class="hljs-comment">// Sonra değiştir (Eğer özellik readonly ise bu bile zordu!)</span>
$yeniProfil-&gt;theme = <span class="hljs-string">'Light Mode'</span>;
</code></pre>
<p><strong>Şimdi (PHP 8.5):</strong> Kopyalama anında değişikliği yapıyoruz. Sanki bir belge fotokopisi çekerken, tek bir satırı daktiloyla düzeltip öyle çıktı almak gibi.</p>
<pre><code class="lang-php"><span class="hljs-comment">// Tek satırda iş bitti! ✅</span>
$yeniProfil = <span class="hljs-keyword">clone</span> $eskiProfil with {
    theme: <span class="hljs-string">'Light Mode'</span>
};
</code></pre>
<hr />
<h2 id="heading-3-yeni-dizi-kahramanlari-arrayfind">3. Yeni Dizi Kahramanları: <code>array_find</code> 🕵️‍♂️</h2>
<p><strong>Nedir?</strong> Bir dizinin içinde belirli bir şartı sağlayan <strong>ilk</strong> elemanı bulmak için artık döngü yazmaya veya takla atmaya gerek yok.</p>
<p><strong>Eskiden:</strong> Ya <code>foreach</code> ile dönüp <code>break</code> yapardık ya da <code>array_filter</code> ile tüm diziyi süzüp ilk elemanı alırdık (ki bu performans kaybı demekti).</p>
<pre><code class="lang-php">$bulunanKullanici = <span class="hljs-literal">null</span>;
<span class="hljs-keyword">foreach</span> ($users <span class="hljs-keyword">as</span> $user) {
    <span class="hljs-keyword">if</span> ($user-&gt;id === <span class="hljs-number">42</span>) {
        $bulunanKullanici = $user;
        <span class="hljs-keyword">break</span>;
    }
}
</code></pre>
<p><strong>Şimdi (PHP 8.5):</strong> PHP'ye "Bana ID'si 42 olanı bul getir" diyoruz, o kadar.</p>
<pre><code class="lang-php"><span class="hljs-comment">// Çok daha temiz, değil mi?</span>
$bulunanKullanici = array_find($users, <span class="hljs-function"><span class="hljs-keyword">fn</span>(<span class="hljs-params">$u</span>) =&gt; $<span class="hljs-title">u</span>-&gt;<span class="hljs-title">id</span> === 42)</span>;
</code></pre>
<blockquote>
<p><em>Not:</em> Ayrıca <code>array_find_key</code>, <code>array_any</code> ve <code>array_all</code> gibi yardımcılar da geldi!</p>
</blockquote>
<hr />
<h2 id="heading-4-nodiscard-ozelligi">4. <code>#[NoDiscard]</code> Özelliği ⚠️</h2>
<p><strong>Nedir?</strong> "Bu fonksiyonun sonucunu görmezden gelemezsin, mutlaka kullan!" uyarısı.</p>
<p><strong>Örnek:</strong> Diyelim ki bir güvenlik fonksiyonunuz var ve size "işlem başarılı mı?" diye bir <code>true/false</code> dönüyor. Eğer siz bu fonksiyonu çağırıp sonucunu kontrol etmezseniz, güvenlik açığı oluşabilir.</p>
<pre><code class="lang-php"><span class="hljs-comment">#[NoDiscard]</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">kritikIslem</span>(<span class="hljs-params"></span>): <span class="hljs-title">bool</span> </span>{
    <span class="hljs-comment">// ... işlem ...</span>
    <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>; <span class="hljs-comment">// Başarısız!</span>
}

<span class="hljs-comment">// PHP 8.5'te bu satır UYARI verir! 🚨</span>
<span class="hljs-comment">// Çünkü sonucu bir değişkene atamadın veya if içinde kullanmadın.</span>
kritikIslem(); 

<span class="hljs-comment">// Doğrusu:</span>
$sonuc = kritikIslem();
</code></pre>
<blockquote>
<p><strong>Benzetme:</strong> Markette para üstünü almadan çıkmaya çalışırsanız kasiyerin arkadan bağırması gibidir. 🗣️</p>
</blockquote>
<hr />
<h2 id="heading-5-url-analizi-artik-cok-daha-guclu">5. URL Analizi Artık Çok Daha Güçlü 🌍</h2>
<p><strong>Nedir?</strong> PHP'nin emektar <code>parse_url</code> fonksiyonu bazen modern URL'lerde hatalı çalışabiliyordu. PHP 8.5 ile gelen yeni <strong>URL Parser API</strong>, modern web standartlarına (RFC 3986 ve WHATWG) tam uyumlu.</p>
<pre><code class="lang-php"><span class="hljs-comment">// Artık URL parçalamak daha güvenilir ve nesne tabanlı</span>
$uri = <span class="hljs-keyword">new</span> Uri\Rfc3986\Uri(<span class="hljs-string">'https://kullanici:sifre@site.com:8080/yol?q=php#hash'</span>);

<span class="hljs-keyword">echo</span> $uri-&gt;getHost(); <span class="hljs-comment">// site.com</span>
<span class="hljs-keyword">echo</span> $uri-&gt;getPort(); <span class="hljs-comment">// 8080</span>
</code></pre>
<hr />
<h3 id="heading-ozet-guncellemeli-mi">Özet: Güncellemeli mi?</h3>
<p>Kesinlikle! Özellikle <strong>Pipe Operatörü</strong> ve <strong>Clone With</strong>, Laravel veya Symfony projelerindeki kod kalabalığını ciddi oranda azaltacak gibi duruyor.</p>
<p>PHP 8.5, dilin sadece "iş gören" değil, aynı zamanda "yazarken keyif veren" bir dil olma yolundaki en büyük adımlarından biri.</p>
<p><em>Görsel ve içerik Gemini tarafından yorumlanmıştır.</em></p>
]]></content:encoded></item></channel></rss>