Kombinatoryal Oyunlarda XOR: Kazananı Tek Sayıyla Bulmak

kombinatoryal-oyunlarda-xor-85

İki oyuncunun sırayla hamle yaptığı bir oyunda bütün olasılıkları gezmek ilk bakışta doğal görünür. Fakat taş yığınları büyüdüğünde oyun ağacı küçük bir çalı olmaktan çıkıp dijital bir ormana dönüşür. Kombinatoryal oyun teorisi, uygun koşullardaki bir oyunun durumunu XOR işlemiyle tek bir sayıya indirerek kazananı belirlememizi sağlar.

Devamı...

Hopcroft-Karp Algoritmasıyla İki Parçalı Çizgelerde Maksimum Eşleşme

Bir şirkette çalışanları görevlere, öğrencileri projelere veya gönüllüleri etkinliklere dağıttığımızı düşünelim. Herkes her işe uygun olmayabilir; üstelik bir kişi yalnızca bir göreve atanabilir. Bütün olası dağılımları denemek kısa sürede kombinasyon cehennemine dönüşür. Hopcroft-Karp algoritması, bu karmaşayı iki parçalı çizge modeliyle düzenler ve mümkün olan en fazla sayıda eşleşmeyi verimli biçimde bulur.

Devamı...

Graf Teorisinde Kesme Noktaları ve Köprüleri Bulmak

İnternet omurgası, elektrik şebekesi veya şehirler arası yol ağı düşünelim. Bazı istasyonların kapanması yalnızca küçük bir aksaklık yaratırken bazıları bütün ağı iki parçaya ayırabilir. Graf teorisi, ağın bu kritik düğüm ve bağlantılarını kesme noktaları ve köprüler kavramlarıyla belirler. Üstelik bunu her elemanı tek tek kaldırıp ağı tekrar sınamadan, verimli bir DFS algoritmasıyla gerçekleştirebiliriz.

Devamı...

FFT ile Polinom ve Büyük Sayı Çarpımı: O(n log n) Hızına Yolculuk

Binlerce basamaklı iki sayıyı klasik yöntemle çarpmak, her basamağı diğer sayının bütün basamaklarıyla eşleştirmeyi gerektirir. Bu yaklaşım küçük sayılarda sorunsuzdur; ancak veri büyüdükçe işlem sayısı hızla artar. Hızlı Fourier Dönüşümü, yani FFT, sayıları polinom gibi yorumlayarak çarpımı frekans uzayına taşır ve yaklaşık $O(n \log n)$ zamanda tamamlar. Kısacası FFT, devasa çarpma işlemini akıllıca organize edilmiş küçük işlemlere dönüştürür.

Devamı...

Fenwick Ağacı Varyasyonları: 2B Matrislerde Güncelleme ve Alan Sorgusu

Bir matris üzerinde sürekli hücre güncelleyip dikdörtgen alanların toplamını sorgulamak, ilk bakışta iç içe döngülerle çözülebilecek masum bir problem gibi görünür. Ancak matris büyüdükçe bu yaklaşım bilgisayarınıza küçük çaplı bir sabır testi uygular. İki boyutlu Fenwick Ağacı, diğer adıyla 2D Binary Indexed Tree, nokta güncellemelerini ve alan toplamı sorgularını logaritmik maliyetle bir araya getirerek bu sorunu zarifçe çözer.

Devamı...

Euler Yolu ve Euler Devresi: Hierholzer Algoritmasıyla Her Kenarı Bir Kez Geçmek

Bir şehrin bütün köprülerinden yalnızca bir kez geçebilir miyiz? Königsberg köprüleri problemiyle ünlenen bu soru, çizge teorisindeki Euler yolu ve Euler devresi kavramlarının temelini oluşturur. Bu yazıda, bir çizgenin her kenarını tam olarak bir kez kullanan rotaları tanıyacak ve böyle bir rotayı verimli biçimde bulan Hierholzer algoritmasını Python ile kodlayacağız.

Devamı...

Dinamik Programlamada Konveks Zarf Optimizasyonu

Dinamik programlama bazen doğru bağıntıyı bulduğumuz hâlde bizi $O(n^2)$ karmaşıklığıyla baş başa bırakır. Her durum için önceki bütün durumları denemek, küçük girdilerde masum görünürken yüz bin elemanda bilgisayarı düşünsel bir inzivaya sokabilir. Eğer geçiş maliyeti belirli biçimde doğrusal fonksiyonlara ayrılabiliyorsa Konveks Zarf Optimizasyonu veya yaygın adıyla Convex Hull Trick (CHT), bu aramayı geometrik bir probleme dönüştürerek ciddi biçimde hızlandırır.

