Robot Parmakları Kaymayı Nasıl Hisseder? Dokunsal Sensörlerin İnce Dünyası

robot-parmaklari-kaymayi-43

Bir robotun bardağı ezmeden tutması kolay görünür; ta ki bardak parmaklarının arasından kaymaya başlayana kadar! İnsanlar bu küçük hareketi derideki mekanoreseptörlerle fark edip kavrama kuvvetini istemsizce artırır. Dokunsal sensörler de robotlara benzer bir refleks kazandırarak basınç, titreşim, kesme kuvveti ve temas geometrisi gibi ayrıntıları ölçer.

Devamı...

Python Type Hint’leri Emniyet Kemeri Değil, Yol Tabelasıdır

Python’da bir fonksiyonun parametresine str, dönüş değerine int yazınca kodumuzun artık yanlış türlere karşı korunduğunu düşünebiliriz. Ne yazık ki bu, kapıya “Girilmez” tabelası asıp fiziksel olarak kilitlediğimizi sanmaya benzer. Type hint’ler geliştiriciye ve analiz araçlarına yol gösterir; Python yorumlayıcısı ise çoğu durumda onları yalnızca izler ve çalışmaya devam eder.

Devamı...

LZW Sıkıştırma Algoritması: Veriyi Sözlükle Küçültme Sanatı

Bir metindeki aynı karakter dizilerini tekrar tekrar saklamak yerine onlara kısa kodlar verseydik ne olurdu? Lempel–Ziv–Welch, yani LZW algoritması, tam olarak bu fikirle çalışan kayıpsız bir veri sıkıştırma yöntemidir. Metin, görüntü veya benzeri veriler içindeki tekrar eden kalıpları çalışma sırasında oluşturduğu bir sözlükte toplar. Böylece uzun diziler küçük sayılarla temsil edilir; veri hiçbir bilgi kaybedilmeden daha kompakt hâle gelir.

Devamı...

İHA Uçuş Kontrolcüleri Rüzgâra Nasıl Meydan Okur?

Bir drone sakin havada uslu bir robot gibi davranabilir; ancak rüzgâr başladığında işler hızla değişir. Ani yön değişimleri, pervane itkisindeki dengesizlikler ve gövde üzerindeki aerodinamik kuvvetler, İHA’yı hedeflenen konumdan uzaklaştırır. Uçuş kontrolcüsünün görevi bu bozucu etkileri algılamak, uygun motor komutlarını hesaplamak ve araç daha ne olduğunu anlamadan dengeyi yeniden kurmaktır.

Devamı...

En Uzun Yol Problemi Neden Bu Kadar Zor?

Bir şehirden diğerine giderken navigasyon uygulaması en kısa rotayı saniyeler içinde bulabilir. Peki uygulamadan hiçbir kavşağı iki kez ziyaret etmeden mümkün olan en uzun rotayı bulmasını istersek ne olur? Masum görünen bu değişiklik, problemi algoritmalar dünyasının en çetin sınıflarından birine taşır: En Uzun Yol Problemi genel graflarda NP-zordur.

Devamı...

En Uzun Tekrar Eden Alt Dizgi: Son Ek Dizileriyle Metnin Gizli Tekrarlarını Bulmak

en-uzun-tekrar-83

Bir metnin içinde en az iki kez geçen en uzun parça hangisidir? İlk bakışta bütün alt dizgileri üretip karşılaştırmak makul görünebilir. Ancak metin büyüdüğünde bu yöntem, samanlıkta iğne ararken önce bütün samanları tek tek numaralandırmaya dönüşür. Son ek dizisi ve LCP dizisi ise tekrarları düzenli, hızlı ve şaşırtıcı derecede zarif biçimde ortaya çıkarır.

Devamı...

C Temelleri: Tarihten Derleme Modeline Sistem Programlamanın Alfabesi

C, işletim sistemlerinden gömülü cihazlara kadar sayısız teknolojinin görünmeyen motorudur. Sözdizimi ilk bakışta sade görünse de bellek, işlemci ve program arasındaki ilişkiyi doğrudan hissettirmesi onu öğretici ve güçlü kılar. C öğrenmek yalnızca yeni bir dil öğrenmek değil, bilgisayarın perde arkasına küçük ama oldukça aydınlatıcı bir pencere açmaktır.

Devamı...

C++ RAII: İstisna Güvenliğinin Görünmez Süper Kahramanı

c-raii-istisna-26

C++ programında dosya açmak, bellek ayırmak veya kilit edinmek kolaydır; asıl macera, işler ters gittiğinde bunları güvenle bırakabilmektir. Bir istisna normal kontrol akışını aniden kesebilir. RAII (Resource Acquisition Is Initialization), kaynakların ömrünü nesnelerin ömrüne bağlayarak bu sorunu dil seviyesindeki otomatik ömür yönetimine teslim eder.

Devamı...

C++ Namespace ve Koenig Araması: Fonksiyon Çözümlemesinin Görünmeyen Kuralları

C++’ta bir fonksiyon çağrısının hangi bildirime bağlanacağı her zaman kodda gördüğümüz isimle sınırlı değildir. foo(x) gibi masum bir çağrı; normal isim aramasını, ad alanlarını, aşırı yük çözümlemesini ve Koenig araması olarak da bilinen ADL mekanizmasını harekete geçirir. Bu görünmez süreç doğru kullanıldığında genişletilebilir API’ler oluşturur, yanlış anlaşıldığında ise derleyicinin neden “alakasız” bir fonksiyonu seçtiğini düşündüren hatalara yol açar.

