Robotikte A* ve RRT: Harita Okuyan Kâşif ile Rastgele Büyüyen Ağaç

Bir robotun başlangıç noktasından hedefe gitmesi, düz bir çizgi çizmekten çok daha karmaşıktır. Duvarlar, hareket kısıtları, robotun boyutları ve bilinmeyen bölgeler devreye girdiğinde bir yol planlama algoritmasına ihtiyaç duyulur. A* ve RRT aynı soruya cevap arasa da bunu tamamen farklı biçimlerde yapar: A* düzenli bir haritada en umut verici hücreleri incelerken RRT, uzaya rastgele dallar uzatan meraklı bir ağaç gibi davranır.

robotikte-a-ve-74

Devamı...

Python’da Sığ Kopya Tuzağı: copy ve deepcopy Arasındaki Kritik Fark

Python’da bir listeyi kopyaladığınızı düşünüp orijinal verinin de değiştiğini görmek, küçük çaplı bir yazılım korku filmidir. Özellikle listeler, sözlükler veya nesneler iç içe geçtiğinde copy() ile deepcopy() arasındaki fark kolayca gözden kaçar. Çünkü ekranda birbirinin aynısı görünen iki değer, bellekte aynı alt nesneleri paylaşmaya devam ediyor olabilir.

Devamı...

Python dict Sırası: Python 3.7 Öncesi Kodlarda Gizli Uyumluluk Tuzağı

python-dict-sirasi-46

Python sözlükleri bugün anahtarları eklenme sırasına göre dolaştığı için oldukça öngörülebilir davranıyor. Ancak eski bir Python sürümünde çalışan projeyi ayağa kaldırdığınızda aynı kodun farklı sırada çıktı üretmesi mümkündür. Bu durum yalnızca estetik bir farklılık değildir; testleri, dosya üretimini, API yanıtlarını ve hatta uygulama mantığını bozabilen sinsi bir uyumluluk problemidir.

Devamı...

PATH Sırası: Terminal Hangi Komutu Çalıştırıyor?

Terminale python, node veya git yazdığınızda kabuk, bu programın nerede olduğunu sihirli biçimde bilmez. Bunun yerine PATH adlı ortam değişkenindeki dizinleri soldan sağa tarar ve eşleşen ilk çalıştırılabilir dosyayı seçer. Dolayısıyla aynı isimli iki komuttan hangisinin çalışacağı, çoğu zaman sürüm numarasından değil dizinlerin sırasından kaynaklanır.

Devamı...

Java’da enum, Autoboxing ve Anotasyonlar: Tip Sisteminin Güçlü Üçlüsü

Java yalnızca sınıflardan ve metotlardan ibaret değildir; dilin tip güvenliğini artıran enum, ilkel tiplerle nesneler arasında köprü kuran autoboxing ve koda metadata ekleyen anotasyonlar da önemli oyunculardır. Bu üç yapı doğru kullanıldığında kod daha okunabilir, güvenli ve otomasyona uygun hâle gelir. Yanlış kullanıldıklarında ise özellikle null, karşılaştırma ve reflection kaynaklı küçük sürprizler hazırlayabilirler.

Devamı...

Java Tarihçesi ve Evrimi: Oak Ağacından JVM Dünyasına

Java, bugün kurumsal uygulamalardan Android ekosistemine kadar pek çok alanda karşımıza çıksa da yolculuğuna web için değil, etkileşimli elektronik cihazlar için başladı. Dilin asıl başarısı yalnızca sözdiziminden kaynaklanmadı; farklı donanımlarda aynı programı çalıştırmayı hedefleyen taşınabilir mimarisi, yazılım dünyasının önemli problemlerinden birine güçlü bir cevap verdi.

Devamı...

Java Operatörleri ve Kontrol İfadeleriyle Program Akışını Yönetmek

Bir Java programı yalnızca yukarıdan aşağıya çalışan komutlardan oluşsaydı, hesap makinesinden biraz daha heyecanlı uygulamalar geliştirmek zor olurdu. Operatörler verileri işlerken kontrol ifadeleri programın hangi yolu izleyeceğine karar verir. Başka bir deyişle operatörler soruları hazırlar, karar yapıları cevapları değerlendirir, döngüler ise gerekli işleri sabırla tekrarlar.

Devamı...

Java Dize İşlemleri: String, StringBuilder ve StringBuffer Rehberi

Java’da metinlerle çalışmak ilk bakışta oldukça basittir: Bir String tanımlar, birkaç kelimeyi birleştirir ve sonucu ekrana yazdırırız. Ancak perde arkasında nesne üretimi, bellek kullanımı, eşzamanlılık ve performans gibi önemli ayrıntılar bulunur. Özellikle döngü içinde binlerce metni birleştiriyorsanız doğru sınıfı seçmek, programınızı kaplumbağadan yarış arabasına dönüştürebilir.

Devamı...

Fazladan Eklem, Fazladan Kaçış: Redundant Robot Kollarda Engel Atlama

Bir robot kolunun görevi yalnızca hedefe ulaşmak değildir; bunu masaya, duvara veya merakla yaklaşan başka bir robota çarpmadan yapması gerekir. Redundant, yani artıklıklı çok eklemli kollar tam bu noktada avantaj sağlar. Uç efektörün konumu değişmeden dirseklerini ve diğer eklemlerini hareket ettirebilen bu robotlar, engeller karşısında adeta “hedefe bakarken belini büken” mekanik akrobatlara dönüşür.

Devamı...

C++ Şablonlarında Specialization ve Overloading: Derleyicinin İnce Seçim Oyunu

c-sablonlarinda-specialization-82

