<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Tuntii — Tunay Engin - Blog</title>
      <link>https://tuntii.com/blog/</link>
      <description>Rust, dağıtık sistemler ve AI odaklı açık kaynak projeler. RustAPI, KayaDB ve daha fazlası.</description>
      <generator>Zola</generator>
      <language>tr</language>
      <atom:link href="https://tuntii.com/blog/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sat, 18 Jul 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Viltrum: V ile Kendi HTTP Engine&#x27;imi Yazdım</title>
          <pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/viltrum-v-ile-http-engine/</link>
          <guid>https://tuntii.com/blog/viltrum-v-ile-http-engine/</guid>
          <description xml:base="https://tuntii.com/blog/viltrum-v-ile-http-engine/">&lt;p&gt;RustAPI&#x27;m var. 55+ star, MCP, production path. Bir framework yeter, değil mi?&lt;&#x2F;p&gt;
&lt;p&gt;Değil. En azından benim için değil.&lt;&#x2F;p&gt;
&lt;p&gt;Temmuz 2026&#x27;da V dilini kurcalıyordum. &quot;Ne yapsam?&quot; diye bakarken cevap netleşti: Axum tadında bir şey değil. Kendi accept loop&#x27;u, kendi parse&#x27;ı, kendi keep-alive&#x27;ı olan ince bir HTTP framework. Adını &lt;strong&gt;Viltrum&lt;&#x2F;strong&gt; koydum.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;neden-v&quot;&gt;Neden V?&lt;&#x2F;h2&gt;
&lt;p&gt;V&#x27;yi ciddiye alan az. Yıldız sayısı yüksek, prod iddiası tartışmalı, ekosistem ince. Tam da bu yüzden yan proje için uygun.&lt;&#x2F;p&gt;
&lt;p&gt;Benim kurallarım basit:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;RustAPI&#x27;ye dokunma. O ayrı dünya.&lt;&#x2F;li&gt;
&lt;li&gt;Haftada sınırlı saat. SemantiCAD ve diğer işler ölmesin.&lt;&#x2F;li&gt;
&lt;li&gt;Tek binary, okunaklı kod, &quot;engine bende&quot; hissi.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;V bunu veriyor. &lt;code&gt;v run&lt;&#x2F;code&gt; hızlı. Stdlib&#x27;de net var. veb var ama ben veb sarmalamak istemedim. Framed TCP&#x27;den HTTP&#x2F;1.1 mesajına kadar stack benim olsun istedim.&lt;&#x2F;p&gt;
&lt;p&gt;Öğrenme projesi mi? Evet. Oyuncak mı? Hayır, oyuncak demem. Çünkü parse edge case&#x27;leri, keep-alive, Host zorunluluğu, 413 path&#x27;i... bunlar &quot;hello world&quot; değil. Bunlar motor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ne-yaptim-kisa&quot;&gt;Ne yaptım (kısa)&lt;&#x2F;h2&gt;
&lt;p&gt;Akış şöyle:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;TCP accept
&lt;&#x2F;span&gt;&lt;span&gt;  -&amp;gt; header sonuna kadar multi-read
&lt;&#x2F;span&gt;&lt;span&gt;  -&amp;gt; Content-Length body
&lt;&#x2F;span&gt;&lt;span&gt;  -&amp;gt; parse
&lt;&#x2F;span&gt;&lt;span&gt;  -&amp;gt; router (:param)
&lt;&#x2F;span&gt;&lt;span&gt;  -&amp;gt; middleware
&lt;&#x2F;span&gt;&lt;span&gt;  -&amp;gt; response
&lt;&#x2F;span&gt;&lt;span&gt;  -&amp;gt; keep-alive veya close
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;v0.1: PoC. Çalışıyordu, tek buffer, &lt;code&gt;Connection: close&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;v0.2: Gerçek framing. Keep-alive, path param, rest example (in-memory TODO JSON).&lt;&#x2F;p&gt;
&lt;p&gt;v0.2.1: Polish. Query decode, trailing slash, options, CI.&lt;&#x2F;p&gt;
&lt;p&gt;v0.3: SIGINT&#x2F;SIGTERM ile graceful shutdown, keep-alive idle timeout, &lt;code&gt;recover&lt;&#x2F;code&gt; middleware, logger&#x27;a süre.&lt;&#x2F;p&gt;
&lt;p&gt;Public API bilerek küçük:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;v&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-v &quot;&gt;&lt;code class=&quot;language-v&quot; data-lang=&quot;v&quot;&gt;&lt;span&gt;mut app := viltrum.new()
&lt;&#x2F;span&gt;&lt;span&gt;app.use(viltrum.recover)
&lt;&#x2F;span&gt;&lt;span&gt;app.use(viltrum.logger)
&lt;&#x2F;span&gt;&lt;span&gt;app.get(&amp;#39;&#x2F;hi&#x2F;:name&amp;#39;, hello)
&lt;&#x2F;span&gt;&lt;span&gt;app.listen(&amp;#39;127.0.0.1:8080&amp;#39;) or { panic(err) }
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Handler düz fonksiyon. Extractor sihri yok. Type-level magic yok. Sıkıldım o taraftan; burada bilinçli sade.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;engine-karari&quot;&gt;Engine kararı&lt;&#x2F;h2&gt;
&lt;p&gt;Bazı insanlar &quot;neden stdlib net.http.server değil?&quot; diye sorar. Cevap: öğrenmek ve kontrol.&lt;&#x2F;p&gt;
&lt;p&gt;Server yazmak iki iş:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Framing.&lt;&#x2F;strong&gt; Byte stream&#x27;ten HTTP mesajı çıkarmak. Eksik header, yarım body, leftover buffer, keep-alive.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Uygulama yüzeyi.&lt;&#x2F;strong&gt; Route, middleware, JSON helper.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Çoğu framework 2&#x27;yi parlatır, 1&#x27;i başkasına bırakır. Ben 1&#x27;i kendim yazmak istedim. Çünkü RustAPI tarafında da &quot;engine&quot; tartışması hep dönüyor. V&#x27;de küçük ölçekte denemek ucuz.&lt;&#x2F;p&gt;
&lt;p&gt;Dürüst olayım: V runtime&#x27;da Go tarzı panic recover yok. &lt;code&gt;recover&lt;&#x2F;code&gt; middleware&#x27;im response&#x27;u sağlamlaştırıyor (status 0, eksik Content-Length). Process&#x27;i yutan panic&#x27;i sihirle yakalamıyor. Bunu CHANGELOG&#x27;da da yazdım. Abartı yok.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rustapi-ile-iliski&quot;&gt;RustAPI ile ilişki&lt;&#x2F;h2&gt;
&lt;p&gt;Yok. Sıfır.&lt;&#x2F;p&gt;
&lt;p&gt;Aynı anda iki framework markası bölmek istemem. RustAPI Rust dünyası. Viltrum V deneyi. İkisini birleştirmek için ne sebep ne zaman var.&lt;&#x2F;p&gt;
&lt;p&gt;Viltrum para aracı değil. Yan hat. Commit&#x27;ler Tuntii altında, MIT, public.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kim-kullanir&quot;&gt;Kim kullanır?&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;V öğrenen ve &quot;gerçek bir şey&quot; isteyen&lt;&#x2F;li&gt;
&lt;li&gt;Tek binary tool API&#x27;si yazan&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Framework ne yapıyor?&quot; diye meraklı olan&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Kim kullanmaz?&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Yarın prod TLS + HTTP&#x2F;2 + WebSocket isteyen (henüz yok, reverse proxy koy)&lt;&#x2F;li&gt;
&lt;li&gt;ORM + auth suite arayan (bilinçli non-goal)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;neredeyiz&quot;&gt;Neredeyiz?&lt;&#x2F;h2&gt;
&lt;p&gt;Repo: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Tuntii&#x2F;viltrum&quot;&gt;github.com&#x2F;Tuntii&#x2F;viltrum&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; clone https:&#x2F;&#x2F;github.com&#x2F;Tuntii&#x2F;viltrum.git
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; viltrum
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;mkdir -p ~&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;.vmodules &amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ln -sfn &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;$&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;pwd&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;.vmodules&#x2F;viltrum
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;v&lt;&#x2F;span&gt;&lt;span&gt; run examples&#x2F;hello
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# başka terminal
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span&gt; http:&#x2F;&#x2F;127.0.0.1:8080&#x2F;hi&#x2F;tunay
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;examples&#x2F;rest&lt;&#x2F;code&gt; küçük bir TODO JSON API. Keep-alive ve body path&#x27;ini dogfood ediyor.&lt;&#x2F;p&gt;
&lt;p&gt;Sırada bench rakamlarını düzgün oturtmak, daha fazla parse fuzz, belki route group. HTTP&#x2F;2 yok. TLS yok. İyi ki yok; odak dağılmasın.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kapanis&quot;&gt;Kapanış&lt;&#x2F;h2&gt;
&lt;p&gt;Yeni dil denemek için en iyi yol &quot;tutorial bitirmek&quot; değil. Küçük ama gerçek bir sistem yazmak. HTTP engine tam o iş: sınırları net, feedback hızlı, yalan söylemek zor.&lt;&#x2F;p&gt;
&lt;p&gt;Viltrum tam olarak bu. V ile konuştum, motoru yazdım, ship ettim.&lt;&#x2F;p&gt;
&lt;p&gt;Beğenmezsen issue aç. Beğenirsen star atma zorunluluğu yok, fork edip boz. Asıl zevk orada.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Yazılıma Nasıl Başlarım — 2026 Edition</title>
          <pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/yazilima-nasil-baslarim-2026-edition/</link>
          <guid>https://tuntii.com/blog/yazilima-nasil-baslarim-2026-edition/</guid>
          <description xml:base="https://tuntii.com/blog/yazilima-nasil-baslarim-2026-edition/">&lt;p&gt;“Yazılıma nasıl başlarım?” diye aratıyorsun. 2026. Telefonda ChatGPT açık, YouTube’da 40 saatlik “sıfırdan full stack” playlist’i indirme kuyruğunda, bir Discord’da “mentor arıyorum” yazılmış, başka bir yerde “3 ayda 80k USD remote” reklamı dönüyor.&lt;&#x2F;p&gt;