Devamı...

Burnside Lemması ile Boyama Problemleri: Simetrileri Saymanın Akıllı Yolu

Bir kolyenin boncuklarını boyadığınızı düşünün. Kırmızı-mavi-yeşil dizilimi ilk bakışta yüzlerce farklı sonuç üretebilir; ancak kolyeyi döndürdüğünüzde veya ters çevirdiğinizde bazı boyamalar aslında aynıdır. İşte Burnside Lemması, bu simetri karmaşasını düzenleyerek gerçekten farklı olan boyamaların sayısını bulmamızı sağlar.

burnside-lemmasi-ile-47

Devamı...

Aho-Corasick Otomatı: Binlerce Kelimeyi Tek Geçişte Aramak

Bir metinde tek bir kelime aramak kolaydır; peki zararlı yazılım imzaları, yasaklı ifadeler veya DNA dizileri gibi binlerce deseni aynı anda bulmak istersek ne olur? Her kelime için metni baştan sona taramak çalışır, ancak performansı kısa sürede bir kaplumbağa yarışına dönüştürür. Aho-Corasick otomatı, bütün desenleri ortak bir sözlük ağacında birleştirerek metni yalnızca bir kez dolaşmamızı sağlar.

Devamı...

Ağır-Hafif Ayrıştırma: Ağaç Yollarını Logaritmik Hızda Yönetmek

Bir ağaçta iki düğüm arasındaki yolu bulmak kolaydır; ancak yüz binlerce düğüm ve sorgu devreye girdiğinde masum bir yürüyüş performans canavarına dönüşür. Ağır-Hafif Ayrıştırma, yani Heavy-Light Decomposition (HLD), uzun yolları birkaç doğrusal parçaya bölerek sorgu ve güncellemeleri Segment Tree gibi veri yapılarıyla hızlandırır.

Devamı...

x86’dan ARM’a: Docker Buildx ile Çok Mimarili İmaj Derleme

Bir projeyi x86 bilgisayarınızda sorunsuz çalıştırmanız, onun ARM tabanlı bir bulut sunucusunda da doğrudan çalışacağı anlamına gelmez. İşlemci komut setleri arasındaki fark, özellikle derlenmiş uygulamalarda ve yerel bağımlılıklarda kendini gösterir. Neyse ki Docker Buildx; x86 geliştirme ortamından ayrılmadan ARM64 uyumlu, hatta birden fazla mimariyi destekleyen imajlar üretmemizi sağlar.

Devamı...

WordPress’te Özel Eklenti Geliştirme: Kısa Kodlar ve Veri Modelleri

Hazır WordPress temaları hızlı başlangıç sağlar; ancak etkinlik kataloğu, ekip listesi veya projeye özgü bir başvuru sistemi istediğinizde tema seçenekleri duvara toslayabilir. Çözüm, functions.php dosyasını yamalı bohçaya çevirmek değil, iş mantığını bağımsız bir eklentiye taşımaktır. Böylece tema değişse bile kısa kodlarınız ve verileriniz yerinde kalır.

wordpresste-ozel-eklenti-18

Devamı...

WordPress'te Object Cache ile MySQL Yükünü Hafifletme

Yüksek trafikli bir WordPress sitesinde MySQL, aynı sorulara tekrar tekrar cevap veren yorgun bir danışmana dönüşebilir: “Bu yazının meta bilgileri nedir?”, “Menüde hangi bağlantılar var?”, “Bu ayarlar değişti mi?” Object Cache, sık kullanılan sonuçları bellekte tutarak danışmanın masasını gereksiz isteklerden temizler. Böylece hem sayfalar hızlanır hem de veritabanı gerçekten gerekli sorgularla ilgilenir.

Devamı...

WordPress REST API ile Headless CMS: İçerik WP’de, Arayüz İstediğin Yerde

WordPress denince akla çoğunlukla tema, eklenti ve klasik blog sayfaları gelir. Oysa WordPress’i yalnızca içerik üretim paneli olarak kullanıp ziyaretçiye görünen arayüzü React, Vue, Next.js, Nuxt, Flutter veya başka bir teknolojiyle geliştirmek mümkündür. Bu yaklaşımda WordPress mutfakta yemekleri hazırlar, REST API garsonluk yapar, seçtiğin arayüz ise sunumu üstlenir.