C++ şablonlarında özelleştirme ve aşırı yükleme aynı hedefe gidiyormuş gibi görünür: belirli türlerde farklı davranmak. Fakat derleyicinin gözünde bunlar iki ayrı mekanizmadır. Overloading adaylar arasındaki yarışı belirlerken specialization, yarışı kazanan şablonun özel bir sürümünün bulunup bulunmadığına bakar. Küçük görünen bu sıra farkı, şaşırtıcı sonuçların kaynağıdır.

Devamı...

C# Operatörler ve Program Kontrolü: Kararlardan Döngülere

Bir C# programı yalnızca yukarıdan aşağıya çalışan komutlardan oluşmaz. Değerleri karşılaştırır, koşullara göre karar verir ve gerektiğinde aynı işlemi tekrarlar. Operatörler bu kararların kelimeleri, kontrol blokları ise programın trafik ışıklarıdır. Gelin C# kodunun nasıl düşündüğünü adım adım inceleyelim.

Devamı...

C Karakter Dizileri: Null Karakterinden Güvenli Metin İşlemeye

C dilinde metinlerle çalışmak ilk bakışta birkaç kelimeyi bir değişkende saklamak kadar basit görünür. Fakat C, hazır ve bağımsız bir string veri türü sunmaz. Bunun yerine metinleri, bellekte art arda bulunan karakterlerden oluşan ve özel bir null karakteriyle sonlandırılan diziler şeklinde işler. Bu yaklaşım hem yüksek performans hem de etkileyici bir kontrol sağlar; ancak sınırlar unutulduğunda programı küçük bir bellek mayın tarlasına çevirebilir.

c-karakter-dizileri-59

Devamı...

C++ İstisna Yönetimi: Hataları Güvenle Yakalamak

Bir C++ programı derlenmiş olsa bile çalışma sırasında dosya bulunamaması, belleğin ayrılamaması veya geçersiz veriyle karşılaşılması gibi sorunlar yaşayabilir. İstisna yönetimi, bu beklenmedik durumları programı aniden sonlandırmadan uygun bir noktaya bildirmemizi sağlar. Kısacası throw alarmı çalıştırır, try riskli bölgeyi gözetler, catch ise olaya müdahale eder.

Devamı...

C++ Fonksiyon Aşırı Yükleme: Tek İsim, Birden Fazla Yetenek

Bir hesap makinesindeki “topla” düğmesinin tam sayılar, ondalıklı sayılar ve hatta metinler için farklı davranabildiğini düşünün. C++ fonksiyon aşırı yükleme sayesinde benzer işlemleri yapan fonksiyonlara aynı ismi verebilir, kullanım sırasında hangi sürümün çalışacağını derleyiciye bırakabiliriz. Böylece toplaTamSayilari, toplaOndalikliSayilari gibi isimler üretmek yerine daha sade ve anlaşılır bir arayüz oluştururuz.

Devamı...

SIGTERM Yetmediğinde: kill, SIGKILL ve Güvenli Süreç Sonlandırma

sigterm-yetmediginde-kill-34

Linux veya Unix benzeri bir sistemde donmuş görünen bir programı kapatmak için çoğu kişinin ilk refleksi kill komutudur. Ancak ismine rağmen kill, bir süreci doğrudan ortadan kaldırmaz; ona bir sinyal gönderir. Varsayılan sinyal olan SIGTERM sürece düzenli biçimde kapanma fırsatı verirken, SIGKILL işletim sisteminin devreye girip süreci koşulsuz sonlandırmasını sağlar.

Devamı...

Shell Pipe Zincirlerinde Sessiz Hataları Yakalamak: pipefail Neden Hayati?

Shell pipe operatörü |, bir komutun çıktısını diğerinin girdisine bağlayarak güçlü ve okunabilir iş akışları kurmamızı sağlar. Ne var ki zincirin ortasındaki bir komut başarısız olduğunda son komut başarılıysa bütün işlem başarılı görünür. İşte set -o pipefail, bu sessiz sabotajcıyı görünür hâle getiren küçük ama kritik bir Bash ayarıdır.

shell-pipe-zincirlerinde-32

Devamı...

Shell Alias’ları Script İçinde Neden Ortadan Kaybolur?

shell-aliaslari-script-38

Terminalde neşeyle çalışan ll, gs veya deploy alias’ınız bir shell scriptine taşındığında aniden tanınmayan komuta dönüşebilir. Bu durum bir hata değil, shell’in etkileşimli kullanım ile otomasyonu bilinçli biçimde ayırmasının sonucudur. Gelin alias’ların neden saklambaç oynadığını ve scriptlerde hangi çözümün daha güvenilir olduğunu inceleyelim.

Devamı...

Seri ve Paralel Manipülatörler: Hassasiyet ile Yük Taşıma Yarışı

seri-ve-paralel-53

Bir robot kolundan kahve fincanını nazikçe kaldırmasını da otomobil parçasını milimetrik doğrulukla yerleştirmesini de isteyebiliriz. Ancak hassasiyet, yük kapasitesi ve çalışma alanı aynı tasarımda kolayca zirveye çıkmaz. Robotik manipülatörün seri veya paralel kinematik yapıda kurulması, bu mühendislik pazarlığının sonucunu doğrudan belirler.

Devamı...

Robotik SLAM: Robot Hem Haritayı Hem de Kendini Nasıl Bulur?

Bir robotu daha önce görmediği bir binaya bıraktığımızı düşünelim. Elinde kat planı yok, GPS içeride çalışmıyor ve robot başlangıçta yalnızca kendi sensörlerine güvenebiliyor. Buna rağmen duvarlara çarpmadan ilerlemesi, çevrenin haritasını oluşturması ve bu haritada nerede bulunduğunu anlaması gerekiyor. SLAM, yani Simultaneous Localization and Mapping, tam olarak bu tavuk-yumurta problemini çözer.

Devamı...