Eşleştirme Oyunlarında Grundy Sayıları: Kazandıran Hamlenin Matematiği

Bir masanın üzerindeki çubukları, taşları veya eşleşebilen kartları sırayla kaldırdığınızı düşünün. Kurallar basit görünür: Hamle yapamayan kaybeder. Fakat hangi hamlenin kazandıracağını bulmak, özellikle bağımsız oyun parçaları birleştiğinde, sezgiden fazlasını gerektirir. Grundy sayıları ya da diğer adıyla nimber, her oyun durumunu tek bir sayıyla özetleyerek bu karmaşayı yönetilebilir bir matematik problemine dönüştürür.

Devamı...

Dinamik Programlamada Hız Sihri: Knuth Optimizasyonunun Sırları

Dinamik programlama bazen doğru bağıntıyı bulduğumuz anda bizi sevindirir, ardından $O(N^3)$ zaman karmaşıklığıyla moralimizi bozar. Özellikle bir aralığı en uygun noktadan bölmeye dayanan problemlerde aynı geçişler tekrar tekrar incelenir. Knuth optimizasyonu, optimum bölme noktalarının düzenli hareket ettiğini matematiksel olarak kanıtlayabildiğimiz durumlarda bu kübik maliyeti $O(N^2)$ seviyesine indiren zarif bir tekniktir.

Devamı...

Dinamik Bağlantılı Bileşenler: Zamanı Böl, Grafı Fethet

Bir sosyal ağda arkadaşlıklar kuruluyor, bozuluyor ve arada “Ali ile Ayşe hâlâ dolaylı olarak bağlantılı mı?” soruları geliyor. Graf sürekli değişirken her sorguda baştan DFS çalıştırmak mümkündür; fakat performansınız kısa sürede dramatik bir vedaya hazırlanır. Çevrimdışı dinamik bağlantılılık, tüm işlemleri önceden bilmenin avantajını kullanarak zamanı parçalara ayırır ve bağlantıları geri alınabilir bir DSU ile takip eder.

Devamı...

CQRS: Okuma ve Yazma Modellerini Neden Ayırıyoruz?

Bir e-ticaret uygulamasında ürün satın almak ile ürün listesini görüntülemek aynı veri üzerinde çalışıyor gibi görünür. Ancak satın alma işlemi stok kontrolü, ödeme ve iş kuralları gerektirirken listeleme işlemi yalnızca hızlı ve zengin bir görünüm ister. CQRS, bu iki farklı ihtiyacı tek bir modelin omuzlarına yüklemek yerine okuma ve yazma taraflarını birbirinden ayırır.

cqrs-okuma-ve-67

Devamı...

Commit’ten Üretime: CI/CD Pipeline’larının Anatomisi

Bir geliştirici kodunu depoya gönderdiğinde görünmez bir fabrika çalışmaya başlar: kaynak kod derlenir, testlerden geçirilir, paketlenir ve kontrollü biçimde kullanıcılarla buluşturulur. CI/CD pipeline adı verilen bu otomatik yolculuk, “Benim bilgisayarımda çalışıyordu!” cümlesini tarihe gömmeyi hedefleyen teknik aşamalar ile güvenlik kapılarından oluşur.

committen-uretime-cicd-48

Devamı...

Brian Kernighan Algoritmasıyla Set Bitlerini Şimşek Hızında Saymak

Bir tam sayının ikili gösteriminde kaç tane 1 bulunduğunu saymak ilk bakışta sıradan bir döngü problemi gibi görünür. Ancak düşük seviyeli programlamanın büyüsü, bazen bütün bitleri tek tek dolaşmak yerine yalnızca ilgilendiğimiz bitlere dokunabilmemizdir. Brian Kernighan algoritması, her turda sağdaki bir adet set bitini temizleyerek gereksiz döngüleri ortadan kaldıran zarif bir bit maskeleme hilesidir.

Devamı...

Aho-Corasick ve Dinamik Programlama ile Yasaklı Kelimelerden Kaçınan Metin Üretimi

aho-corasick-ve-37