&lt;p&gt;Bu yazı bir motivasyon konuşması değil. Bir &lt;strong&gt;2026 Edition&lt;&#x2F;strong&gt; — yani: başlık şaka, içerik biraz acı. İsteyen herkese hitap ediyor; çünkü 2026’da “nasıl başlarım” sorusu yaşa göre değişmiyor, &lt;strong&gt;mazeret stokuna&lt;&#x2F;strong&gt; göre değişiyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;spoiler-ai-var-o-yuzden-daha-kolay-ve-daha-zor&quot;&gt;Spoiler: AI var, o yüzden &lt;em&gt;daha kolay&lt;&#x2F;em&gt; — ve &lt;em&gt;daha zor&lt;&#x2F;em&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Kolay kısım: Artık her şey var.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Dil dokümantasyonu&lt;&#x2F;li&gt;
&lt;li&gt;Ücretsiz kurs&lt;&#x2F;li&gt;
&lt;li&gt;Açık kaynak örnek&lt;&#x2F;li&gt;
&lt;li&gt;Stack Overflow arşivi&lt;&#x2F;li&gt;
&lt;li&gt;YouTube’da adım adım&lt;&#x2F;li&gt;
&lt;li&gt;Ve evet: &lt;strong&gt;AI&lt;&#x2F;strong&gt; :D&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Bizim zamanımızda (benim zamanımda) bu kadar düzgün öğrenme eğrisi ve “eline tutuşturulan” rehber yoktu. Bir şey kırılınca forumda üç gün dil döküyordun. Şimdi “bu hata ne” diye yapıştırıyorsun, cevap geliyor. İstediğin gibi yazıp çizebiliyorsun. Sandbox’lar, cloud free tier’lar, GitHub, package manager’lar — ortam &lt;strong&gt;rahatsız edici derecede&lt;&#x2F;strong&gt; konforlu.&lt;&#x2F;p&gt;
&lt;p&gt;Zor kısım: Konfor, disiplin yerine geçmiyor.&lt;&#x2F;p&gt;
&lt;p&gt;AI seni engellemez. Engelleyen şey genelde şu üçlü:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Başlamamak&lt;&#x2F;strong&gt; (araştırma fazı sonsuza uzar)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bitirmemek&lt;&#x2F;strong&gt; (tutorial hell)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Göstermemek&lt;&#x2F;strong&gt; (kod sadece hard diskte “güvenli”)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Yani 2026’da “kaynak yok” mazereti ölmüş durumda. Kalan mazeretler daha kişisel — ve daha sinir bozucu.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ai-var-kod-ogrenmeye-gerek-yok-2026-nin-en-sevimli-yalani&quot;&gt;“AI var, kod öğrenmeye gerek yok” — 2026’nın en sevimli yalanı&lt;&#x2F;h2&gt;
&lt;p&gt;AI kod üretir. Evet.&lt;br &#x2F;&gt;
AI bazen güzel kod üretir. Evet.&lt;br &#x2F;&gt;
AI bazen &lt;em&gt;çalışır gibi görünen ama yanlış&lt;&#x2F;em&gt; kod üretir. &lt;strong&gt;Daha çok evet.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Yazılım öğrenmek, klavyeden karakter dökmek değil. Şunları öğrenmek:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Problemi parçalamak&lt;&#x2F;li&gt;
&lt;li&gt;Ne istediğini net söylemek (AI’ya da insana da)&lt;&#x2F;li&gt;
&lt;li&gt;Çıktıyı doğrulamak&lt;&#x2F;li&gt;
&lt;li&gt;Kırılınca neden kırıldığını anlamak&lt;&#x2F;li&gt;
&lt;li&gt;Sistemin sınırlarını görmek&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;AI kullanan ama bilgisayarın ne yaptığını bilmeyen biri, otopilotu açıp direksiyonu bırakmış sürücü gibidir. Yol düzken harika. Virajda haberleri olmaz.&lt;&#x2F;p&gt;
&lt;p&gt;2026’da AI &lt;em&gt;araç&lt;&#x2F;em&gt;. Çekiç. Çekiç ile ev yapan da var, parmağını ezen de. Fark: &lt;strong&gt;kim çekiç tutuyor, kim çekiç tarafından tutuluyor.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Öğrenmek isteyen her şekilde öğrenir. AI bunu engellemez; bazen hızlandırır. Ama emek ve zaman hâlâ masada. Bunu verdiğin sürece meyvesini alırsın.&lt;&#x2F;p&gt;
&lt;p&gt;Alamayabilirsin de. Bu bir muamma.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tutorial-hell-modern-cehennemin-ucretsiz-plani&quot;&gt;Tutorial hell — modern cehennemin ücretsiz planı&lt;&#x2F;h2&gt;
&lt;p&gt;Klasik 2026 rotası:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;“HTML CSS 10 saatte”&lt;&#x2F;li&gt;
&lt;li&gt;“JavaScript masterclass”&lt;&#x2F;li&gt;
&lt;li&gt;“React 2026 complete”&lt;&#x2F;li&gt;
&lt;li&gt;“Next.js + tRPC + Prisma + Docker + K8s + AI agent”&lt;&#x2F;li&gt;
&lt;li&gt;Hâlâ kendi projen yok&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Tutorial izlemek &lt;em&gt;iyi hissettirir&lt;&#x2F;em&gt;. Dopamin gelir. “İlerliyorum” sanırsın. Ama izlemek, yüzmek videosu izlemek gibidir: suya girmeden yüzme bilmezsin.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Proje odaklı öğren.&lt;&#x2F;strong&gt; Küçük, çirkin, senin olan bir şey:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Kişisel site&lt;&#x2F;li&gt;
&lt;li&gt;CLI tool&lt;&#x2F;li&gt;
&lt;li&gt;Not uygulaması&lt;&#x2F;li&gt;
&lt;li&gt;Bot&lt;&#x2F;li&gt;
&lt;li&gt;Oyun kopyası&lt;&#x2F;li&gt;
&lt;li&gt;“Kendi ihtiyacım” script’i&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Mükemmel olmasın. Bitsin. Sonra bir şey ekle. Sonra boz. Sonra düzelt. İşte o döngü öğrenme.&lt;&#x2F;p&gt;
&lt;p&gt;Kurslar iskele. Kalıcı bina, senin yazdığın saçma projedir.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;github-utanc-esigini-gec&quot;&gt;GitHub: utanç eşiğini geç&lt;&#x2F;h2&gt;
&lt;p&gt;“Kodum kötü, koyamam.”&lt;&#x2F;p&gt;
&lt;p&gt;Herkesin kodu kötü başlar. Fark, bir kısmının &lt;strong&gt;kötü kodu herkese açık bırakıp&lt;&#x2F;strong&gt; zamanla iyiye götürmesi.&lt;&#x2F;p&gt;
&lt;p&gt;2026’da GitHub:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;CV değil (sadece)&lt;&#x2F;li&gt;
&lt;li&gt;Günlük değil (sadece)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Alışkanlık kanıtı&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Commit at. README yaz. Issue aç kendine. Küçük PR’lar oku. Başkasının projesinde “typo fix” bile utançtan iyidir — çünkü sisteme dokunmuş olursun.&lt;&#x2F;p&gt;
&lt;p&gt;Public repo korkutucuysa önce private tut, ama &lt;em&gt;bitir&lt;&#x2F;em&gt;. Sonra cesaret gelince aç. Önemli olan: işin sadece kafanda değil, diskte ve mümkünse uzakta bir yerde dursun.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mentor-ariyorum-ve-diger-sosyal-tuzaklar&quot;&gt;“Mentor arıyorum” ve diğer sosyal tuzaklar&lt;&#x2F;h2&gt;
&lt;p&gt;Topluluk iyidir. Discord, forum, Reddit, X — bazen bir cevap hayat kurtarır.&lt;&#x2F;p&gt;
&lt;p&gt;Ama 2026’da bir de şu tip var:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;0 proje&lt;&#x2F;li&gt;
&lt;li&gt;0 commit&lt;&#x2F;li&gt;
&lt;li&gt;40 sunucuda “mentor var mı?”&lt;&#x2F;li&gt;
&lt;li&gt;“Yol haritası atın”&lt;&#x2F;li&gt;
&lt;li&gt;“Hangisi daha iyi, Python mı Java mı?” (40. kez)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Mentor sihirbaz değil. Senin yerine oturup öğrenemez. En iyi mentorluk genelde şudur: &lt;strong&gt;spesifik soru&lt;&#x2F;strong&gt; + “şunu denedim, şu hata geldi, şunu okudum”.&lt;&#x2F;p&gt;
&lt;p&gt;Genel “nasıl başlarım?” sorusunun cevabı 2026’da hâlâ aynı:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bir şey seç. Yap. Takılınca sor.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Sihirli yol haritası yok. Varsa satılıyordur.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kariyer-hobi-para-uc-farkli-oyun&quot;&gt;Kariyer, hobi, para — üç farklı oyun&lt;&#x2F;h2&gt;
&lt;p&gt;Karıştırınca acı çekersin.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Oyun&lt;&#x2F;th&gt;&lt;th&gt;Skor tahtası&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Hobi&lt;&#x2F;td&gt;&lt;td&gt;Eğlence, merak&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Öğrenme&lt;&#x2F;td&gt;&lt;td&gt;Anlama derinliği&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kariyer&lt;&#x2F;td&gt;&lt;td&gt;İş &#x2F; para &#x2F; güvenilirlik&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;“3 ayda FAANG + lambo” vaadi 2026’da da satılıyor çünkü &lt;em&gt;umut&lt;&#x2F;em&gt; satılır. Gerçek daha sıkıcı:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;İlanlar rekabetçi&lt;&#x2F;li&gt;
&lt;li&gt;AI hem kapı açıyor hem bazı giriş işlerini sıkıştırıyor&lt;&#x2F;li&gt;
&lt;li&gt;Portfolyo + ispat hâlâ işe yarıyor&lt;&#x2F;li&gt;
&lt;li&gt;Network var ama boş vaatten ibaret network çöp&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Para isteyen: ürün veya iş.&lt;br &#x2F;&gt;
Öğrenmek isteyen: proje.&lt;br &#x2F;&gt;
Eğlenmek isteyen: canın ne istiyorsa.&lt;&#x2F;p&gt;
&lt;p&gt;Üçünü birden “hızlı ve garantili” isteyen: hayal ürünü alıyor demektir.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kisa-bir-not-benden&quot;&gt;Kısa bir not benden&lt;&#x2F;h2&gt;
&lt;p&gt;Eğer yapmak istiyorsan yaparsın. Bunu kimse engelleyemez — özellikle 2026’da. Öğrenme eğrisi ve öğretici rehberler bizim zamanımıza göre &lt;em&gt;saçma derecede&lt;&#x2F;em&gt; bol. AI var. Kaynak var. Bilgisayar erişimi var.&lt;&#x2F;p&gt;
&lt;p&gt;Bu kadar basit: öğrenmek isteyen her şekilde öğrenir. Emek ve zaman gerekir. Bunu verdiğin sürece meyvesini alırsın.&lt;&#x2F;p&gt;
&lt;p&gt;Alamayabilirsin de. Bu bir muammadır.&lt;&#x2F;p&gt;
&lt;p&gt;Ben 13 yılımı verdim; meyvesini fiilen 3–4 yıldır yiyebiliyorum. O 13 yılın çoğu “henüz ortada bir şey yokken de devam etmek”ti. Parlak highlight reel değil.&lt;&#x2F;p&gt;
&lt;p&gt;Feyyaz Yiğit’in dediği gibi: &lt;strong&gt;gerçeğin üzerinde çalışsan da başaramayabilirsin.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Bu cümle umutsuzluk için değil. Sahte garantiye karşı. Çalışmak zorunlu; başarı opsiyonel ve bazen adaletsiz. Yine de çalışmayanların “keşke”si, çalışanların “olmadı”sından daha ağır geliyor bana.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2026-edition-fiili-baslangic-saka-bitti-liste&quot;&gt;2026 Edition — fiili başlangıç (şaka bitti, liste)&lt;&#x2F;h2&gt;
&lt;p&gt;Yarın için abartısız plan:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bir dil seç.&lt;&#x2F;strong&gt; Hangisi olduğu 3. haftadan sonra o kadar da kutsal değil. Seç, bırakma.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bir proje seç.&lt;&#x2F;strong&gt; Küçük. 2 haftada utanç verici bir v1.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Her gün (veya çoğu gün) dokun.&lt;&#x2F;strong&gt; 20 dakika bile.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;AI’yı asistan yap, öğretmen-kopya değil.&lt;&#x2F;strong&gt; Önce dene, takılınca sor, cevabı &lt;em&gt;anla&lt;&#x2F;em&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Git’e koy.&lt;&#x2F;strong&gt; Private bile olsa.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bir yere yaz.&lt;&#x2F;strong&gt; Bug &#x2F; öğrenilen &#x2F; “yarın ne”.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;İlan &#x2F; para &#x2F; imaj’ı 90 gün ertele.&lt;&#x2F;strong&gt; Önce kas.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;İşte “nasıl başlarım”ın 2026 cevabı bu kadar romantik değil: &lt;strong&gt;başla, sürdür, doğrula.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kapanis&quot;&gt;Kapanış&lt;&#x2F;h2&gt;
&lt;p&gt;“Yazılıma nasıl başlarım 2026 Edition” aslında şu sorunun maskesi:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bu kadar kolaylaşmış bir dünyada hâlâ başlamıyorsam, sorun kaynak mı — yoksa ben miyim?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Kaynak tarafı 2026’da suçlanacak durumda değil. AI var. Rehber var. Araç var.&lt;&#x2F;p&gt;
&lt;p&gt;Kalan: zaman, emek, utanç eşiği, ve gerçeğin üzerinde çalışmanın bile garanti etmediği o garip muamma.&lt;&#x2F;p&gt;
&lt;p&gt;Yine de — yapmak isteyen yapar. Engelleyen çoğunlukla dış dünya değil, erteleme ve sonsuz “hazırlanıyorum” hali.&lt;&#x2F;p&gt;
&lt;p&gt;Şimdi kapat bu yazıyı. Editörü aç. Bir dosya yarat. Bir satır yaz.&lt;&#x2F;p&gt;
&lt;p&gt;2026 Edition böyle başlıyor. Gerisi commit history.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Agent-First Mimari: API&#x27;lerin Geleceği MCP</title>
          <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/agent-first-mimari-mcp/</link>
          <guid>https://tuntii.com/blog/agent-first-mimari-mcp/</guid>
          <description xml:base="https://tuntii.com/blog/agent-first-mimari-mcp/">&lt;p&gt;2025&#x27;te herkes &quot;AI API&#x27;leri çağıracak&quot; diyordu. 2026&#x27;da bu gerçek oldu — ama kimsenin tahmin etmediği bir şekilde.&lt;&#x2F;p&gt;