c-namespace-ve-35

Devamı...

C Dizileri: Bellekte Yan Yana Yaşayan Veriler

C dilinde çok sayıda aynı tür veriyi ayrı ayrı değişkenlerle yönetmek, her yolcu için ayrı otobüs çağırmaya benzer. Diziler ise tüm yolcuları tek araca bindirir: Veriler ardışık bellek hücrelerinde saklanır, ortak bir adla yönetilir ve indeksler sayesinde hızlıca erişilebilir hâle gelir.

c-dizileri-bellekte-85

Devamı...

C Değişkenler, Sabitler ve Veri Tipleri: Belleğin Dilini Öğrenmek

C programında oluşturduğumuz her değişken, bellekte ayrılmış bir alanı temsil eder. Veri tipi ise derleyiciye bu alanın yaklaşık büyüklüğünü, içindeki bitlerin nasıl yorumlanacağını ve hangi işlemlerin uygulanabileceğini söyler. Kısacası değişken bir kutuysa veri tipi kutunun etiketi, sabit ise kapağı kilitlenmiş kutudur.

c-degiskenler-sabitler-64

Devamı...

C# Arayüzler ve Yapılar: Davranış Sözleşmesinden Verimli Bellek Kullanımına

C# dünyasında interface ve struct, benzer görünen problemlere tamamen farklı yönlerden yaklaşır. Arayüzler bir türün ne yapması gerektiğini söylerken yapılar küçük verileri düşük maliyetle temsil etmeyi amaçlar. Biri davranış sözleşmesi, diğeri değer semantiği sunar. Doğru yerde kullanıldıklarında kodu hem esnek hem de hızlı hâle getirirler; yanlış tercihler ise kutulama, gereksiz kopyalama ve karmaşık tasarım gibi sürprizler doğurabilir.

c-arayuzler-ve-77

Devamı...

B-Ağaçları: Veritabanlarının Diskteki Hız Sırrı

Bir veritabanında milyonlarca kayıt bulunmasına rağmen sorguların birkaç milisaniyede sonuçlanması sihir değildir. Bu başarının arkasında, verileri disk üzerinde akıllıca düzenleyen indeksler ve özellikle B-ağaçları vardır. Dengeli, geniş ve kısa bir yapıya sahip olan B-ağaçları, pahalı disk erişimlerinin sayısını azaltarak aradığımız kayda mümkün olduğunca az adımda ulaşmamızı sağlar.

Devamı...

Üçlü Arama Ağaçları: Trie Hızını Daha Az Bellekle Yakalamak

Bir sözlük uygulamasında binlerce kelimeyi saklamak, otomatik tamamlama yapmak veya belirli bir önekle başlayan kayıtları bulmak istediğinizi düşünün. Trie bu işler için oldukça hızlıdır; ancak her düğümde alfabenin tamamı kadar bağlantı tutması belleği adeta açık büfeye çevirebilir. Üçlü Arama Ağacı, yani Ternary Search Tree (TST), Trie’ın karakter tabanlı yaklaşımını ikili arama ağacının ekonomik bağlantı modeliyle birleştirir.

Devamı...

Soyut Veri Tipleri: İçeriyi Gizle, Güvenli Arayüzler Tasarla

Bir kahve makinesini kullanmak için içindeki pompanın basıncını veya ısıtıcının devresini bilmemiz gerekmez; düğmeye basar, kahvemizi alırız. Soyut Veri Tipleri de benzer biçimde çalışır: Kullanıcıya ne yapılabileceğini gösterirken bunun nasıl yapıldığını gizler. Böylece veri yapıları daha güvenli, değiştirilebilir ve anlaşılır hâle gelir.

Devamı...

Sıralama Algoritmalarında Kararlılık: Eşitler Arasında Düzeni Korumak

Bir sıralama algoritması yalnızca elemanları küçükten büyüğe dizmekle kalmaz; bazen eşit kabul edilen elemanların geçmişine de saygı göstermelidir. İşte kararlılık (stability), aynı sıralama anahtarına sahip elemanların başlangıçtaki göreli sırasının korunmasını ifade eder. İlk bakışta küçük bir ayrıntı gibi görünse de çok alanlı kayıtlar, raporlar ve kullanıcı arayüzleri söz konusu olduğunda sonuçları belirgin biçimde etkiler.

Devamı...

Seyrek Matris-Vektör Çarpımı: Sıfırları Taşımadan Hız Kazanmak

Devasa bir matristeki elemanların büyük bölümü sıfırsa, bu sıfırları bellekte saklamak biraz boş koltuklarla dolu bir otobüsü şehir turuna çıkarmaya benzer. Seyrek matris gösterimleri yalnızca anlamlı değerleri ve konumlarını saklayarak hem bellek tüketimini hem de matris-vektör çarpımının işlem maliyetini azaltır.

Devamı...

Regex Motorunun Perde Arkası: Düzenli İfadeden NFA Simülasyonuna

Bir düzenli ifade yazıp eşleşme arattığımızda küçük bir sihir gerçekleşir: Metinsel desen, durumlar ve geçişlerden oluşan matematiksel bir makineye dönüştürülür. Özellikle klasik regex motorlarında bu makine çoğunlukla bir belirsiz sonlu durum otomatıdır, yani NFA’dır. Gelin (a|b)*abb ifadesinin bir metni nasıl adım adım tükettiğini ve motorun arka planda hangi durumları takip ettiğini keşfedelim.

regex-motorunun-perde-56

Devamı...