Bir alfabenin karakterlerini kullanarak belirli uzunlukta metinler üretmek kolaydır: alfabe boyutu $K$, metin uzunluğu $N$ ise toplam $K^N$ seçenek vardır. Ancak metnin içinde “abc”, “kedi” veya “virus” gibi yasaklı kelimelerin hiç geçmemesini istediğimizde işler karışır. Her dizgiyi tek tek üretip kontrol etmek astronomik derecede pahalıdır. Neyse ki Aho-Corasick otomatı ile dinamik programlamayı birleştirerek tüm geçerli dizgileri üretmeden sayabiliriz.

Devamı...

Ağaçlarda Euler Turu Tekniği: Alt Ağaçları Tek Boyutlu Dizide Yakalamak

agaclarda-euler-turu-67

Bir şirket hiyerarşisindeki yöneticileri, dosya sistemindeki klasörleri veya bir oyundaki yetenek ağacını düşünün. Bu yapılarda “X düğümünün altındaki bütün değerlerin toplamı nedir?” gibi sorgular sıkça karşımıza çıkar. Ağacı her sorguda yeniden dolaşmak pahalıdır; Euler Turu Tekniği (ETT), alt ağaçları tek boyutlu ve kesintisiz dizi aralıklarına dönüştürerek segment ağacının süper güçlerinden yararlanmamızı sağlar.

Devamı...

Ağaç İçi Mesafelerin Gizli Silahı: Centroid Decomposition

Bir ağaçta iki düğüm arasındaki mesafeyi hesaplamak kolaydır; fakat binlerce güncelleme ve sorgu geldiğinde işler hızla dallanıp budaklanır. Centroid Decomposition, ağacı dengeli biçimde parçalara ayırarak mesafe problemlerini yaklaşık $O(\log n)$ katman üzerinden çözmemizi sağlar. Kısacası ağacın fiziksel yapısını değiştirmeden, onun üzerinde ikinci ve dengeli bir “centroid ağacı” kurarız.

agac-ici-mesafelerin-68

Devamı...

UART ve Seri Haberleşme: İki Cihazın En Sade Sohbet Protokolü

Bir mikrodenetleyicinin sensörle, bilgisayarla veya başka bir kartla konuşmasını sağlamanın en kolay yollarından biri UART’tır. Karmaşık ağ katmanları, IP adresleri ya da bağlantı pazarlıkları yoktur; iki taraf doğru hızda dinler ve bitler sırayla yola çıkar. Kısacası UART, elektronik dünyasının “aynı dili ve tempoyu biliyorsak konuşabiliriz” anlaşmasıdır.

Devamı...

Time-Series Database’ler: Zaman Damgalı Veriler Neden Farklı Davranır?

Bir sunucunun CPU kullanımı, elektrik sayacının ölçümü, borsa fiyatı veya akıllı saatin kaydettiği nabız aynı temel özelliği taşır: Her değer belirli bir zaman anına aittir. Klasik veritabanları bu kayıtları elbette saklayabilir; ancak veri saniyede binlerce kez akmaya başladığında zaman, sıradan bir sütun olmaktan çıkar ve veri modelinin başrol oyuncusuna dönüşür.

Devamı...

SPI Protokolü: Yüksek Hızlı Çevresel Donanım İletişiminin Mantığı

Bir mikrodenetleyicinin sensör, ekran, ADC, DAC veya flash bellek gibi çevresel donanımlarla hızlı konuşması gerektiğinde SPI çoğu zaman sahneye çıkar. Açılımı Serial Peripheral Interface olan bu protokol, veriyi bit bit aktarmasına rağmen yüksek saat frekansı ve basit çalışma mantığı sayesinde oldukça hızlıdır. Kısacası SPI, donanım dünyasının “lafı dolandırmadan doğrudan konuşan” iletişim yöntemlerinden biridir.

Devamı...

SOLID Gerçek Projelerde: Prensip mi, Dogma mı?

SOLID, yazılım ekiplerinin toplantılarda ciddi yüz ifadeleriyle andığı; kod incelemelerinde ise bazen kılıç gibi kullandığı beş tasarım prensibidir. Doğru uygulandığında değişime dayanıklı kod üretir, yanlış yorumlandığında üç satırlık işlem için on iki arayüz ve yirmi sınıf doğurabilir. Dolayısıyla asıl soru “SOLID kullanmalı mıyız?” değil, “Hangi maliyet karşılığında ve hangi problem için kullanmalıyız?” olmalıdır.

