
Bir robot koluna eklem açılarını verdiğinizde elinin nereye gideceğini bulmak genellikle düzenli bir hesap işidir. Ancak elin ulaşmasını istediğiniz noktayı verip gerekli eklem açılarını sorduğunuzda işler bir anda matematiksel bir bulmacaya dönüşür. İleri kinematik ile ters kinematik arasındaki temel zorluk farkı, aynı hareket zincirine iki farklı yönden bakmalarından kaynaklanır.
Devamı...
Bir robota “motoru iki saniye çalıştır” demek ile “hedef konuma ulaşana kadar motoru çalıştır” demek aynı şey değildir. İlk komutta robot yalnızca verilen talimatı uygular; ikinci komutta ise bulunduğu konumu ölçerek davranışını sürekli düzeltir. Açık döngü ve kapalı döngü kontrol arasındaki temel ayrım, sistemin kendi sonucundan haberdar olup olmamasıdır.

Devamı...
Bir robot kolunun hedef konuma yıldırım gibi ulaşıp birkaç kez ileri geri sallanması mı, yoksa ağır çekimde ilerleyerek hedefi şaşmadan bulması mı daha iyidir? PID kontrolcü ayarlarken karşılaşılan temel ikilem tam olarak budur: hızlı tepki ile düşük aşım arasında dengeli bir nokta bulmak.
Devamı...

Python öğrenirken is ve == bazen aynı sonucu veriyormuş gibi görünür. Özellikle küçük tam sayılarla yapılan denemelerde iki operatörün de True döndürmesi, aralarında gerçek bir fark olmadığı yanılgısını doğurabilir. Oysa biri değerleri, diğeri nesnelerin kimliğini karşılaştırır; küçük tam sayı önbelleklemesi ise bu farkı geçici olarak gizleyen küçük bir illüzyondur.
Devamı...
Bir uygulamada her şey planlandığı gibi gitmez: Dosya bulunamaz, kullanıcı sayı yerine metin girer veya ağ bağlantısı aniden kesilir. Java istisna yönetimi, bu beklenmeyen durumları kontrollü biçimde karşılayarak programın dramatik bir şekilde sahneden düşmesini engeller. Amaç hataları gizlemek değil; onları anlamlı, izlenebilir ve güvenli bir akış içinde yönetmektir.
Devamı...
Komut satırında her metin problemi bir çivi gibi görünüyorsa, elimizdeki ilk komutu çekiç olarak kullanmak cazip gelir. Böylece grep ile hesap yapmaya, sed ile sütun toplamaya veya awk ile yalnızca bir kelime aramaya çalışırız. Sonuç bazen çalışır; fakat okunabilirlik, taşınabilirlik ve bakım kolaylığı sessizce pencereden kaçar.

Devamı...
C++’ta sanal fonksiyonlar çalışma zamanlı polimorfizmin yıldızıdır; varsayılan parametreler ise çağrıları kısaltan kullanışlı yardımcılardır. Ancak bu iki özellik aynı fonksiyonda buluştuğunda küçük bir sürpriz ortaya çıkar: Çalıştırılan fonksiyon türetilmiş sınıfa aitken kullanılan varsayılan değer temel sınıftan gelebilir. İlk bakışta çelişkili görünse de sebep, C++ derleyicisinin iki kararı farklı zamanlarda vermesidir.
Devamı...
Bir C++ kurucusu çalışırken istisna fırlatırsa nesne hiçbir zaman tamamen oluşmuş sayılmaz. Bu nedenle nesnenin kendi yıkıcısı çağrılmaz. Kurucu içinde elle edinilmiş bellek, dosya veya kilit gibi kaynaklar varsa bu davranış kolayca sızıntıya dönüşebilir. Neyse ki C++’ın üye yıkım kuralları ve RAII yaklaşımı, doğru kullanıldığında yarım kalan inşaatı güvenli biçimde temizler.
Devamı...
C++ şablonları, aynı algoritmayı farklı türlerle kullanmayı sağlayan güçlü bir mekanizmadır. Fakat derleyicinin bir türü başarıyla çıkarması, ilgili şablonun sorunsuz biçimde üretileceği anlamına gelmez. Bazen masum görünen bir fonksiyon çağrısı, derleyiciyi henüz hazır olmayan bir gövdeyi örneklemeye zorlar ve ekranı uzun, hiyeroglif benzeri hata mesajlarıyla doldurur.
Devamı...
Bir STL konteynerinde dolaşırken eleman silmek, ilk bakışta son derece masum görünür. Ancak yanlış kullanılan tek bir erase, yineleyiciyi geçersiz hâle getirerek tanımsız davranışa, atlanan elemanlara veya yalnızca cuma akşamları ortaya çıkan gizemli çökmelere neden olabilir. Bu tuzağın kaynağı, her konteynerin elemanlarını bellekte farklı biçimde saklamasıdır.
Devamı...
Bir oyun geliştirdiğimizi ve ekranda savaşçı, büyücü, okçu gibi farklı karakterlerin bulunduğunu düşünelim. Her karakter saldırır, ancak saldırma biçimleri birbirinden farklıdır. C++ çok biçimliliği, bu nesneleri tek bir ortak arayüz üzerinden yönetirken doğru davranışın çalışma zamanında seçilmesini sağlar. Böylece uzun if-else zincirleri yerine genişletilebilir ve bakımı kolay bir tasarım elde ederiz.