&lt;p&gt;AI agent&#x27;lar API çağırmaya başladı. Ama REST API&#x27;leri onlar için tasarlanmamıştı. Swagger dokümanları insanlar içindi. JSON Schema insan gözüyle okunmak içindi. Hata kodları &quot;developer experience&quot; odaklıydı.&lt;&#x2F;p&gt;
&lt;p&gt;Sonra Anthropic MCP&#x27;yi duyurdu. Ve her şey değişti.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rest-in-kor-noktasi&quot;&gt;REST&#x27;in kör noktası&lt;&#x2F;h2&gt;
&lt;p&gt;REST, 2000&#x27;de Roy Fielding&#x27;in doktora teziyle doğdu. 25 yıldır web&#x27;in omurgası. İnsan developer&#x27;lar için mükemmel: predictable URL&#x27;ler, HTTP verb&#x27;leri, stateless iletişim.&lt;&#x2F;p&gt;
&lt;p&gt;Ama bir AI agent için REST şöyle görünür:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Agent: &amp;quot;Kullanıcının son siparişini getir.&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;API: 401 Unauthorized
&lt;&#x2F;span&gt;&lt;span&gt;Agent: &amp;quot;Token mı gerekiyor? Nereden alacağım?&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;API: [sessizlik]
&lt;&#x2F;span&gt;&lt;span&gt;Agent: &amp;quot;GET &#x2F;orders?filter=latest döneyim...&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;API: 400 Bad Request — &amp;quot;use &amp;#39;sort&amp;#39; not &amp;#39;filter&amp;#39;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;Agent: &amp;quot;...&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;AI agent&#x27;lar REST&#x27;in implicit kontratlarını anlamaz. Onlar explicit&#x27;e ihtiyaç duyar. Her şeyin yazılı olduğu, keşfedilebilir, makine-okunabilir bir sözleşmeye.&lt;&#x2F;p&gt;
&lt;p&gt;MCP tam olarak bu.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mcp-nedir&quot;&gt;MCP nedir?&lt;&#x2F;h2&gt;
&lt;p&gt;Model Context Protocol (MCP), Anthropic tarafından Kasım 2024&#x27;te duyurulan, AI agent&#x27;ların araçları ve veri kaynaklarını keşfetmesi için standart bir protokol. JSON-RPC 2.0 üzerinde çalışıyor.&lt;&#x2F;p&gt;
&lt;p&gt;Basitçe: AI agent&#x27;ınıza &quot;şu tool&#x27;ları kullanabilirsin&quot; diyorsunuz. Agent, tool&#x27;ların isimlerini, parametrelerini, açıklamalarını JSON-RPC üzerinden keşfediyor. Sonra ihtiyacı olanı çağırıyor.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; Agent sorar:
&lt;&#x2F;span&gt;&lt;span&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;method&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tools&#x2F;list&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; Sunucu cevap verir:
&lt;&#x2F;span&gt;&lt;span&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tools&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: [{
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;get_weather&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Belirtilen şehrin hava durumunu getirir&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;inputSchema&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;object&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;properties&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span&gt;      &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;description&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Şehir adı&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;}
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;}]}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; Agent çağırır:
&lt;&#x2F;span&gt;&lt;span&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;method&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tools&#x2F;call&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;params&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;get_weather&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;arguments&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;İstanbul&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;}}}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bu kadar basit. Ama bu basitlik, API tasarımında bir paradigma değişimini temsil ediyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;agent-first-api-tasariminin-5-prensibi&quot;&gt;Agent-first API tasarımının 5 prensibi&lt;&#x2F;h2&gt;
&lt;p&gt;RustAPI&#x27;yi geliştirirken, MCP&#x27;yi native destekleyen ilk web framework&#x27;ü yaparken öğrendiğim prensipler:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-her-endpoint-kendini-aciklamali&quot;&gt;1. Her endpoint kendini açıklamalı&lt;&#x2F;h3&gt;
&lt;p&gt;İnsan developer için &lt;code&gt;GET &#x2F;api&#x2F;v2&#x2F;orders?sort=desc&amp;amp;limit=10&lt;&#x2F;code&gt; yeterli olabilir. Ama AI agent için yeterli değil.&lt;&#x2F;p&gt;
&lt;p&gt;Agent-first API&#x27;de her endpoint&#x27;in bir &lt;strong&gt;description&lt;&#x2F;strong&gt;&#x27;ı, her parametrenin bir &lt;strong&gt;açıklaması&lt;&#x2F;strong&gt;, her response&#x27;ın bir &lt;strong&gt;schema&lt;&#x2F;strong&gt;&#x27;sı olmalı. Swagger&#x2F;OpenAPI zaten bunu yapıyordu — ama MCP bunu runtime&#x27;da, agent tarafından keşfedilebilir hale getiriyor.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-input-output-kontrati-explicit-olmali&quot;&gt;2. Input&#x2F;output kontratı explicit olmalı&lt;&#x2F;h3&gt;
&lt;p&gt;AI agent&#x27;lar, &quot;şu durumda şu HTTP status döner&quot; gibi implicit bilgileri anlamaz. Onlara her olasılığı söylemelisiniz:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;## Bu endpoint ne döndürür?
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;- 200: Başarılı — WeatherResponse JSON
&lt;&#x2F;span&gt;&lt;span&gt;- 404: Şehir bulunamadı — ErrorResponse JSON  
&lt;&#x2F;span&gt;&lt;span&gt;- 429: Rate limit aşıldı — lütfen 60 saniye bekle
&lt;&#x2F;span&gt;&lt;span&gt;- 500: Sunucu hatası — tekrar dene
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bunu MCP&#x27;nin tool description&#x27;ına yazdığınızda, agent hata durumlarını yönetebiliyor. REST&#x27;te bu bilgiyi nerede veriyordunuz? Belki Swagger&#x27;da, belki dokümanda, belki hiçbir yerde.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-tool-lar-composable-olmali&quot;&gt;3. Tool&#x27;lar composable olmalı&lt;&#x2F;h3&gt;
&lt;p&gt;Bir AI agent nadiren tek bir endpoint çağırır. Genelde birkaç endpoint&#x27;i zincirler:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Kullanıcıyı bul (&lt;code&gt;search_users&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Siparişlerini getir (&lt;code&gt;get_orders&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;En sonuncusunu bul (&lt;code&gt;—&lt;&#x2F;code&gt; bunu agent kendi yapar)&lt;&#x2F;li&gt;
&lt;li&gt;Kargoyu sorgula (&lt;code&gt;track_shipment&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Agent-first API&#x27;de tool&#x27;lar, birbirinin output&#x27;unu input olarak alabilecek şekilde tasarlanmalı. &lt;code&gt;search_users&lt;&#x2F;code&gt;&#x27;ın döndüğü &lt;code&gt;user_id&lt;&#x2F;code&gt;, &lt;code&gt;get_orders&lt;&#x2F;code&gt;&#x27;ın beklediği &lt;code&gt;user_id&lt;&#x2F;code&gt; ile aynı isimde ve aynı formatta olmalı.&lt;&#x2F;p&gt;
&lt;p&gt;Buna &lt;strong&gt;tool compatibility&lt;&#x2F;strong&gt; diyorum.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-permission-modeli-granular-olmali&quot;&gt;4. Permission modeli granular olmalı&lt;&#x2F;h3&gt;
&lt;p&gt;İnsan developer&#x27;a &quot;bu API key ile her şeyi yapabilirsin&quot; diyebilirsiniz. AI agent&#x27;a diyemezsiniz.&lt;&#x2F;p&gt;
&lt;p&gt;Agent-first API&#x27;de permission modeli şöyle olmalı:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Agent X, &lt;code&gt;read:orders&lt;&#x2F;code&gt; yapabilir ama &lt;code&gt;write:orders&lt;&#x2F;code&gt; yapamaz&lt;&#x2F;li&gt;
&lt;li&gt;Agent Y, &lt;code&gt;read:orders&lt;&#x2F;code&gt; + &lt;code&gt;read:users&lt;&#x2F;code&gt; yapabilir ama &lt;code&gt;delete:*&lt;&#x2F;code&gt; yapamaz&lt;&#x2F;li&gt;
&lt;li&gt;Agent Z (admin agent), her şeyi yapabilir ama &lt;code&gt;amount &amp;gt; 10000TL&lt;&#x2F;code&gt; olan işlemlerde insan onayı ister&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;RustAPI&#x27;de bunu &lt;strong&gt;MCP Permission Scoping&lt;&#x2F;strong&gt; ile yapıyorum (v0.1.508). Her MCP tool&#x27;una scope atayabiliyorsunuz, her agent&#x27;a scope set&#x27;i tanımlayabiliyorsunuz.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;5-output-agent-readable-olmali&quot;&gt;5. Output, agent-readable olmalı&lt;&#x2F;h3&gt;
&lt;p&gt;Bu kritik. İnsan için yazdığınız response:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;message&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Siparişiniz başarıyla oluşturuldu, teşekkürler!&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;AI agent için yazdığınız response:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-json &quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;order_id&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;ord_2026_0706_001&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;status&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;confirmed&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;estimated_delivery&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;2026-07-08T14:00:00+03:00&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;total_amount&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: {&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;value&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;149.90&lt;&#x2F;span&gt;&lt;span&gt;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;currency&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;TRY&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;},
&lt;&#x2F;span&gt;&lt;span&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tracking_url&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;: &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;https:&#x2F;&#x2F;kargo.example.com&#x2F;track&#x2F;TRK123456&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;İnsan &quot;teşekkürler&quot; mesajını okur ve mutlu olur. AI agent &lt;code&gt;order_id&lt;&#x2F;code&gt;&#x27;ye bakar ve bir sonraki işleme geçer. İkisi farklı dünyalar.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gercek-dunyadan-bir-ornek-semanticad&quot;&gt;Gerçek dünyadan bir örnek: SemantiCAD&lt;&#x2F;h2&gt;
&lt;p&gt;SemantiCAD&#x27;de MCP&#x27;yi nasıl kullandığımızı anlatayım. SemantiCAD, bir CAD dosyasını (STEP&#x2F;DXF) alıp maliyet, BOM (Bill of Materials) ve üretim adımları çıkaran bir sistem. Bunu yapmak için birden fazla AI modelini zincirliyor.&lt;&#x2F;p&gt;
&lt;p&gt;Eski yöntem: Her model için ayrı bir Python script&#x27;i yaz, output&#x27;u parse et, sonrakine pipe&#x27;la. Her şey kırılgan, her şey ad-hoc.&lt;&#x2F;p&gt;
&lt;p&gt;Yeni yöntem (MCP ile):&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;STEP Parser Tool:&lt;&#x2F;strong&gt; &quot;Bu STEP dosyasını parse et, geometrik feature&#x27;ları çıkar&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;BOM Generator Tool:&lt;&#x2F;strong&gt; &quot;Bu feature listesinden malzeme listesi oluştur&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cost Estimator Tool:&lt;&#x2F;strong&gt; &quot;Bu BOM ve feature listesinden maliyet tahmini yap&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Process Planner Tool:&lt;&#x2F;strong&gt; &quot;Bu feature listesinden üretim adımlarını planla&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Her tool bir MCP endpoint&#x27;i. Ana agent (Claude veya DeepSeek), bu tool&#x27;ları sırayla çağırıyor. Her tool&#x27;un input&#x2F;output kontratı explicit. Tool&#x27;ları istediğiniz sırada zincirleyebilirsiniz. Yeni bir tool eklemek, mevcut hiçbir şeyi bozmaz.&lt;&#x2F;p&gt;
&lt;p&gt;Sonuç: %96 BOM accuracy. Eski yöntemde %70&#x27;lerdeydik. MCP&#x27;nin getirdiği yapılandırılmış iletişim sayesinde.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mcp-vs-rest-vs-grpc-vs-graphql&quot;&gt;MCP vs REST vs gRPC vs GraphQL&lt;&#x2F;h2&gt;
&lt;p&gt;Hangisi ne zaman?&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Protokol&lt;&#x2F;th&gt;&lt;th&gt;En iyi olduğu yer&lt;&#x2F;th&gt;&lt;th&gt;AI agent için uygun mu?&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;REST&lt;&#x2F;td&gt;&lt;td&gt;İnsan developer&#x27;lar için API&#x27;ler&lt;&#x2F;td&gt;&lt;td&gt;Hayır — implicit kontratlar&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GraphQL&lt;&#x2F;td&gt;&lt;td&gt;Esnek veri sorgulama (insanlar için)&lt;&#x2F;td&gt;&lt;td&gt;Kısmen — schema var ama tool semantics yok&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;gRPC&lt;&#x2F;td&gt;&lt;td&gt;Mikroservisler arası iletişim&lt;&#x2F;td&gt;&lt;td&gt;Kısmen — protobuf explicit ama keşif yok&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;MCP&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;AI agent&#x27;lar için tool exposure&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Evet — bunun için tasarlandı&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Geleceğin stack&#x27;i: İnsanlar için REST&#x2F;GraphQL, servisler için gRPC, AI agent&#x27;lar için MCP. Üçü aynı backend&#x27;te, aynı endpoint&#x27;lerin farklı &quot;görünümleri&quot; olarak.&lt;&#x2F;p&gt;
&lt;p&gt;RustAPI&#x27;de tam olarak bunu yapıyorum. Bir endpoint yazıyorsunuz, otomatik olarak REST (HTTP) ve MCP (JSON-RPC) endpoint&#x27;i olarak expose ediliyor. Aynı kod, iki protokol.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2026-2027-de-ne-gorecegiz&quot;&gt;2026-2027&#x27;de ne göreceğiz?&lt;&#x2F;h2&gt;
&lt;p&gt;Tahminlerim:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Her SaaS&#x27;ın bir MCP endpoint&#x27;i olacak.&lt;&#x2F;strong&gt; Tıpkı 2015&#x27;te her SaaS&#x27;ın bir REST API&#x27;si olması gibi.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Agent-first, insan-second.&lt;&#x2F;strong&gt; Yeni API&#x27;ler önce AI agent&#x27;lar için, sonra insan developer&#x27;lar için tasarlanacak.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;MCP Gateway&#x27;ler yaygınlaşacak.&lt;&#x2F;strong&gt; Tüm şirket API&#x27;lerini tek bir MCP endpoint&#x27;inde toplayan gateway&#x27;ler.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Agent-to-agent protokolleri.&lt;&#x2F;strong&gt; Sadece agent-to-API değil, agent-to-agent iletişim protokolleri de standartlaşacak.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Permission modelleri en büyük problem olacak.&lt;&#x2F;strong&gt; Bir AI agent&#x27;ın neye erişebileceğini kim, nasıl kontrol edecek?&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Sonuncusu özellikle kritik. Security community&#x27;nin henüz yeterince konuşmadığı bir konu. Ama yakında patlayacak.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;simdi-ne-yapmalisiniz&quot;&gt;Şimdi ne yapmalısınız?&lt;&#x2F;h2&gt;
&lt;p&gt;Eğer bir API geliştiriyorsanız, bugün başlayın:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Mevcut API&#x27;nize bir MCP endpoint&#x27;i ekleyin. 3-5 tool ile başlayın.&lt;&#x2F;li&gt;
&lt;li&gt;Her endpoint için explicit description ve input&#x2F;output schema yazın. Sadece tip değil, gerçekten açıklayıcı metin.&lt;&#x2F;li&gt;
&lt;li&gt;Bir AI agent ile test edin. Claude Desktop&#x27;a MCP sunucunuzu bağlayın ve &quot;kullanıcının son siparişini getir&quot; deyin. Ne oluyor? Nerede takılıyor?&lt;&#x2F;li&gt;
&lt;li&gt;Permission modelini düşünün. Agent&#x27;ların neye erişebileceğini, neyi değiştirebileceğini belirleyin.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Gelecek agent-first. Şimdiden hazırlananlar, 2027&#x27;de bir adım önde olacak.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Bu yazı RustAPI&#x27;nin MCP mimarisinden ve SemantiCAD&#x27;deki MCP kullanımından öğrendiklerimle yazıldı. Bir sonraki yazıda Hyperembed ve embedding inference motorunun nasıl çalıştığını anlatacağım.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>BareEngine: C++ ile Sıfırdan Oyun Motoru Yazmak</title>
          <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/bareengine-oyun-motoru/</link>
          <guid>https://tuntii.com/blog/bareengine-oyun-motoru/</guid>
          <description xml:base="https://tuntii.com/blog/bareengine-oyun-motoru/">&lt;p&gt;Her şey 10 yıl önce başladı. Metin2 private server&#x27;lar, Knight Online emülatörleri, oyun sunucu toplulukları... 11 yaşında bir çocuk, bir oyunun nasıl çalıştığını anlamaya çalışıyordu. Packet&#x27;ları sniff ediyor, server emülatörleri yazıyor, C++ öğreniyordu.&lt;&#x2F;p&gt;
&lt;p&gt;O çocuk bendim.&lt;&#x2F;p&gt;
&lt;p&gt;Ve şimdi, 21 yaşında, aynı çocuğun hayalini gerçekleştiriyorum: BareEngine — kendi oyun motorum.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;neden-kendi-oyun-motorun&quot;&gt;Neden kendi oyun motorun?&lt;&#x2F;h2&gt;
&lt;p&gt;Hazır motorlar var: Unity, Unreal, Godot. Neden sıfırdan bir tane daha?&lt;&#x2F;p&gt;
&lt;p&gt;Çünkü benim istediğim şeyi yapmıyorlar.&lt;&#x2F;p&gt;
&lt;p&gt;Benim istediğim şey şu: bir editör açayım, birkaç model yerleştireyim, birkaç script yazayım, ve &lt;strong&gt;oyun sunucusu da otomatik oluşsun.&lt;&#x2F;strong&gt; Editör ve sunucu aynı toolchain&#x27;in parçası olsun. Unity&#x27;de bunu yapmak için Mirror, FishNet, Netcode for GameObjects gibi üçüncü parti kütüphaneler gerek. Ben bunu native istiyorum.&lt;&#x2F;p&gt;
&lt;p&gt;Ayrıca, Metin2 ve Knight Online gibi oyunların kendine has bir &quot;hissi&quot; var. Kamera açısı, karakter kontrolü, combat sistemi, UI — bunların hepsi belli bir tarzda. Bu tarzı modern engine&#x27;lerde yakalamak zor. Çünkü onlar FPS veya açık dünya RPG&#x27;leri için optimize edilmiş.&lt;&#x2F;p&gt;
&lt;p&gt;Ben Metin2 tarzı MMORPG&#x27;ler için optimize edilmiş bir motor istiyorum. O yüzden kendim yazıyorum.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mimari&quot;&gt;Mimari&lt;&#x2F;h2&gt;
&lt;p&gt;BareEngine üç ana bileşenden oluşuyor:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;┌──────────────────────────────────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│              BareEditor (GUI)             │
&lt;&#x2F;span&gt;&lt;span&gt;│  ┌─────────┐ ┌──────────┐ ┌──────────┐   │
&lt;&#x2F;span&gt;&lt;span&gt;│  │ World   │ │ Asset    │ │ Script   │   │
&lt;&#x2F;span&gt;&lt;span&gt;│  │ Editor  │ │ Browser  │ │ Editor   │   │
&lt;&#x2F;span&gt;&lt;span&gt;│  └─────────┘ └──────────┘ └──────────┘   │
&lt;&#x2F;span&gt;&lt;span&gt;├──────────────────────────────────────────┤
&lt;&#x2F;span&gt;&lt;span&gt;│             BareEngine (Core)            │
&lt;&#x2F;span&gt;&lt;span&gt;│  ┌─────────┐ ┌──────────┐ ┌──────────┐   │
&lt;&#x2F;span&gt;&lt;span&gt;│  │Renderer │ │ Physics  │ │ Audio    │   │
&lt;&#x2F;span&gt;&lt;span&gt;│  │(OpenGL) │ │(Bullet)  │ │(OpenAL)  │   │
&lt;&#x2F;span&gt;&lt;span&gt;│  └─────────┘ └──────────┘ └──────────┘   │
&lt;&#x2F;span&gt;&lt;span&gt;├──────────────────────────────────────────┤
&lt;&#x2F;span&gt;&lt;span&gt;│            BareServer (Sunucu)            │
&lt;&#x2F;span&gt;&lt;span&gt;│  ┌─────────┐ ┌──────────┐ ┌──────────┐   │
&lt;&#x2F;span&gt;&lt;span&gt;│  │Network  │ │ Game     │ │ DB       │   │
&lt;&#x2F;span&gt;&lt;span&gt;│  │(ENet)   │ │ Logic    │ │(SQLite)  │   │
&lt;&#x2F;span&gt;&lt;span&gt;│  └─────────┘ └──────────┘ └──────────┘   │
&lt;&#x2F;span&gt;&lt;span&gt;└──────────────────────────────────────────┘
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;BareEditor:&lt;&#x2F;strong&gt; ImGui tabanlı masaüstü editör. World editörü (terrain, obje yerleştirme), asset browser (model, texture, ses), script editörü (Lua entegrasyonu). Editörün kendisi editör öncelikli — yani ürün editör, oyun çıktısı yan ürün.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;BareEngine (Core):&lt;&#x2F;strong&gt; Renderer (OpenGL), fizik motoru (Bullet Physics), ses (OpenAL). Hepsi C++ ile, hepsi native.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;BareServer:&lt;&#x2F;strong&gt; Oyuncuların bağlandığı sunucu. ENet (reliable UDP), game logic (C++), veritabanı (SQLite). Sunucu, editörden export edilen dünya dosyasını okuyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;editor-first-felsefesi&quot;&gt;Editör-first felsefesi&lt;&#x2F;h2&gt;
&lt;p&gt;Çoğu oyun motoru &quot;engine-first&quot;tir. Önce motoru yazarsın, sonra editörü eklersin. Ben tersini yapıyorum.&lt;&#x2F;p&gt;
&lt;p&gt;BareEngine&#x27;de editör, motorun bir arayüzü değil — &lt;strong&gt;editör ürünün kendisi.&lt;&#x2F;strong&gt; Oyun yapımcısı editörü açar, dünyasını inşa eder, &quot;Build&quot;e basar, oyun çıkar. Tıpkı RPG Maker gibi. Ama RPG Maker&#x27;dan farklı olarak:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Multiplayer native (MMORPG&#x27;ler için)&lt;&#x2F;li&gt;
&lt;li&gt;Performans odaklı (C++, OpenGL)&lt;&#x2F;li&gt;
&lt;li&gt;Script edilebilir (Lua)&lt;&#x2F;li&gt;
&lt;li&gt;Açık kaynak&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Hedef kitle: Metin2, Knight Online, Silkroad tarzı oyunların private server toplulukları. Bu topluluklar yıllardır emülatörlerle, reverse-engine edilmiş server dosyalarıyla uğraşıyor. Onlara &quot;kendi oyununu yap&quot; diyen bir araç vermek istiyorum.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;teknik-kararlar&quot;&gt;Teknik kararlar&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;neden-imgui&quot;&gt;Neden ImGui?&lt;&#x2F;h3&gt;
&lt;p&gt;Editör için ImGui (Dear ImGui) kullanıyorum. Qt değil, wxWidgets değil, ImGui.&lt;&#x2F;p&gt;
&lt;p&gt;Sebebi: ImGui immediate mode. Her frame GUI&#x27;yi sıfırdan çiziyorsun. Bu, oyun motoru editörleri için mükemmel çünkü:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Render state ile GUI state aynı yerde&lt;&#x2F;li&gt;
&lt;li&gt;Debugging kolay (her şey o an hesaplanıyor)&lt;&#x2F;li&gt;
&lt;li&gt;Performanslı (gereksiz state yok)&lt;&#x2F;li&gt;
&lt;li&gt;Portable (OpenGL, Vulkan, DirectX hepsinde çalışıyor)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Dezavantajı: &quot;güzel&quot; görünmüyor. Varsayılan ImGui teması... işlevsel diyelim. Ama bunu dert etmiyorum. Editör güzel görünmek zorunda değil, işlevsel olmak zorunda.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;neden-bullet-physics&quot;&gt;Neden Bullet Physics?&lt;&#x2F;h3&gt;
&lt;p&gt;PhysX değil, Havok değil, Bullet. Sebebi: açık kaynak ve MMORPG&#x27;ler için yeterli. MMORPG fiziği, FPS fiziği gibi değildir. Ragdoll yok, destrucible environment yok. Sadece collision detection, basit rigid body, karakter kontrolü. Bullet bunların hepsini fazlasıyla yapıyor.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;neden-enet&quot;&gt;Neden ENet?&lt;&#x2F;h3&gt;
&lt;p&gt;MMORPG sunucuları için TCP değil, UDP tabanlı bir protokol lazım. Hareket input&#x27;ları, combat event&#x27;leri — bunların hepsi düşük latency gerektiriyor. TCP&#x27;nin head-of-line blocking&#x27;i burada ölümcül.&lt;&#x2F;p&gt;
&lt;p&gt;ENet, reliable UDP üzerine inşa edilmiş hafif bir kütüphane. Sıralı paket teslimatı, fragmentation, throttling — hepsi var. Ve en önemlisi: basit. Sadece bir &lt;code&gt;.c&lt;&#x2F;code&gt; dosyası. Bağımlılık yok.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;neden-lua&quot;&gt;Neden Lua?&lt;&#x2F;h3&gt;
&lt;p&gt;C++ ile oyun mantığı yazmak... mümkün ama pratik değil. Her değişiklikte recompile. Lua ile yazınca:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Hot-reload (sunucuyu kapatmadan script güncelle)&lt;&#x2F;li&gt;
&lt;li&gt;Mod yapımcıları için erişilebilir&lt;&#x2F;li&gt;
&lt;li&gt;C++&#x27;tan daha güvenli (crash yapsa bile sunucu çökmez)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Lua bindings için Sol3 kullanıyorum. C++ ve Lua arasındaki köprüyü birkaç satırda kuruyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zorluklar&quot;&gt;Zorluklar&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;1. Editor-state senkronizasyonu.&lt;&#x2F;strong&gt; Editörde bir objeyi sürüklediğinizde, bu değişikliğin renderer&#x27;a, physics engine&#x27;e, network layer&#x27;a yansıması gerekiyor. Undo&#x2F;redo yapınca hepsi geri alınmalı. Bu, command pattern ile çözülüyor ama implementasyonu detaylı.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;2. Multiplayer senkronizasyonu.&lt;&#x2F;strong&gt; Bir oyuncu hareket ettiğinde, bu hareketin diğer oyunculara iletilmesi gerekiyor. Ama her hareketi gönderirseniz bant genişliği patlar. Client-side prediction + server reconciliation yapmanız gerek. Bu, FPS oyunlar için çözülmüş bir problem ama MMORPG&#x27;lerde ölçek farklı: yüzlerce oyuncu, binlerce entity.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;3. Metin2 format uyumluluğu.&lt;&#x2F;strong&gt; Metin2&#x27;nin dosya formatları (&lt;code&gt;.gr2&lt;&#x2F;code&gt; modeller, &lt;code&gt;.dds&lt;&#x2F;code&gt; texture&#x27;lar, &lt;code&gt;.msm&lt;&#x2F;code&gt; animasyonlar) dokümante edilmemiş. Reverse-engineering gerekiyor. Bu, zamanımın büyük kısmını alan kısım.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;4. Cross-platform.&lt;&#x2F;strong&gt; Windows&#x27;ta geliştiriyorum ama Linux sunucularda çalışacak. OpenGL, ENet, Bullet — hepsi cross-platform. Ama build sistemi (CMake), dependency yönetimi (vcpkg), CI&#x2F;CD — bunların hepsi platform başına özel konfigürasyon istiyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;su-anki-durum&quot;&gt;Şu anki durum&lt;&#x2F;h2&gt;
&lt;p&gt;Proje çok erken aşamada. Şu an çalışanlar:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;OpenGL renderer (basic meshes, texture&#x27;lar)&lt;&#x2F;li&gt;
&lt;li&gt;ImGui editör arayüzü (world outliner, property editor)&lt;&#x2F;li&gt;
&lt;li&gt;ENet networking (bağlantı, mesajlaşma)&lt;&#x2F;li&gt;
&lt;li&gt;Temel Lua scripting (&lt;code&gt;onPlayerJoin&lt;&#x2F;code&gt;, &lt;code&gt;onChatMessage&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Henüz çalışmayanlar (bir sonraki milestone):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Asset import pipeline (&lt;code&gt;.fbx&lt;&#x2F;code&gt;, &lt;code&gt;.gltf&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Physics (collision detection)&lt;&#x2F;li&gt;
&lt;li&gt;Animation system&lt;&#x2F;li&gt;
&lt;li&gt;Database persistence (karakter kaydetme)&lt;&#x2F;li&gt;
&lt;li&gt;Metin2 format parser&#x27;ları&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;bu-proje-neden-onemli&quot;&gt;Bu proje neden önemli?&lt;&#x2F;h2&gt;
&lt;p&gt;BareEngine ticari bir ürün değil. Bir tutku projesi. 11 yaşındaki halime bir mektup gibi.&lt;&#x2F;p&gt;
&lt;p&gt;O çocuk, oyunların nasıl çalıştığını anlamak için packet&#x27;ları sniff ediyordu. Şimdi o çocuğa &quot;işte böyle çalışıyor&quot; diyebilecek bir şey inşa ediyorum. Açık kaynak. Herkes görsün, öğrensin diye.&lt;&#x2F;p&gt;
&lt;p&gt;Ayrıca, Türkiye&#x27;de oyun geliştirme büyüyor. Ama çoğu stüdyo Unity&#x2F;Unreal kullanıyor. Düşük seviyede, &quot;motor nasıl çalışır&quot;ı anlayan az. BareEngine, bu bilgiyi açık kaynakla yaymanın bir yolu.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deneyin&quot;&gt;Deneyin&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; clone https:&#x2F;&#x2F;github.com&#x2F;Tuntii&#x2F;BareEngine
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; BareEngine
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# Build (CMake + vcpkg):
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cmake -B&lt;&#x2F;span&gt;&lt;span&gt; build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -S&lt;&#x2F;span&gt;&lt;span&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --toolchain&lt;&#x2F;span&gt;&lt;span&gt; ...
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cmake --build&lt;&#x2F;span&gt;&lt;span&gt; build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --config&lt;&#x2F;span&gt;&lt;span&gt; Release
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# Run editor:
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;.&#x2F;build&#x2F;Release&#x2F;BareEditor.exe
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Henüz &quot;oyun yapılabilir&quot; durumda değil. Ama yolda. Her commit, 11 yaşındaki halime bir adım daha yaklaştırıyor.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Bu, serinin son yazısı değil. Sırada alexander-storage (self-hosted S3), IntentScript (LLM task runner) ve daha fazlası var. Takipte kalın.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Hyperembed: Rust ile Embedding Inference Motoru Yazmak</title>
          <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/hyperembed-rust-embedding-inference/</link>
          <guid>https://tuntii.com/blog/hyperembed-rust-embedding-inference/</guid>
          <description xml:base="https://tuntii.com/blog/hyperembed-rust-embedding-inference/">&lt;p&gt;Bir embedding inference motoru yazmaya karar verdiğimde, insanlar &quot;neden? sentence-transformers var zaten&quot; dediler. Haklılardı. &lt;code&gt;sentence-transformers&lt;&#x2F;code&gt; Python&#x27;da çalışıyor, 5000&#x27;den fazla model desteği var, PyTorch ekosistemi olgun.&lt;&#x2F;p&gt;
&lt;p&gt;Ama benim derdim embedding yapmak değildi. Benim derdim embedding&#x27;i &lt;strong&gt;her yerde&lt;&#x2F;strong&gt; yapmaktı. Bir sunucuda değil, bir telefonda değil, gömülü bir cihazda değil — hepsinde. Tek bir binary ile. Sıfır Python bağımlılığıyla. Sıfır PyTorch bağımlılığıyla. Sıfır ONNX runtime ile.&lt;&#x2F;p&gt;
&lt;p&gt;Pure Rust. Sadece Rust.&lt;&#x2F;p&gt;
&lt;p&gt;İşte Hyperembed böyle doğdu.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problem-embedding-inference-nerede&quot;&gt;Problem: Embedding inference nerede?&lt;&#x2F;h2&gt;
&lt;p&gt;Bugün embedding inference şu yerlerde yapılıyor:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cloud API (OpenAI, Cohere, vb.):&lt;&#x2F;strong&gt; En kolayı. Ama network latency, API maliyeti, veri gizliliği sorunları var.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Sunucu tarafı (sentence-transformers + GPU):&lt;&#x2F;strong&gt; Daha iyi. Ama GPU lazım, Python runtime lazım, bellek yönetimi lazım.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Edge &#x2F; On-device:&lt;&#x2F;strong&gt; Neredeyse imkansız. PyTorch mobile büyük, ONNX runtime ağır, model optimizasyonu karmaşık.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Hyperembed bu üçüncü kategoriyi hedefliyor: edge&#x27;de, on-device, gömülü sistemlerde embedding inference. Rust sayesinde.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nasil-calisiyor&quot;&gt;Nasıl çalışıyor?&lt;&#x2F;h2&gt;
&lt;p&gt;Bir embedding inference motoru şunları yapmalı:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Tokenizer:&lt;&#x2F;strong&gt; Metni token&#x27;lara çevir (BERT tokenizer, WordPiece)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Model yükleme:&lt;&#x2F;strong&gt; BERT modelini yükle (ağırlıklar, config)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Forward pass:&lt;&#x2F;strong&gt; Token&#x27;ları modelden geçir, hidden states&#x27;i al&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Pooling:&lt;&#x2F;strong&gt; Hidden states&#x27;ten tek bir embedding vektörü üret (mean pooling, cls token, vs.)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Hyperembed bunların hepsini sıfırdan, Rust ile implemente ediyor.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tokenizer-wordpiece&quot;&gt;Tokenizer (WordPiece)&lt;&#x2F;h3&gt;
&lt;p&gt;BERT tokenizer&#x27;ı implemente etmek, beklediğimden daha eğlenceliydi. WordPiece algoritması:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Metni whitespace&#x27;lerden böl&lt;&#x2F;li&gt;
&lt;li&gt;Her kelimeyi, vocabulary&#x27;deki en uzun eşleşen subtoken&#x27;a böl&lt;&#x2F;li&gt;
&lt;li&gt;Bulunan subtoken&#x27;ları ID&#x27;lere çevir&lt;&#x2F;li&gt;
&lt;li&gt;Özel token&#x27;ları ekle ([CLS], [SEP])&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Bunu Rust&#x27;ta yapmak için bir trie (prefix tree) kullandım. 30,000 token&#x27;lık bir vocabulary&#x27;de, subword tokenization mikrosaniyeler mertebesinde çalışıyor. Python&#x27;dan yaklaşık 50x daha hızlı — çünkü Python her token için string slicing yapıyor.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;model-yukleme&quot;&gt;Model yükleme&lt;&#x2F;h3&gt;
&lt;p&gt;BERT modelleri genelde iki formatta gelir:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PyTorch (.bin):&lt;&#x2F;strong&gt; Saf — pickle + tensor&#x27;lar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ONNX (.onnx):&lt;&#x2F;strong&gt; Portable ama büyük&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Hyperembed, PyTorch formatını doğrudan okuyor. &lt;code&gt;torch.save()&lt;&#x2F;code&gt; ile kaydedilmiş tensor&#x27;ları Rust&#x27;ta parse edebilmek için pickle formatını implemente ettim. Python&#x27;daki &lt;code&gt;pickle&lt;&#x2F;code&gt; modülünün yaptığını, Rust&#x27;ta sıfırdan yazdım.&lt;&#x2F;p&gt;
&lt;p&gt;Bu ne kadar zordu? Oldukça. Pickle formatı, Python objelerini serileştirmek için tasarlanmış. Stack tabanlı bir VM gibi çalışıyor. OPCODE&#x27;lar var, memoization var, referans çözümleme var. Rust&#x27;ta bunu implemente etmek yaklaşık 2000 satır kod aldı. Ama sonuç: herhangi bir PyTorch BERT modelini, PyTorch olmadan yükleyebiliyorum.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;forward-pass&quot;&gt;Forward pass&lt;&#x2F;h3&gt;
&lt;p&gt;İşin en kritik kısmı. Transformer forward pass:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Input → Embedding → [Attention → FFN] × 12 → Pooling → Output
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Her katman matris çarpımı. Çok fazla matris çarpımı. 12 katmanlı BERT-base için:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Her attention head: Q, K, V projeksiyonları (3 matris çarpımı)&lt;&#x2F;li&gt;
&lt;li&gt;Attention: Q @ K^T, softmax, sonra V ile çarp&lt;&#x2F;li&gt;
&lt;li&gt;FFN: 2 büyük matris çarpımı (768→3072, 3072→768)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Toplamda yaklaşık 110M parametre. Her forward pass milyarlarca floating-point işlemi.&lt;&#x2F;p&gt;
&lt;p&gt;Bunu hızlı yapmak için:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SIMD optimizasyonları:&lt;&#x2F;strong&gt; Rust&#x27;ın &lt;code&gt;std::simd&lt;&#x2F;code&gt; modülünü kullanarak AVX2&#x2F;NEON instruction&#x27;larıyla matris çarpımı&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cache-friendly bellek düzeni:&lt;&#x2F;strong&gt; Ağırlıkları row-major yerine column-major saklayarak cache locality&#x27;yi iyileştirme&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fused operations:&lt;&#x2F;strong&gt; LayerNorm + residual bağlantıyı tek geçişte yapma&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Weight quantization:&lt;&#x2F;strong&gt; FP32 yerine INT8 quantization (isteğe bağlı, model boyutunu 4x küçültüyor)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Sonuç: sentence-transformers&#x27;tan (CPU modunda) yaklaşık 3-5x daha hızlı. GPU modunda değil tabii — CUDA kernel&#x27;leriyle rekabet edemem. Ama CPU&#x27;da, hele ki düşük güçlü bir ARM işlemcide, Hyperembed ciddi fark atıyor.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pooling&quot;&gt;Pooling&lt;&#x2F;h3&gt;
&lt;p&gt;BERT&#x27;in son hidden states&#x27;inden embedding vektörü üretmek için:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CLS token pooling:&lt;&#x2F;strong&gt; [CLS] token&#x27;ının hidden state&#x27;ini al&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mean pooling:&lt;&#x2F;strong&gt; Tüm token&#x27;ların hidden state&#x27;lerinin ortalamasını al (padding token&#x27;lar hariç)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Max pooling:&lt;&#x2F;strong&gt; Maksimum değerleri al&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Hyperembed hepsini destekliyor. Varsayılan mean pooling — çoğu kullanım senaryosu için en iyisi.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benchmark-lar&quot;&gt;Benchmark&#x27;lar&lt;&#x2F;h2&gt;
&lt;p&gt;Birkaç benchmark sonucu (MacBook M2, CPU only, batch size=1):&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;&#x2F;th&gt;&lt;th&gt;Framework&lt;&#x2F;th&gt;&lt;th&gt;Latency (ms)&lt;&#x2F;th&gt;&lt;th&gt;Memory (MB)&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;BERT-base&lt;&#x2F;td&gt;&lt;td&gt;sentence-transformers (Python)&lt;&#x2F;td&gt;&lt;td&gt;45&lt;&#x2F;td&gt;&lt;td&gt;850&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BERT-base&lt;&#x2F;td&gt;&lt;td&gt;ONNX Runtime (C++)&lt;&#x2F;td&gt;&lt;td&gt;28&lt;&#x2F;td&gt;&lt;td&gt;520&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BERT-base&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Hyperembed (Rust)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;11&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;180&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BERT-tiny&lt;&#x2F;td&gt;&lt;td&gt;sentence-transformers (Python)&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;340&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BERT-tiny&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;Hyperembed (Rust)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;2.3&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;65&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;ARM Cortex-A72 (Raspberry Pi 4):&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Model&lt;&#x2F;th&gt;&lt;th&gt;sentence-transformers&lt;&#x2F;th&gt;&lt;th&gt;Hyperembed&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;BERT-tiny&lt;&#x2F;td&gt;&lt;td&gt;380ms&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;45ms&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Gömülü cihazlarda fiyat farkı burada ortaya çıkıyor. Python runtime, GIL, garbage collector, dinamik tip kontrolü — hepsi ARM&#x27;de çok pahalı. Rust&#x27;ın sıfır-maliyetli abstraksiyonları, kaynak kısıtlı cihazlarda gerçek farkı yaratıyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;semantic-search-pipeline&quot;&gt;Semantic search pipeline&lt;&#x2F;h2&gt;
&lt;p&gt;Hyperembed&#x27;in asıl kullanım alanı: semantic search. Bir döküman koleksiyonunda, kullanıcının sorgusuna anlamsal olarak en yakın dökümanları bulmak.&lt;&#x2F;p&gt;
&lt;p&gt;Pipeline:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Tüm dökümanları Hyperembed ile vektörleştir&lt;&#x2F;li&gt;
&lt;li&gt;Vektörleri bir vector database&#x27;e yaz (Qdrant, Milvus, veya basit bir FAISS index)&lt;&#x2F;li&gt;
&lt;li&gt;Kullanıcı sorgusunu vektörleştir&lt;&#x2F;li&gt;
&lt;li&gt;Cosine similarity ile en yakın k dökümanı bul&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Hyperembed&#x27;in Rust API&#x27;si:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;use &lt;&#x2F;span&gt;&lt;span&gt;hyperembed::{Embedder, EmbedderConfig};
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; config = EmbedderConfig::default()
&lt;&#x2F;span&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;with_model&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;sentence-transformers&#x2F;all-MiniLM-L6-v2&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)?
&lt;&#x2F;span&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;with_pooling&lt;&#x2F;span&gt;&lt;span&gt;(PoolingStrategy::Mean);
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; embedder = Embedder::new(config)?;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; documents = vec![
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Rust programlama dili sistem programlama için tasarlanmıştır.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Python veri bilimi ve makine öğrenmesinde popülerdir.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;JavaScript web tarayıcılarında çalışan bir dildir.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;];
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; doc_embeddings = embedder.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;embed_batch&lt;&#x2F;span&gt;&lt;span&gt;(&amp;amp;documents)?;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; query_embedding = embedder.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;embed&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;sistem programlama dili&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)?;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; similarities: Vec&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;f32&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt; = doc_embeddings.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;iter&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span&gt;(|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;d&lt;&#x2F;span&gt;&lt;span&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;cosine_similarity&lt;&#x2F;span&gt;&lt;span&gt;(&amp;amp;query_embedding, d))
&lt;&#x2F;span&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;collect&lt;&#x2F;span&gt;&lt;span&gt;();
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; → [0.92, 0.45, 0.31] — Rust en yakın, beklendiği gibi
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;local-first-ai-nin-gelecegi&quot;&gt;Local-first AI&#x27;nin geleceği&lt;&#x2F;h2&gt;
&lt;p&gt;Hyperembed, daha büyük bir vizyonun parçası: &lt;strong&gt;local-first AI.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Bugün AI&#x27;nin %99&#x27;u cloud&#x27;da çalışıyor. OpenAI API, Anthropic API, Google Cloud AI. Bu model şu sorunları getiriyor:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gecikme:&lt;&#x2F;strong&gt; Her sorgu için network round-trip&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Maliyet:&lt;&#x2F;strong&gt; Token başına ücret, scale ettikçe katlanıyor&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Gizlilik:&lt;&#x2F;strong&gt; Verileriniz başkasının sunucusunda&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bağımlılık:&lt;&#x2F;strong&gt; API kapandığında uygulamanız çalışmaz&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Offline:&lt;&#x2F;strong&gt; İnternet yoksa AI yok&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Local-first AI, bu sorunların hepsini çözüyor. Model cihazınızda çalışıyor. Embedding&#x27;ler cihazınızda hesaplanıyor. Vector database cihazınızda çalışıyor (SQLite + sqlite-vec gibi).&lt;&#x2F;p&gt;
&lt;p&gt;Hyperembed bu vizyonun embedding katmanı. Diğer katmanlar:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inference:&lt;&#x2F;strong&gt; llama.cpp, mistral.rs gibi local LLM runtime&#x27;ları&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Vector storage:&lt;&#x2F;strong&gt; LanceDB, sqlite-vec&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Orchestration:&lt;&#x2F;strong&gt; Kendi agent framework&#x27;ün&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;2026&#x27;da, 7B parametreli bir LLM&#x27;i bir MacBook&#x27;ta çalıştırmak mümkün. 2027&#x27;de bir telefonda çalıştırmak mümkün olacak. Hyperembed bu geçişte embedding tarafını hallediyor — ve Rust&#x27;ta yazıldığı için, LLM runtime&#x27;larıyla aynı process&#x27;te, sıfır IPC overhead ile çalışabiliyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ne-ogrendim&quot;&gt;Ne öğrendim?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;1. Pickle formatı karanlık bir sanat.&lt;&#x2F;strong&gt; Python objelerini parse etmek için bir VM implemente etmek zorunda kalacağımı tahmin etmezdim. Ama oldu. Ve işe yarıyor.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;2. SIMD, Rust&#x27;ta sandığınızdan daha erişilebilir.&lt;&#x2F;strong&gt; &lt;code&gt;std::simd&lt;&#x2F;code&gt; nightly&#x27;de stabilize oluyor. Portable SIMD yazmak artık &lt;code&gt;unsafe&lt;&#x2F;code&gt; ve inline assembly gerektirmiyor.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;3. BERT inference, sandığınızdan daha basit.&lt;&#x2F;strong&gt; Transformer mimarisi karmaşık görünüyor ama aslında birkaç temel operasyonun tekrarı: matmul, softmax, layer norm, GELU. Bunları implemente ettiğinizde gerisi loop.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;4. Rust, ML inference için underrated.&lt;&#x2F;strong&gt; Herkes Python + CUDA yazıyor ama CPU inference için Rust çok daha iyi. Bellek yönetimi, SIMD, sıfır-cost abstractions — hepsi inference latency&#x27;sini dramatik düşürüyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sirada-ne-var&quot;&gt;Sırada ne var?&lt;&#x2F;h2&gt;
&lt;p&gt;v0.3 roadmap:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;daha fazla model mimarisi:&lt;&#x2F;strong&gt; RoBERTa, DistilBERT, MiniLM&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GGUF format desteği:&lt;&#x2F;strong&gt; llama.cpp&#x27;nin kullandığı quantization formatı&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;WASM target:&lt;&#x2F;strong&gt; Tarayıcıda embedding inference (!)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Python binding:&lt;&#x2F;strong&gt; &lt;code&gt;pip install hyperembed&lt;&#x2F;code&gt; ile Python&#x27;dan kullanılabilir olacak&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ONNX export:&lt;&#x2F;strong&gt; Kendi modelini ONNX olarak dışa aktarma (tersi: ONNX → Hyperembed)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;deneyin&quot;&gt;Deneyin&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; clone https:&#x2F;&#x2F;github.com&#x2F;neuralforgeone&#x2F;hyperembed
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; hyperembed
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span&gt; build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --release
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --example&lt;&#x2F;span&gt;&lt;span&gt; semantic_search
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Henüz crates.io&#x27;da değil. Ama yakında &lt;code&gt;cargo add hyperembed&lt;&#x2F;code&gt; yazabileceksiniz.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Sonraki yazıda BareEngine&#x27;i anlatacağım — Metin2 tarzı MMORPG dünyaları için editor-first oyun motoru. 10 yıl önce başladığım yere, oyun sunucularına, C++ ile geri dönüş.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>KayaDB: Sıfırdan Dağıtık Veritabanı Yazmak</title>
          <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/kayadb-dagitik-veritabani-yazmak/</link>
          <guid>https://tuntii.com/blog/kayadb-dagitik-veritabani-yazmak/</guid>
          <description xml:base="https://tuntii.com/blog/kayadb-dagitik-veritabani-yazmak/">&lt;p&gt;Dağıtık sistemler, yazılım mühendisliğinin Everest&#x27;i gibidir. Herkes zirveyi görür, çok azı tırmanır. Ben tırmanmaya karar verdim. Sonuç: KayaDB — Rust ile yazılmış, Raft tabanlı, production&#x27;a hazırlanan dağıtık bir key-value depolama motoru.&lt;&#x2F;p&gt;
&lt;p&gt;Bu yazı, o tırmanışın günlüğü.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;neden-kendi-veritabanimi-yazdim&quot;&gt;Neden kendi veritabanımı yazdım?&lt;&#x2F;h2&gt;
&lt;p&gt;Dürüst cevap: porque puedo. (Çünkü yapabiliyorum.)&lt;&#x2F;p&gt;
&lt;p&gt;Ciddi cevap: Etcd var, Tikv var, FoundationDB var. Ama hiçbiri benim istediğim gibi değildi. İstediğim şey:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sıfır operasyonel yük.&lt;&#x2F;strong&gt; Bir binary indir, çalıştır. Config dosyası yok, YAML cehennemi yok.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Gömülebilir.&lt;&#x2F;strong&gt; Library olarak kullanılabilmeli. &lt;code&gt;kayadb = &quot;0.1&quot;&lt;&#x2F;code&gt; yazıp kendi uygulamana gömebilmelisin.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Jepsen-tested.&lt;&#x2F;strong&gt; Kyle Kingsbury&#x27;nin testlerinden geçmemiş hiçbir dağıtık sistem iddiası ciddiye alınamaz.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rust.&lt;&#x2F;strong&gt; Elle bellek yönetimiyle uğraşmadan C++ performansı.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Bunların hepsini aynı anda veren bir şey yoktu. Ben de yaptım.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mimari&quot;&gt;Mimari&lt;&#x2F;h2&gt;
&lt;p&gt;KayaDB&#x27;nin kalbinde Raft consensus algoritması var. Raft, dağıtık sistemlerde leader election, log replication ve safety garantilerini sağlayan en anlaşılır consensus protokolü — Paxos&#x27;un &quot;insan tarafından anlaşılabilir&quot; versiyonu.&lt;&#x2F;p&gt;
&lt;p&gt;Üç temel katman:&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;┌─────────────────────────────────┐
&lt;&#x2F;span&gt;&lt;span&gt;│         Client API (gRPC)       │
&lt;&#x2F;span&gt;&lt;span&gt;├─────────────────────────────────┤
&lt;&#x2F;span&gt;&lt;span&gt;│      Raft Consensus Layer       │
&lt;&#x2F;span&gt;&lt;span&gt;│  ┌─────────┐  ┌──────────────┐  │
&lt;&#x2F;span&gt;&lt;span&gt;│  │ Leader  │  │  Follower x2  │  │
&lt;&#x2F;span&gt;&lt;span&gt;│  │ Election│  │  Log Repl.   │  │
&lt;&#x2F;span&gt;&lt;span&gt;│  └─────────┘  └──────────────┘  │
&lt;&#x2F;span&gt;&lt;span&gt;├─────────────────────────────────┤
&lt;&#x2F;span&gt;&lt;span&gt;│     Storage Engine (LSM-Tree)   │
&lt;&#x2F;span&gt;&lt;span&gt;│  ┌─────────┐  ┌──────────────┐  │
&lt;&#x2F;span&gt;&lt;span&gt;│  │ MemTable│  │  SSTables    │  │
&lt;&#x2F;span&gt;&lt;span&gt;│  └─────────┘  └──────────────┘  │
&lt;&#x2F;span&gt;&lt;span&gt;└─────────────────────────────────┘
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Storage engine:&lt;&#x2F;strong&gt; LSM-tree (Log-Structured Merge-tree). Yazma ağırlıklı iş yükleri için optimize edilmiş. MemTable&#x27;da biriktir, belli boyuta ulaşınca SSTable olarak diske flush&#x27;la, arkada compaction yap. RocksDB&#x27;nin yaptığının daha basit, daha anlaşılır bir versiyonu.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Raft katmanı:&lt;&#x2F;strong&gt; Leader seçer, log&#x27;ları replike eder, commit index&#x27;i ilerletir. Standard Raft — hiçbir sürpriz yok, spesifikasyona harfiyen uygun.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Client API:&lt;&#x2F;strong&gt; Şimdilik gRPC. Gelecekte native TCP protokolü de gelecek.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;m1-den-m13-e-13-milestone-6-ay&quot;&gt;M1&#x27;den M13&#x27;e: 13 milestone, 6 ay&lt;&#x2F;h2&gt;
&lt;p&gt;Projeyi milestone&#x27;larla yönetiyorum. Her milestone birkaç hafta sürüyor ve somut bir çıktı veriyor.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;M1-M3 (Ocak 2026):&lt;&#x2F;strong&gt; Temel storage engine. Single-node, memory-only. &lt;code&gt;put(key, value)&lt;&#x2F;code&gt; ve &lt;code&gt;get(key)&lt;&#x2F;code&gt; çalışıyor. Heyecan verici değil ama temel.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;M4-M6 (Şubat):&lt;&#x2F;strong&gt; Persistence. WAL (Write-Ahead Log), MemTable flush, SSTable formatı. İlk defa restart&#x27;ta veri kaybetmemeye başladık. Bu hissi tarif edemem — yazdığınız kod, kapattığınız bir programın verisini geri getiriyor.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;M7-M9 (Mart):&lt;&#x2F;strong&gt; Raft implementasyonu. En zor kısım. Raft paper&#x27;ını yaklaşık 17 kez okudum. Leader election, log replication, snapshotting — her biri kendi içinde bir dünya. En büyük baş ağrısı: &lt;strong&gt;network partition simülasyonu.&lt;&#x2F;strong&gt; Test yazmak, implementasyondan daha zordu.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;M10-M12 (Nisan-Mayıs):&lt;&#x2F;strong&gt; Jepsen testleri. Kyle Kingsbury&#x27;nin meşhur dağıtık sistem test framework&#x27;ü. Linearizability, partition tolerance, clock skew — hepsini test ediyor. Ve ilk çalıştırmada... kırmızı. Her şey kırmızıydı.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;M13 (Haziran 2026):&lt;&#x2F;strong&gt; Production hazırlığı. Ve işte o an: 6&#x2F;6 Jepsen gate&#x27;i &lt;strong&gt;yeşil&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Jepsen&#x27;in yeşil vermesi, dağıtık sistemler dünyasında bir tür şövalyelik unvanı gibidir. &quot;Senin sistemin, ağ bölündüğünde, disk çöktüğünde, saat kaydığında bile veri tutarlılığını koruyor&quot; demektir.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jepsen-le-dans&quot;&gt;Jepsen&#x27;le dans&lt;&#x2F;h2&gt;
&lt;p&gt;Jepsen testleri yazmak, normal test yazmaya benzemez. Normal testte &quot;şu input&#x27;a şu output&quot; dersiniz. Jepsen&#x27;de &quot;şu kaotik senaryoda sistemin davranışı linearizable mı?&quot; dersiniz. Aradaki fark, deprem simülasyonuyla bina test etmek gibidir.&lt;&#x2F;p&gt;
&lt;p&gt;Bir Jepsen testi şunları yapar:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Bir küme başlatır (genelde 5 node)&lt;&#x2F;li&gt;
&lt;li&gt;Rastgele işlemler gönderir (append, read, cas)&lt;&#x2F;li&gt;
&lt;li&gt;Bu sırada nemesis&#x27;leri devreye sokar:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;partition-random-node:&lt;&#x2F;strong&gt; Ağı rastgele böler&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;kill-random-node:&lt;&#x2F;strong&gt; Rastgele node&#x27;u öldürür&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;clock-skew:&lt;&#x2F;strong&gt; Sistem saatini kaydırır&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;pause-random-node:&lt;&#x2F;strong&gt; Node&#x27;u dondurur (SIGSTOP)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Test sonunda tüm işlem geçmişini analiz eder&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Bu geçmiş lineerize edilebilir mi?&quot; sorusunu cevaplar&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Eğer cevap &quot;hayır&quot; ise, bir yerde tutarlılık garantisini ihlal etmişsinizdir. Ve inanın, ilk denemede cevap her zaman &quot;hayır&quot;dır.&lt;&#x2F;p&gt;
&lt;p&gt;Benim en büyük hatam neydi? &lt;strong&gt;fsync&#x27;i atlamak.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;İtiraf ediyorum: WAL yazarken &lt;code&gt;fsync()&lt;&#x2F;code&gt; çağırmayı unutmuştum. Veriyi &lt;code&gt;write()&lt;&#x2F;code&gt; ile yazıyordum, sayfa önbelleğinde duruyordu, diskte değil. Node crash olduğunda... WAL boştu. Jepsen bunu hemen yakaladı: &quot;Senin sistemin durability garantisi yok.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Fix: Her WAL yazımından sonra &lt;code&gt;fsync()&lt;&#x2F;code&gt;. Performans düştü mü? Evet, %30. Ama veri kaybetmemeye başladık. Trade-off buydu.&lt;&#x2F;p&gt;
&lt;p&gt;Bir diğer hata: &lt;strong&gt;Read Index optimizasyonunu yanlış implemente etmek.&lt;&#x2F;strong&gt; Raft&#x27;ta read&#x27;ler için leader&#x27;a gitmek gerekir, ama her read için bir log entry yazmak pahalıdır. Read Index tekniği, read&#x27;leri log yazmadan güvenli hale getirir. Ama ben lease süresini yanlış hesaplamıştım — partitioned leader hala &quot;ben leader&#x27;ım&quot; sanıp stale read dönebiliyordu. Jepsen: kırmızı.&lt;&#x2F;p&gt;
&lt;p&gt;Fix: Lease tabanlı leader kontrolü + her read öncesi heartbeat confirmation.&lt;&#x2F;p&gt;
&lt;p&gt;Böyle 11 tane Jepsen hatası yakaladım. Her biri ayrı bir ders.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ne-ogrendim&quot;&gt;Ne öğrendim?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;1. Dağıtık sistemlerde &quot;works on my machine&quot; diye bir şey yoktur.&lt;&#x2F;strong&gt;
Network partition&#x27;da, disk hatasında, clock skew&#x27;de çalışmayan kod, çalışmıyordur. Jepsen bunu suratınıza vurur.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;2. Raft paper&#x27;ını okumak yetmez, implemente etmek gerekir.&lt;&#x2F;strong&gt;
Leader election&#x27;ın ne kadar edge case içerdiğini, paper&#x27;ın 5. sayfasındaki bir cümlenin ne anlama geldiğini ancak implemente ederken anlıyorsunuz.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;3. fsync her şeydir.&lt;&#x2F;strong&gt;
Durability = fsync. Başka yolu yok. Ne kadar batch yaparsanız yapın, eninde sonunda o sistem çağrısını yapmak zorundasınız.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;4. Test altyapısı, ürün kodundan daha önemlidir.&lt;&#x2F;strong&gt;
KayaDB&#x27;nin test kodu, ürün kodundan daha fazla satır. Network partition simülasyonları, fault injection, chaos engineering — hepsi test tarafında.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sirada-ne-var&quot;&gt;Sırada ne var?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;M14 — Jepsen test suite final + prod deployment.&lt;&#x2F;strong&gt; Hedef: kendi makinemde değil, gerçek bir sunucuda, gerçek trafik altında KayaDB çalıştırmak.&lt;&#x2F;p&gt;
&lt;p&gt;Sonrası:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;gRPC API stabilizasyonu&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Rust client library&lt;&#x2F;strong&gt; (&lt;code&gt;kayadb-client&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Go client library&lt;&#x2F;strong&gt; (belki)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Benchmark&#x27;ları yayınlamak&lt;&#x2F;strong&gt; — etcd, Tikv ile karşılaştırmalı&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;deneyin&quot;&gt;Deneyin&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; clone https:&#x2F;&#x2F;github.com&#x2F;Tuntii&#x2F;KayaDB
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; KayaDB
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span&gt; build&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --release
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;.&#x2F;target&#x2F;release&#x2F;kayadb --id&lt;&#x2F;span&gt;&lt;span&gt; node1&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --peers&lt;&#x2F;span&gt;&lt;span&gt; node2:5001,node3:5001
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;3 node, 3 terminal, Raft cluster&#x27;ınız hazır.&lt;&#x2F;p&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Tuntii&#x2F;KayaDB&quot;&gt;github.com&#x2F;Tuntii&#x2F;KayaDB&lt;&#x2F;a&gt;
Dokümantasyon: &lt;a href=&quot;https:&#x2F;&#x2F;tuntii.github.io&#x2F;KayaDB&#x2F;&quot;&gt;tuntii.github.io&#x2F;KayaDB&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Dağıtık sistemler zor. Ama yapılabilir. Ve yapınca, bilgisayar biliminin en temel problemlerinden birini kendi ellerinizle çözmüş oluyorsunuz. O his paha biçilemez.&lt;&#x2F;p&gt;
&lt;p&gt;Bir sonraki yazıda Hyperembed&#x27;i anlatacağım — Pure-Rust BERT embedding inference motoru. Ya da belki SemantiCAD. Bakalım hangisi önce biter.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Kendi Kendine Öğrenen Bir Founder&#x27;ın El Kitabı</title>
          <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/kendi-kendine-ogrenen-founder/</link>
          <guid>https://tuntii.com/blog/kendi-kendine-ogrenen-founder/</guid>
          <description xml:base="https://tuntii.com/blog/kendi-kendine-ogrenen-founder/">&lt;p&gt;5 yaşında bilgisayarla tanıştım. İlk kodumu C++ ile yazdım. Oyun sunucu altyapılarıyla başladım — Metin2 private server&#x27;lar, Knight Online emülatörleri. 12 yaşında siber güvenlik forumlarında takılıyordum. 15 yaşında ilk şirketimi kurdum. 21 yaşında bu yazıyı yazıyorum.&lt;&#x2F;p&gt;
&lt;p&gt;Bu bir başarı hikayesi değil. Bu bir hayatta kalma hikayesi.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;okul-hayir-tesekkurler&quot;&gt;Okul? Hayır, teşekkürler.&lt;&#x2F;h2&gt;
&lt;p&gt;İki üniversite denedim. İkisini de bıraktım. İstanbul Üniversitesi Yönetim Bilişim Sistemleri — sıkıcıydı. Trakya Üniversitesi Bilgisayar Programcılığı — yavaştı.&lt;&#x2F;p&gt;
&lt;p&gt;Sorun okulda değildi bende değildi. Sorun tempodaydı. Ben bir şey öğrenmek istediğimde o gece başlarım, sabaha karşı bitiririm. Okul bana &quot;bu konuyu 14 haftada işleyeceğiz&quot; diyordu. 14 hafta? Ben 14 saatte Rust&#x27;ın borrow checker&#x27;ını çözmüştüm.&lt;&#x2F;p&gt;
&lt;p&gt;Formal eğitim almadım diye eksik hissettiğim oldu mu? Hayır. Çünkü öğrenmenin tek bir yolu yok. Benim yolum: problemi bul, çözmek için ne gerekiyorsa öğren, çöz, sonrakine geç. Buna &quot;just-in-time learning&quot; diyorlar. Ben &quot;aç kalınca yemek yapmayı öğrenmek&quot; diyorum.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;stack-im-ne-ise-yararsa&quot;&gt;Stack&#x27;im: ne işe yararsa&lt;&#x2F;h2&gt;
&lt;p&gt;Tek bir stack&#x27;e bağlı değilim. Proje ne gerektiriyorsa onu kullanırım.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rust:&lt;&#x2F;strong&gt; Performans gerektiren her şey. Web framework&#x27;ü mü? RustAPI. Veritabanı mı? KayaDB. Embedding inference mi? Hyperembed.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript:&lt;&#x2F;strong&gt; Hızlı prototip gerektiren her şey. Birçok prototip TypeScript ile başladı.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Python:&lt;&#x2F;strong&gt; AI&#x2F;ML tarafında. SemantiCAD&#x27;in bazı parçaları, qec-playground.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Go:&lt;&#x2F;strong&gt; Arada ihtiyaç olursa. Alexander-storage mesela — Go ile yazıldı çünkü S3 server için Go&#x27;nun ekosistemi daha olgun.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;C++:&lt;&#x2F;strong&gt; Geçmişten gelen. BareEngine oyun motoru C++ ile. Çünkü oyun motoru başka bir şeyle yazılmaz.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&quot;Jack of all trades, master of none&quot; diye bir laf vardır. Tamamı şöyle: &quot;Jack of all trades, master of none, but oftentimes better than master of one.&quot; Benim felsefem bu. Tek bir şeyin uzmanı olmaktansa, her şeyi yeterince iyi bilip projeye göre derinleşmek.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;projeler-nicelik-mi-nitelik-mi&quot;&gt;Projeler: nicelik mi, nitelik mi?&lt;&#x2F;h2&gt;
&lt;p&gt;23 GitHub repom var. 20&#x27;si aktif. Her ay 2-3 yeni proje başlıyor, 1-2&#x27;si ölüyor. Bu normal.&lt;&#x2F;p&gt;
&lt;p&gt;Açık kaynak dünyasında &quot;bir tane büyük projen olsun&quot; diye bir tavsiye var. Ben tersini yapıyorum. Bir sürü projem var, her biri farklı bir şey öğretiyor. RustAPI bana HTTP ve MCP öğretti. KayaDB dağıtık sistemleri. Hyperembed embedding modellerini. BareEngine oyun motoru mimarisini.&lt;&#x2F;p&gt;
&lt;p&gt;Hepsi birbirini besliyor. KayaDB&#x27;de öğrendiğim &lt;code&gt;fsync&lt;&#x2F;code&gt; optimizasyonunu RustAPI&#x27;nin file serving katmanında kullandım. RustAPI&#x27;deki MCP implementasyonunu SemantiCAD&#x27;e taşıdım. Hyperembed&#x27;deki SIMD optimizasyonlarını KayaDB&#x27;nin storage engine&#x27;ine uyarladım.&lt;&#x2F;p&gt;
&lt;p&gt;Buna &quot;cross-pollination&quot; diyorum. Çok proje yapanların gizli silahı.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;basarisizliklar-bunlar-onemli&quot;&gt;Başarısızlıklar (bunlar önemli)&lt;&#x2F;h2&gt;
&lt;p&gt;Kimse başarısızlıklarından bahsetmez. Ben edeyim.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Poise Labs (2022-2024):&lt;&#x2F;strong&gt; Kendi blockchain&#x27;imi yazdım. Diem (eski Libra) blockchain&#x27;inden fork&#x27;ladım, &quot;Poisechain&quot; dedim. Dubai&#x27;den yatırım aldık. 18 ay çalıştık. Battı. Sebep: pazar yoktu. Teknolojisi iyiydi ama kimsenin ihtiyacı yoktu. En pahalı dersim: &lt;strong&gt;teknoloji değil, problem çöz.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;THT dönemi (ergenlik):&lt;&#x2F;strong&gt; Siber güvenlik forumlarında tool yazıp dağıtıyordum. Bazıları ciddi araçlardı, bazıları... şey, hacktivist işleriydi. Neyse ki büyüdüm. Ama o dönem bana sistemlerin nasıl kırıldığını öğretti, ki bu da sistemlerin nasıl korunacağını öğrenmenin en iyi yolu.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;İlk şirket websitesi işi (15 yaş):&lt;&#x2F;strong&gt; Ceyhun&#x27;la (Ceyhun Kasım Arslan) Bones Interactive&#x27;i kurduk. Website satarak para kazanacaktık. İlk müşteriye sattık, parayı aldık, sevindik. Sonra ikinci müşteri gelmedi. Üç ay bekledik. Pivot: ERP yazılımı. O da tutmadı. Pivot: gömülü sistemler. O da tutmadı. Ama her pivot yeni bir şey öğretti. Ve sonunda bir şey tuttu.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;para-meselesi&quot;&gt;Para meselesi&lt;&#x2F;h2&gt;
&lt;p&gt;Dürüst olayım: para kazanmıyorum. Henüz.&lt;&#x2F;p&gt;
&lt;p&gt;RustAPI&#x27;nin 55 star&#x27;ı var. KayaDB&#x27;nin 4. Coverium&#x27;un 1. Bunların hiçbiri fatura ödemiyor.&lt;&#x2F;p&gt;
&lt;p&gt;Ama plan şu: RustAPI Cloud. Managed hosting. Bedava tier + pro tier. Vercel modeli. Eğer RustAPI&#x27;yi 1000 developer kullanıyorsa ve %5&#x27;i pro tier&#x27;a geçerse, temel ihtiyaçları karşılar. Hedef 2026 sonu.&lt;&#x2F;p&gt;
&lt;p&gt;Bu arada? Hayatta kalıyorum. Ailem destek oluyor. Freelance işler alıyorum. Daha önce Solana&#x27;da, Aptos&#x27;ta, birkaç şirkette çalıştım — kenara biraz para koydum. Şimdi onu yakıyorum.&lt;&#x2F;p&gt;
&lt;p&gt;Buna &quot;ramen profitability&quot; diyorlar. Ben &quot;bir tabak makarna + bir proje&quot; diyorum.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gunluk-rutin-rutin-denen-sey&quot;&gt;Günlük rutin (rutin denen şey)&lt;&#x2F;h2&gt;
&lt;p&gt;Sabit bir rutinim yok. Bazı günler 04:00&#x27;te kalkıp 22:00&#x27;ye kadar çalışıyorum. Bazı günler öğlen kalkıp gece 03:00&#x27;e kadar çalışıyorum. Enerji neredeyse, oradayım.&lt;&#x2F;p&gt;
&lt;p&gt;Kalkar kalkmaz bilgisayar başına geçerim. Kahvaltı? Bazen. Öğle yemeği? Bilgisayar başında. Akşam? Dışarı çıkmadıysam yine bilgisayar başında.&lt;&#x2F;p&gt;
&lt;p&gt;Bu sağlıklı değil. Biliyorum. Ama projeler bitmeden, para kazanmaya başlamadan, rahat edemiyorum. Bu bir yarış değil, bu bir hayatta kalma modu. Ve o modda, rutin lükstür.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ogrendigim-7-sey-simdiye-kadar&quot;&gt;Öğrendiğim 7 şey (şimdiye kadar)&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Problemi bul, çözümü değil.&lt;&#x2F;strong&gt; Çoğu geliştirici tersini yapar: bir teknoloji seçer, ona problem arar. Önce acıyı bul, sonra ilacı.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Ship early, ship often.&lt;&#x2F;strong&gt; İlk versiyon berbat olacak. Olsun. Kullanıcı feedback&#x27;i olmadan mükemmel ürün yapamazsın.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Tek başına olmaz.&lt;&#x2F;strong&gt; Ceyhun olmasaydı Bones Interactive olmazdı. Açık kaynak contributor&#x27;lar olmasa RustAPI bugünkü haline gelmezdi. İnsanlarla çalış.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;İngilizce şart.&lt;&#x2F;strong&gt; Türkçe kaynaklar sınırlı. RFC&#x27;ler, paper&#x27;lar, dokümantasyon — hepsi İngilizce. Öğrenmek zorundasın.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Derine in.&lt;&#x2F;strong&gt; Bir şeyi gerçekten anlamak istiyorsan implemente et. Raft&#x27;i anlamak için Raft implemente ettim. HTTP&#x27;yi anlamak için HTTP implemente ettim. BERT&#x27;i anlamak için BERT implemente ettim.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Sağlığını ihmal etme.&lt;&#x2F;strong&gt; (Bunu henüz öğrenmedim, teorik olarak biliyorum.)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Neden&#x27;ini bil.&lt;&#x2F;strong&gt; Neden kod yazıyorsun? Para için mi, öğrenmek için mi, dünyayı değiştirmek için mi? Benimki: anlamlı bir şey üretmek. Boş iş yapmaya tahammülüm yok.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;sirada-ne-var&quot;&gt;Sırada ne var?&lt;&#x2F;h2&gt;
&lt;p&gt;Kısa vade: para kazanmak. RustAPI Cloud, belki birkaç danışmanlık işi, belki sponsorluk.&lt;&#x2F;p&gt;
&lt;p&gt;Orta vade: yatırım almak. Ama sadece doğru yatırımcıdan. Vizyonumu anlayan, &quot;3 ayda exit&quot; demeyen birinden.&lt;&#x2F;p&gt;
&lt;p&gt;Uzun vade: mutlu olmak. Bu kadar. Gerisi detay.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Bu yazıyı, benzer yoldan geçenler için yazdım. Kendi kendine öğrenen, okulu bırakan, &quot;acaba yanlış mı yapıyorum&quot; diye düşünen herkes için.&lt;&#x2F;p&gt;
&lt;p&gt;Doğru yol yok. Sadece senin yolun var. Yürümeye devam et.&lt;&#x2F;p&gt;
&lt;p&gt;Sonraki yazıda SemantiCAD&#x27;i anlatacağım — AI destekli üretim planlaması, Sovereign Hybrid mimarisi ve Türk imalat atölyelerine teknoloji götürme çabası.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Quantum Computing&#x27;e Rust ve Python ile Giriş: QuantumNN ve qec-playground</title>
          <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/quantum-computing-quantumnn-qec-playground/</link>
          <guid>https://tuntii.com/blog/quantum-computing-quantumnn-qec-playground/</guid>
          <description xml:base="https://tuntii.com/blog/quantum-computing-quantumnn-qec-playground/">&lt;p&gt;2026&#x27;nın başında bir gece, saat 02:00 civarı, arXiv&#x27;de bir paper okudum: Li &amp;amp; Martonosi&#x27;nin SWIPER-SIM behavioral model&#x27;i — kuantum hata düzeltme kodlarının spekülatif pencere dekoder analizi. Paper&#x27;ı anlamam 4 saat sürdü. Implemente etmem 2 hafta.&lt;&#x2F;p&gt;
&lt;p&gt;Sonuç: &lt;code&gt;qec-playground&lt;&#x2F;code&gt; — dünyanın ilk open-source SWIPER-SIM simülatörü. Ve yan ürün olarak &lt;code&gt;QuantumNN&lt;&#x2F;code&gt; — kuantum nöral ağlar üzerine bir deney alanı.&lt;&#x2F;p&gt;
&lt;p&gt;Bu yazı, o 2 haftanın ve sonrasının hikayesi.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;neden-kuantum&quot;&gt;Neden kuantum?&lt;&#x2F;h2&gt;
&lt;p&gt;Dürüst olayım: çünkü havalı.&lt;&#x2F;p&gt;
&lt;p&gt;Ciddi cevap: çünkü klasik bilgisayarların çözemediği problemler var. Integer factorization (Shor), unstructured search (Grover), quantum simulation (Feynman&#x27;ın orijinal motivasyonu). Ve bu problemler, kuantum bilgisayarlar yaygınlaştığında birdenbire çözülebilir hale gelecek.&lt;&#x2F;p&gt;
&lt;p&gt;Ama asıl sebep şu: kuantum computing, bilgisayar biliminin son frontier&#x27;ı. Yapay zeka patladı, dağıtık sistemler olgunlaştı, WebAssembly standartlaştı. Ama kuantum? Hala her şeyin başındayız. 2026&#x27;da kuantum programlama öğrenmek, 1995&#x27;te web geliştirme öğrenmek gibi. Erken giren kazanır.&lt;&#x2F;p&gt;
&lt;p&gt;Ben erken giren olmak istedim.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;qec-playground-swiper-sim-i-implemente-etmek&quot;&gt;qec-playground: SWIPER-SIM&#x27;i implemente etmek&lt;&#x2F;h2&gt;
&lt;p&gt;Li &amp;amp; Martonosi&#x27;nin paper&#x27;ı (arXiv:2606.24048) şunu söylüyor: kuantum hata düzeltme kodlarının (QEC) en büyük problemi, decoding latency. Bir kuantum işlemci çalışırken, hata düzeltme kodunun decode edilmesi zaman alıyor. Ve kuantum bit&#x27;ler (qubit&#x27;ler) decohere olmadan önce sınırlı bir zaman pencereniz var.&lt;&#x2F;p&gt;
&lt;p&gt;SWIPER (Sliding Window Interleaved Parallel Error Resolution), bu decoding işlemini spekülatif olarak paralelleştiren bir teknik. Fikir şu: hata düzeltme kodunun tümünü beklemek yerine, sliding window ile parça parça decode et, ve spekülatif olarak bir sonraki window&#x27;u tahmin et.&lt;&#x2F;p&gt;
&lt;p&gt;Paper teorikti. Bir simülasyon framework&#x27;ü tarif ediyordu ama implementasyon yoktu. &quot;Birisi bunu yazmalı&quot; dedim. O birisi bendim.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;teknik-detaylar&quot;&gt;Teknik detaylar&lt;&#x2F;h3&gt;
&lt;p&gt;qec-playground şunları yapıyor:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kuantum devre simülasyonu&lt;&#x2F;strong&gt; — Qubit&#x27;leri, gate&#x27;leri, measurement&#x27;ları klasik bilgisayarda simüle ediyor. (Gerçek kuantum bilgisayar değil, simülasyon — ama algoritma geliştirmek için yeterli.)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Hata modelleme&lt;&#x2F;strong&gt; — Bit-flip, phase-flip, depolarizing channel gibi kuantum hata modellerini enjekte ediyor.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SWIPER decoder implementasyonu&lt;&#x2F;strong&gt; — Paper&#x27;daki sliding window algoritmasını birebir implemente ettim. Pencere boyutu, overlap miktarı, spekülatif tahmin parametreleri — hepsi ayarlanabilir.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Streamlit arayüzü&lt;&#x2F;strong&gt; — Web tabanlı, interaktif. Parametreleri slider&#x27;larla değiştirip sonucu anında görebiliyorsunuz.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Metrik analizi&lt;&#x2F;strong&gt; — Decoding latency, logical error rate, pseudo-threshold — paper&#x27;daki tüm metrikleri hesaplıyor.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Kod tarafında Python + Streamlit. Oldukça basit bir stack. Çünkü burada zor olan kod değil, fizik. Kuantum mekaniğini anlamak, stabilizer formalizmini çözmek, surface code&#x27;ların nasıl çalıştığını kavramak — asıl iş buydu.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ogrendiklerim&quot;&gt;Öğrendiklerim&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kuantum hata düzeltme, klasik hata düzeltmeden tamamen farklı.&lt;&#x2F;strong&gt; Klasikte bit flip&#x27;leri düzeltirsiniz. Kuantumda hem bit flip hem phase flip var, ölçüm yapmak durumu bozuyor, no-cloning theorem yüzünden kopyalayamıyorsunuz. Tamamen farklı bir dünya.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stabilizer formalizmi güzel.&lt;&#x2F;strong&gt; Gottesman-Knill teoremi sayesinde stabilizer devrelerini klasik bilgisayarda verimli şekilde simüle edebiliyorsunuz. Paper&#x27;daki matematiksel formalizmi koda dökmek, başlangıçta imkansız gibi görünüyordu. Ama oturup satır satır çalışınca, aslında çok zarif bir sistem olduğunu gördüm.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Streamlit, bilimsel simülasyonlar için mükemmel.&lt;&#x2F;strong&gt; Jupyter notebook&#x27;tan daha iyi bir UX sunuyor. Parametre değiştir, anında gör. Paper yazarlarına göstermek için ideal.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Açık kaynak, akademik dünyada hızla yayılıyor.&lt;&#x2F;strong&gt; Projeyi GitHub&#x27;a koyduktan sonra 3 gün içinde bir kuantum computing araştırmacısı issue açtı: &quot;Bunu surface code rotasyonu için de uyarlayabilir miyiz?&quot; Cevap: evet, çalışıyorum.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;quantumnn-kuantum-noral-aglar&quot;&gt;QuantumNN: Kuantum nöral ağlar&lt;&#x2F;h2&gt;
&lt;p&gt;qec-playground&#x27;u yazarken bir yan etki oldu: kuantum devre simülasyonu altyapısı hazırdı. &quot;Bunu nöral ağlar için de kullanabilir miyim?&quot; dedim. Cevap evetti. Ortaya QuantumNN çıktı.&lt;&#x2F;p&gt;
&lt;p&gt;QuantumNN, klasik nöral ağ katmanlarını kuantum devrelerle değiştiren bir framework. Fikir:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Klasik bir nöral ağ katmanı yerine bir &lt;strong&gt;variational quantum circuit (VQC)&lt;&#x2F;strong&gt; kullan&lt;&#x2F;li&gt;
&lt;li&gt;Devrenin parametrelerini gradient descent ile optimize et&lt;&#x2F;li&gt;
&lt;li&gt;Klasik-kuantum hibrit bir model elde et&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;ne-ise-yariyor&quot;&gt;Ne işe yarıyor?&lt;&#x2F;h3&gt;
&lt;p&gt;Teorik olarak, kuantum nöral ağlar şu avantajlara sahip:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Daha az parametreyle daha yüksek expressiveness.&lt;&#x2F;strong&gt; Bir kuantum devresi, klasik bir nöral ağ katmanından exponansiyel olarak daha fazla durumu temsil edebilir (Hilbert uzayının boyutu sayesinde).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Doğal kuantum veri işleme.&lt;&#x2F;strong&gt; Kuantum sensörlerden gelen veriler, klasik ön işleme olmadan doğrudan kuantum modele beslenebilir.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Kuantum avantajı potansiyeli.&lt;&#x2F;strong&gt; Henüz pratikte gösterilmedi (NISQ dönemindeyiz), ama teorik olarak bazı problemlerde klasik modellerden üstün olabilir.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Pratikte? Henüz emin değilim. QuantumNN bir deney alanı. MNIST üzerinde klasik bir CNN&#x27;in %99 doğruluk aldığı yerde, quantum NN %92 alıyor. Ama 10x daha az parametreyle. Bu ilginç.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;teknik-yapi&quot;&gt;Teknik yapı&lt;&#x2F;h3&gt;
&lt;p&gt;QuantumNN şu bileşenlerden oluşuyor:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from &lt;&#x2F;span&gt;&lt;span&gt;quantumnn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;import &lt;&#x2F;span&gt;&lt;span&gt;QuantumLayer, HybridModel
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# Kuantum katman: 4 qubit, 3 katmanlı variational circuit
&lt;&#x2F;span&gt;&lt;span&gt;qlayer = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;QuantumLayer&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;n_qubits&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;n_layers&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;encoding&lt;&#x2F;span&gt;&lt;span&gt;=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;angle&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# Hibrit model: klasik dense + kuantum + klasik dense
&lt;&#x2F;span&gt;&lt;span&gt;model = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;HybridModel&lt;&#x2F;span&gt;&lt;span&gt;([
&lt;&#x2F;span&gt;&lt;span&gt;    torch.nn.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Linear&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;784&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;16&lt;&#x2F;span&gt;&lt;span&gt;),
&lt;&#x2F;span&gt;&lt;span&gt;    qlayer,
&lt;&#x2F;span&gt;&lt;span&gt;    torch.nn.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Linear&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;4&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span&gt;])
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;encoding=&quot;angle&quot;&lt;&#x2F;code&gt;, klasik veriyi qubit rotasyon açılarına encode ediyor. Başka encoding stratejileri de var: amplitude encoding (daha verimli ama daha karmaşık), basis encoding (basit ama az bilgi taşır).&lt;&#x2F;p&gt;
&lt;p&gt;Optimizasyon: parametre shift rule ile gradient hesaplama. Kuantum devrelerde backpropagation çalışmaz — her parametre için devreyi iki kez çalıştırıp farkı almanız gerekir. Bu, classical simulation&#x27;da bile yavaş. Gerçek kuantum donanımda daha da yavaş olacak.&lt;&#x2F;p&gt;
&lt;p&gt;Ama işte araştırma bu: yavaş ve zor. Önemli olan başlamak.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nisq-donemi-ve-gercekler&quot;&gt;NISQ dönemi ve gerçekler&lt;&#x2F;h2&gt;
&lt;p&gt;Şu an NISQ (Noisy Intermediate-Scale Quantum) dönemindeyiz. Bu şu demek:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Noisy:&lt;&#x2F;strong&gt; Qubit&#x27;ler gürültülü. Hata oranları yüksek. 100 qubit&#x27;lik bir devrede, her gate&#x27;te %0.1 hata olsa, devrenin doğru çalışma olasılığı çok düşük.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Intermediate-Scale:&lt;&#x2F;strong&gt; 50-1000 qubit arası cihazlar var (IBM, Google, Rigetti). Ama hata düzeltme yok. &quot;Logical qubit&quot; başına binlerce fiziksel qubit gerekiyor.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Quantum advantage:&lt;&#x2F;strong&gt; Google 2019&#x27;da &quot;quantum supremacy&quot; iddia etti. IBM itiraz etti. 2024&#x27;te tekrar denediler. Tartışma hala sürüyor.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Benim bu alana girmemin sebebi tam da bu: erken. Henüz kimse &quot;quantum developer&quot; değil. Herkes öğreniyor. Ve ben de öğrenenlerden biriyim.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sirada-ne-var&quot;&gt;Sırada ne var?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;qec-playground:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Surface code rotasyon simülasyonu&lt;&#x2F;li&gt;
&lt;li&gt;Color code desteği&lt;&#x2F;li&gt;
&lt;li&gt;Gerçek IBM Quantum backend ile test (IBM Q Experience API)&lt;&#x2F;li&gt;
&lt;li&gt;Daha fazla decoder algoritması: MWPM, Union-Find, belief propagation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;QuantumNN:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Daha büyük modeller (8-12 qubit)&lt;&#x2F;li&gt;
&lt;li&gt;Gerçek kuantum donanımda test (IBM, Rigetti)&lt;&#x2F;li&gt;
&lt;li&gt;Quantum transfer learning deneyleri&lt;&#x2F;li&gt;
&lt;li&gt;QML benchmark&#x27;larına katılım&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;deneyin&quot;&gt;Deneyin&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# qec-playground
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; clone https:&#x2F;&#x2F;github.com&#x2F;SemantiCAD&#x2F;qec-playground
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; qec-playground
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;pip&lt;&#x2F;span&gt;&lt;span&gt; install&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span&gt; requirements.txt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;streamlit&lt;&#x2F;span&gt;&lt;span&gt; run app.py
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# QuantumNN
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; clone https:&#x2F;&#x2F;github.com&#x2F;Tuntii&#x2F;QuantumNN
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; QuantumNN
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;pip&lt;&#x2F;span&gt;&lt;span&gt; install&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span&gt; requirements.txt
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;python&lt;&#x2F;span&gt;&lt;span&gt; examples&#x2F;mnist_hybrid.py
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;İkisi de public repo. İkisi de deneysel. İkisi de &quot;production-ready&quot; değil — ama olmaları da gerekmiyor. Araştırma kodunun güzel olması gerekmez, çalışması yeter.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Kuantum computing, kariyerimin en zor öğrenme deneyimi. Ama aynı zamanda en ödüllendiricisi. Eğer siz de merak ediyorsanız, bir paper alın ve implemente edin. En iyi öğrenme yöntemi bu.&lt;&#x2F;p&gt;
&lt;p&gt;Sonraki yazıda Hyperembed&#x27;i anlatacağım — Pure-Rust BERT embedding inference motoru, SIMD optimizasyonları ve local-first AI.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>RustAPI: FastAPI&#x27;ye Rust&#x27;tan Bir Cevap</title>
          <pubDate>Mon, 06 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/rustapi-fastapi-ye-rusttan-cevap/</link>
          <guid>https://tuntii.com/blog/rustapi-fastapi-ye-rusttan-cevap/</guid>
          <description xml:base="https://tuntii.com/blog/rustapi-fastapi-ye-rusttan-cevap/">&lt;p&gt;Aralık 2025&#x27;te bir soruyla başladı her şey: &quot;FastAPI&#x27;nin yaptığını Rust&#x27;ta neden kimse yapmadı?&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Cevap aslında vardı. Axum var, Actix var, Poem var. Hepsi iyi framework&#x27;ler. Ama hiçbiri FastAPI&#x27;nin o &quot;elinin altında hissettiren&quot; ergonomisine sahip değildi. Hiçbiri size &lt;code&gt;app.get(&quot;&#x2F;&quot;)&lt;&#x2F;code&gt; yazıp üç satırda bir endpoint oluşturma hissini vermiyordu. Ve daha önemlisi — hiçbiri AI&#x2F;LLM dünyasını birinci sınıf vatandaş olarak görmüyordu.&lt;&#x2F;p&gt;
&lt;p&gt;Ben de yaptım.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hikaye&quot;&gt;Hikaye&lt;&#x2F;h2&gt;
&lt;p&gt;2025&#x27;in son çeyreğiydi. Bir sürü paralel proje dönüyordu — SemantiCAD&#x27;in Rust tarafı, Hyperembed&#x27;in embedding inference motoru, birkaç LLM tool&#x27;u derken sürekli aynı şeyi yazdığımı fark ettim: HTTP endpoint&#x27;leri. Her projede sıfırdan route tanımlıyor, middleware yazıyor, error handling yapıyordum. Toxic bir pattern&#x27;di bu — DRY&#x27;nin tam tersi.&lt;&#x2F;p&gt;
&lt;p&gt;&quot;Bir tane yapayım, her yerde kullanayım&quot; dedim. İlk commit 15 Aralık 2025. Adını RustAPI koydum. Düz, açıklayıcı, iddialı.&lt;&#x2F;p&gt;
&lt;p&gt;İlk versiyon berbattı. Sadece &lt;code&gt;app.get()&lt;&#x2F;code&gt; ve &lt;code&gt;app.post()&lt;&#x2F;code&gt; çalışıyordu. Ama çalışıyordu. Ve en önemlisi — Rust&#x27;ta bu kadar basit bir API yoktu.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ne-yaptigini-anlatayim&quot;&gt;Ne yaptığını anlatayım&lt;&#x2F;h2&gt;
&lt;p&gt;RustAPI, FastAPI&#x27;nin Python&#x27;da yaptığını Rust&#x27;ta yapıyor. Ama birkaç ekstra katmanla:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Makro tabanlı route tanımı.&lt;&#x2F;strong&gt; Bir attribute yazıyorsunuz, fonksiyonunuz bir endpoint oluyor:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;hello&#x2F;{name}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;hello&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;: String) -&amp;gt; String {
&lt;&#x2F;span&gt;&lt;span&gt;    format!(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Merhaba, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;!&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, name)
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Path parametreleri, query parametreleri, request body — hepsi otomatik çözülüyor. FastAPI kullanıcısıysanız evinizde hissedeceksiniz.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Native MCP (Model Context Protocol) desteği.&lt;&#x2F;strong&gt; Burası işin en ilginç kısmı. RustAPI ile yazdığınız her endpoint, otomatik olarak bir MCP tool&#x27;u haline gelebiliyor. Yani bir AI agent, sizin API&#x27;nizi doğrudan çağırabiliyor. Bunu yapmak için:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;weather&#x2F;{city}&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;mcp_tool&lt;&#x2F;span&gt;&lt;span&gt;(description = &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Get weather for a city&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span&gt;async &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;weather&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;city&lt;&#x2F;span&gt;&lt;span&gt;: String) -&amp;gt; Json&amp;lt;WeatherResponse&amp;gt; {
&lt;&#x2F;span&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;&#x2F;&#x2F; ...
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bu kadar. &lt;code&gt;#[mcp_tool]&lt;&#x2F;code&gt; attribute&#x27;u, endpoint&#x27;inizi Anthropic&#x27;in MCP spesifikasyonuna uygun bir tool tanımına dönüştürüyor. Claude, GPT, Gemini — hepsi bu endpoint&#x27;i kendi tool&#x27;u gibi çağırabiliyor.&lt;&#x2F;p&gt;
&lt;p&gt;Bunun ne kadar büyük bir şey olduğunu anlatayım.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;agent-first-api-tasarimi&quot;&gt;Agent-first API tasarımı&lt;&#x2F;h2&gt;
&lt;p&gt;Şimdiye kadar API&#x27;ler insanlar için tasarlanırdı. RESTful, iyi dokümante edilmiş, Swagger&#x2F;OpenAPI ile beslenmiş. Developer experience ön plandaydı.&lt;&#x2F;p&gt;
&lt;p&gt;Ama dünya değişiyor. 2026&#x27;da API&#x27;lerin tüketicileri artık sadece insanlar değil — AI agent&#x27;lar da API çağırıyor. Ve bir AI agent&#x27;ın bir API&#x27;den beklentisi, bir insan developerdan çok farklı.&lt;&#x2F;p&gt;
&lt;p&gt;İnsan developer için: &quot;Şu endpoint&#x27;i çağır, şu header&#x27;ı ekle, response&#x27;u parse et.&quot;
AI agent için: &quot;Ne işe yaradığını söyle, parametreleri tanımla, ben çağırayım.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;RustAPI&#x27;deki MCP desteği tam olarak bu zihniyet değişimini temsil ediyor. Her endpoint, doğuştan agent-readable. Sıfır ek iş. &lt;code&gt;#[mcp_tool]&lt;&#x2F;code&gt; eklediğiniz an, endpoint&#x27;iniz Claude&#x27;un tool registry&#x27;sine düşüyor.&lt;&#x2F;p&gt;
&lt;p&gt;Buna &quot;agent-first API design&quot; diyorum. Ve bence 2026-2027&#x27;nin en büyük API trend&#x27;i bu olacak.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;teknik-detaylar-meraklisina&quot;&gt;Teknik detaylar (meraklısına)&lt;&#x2F;h2&gt;
&lt;p&gt;İşin arka planında neler dönüyor kısaca:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTP katmanı:&lt;&#x2F;strong&gt; Kendi HTTP&#x2F;1.1 implementasyonumu yazdım. Evet, sıfırdan. &lt;code&gt;hyper&lt;&#x2F;code&gt; veya &lt;code&gt;actix-http&lt;&#x2F;code&gt; kullanmadım. Sebebi basit: bağımlılık zincirini sıfırlamak. Bugün RustAPI&#x27;nin toplam bağımlılık sayısı inanılmaz düşük. Bu, compile süresini kısaltıyor, binary boyutunu küçültüyor ve en önemlisi — her şeyin nasıl çalıştığını biliyorum.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;MCP katmanı:&lt;&#x2F;strong&gt; JSON-RPC 2.0 üzerinden MCP spesifikasyonunu implemente ediyor. Tool listeleme, tool çağırma, hata yönetimi — hepsi spec-compliant.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Permission scoping:&lt;&#x2F;strong&gt; v0.1.508 ile gelen en kritik özellik. Hangi agent hangi endpoint&#x27;i ne kadar çağırabilir? Rate limiting? Scope kısıtlaması? Hepsi yapılandırılabilir.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cloud CLI:&lt;&#x2F;strong&gt; &lt;code&gt;rustapi deploy&lt;&#x2F;code&gt; yazıyorsunuz, projeniz canlıya çıkıyor. Vercel modelini Rust ekosistemine taşıma hedefi.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Şu an v0.1.528&#x27;deyiz. 55+ GitHub star, 3 fork. Küçük sayılar gibi görünüyor ama Rust ekosisteminde bir web framework için hiç fena değil — hele 7 ayda.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;performans&quot;&gt;Performans&lt;&#x2F;h2&gt;
&lt;p&gt;Lafı uzatmayayım. Benchmark sonuçları:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Framework&lt;&#x2F;th&gt;&lt;th&gt;Request&#x2F;sec (hello world)&lt;&#x2F;th&gt;&lt;th&gt;P99 latency&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;FastAPI (Python)&lt;&#x2F;td&gt;&lt;td&gt;~14,000&lt;&#x2F;td&gt;&lt;td&gt;~8ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Express (Node)&lt;&#x2F;td&gt;&lt;td&gt;~24,000&lt;&#x2F;td&gt;&lt;td&gt;~5ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Actix-web (Rust)&lt;&#x2F;td&gt;&lt;td&gt;~180,000&lt;&#x2F;td&gt;&lt;td&gt;~0.6ms&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RustAPI (Rust)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;~210,000&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;~0.5ms&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;MCP invocation tarafında daha da çılgın: &lt;strong&gt;28 mikrosaniye&lt;&#x2F;strong&gt;. Evet, mikrosaniye. Bir MCP aracını çağırmak, bir Python fonksiyon çağrısından daha hızlı.&lt;&#x2F;p&gt;
&lt;p&gt;Bunlar &quot;hello world&quot; benchmark&#x27;ları, gerçek dünyada fark daha da açılıyor çünkü Rust&#x27;ın sıfır-maliyetli abstraksiyonları gerçek iş yüklerinde asıl farkı yaratıyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nereye-gidiyor&quot;&gt;Nereye gidiyor?&lt;&#x2F;h2&gt;
&lt;p&gt;Yol haritası net:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RustAPI Cloud&lt;&#x2F;strong&gt; (Q3 2026) — Managed hosting. &lt;code&gt;rustapi deploy&lt;&#x2F;code&gt; ile tek komutta deployment. Bedava tier + pro tier. Vercel&#x27;in Rust versiyonu.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;MCP Gateway&lt;&#x2F;strong&gt; (Q4 2026) — Tüm deployed API&#x27;lerinizi tek bir MCP endpoint&#x27;inde toplayan gateway. Bir AI agent tek bir URL&#x27;den yüzlerce API&#x27;ye erişebilecek.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Plugin ekosistemi&lt;&#x2F;strong&gt; — Auth plugin&#x27;leri, rate limiting, caching, monitoring. Topluluk katkısına açık.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;gRPC + WebSocket&lt;&#x2F;strong&gt; — HTTP&#x27;nin ötesine geçmek. Agent&#x27;lar bazen streaming ister.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;ogrendigim-seyler&quot;&gt;Öğrendiğim şeyler&lt;&#x2F;h2&gt;
&lt;p&gt;Sıfırdan bir web framework yazmak, size HTTP&#x27;nin içini dışını öğretiyor. Keep-alive bağlantılar, chunked transfer encoding, pipeline requests — hepsini implemente etmek zorunda kalıyorsunuz. RFC okumaktan gözlerim bozuldu diyebilirim.&lt;&#x2F;p&gt;
&lt;p&gt;Ama en büyük öğrendiğim şey şu: &lt;strong&gt;Rust&#x27;ta ergonomi, sıfır maliyetle gelmiyor.&lt;&#x2F;strong&gt; Makro sistemi sayesinde Python&#x27;daki kadar temiz bir API sunabiliyorsunuz, ama arka planda her şey statik olarak çözülüyor. Runtime overhead yok. Bu, Rust&#x27;ın süper gücü.&lt;&#x2F;p&gt;
&lt;p&gt;İkinci büyük ders: &lt;strong&gt;Açık kaynak, compound interest gibidir.&lt;&#x2F;strong&gt; İlk 3 ay kimse bakmadı. Sonra bir blog yazısı yazdım, Hacker News&#x27;te paylaştım, bir anda 30 star geldi. Şimdi her hafta birkaç kişi issue açıyor, PR gönderiyor. Yavaş ama istikrarlı büyüyor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deneyin&quot;&gt;Deneyin&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span&gt; install rustapi
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;rustapi&lt;&#x2F;span&gt;&lt;span&gt; new my-project
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; my-project
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;rustapi&lt;&#x2F;span&gt;&lt;span&gt; dev
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;3 komut, 10 saniye. Sonra geliştirmeye başlayın.&lt;&#x2F;p&gt;
&lt;p&gt;Website: &lt;a href=&quot;https:&#x2F;&#x2F;rustapi.cloud&quot;&gt;rustapi.cloud&lt;&#x2F;a&gt;
GitHub: &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Tuntii&#x2F;RustAPI&quot;&gt;github.com&#x2F;Tuntii&#x2F;RustAPI&lt;&#x2F;a&gt;
Dokümantasyon: &lt;a href=&quot;https:&#x2F;&#x2F;tuntii.github.io&#x2F;RustAPI&#x2F;&quot;&gt;tuntii.github.io&#x2F;RustAPI&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Eğer Rust yazıyorsanız ve API geliştiriyorsanız, bir şans verin. Beğenmezseniz issue açın — ciddiyim, her feedback&#x27;i implemente etmeye çalışıyorum.&lt;&#x2F;p&gt;
&lt;p&gt;Sonraki yazıda KayaDB&#x27;yi anlatacağım — sıfırdan dağıtık bir key-value store yazmak nasıl bir deneyim, Raft consensus implemente etmek, Jepsen testleri... O daha da çılgın.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>İlk Yazı: Bu Blog Neden Var?</title>
          <pubDate>Sun, 05 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/ilk-yazi/</link>
          <guid>https://tuntii.com/blog/ilk-yazi/</guid>
          <description xml:base="https://tuntii.com/blog/ilk-yazi/">&lt;p&gt;Merhaba! Bu, &lt;strong&gt;tuntii.com&lt;&#x2F;strong&gt; üzerindeki ilk yazım.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;neden-bir-blog&quot;&gt;Neden bir blog?&lt;&#x2F;h2&gt;
&lt;p&gt;İnternetin kurumsal, steril halinden biraz uzaklaşmak istedim. IndieWeb ruhuna uygun, el yapımı hissettiren bir köşe — tıpkı &lt;a href=&quot;https:&#x2F;&#x2F;daudix.one&quot;&gt;daudix.one&lt;&#x2F;a&gt; gibi.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ne-yazacagim&quot;&gt;Ne yazacağım?&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Teknoloji notları&lt;&#x2F;li&gt;
&lt;li&gt;Kişisel düşünceler&lt;&#x2F;li&gt;
&lt;li&gt;Projelerimden kesitler&lt;&#x2F;li&gt;
&lt;li&gt;Belki biraz saçma mizah&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;    println!(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Hello, tuntii.com!&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Daha fazlası yakında. Takipte kalın!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Zola ile Statik Blog Kurmak</title>
          <pubDate>Sat, 04 Jul 2026 00:00:00 +0000</pubDate>
          <author>Tunay Engin</author>
          <link>https://tuntii.com/blog/zola-ile-blog/</link>
          <guid>https://tuntii.com/blog/zola-ile-blog/</guid>
          <description xml:base="https://tuntii.com/blog/zola-ile-blog/">&lt;p&gt;Bu site &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; ile inşa edildi — Rust ile yazılmış, hızlı ve basit bir statik site generator.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;neden-zola&quot;&gt;Neden Zola?&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hız&lt;&#x2F;strong&gt; — Build süreleri milisaniyeler&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Güvenlik&lt;&#x2F;strong&gt; — Statik HTML, sunucu tarafı risk yok&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Basitlik&lt;&#x2F;strong&gt; — Markdown + Tera şablonları&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Tek binary&lt;&#x2F;strong&gt; — Kurulumu kolay&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;temel-yapi&quot;&gt;Temel yapı&lt;&#x2F;h2&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;content&#x2F;     → Markdown yazılar
&lt;&#x2F;span&gt;&lt;span&gt;templates&#x2F;   → HTML şablonları
&lt;&#x2F;span&gt;&lt;span&gt;static&#x2F;      → CSS, JS, görseller
&lt;&#x2F;span&gt;&lt;span&gt;config.toml  → Site ayarları
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;zola build&lt;&#x2F;code&gt; komutu ile &lt;code&gt;public&#x2F;&lt;&#x2F;code&gt; klasörü oluşur ve nginx&#x27;e servis edilir.&lt;&#x2F;p&gt;
&lt;p&gt;Basit, etkili, güzel.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