wordpress-rest-api-32

Devamı...

VS Code Remote-SSH ile Bulut Sunucuda Yerel Konforla Kodlama

Kod bulut sunucuda, editör dizüstü bilgisayarında olabilir mi? VS Code Remote-SSH tam olarak bu sihri gerçekleştirir. Proje dosyalarını indirip yeniden yüklemek yerine SSH üzerinden sunucuya bağlanır; dosya gezgininden terminale, Git işlemlerinden hata ayıklamaya kadar geliştirme ortamını yerel VS Code penceresinden yönetmeni sağlar. Böylece “Sunucuda çalışan kod neden bilgisayarımda çalışmıyor?” bilmecesi de büyük ölçüde tarihe karışır.

Devamı...

Telegram Botlarında Rate Limiting: Kuyruklarla Güvenli Toplu Bildirim

Telegram botunuz yüz kullanıcıya mesaj gönderirken gayet sakin çalışabilir; ancak kullanıcı sayısı binlere ulaştığında Bot API aniden 429 Too Many Requests yanıtları vermeye başlayabilir. Çözüm, döngüye biraz sleep serpiştirmek değil; gönderim hızını ölçen, mesajları sıraya alan ve geçici hataları yeniden deneyen kontrollü bir dağıtım sistemi kurmaktır.

Devamı...

Sanal Kimliklerin İnşası: Anonimlik Perdesinin Arkasında Kim Oluyoruz?

Bir forumda ciddi bir teknoloji uzmanı, başka bir platformda sivri dilli bir eleştirmen, kişisel blogunda ise duygusal bir hikâye anlatıcısı… Aynı kişi internette birbirinden oldukça farklı karakterlere bürünebilir. Sanal kimlikler yalnızca kullanıcı adı ve profil fotoğrafından oluşmaz; kişinin seçerek sergilediği özelliklerin, davranışlarının ve topluluk içindeki itibarının birleşimidir.

sanal-kimliklerin-insasi-70

Devamı...

Oracle Cloud’da Ampere Sunucularını Yük Dengeleyiciyle Ölçeklendirme

oracle-cloudda-ampere-78

Tek bir Ampere sunucusu hızlı ve ekonomik olabilir; ancak bütün web trafiğini ona yönlendirmek, uygulamanın kaderini tek bir makineye bağlar. Oracle Cloud Infrastructure üzerinde bir yük dengeleyici kullanarak istekleri birden fazla Ampere A1 sunucusuna dağıtabilir, bakım sırasında kesintiyi azaltabilir ve trafik yükseldiğinde sisteminizi daha rahat ölçeklendirebilirsiniz.

Devamı...

Koda Karşı Empati: Eski Bir Kodun Zihnini Okumak

koda-karsi-empati-53

Yıllar önce yazılmış karmaşık bir fonksiyonla karşılaştığınızda yalnızca değişkenleri ve koşulları çözmezsiniz. Görünmeyen bir geliştiricinin ne bildiğini, neden belirli risklerden kaçındığını ve hangi baskılar altında karar verdiğini de tahmin etmeye çalışırsınız. Başka insanların inanç ve niyetlerini modelleme becerisi psikolojide zihin kuramı (theory of mind) olarak adlandırılır. Eski kod okumak da biraz dijital arkeoloji, biraz dedektiflik ve şaşırtıcı ölçüde empati gerektirir.

Devamı...

Flarum’da Deneysel Veri Sorgulama: JSON:API’den GraphQL Katmanına

flarumda-deneysel-veri-42

Flarum, standart kurulumunda düzenli ve öngörülebilir bir JSON:API yaklaşımı sunar. Ancak bir tartışmanın yazarını, etiketlerini, son yanıtlarını ve özel uzantı alanlarını tek ekranda göstermek istediğimizde istemci tarafı küçük bir veri toplama dedektifine dönüşebilir. Deneysel bir sorgulama katmanı ekleyerek istemcinin ihtiyaç duyduğu alanları açıkça seçmesini, gereksiz veriyi azaltmasını ve Flarum uzantıları arasında daha esnek ilişkiler kurmasını sağlayabiliriz.

Devamı...