Devamı...

C++ dünyasında bir nesne her zaman göründüğü şey olmayabilir. Elinizde Karakter* türünde bir işaretçi bulunurken, işaret edilen gerçek nesne bir Buyucu veya Savasci olabilir. Çalışma Zamanı Tür Bilgisi, yani RTTI (Run-Time Type Information), program çalışırken bu gerçek kimliği öğrenmemizi ve kalıtım hiyerarşilerinde güvenli dönüşümler yapmamızı sağlar.
Devamı...
Bir uygulamanın aynı anda birden fazla iş yapabilmesi kulağa sihir gibi gelebilir; ancak C# dünyasında bu sihrin arkasında iş parçacıkları, görevler ve dikkatli bir zamanlama mekanizması bulunur. Task Parallel Library (TPL) CPU ağırlıklı işleri paralelleştirirken async/await, özellikle dosya, ağ ve veritabanı gibi beklemeli işlemlerde iş parçacıklarını gereksiz yere meşgul etmeden ölçeklenebilir uygulamalar kurmamızı sağlar.
Devamı...
Bir C programı çalışırken değişkenler çoğunlukla RAM’de yaşar ve program sonlandığında sahneden sessizce çekilir. Oysa kullanıcı kayıtları, ayarlar veya ölçüm sonuçları gibi verilerin yeniden kullanılabilmesi için diske yazılması gerekir. C’nin File I/O araçları, geçici bellek ile kalıcı depolama arasında bir köprü kurar.
Devamı...
Bir zamanlar robot geliştirmek; pahalı laboratuvarlara, özel üretim devrelere ve kalın mühendislik kitaplarına erişmeyi gerektiriyordu. Arduino ve Raspberry Pi gibi açık kaynaklı donanım platformları ise bu tabloyu önemli ölçüde değiştirdi. Öğrenciler artık birkaç sensör, motor ve internetten erişilebilen örneklerle çalışan bir robot geliştirebiliyor. Böylece robotik eğitimi, yalnızca uzmanların bulunduğu laboratuvarlardan çıkarak sınıflara, atölyelere ve hatta mutfak masalarına kadar ulaşıyor.
Devamı...

Bir robotu kilometrelerce uzaktan yönetmek, ekrandaki görüntüye bakarak oyun oynamaya benzeyebilir. Ancak komut ile hareket arasındaki gecikme büyüdüğünde oyun kumandası hissi kaybolur; robot adeta geçmişten gelen talimatlarla hareket etmeye başlar. Özellikle cerrahi, afet müdahalesi, uzay araştırmaları ve tehlikeli madde operasyonlarında birkaç yüz milisaniyelik gecikme bile operatörün hızını, doğruluğunu ve güvenini ciddi biçimde etkileyebilir.
Devamı...
Shell betiklerinde bir komutun çıktısını başka bir komutun argümanı yapmak oldukça yaygındır. Bunun için modern $(...) söz dizimini veya eski backtick biçimini kullanabiliriz. İkisi basit örneklerde aynı sonucu üretse de iç içe komutlar, kaçış karakterleri ve bakım kolaylığı devreye girdiğinde aralarında ciddi farklar ortaya çıkar.

Devamı...

find ile binlerce dosyayı aradıktan sonra üzerlerinde işlem yapmak istediğimizde iki popüler seçenek karşımıza çıkar: -exec ve xargs. İkisi de bulunan yolları başka bir komuta aktarır; ancak süreç oluşturma maliyeti, özel karakter içeren dosya adları ve güvenilmeyen dizinlerle çalışma konusunda davranışları aynı değildir. Yanlış seçim betiği yalnızca yavaşlatmaz, beklenmedik dosyaların işlenmesine de yol açabilir.
Devamı...
Bir döngü içinde birkaç lambda oluşturup her birinin farklı değeri hatırlamasını beklersiniz. Ardından hepsi aynı sonucu döndürür ve Python masumca size bakar. Bu davranış bir hata değil; closure’ların değişkenleri nasıl bağladığıyla ilgili önemli bir Python kuralıdır.
Devamı...

Python’daki *args ve **kwargs, fonksiyonlara değişken sayıda argüman gönderme özgürlüğü sağlar. Ancak bu özgürlük kontrolsüz kullanıldığında fonksiyon imzası, ne beklediğini söylemeyen gizemli bir kapıya dönüşebilir. Fonksiyon çalışır, testler geçer; fakat onu ilk kez gören geliştirici kendini “Buraya ne göndermem gerekiyor?” diye sorarken bulur.
Devamı...