solid-gercek-projelerde-75

Devamı...

Sensör Kalibrasyonu: Kusurlu Ölçüm Cihazından Güvenilir Veri Üretmek

Bir sıcaklık sensörünü buzlu suya daldırdığınızda 0 °C yerine 2,4 °C göstermesi onun işe yaramaz olduğu anlamına gelmez. Sensör yalnızca biraz “dürüstlük eğitimine” ihtiyaç duyuyor olabilir! Kalibrasyon, cihazın ürettiği ham değerlerle güvenilir referans değerler arasındaki ilişkiyi modelleyerek ölçüm hatasını azaltma işlemidir.

sensor-kalibrasyonu-kusurlu-78

Devamı...

RTOS Scheduler’ları: Gerçek Zamanlı Sistemlerde Önce Kim Çalışacak?

rtos-schedulerlari-gercek-86

Bir mikrodenetleyicide sensör okumak, motor sürmek ve haberleşme paketlerini işlemek aynı anda gerekli olabilir. Ancak tek çekirdekli işlemci gerçekte aynı anda yalnızca bir işi yürütür. RTOS scheduler’ı, yani zamanlayıcı, tam bu noktada sahneye çıkar ve hazır görevlerden hangisinin işlemciyi kullanacağına karar verir. Kısacası scheduler, görevler arasındaki trafik polisidir; fakat yanlış kararında yalnızca korna sesi değil, kaçırılmış deadline’lar duyulur.

Devamı...

Robot Kolunda Jacobian Matrisi: Eklem Hızından Uç Nokta Hareketine

Bir robot kolunun eklemlerini döndürdüğümüzde uç efektörün hangi yönde ve ne kadar hızlı hareket edeceğini nasıl buluruz? Tersinden sorarsak, robotun elini belirli bir hızla ilerletmek için motorları hangi hızlarda çevirmeliyiz? Robotikte bu iki dünya arasındaki tercüman Jacobian matrisidir. İlk bakışta ürkütücü görünen bu matris, aslında eklem hızlarını Kartezyen uzaydaki harekete bağlayan yerel bir yol haritasıdır.

Devamı...

Read Replica Mimarisi: Okuma Trafiğini Çoğaltarak Ölçeklemek

Bir uygulama büyüdükçe veritabanındaki iş yükü de büyür. Ürün listeleme, profil görüntüleme ve raporlama gibi okuma işlemleri çoğalırken sipariş oluşturma gibi yazma işlemleri genellikle daha düşük oranda kalır. Tek veritabanını daha güçlü bir sunucuya taşımak bir süre işe yarasa da sonsuza kadar RAM ekleyemeyiz. Read replica mimarisi, okuma trafiğini birden fazla veritabanı kopyasına dağıtarak bu darboğazı aşmayı hedefler.

read-replica-mimarisi-69

Devamı...

PWM ile Motor Hızı ve LED Parlaklığı Kontrolü

Bir mikrodenetleyicinin yalnızca HIGH ve LOW üretebildiğini düşünürsek, bir LED’i nasıl yarı parlak yakabilir veya motoru yarı hızda döndürebiliriz? Cevap, elektroniğin hızlı aç-kapa illüzyonu olan PWM tekniğidir. PWM sayesinde dijital bir çıkış, analog çıkışa benzer bir davranış sergiler.

Devamı...

Micro-ROS: Mikrodenetleyicilere Robot İşletim Sistemi Dokunuşu

micro-ros-mikrodenetleyicilere-21

Bir robotun motorunu milisaniyeler içinde kontrol etmek isteyen küçücük bir mikrodenetleyici ile harita çıkaran güçlü bir bilgisayar aynı dili konuşabilir mi? Micro-ROS tam olarak bu soruya “Evet!” cevabını verir. ROS 2 ekosisteminin iletişim modelini kaynakları sınırlı mikrodenetleyicilere taşıyarak sensörlerden motor sürücülerine kadar robotun en küçük parçalarını dağıtık sistemin birer üyesi hâline getirir.

Devamı...