Robotik Kavramada Stabilitenin Anahtarı: Doğru Temas Noktalarını Seçmek

Bir robotun bardağı kavraması ilk bakışta yalnızca parmaklarını kapatmasından ibaret görünebilir. Oysa parmakların nesneye nerede dokunduğu; bardağın güvenle kaldırılması, kayması veya dramatik biçimde yere düşmesi arasındaki farkı belirler. Grasp planning, geometrik modeller ve fiziksel kısıtlar yardımıyla uygun temas noktalarını seçerek dış kuvvetlere dayanıklı bir kavrama üretmeyi amaçlar.

Devamı...

Python Metaclass: Sınıfları Üreten Gizli Fabrika

Python’da sınıfları genellikle nesne üreten şablonlar olarak düşünürüz. Peki sınıfların kendisini kim üretir? Cevap: metaclass. Metaclass kullanımı; sınıf oluşturulurken doğrulama yapmak, otomatik kayıt mekanizmaları kurmak ve sınıf yapısını değiştirmek gibi güçlü olanaklar sunar. Ancak bu güç, kodu küçük bir büyücülük gösterisine dönüştürebilecek kadar karmaşıktır.

Devamı...

Java Multithreading: Thread’leri Oluşturma, Yönetme ve Senkronize Etme

Bir uygulamanın aynı anda dosya indirip kullanıcı arayüzünü canlı tutması veya binlerce isteğe cevap vermesi gerekiyorsa sahneye çok iş parçacıklı programlama çıkar. Java, Thread sınıfından modern ExecutorService araçlarına kadar bu konuda güçlü seçenekler sunar. Ancak birden fazla iş parçacığı aynı veriye dokunduğunda işler, aynı buzdolabındaki son tatlıya uzanan iki el gibi hızla karışabilir.

Devamı...

Çoklu Robotlarda Görev Tahsisi: Optimizasyon Neden Bu Kadar Zor?

Bir depoda onlarca robotun paket taşıdığını düşünün. Hangi robot hangi paketi almalı, görevler hangi sırada yapılmalı ve bataryası azalan robot ne zaman şarja gitmeli? İlk bakışta basit bir iş bölümü gibi görünen bu problem, seçeneklerin sayısı büyüdükçe kombinatoryal bir canavara dönüşür. Çoklu robot görev tahsisi, robotların yeteneklerini ve görevlerin gereksinimlerini eşleştirirken zaman, enerji ve mesafe gibi maliyetleri en aza indirmeyi amaçlar.

coklu-robotlarda-gorev-73

Devamı...

chmod 777: Kolay Çözüm Gibi Görünen Büyük Güvenlik Riski

Linux üzerinde bir dosya çalışmadığında veya uygulama erişim hatası verdiğinde internette sıkça şu öneriyle karşılaşırız: chmod 777 dosya. Komut sorunu saniyeler içinde çözebilir; ancak bunu yapmak, kilidi açmak yerine kapıyı tamamen sökmeye benzer. Gelin 777 sayısının arkasındaki mantığı ve neden üretim sistemlerinde ciddi bir güvenlik riski oluşturduğunu inceleyelim.

Devamı...

C# Veri Tipleri ve Literaller: Stack, Heap ve Kimlik Meselesi

C#’ta bir değişken tanımlarken yalnızca hangi veriyi saklayacağımızı değil, o verinin nasıl kopyalanacağını, nerede tutulacağını ve yaşam döngüsünün nasıl yönetileceğini de seçeriz. Bu seçimin merkezinde değer tipleri (struct) ile referans tipleri (class) bulunur. İkisi bazen aynı görünebilir; fakat atama işlemi gerçekleştiğinde sahne arkasında bambaşka davranırlar.

Devamı...

C Operatörler ve İfadeler: Sayılardan Bitlere İşlem Rehberi

C dilinde değişkenler verileri saklarken operatörler bu verileri harekete geçirir. Toplama yapmak, iki değeri karşılaştırmak, koşulları birleştirmek veya sayının bitlerini değiştirmek için operatörlerden yararlanırız. Kısacası değişkenler mutfağın malzemeleriyse operatörler bıçak, kaşık ve mikserdir; doğru aracı doğru yerde kullanmak gerekir.

Devamı...

C++ Kalıtım: Sınıflar Arasında Akıllı Bir Miras Sistemi

Bir yazılım projesinde aynı özellikleri tekrar tekrar yazmak hem zaman kaybettirir hem de bakım maliyetini artırır. C++ kalıtım (inheritance) mekanizması, mevcut bir sınıfın veri ve davranışlarını yeni sınıflara aktararak bu tekrarı azaltır. Kısacası kalıtım, kod dünyasındaki “aileden gelen özellikler” sistemidir; fakat hangi özelliğin kime kalacağını erişim belirleyicileri kontrol eder.

Devamı...

C# İndeksleyiciler ve Özellikler: Nesnelere Kontrollü Erişim

C#’ta bir nesnenin içindeki verilere erişmek için her zaman uzun metot çağrıları yazmak gerekmez. Özellikler (properties) alanları güvenli biçimde yönetirken, indeksleyiciler (indexers) nesnelerin dizi veya sözlük gibi kullanılmasını sağlar. Böylece hem okunabilir hem de kapsülleme ilkesine uygun sınıflar tasarlayabiliriz.

Devamı...

C++ İçindeki C Alt Kümesi: Temelden Modern C++’a

C++, nesne yönelimli programlama, şablonlar ve standart kütüphane gibi güçlü özelliklere sahip olsa da dilin kalbinde C’den miras alınan önemli bir sözdizimi bulunur. Değişkenler, operatörler, koşullar, döngüler, fonksiyonlar, diziler ve işaretçiler bu ortak temelin parçalarıdır. Bu yapıları öğrenmek yalnızca eski C kodlarını anlamayı değil, C++’ın düşük seviyeli çalışma mantığını kavramayı da kolaylaştırır.

Devamı...

C# Generics: Tür Güvenli ve Performanslı Koleksiyonların Sırrı

Bir kutuya kalem koyup daha sonra içinden kahve kupası çıkarmayı beklemezsiniz. C# koleksiyonlarında da benzer bir düzen gerekir: Eklenen ve alınan değerlerin türü önceden bilinmelidir. Genel türler, yani generics, bu düzeni derleme zamanında sağlayarak çalışma anındaki sürpriz tür dönüşümü hatalarını azaltır ve özellikle değer türlerinde daha iyi performans sunar.

Devamı...

C Fonksiyonları: Argümanlardan Özyinelemeye Tekrar Kullanılabilir Kod

C programlarında her işi main fonksiyonuna yüklemek, bütün eşyaları tek çekmeceye doldurmaya benzer: Başlangıçta kolay görünür, fakat aradığını bulmak kısa sürede işkenceye dönüşür. Fonksiyonlar, büyük problemleri adlandırılmış ve tekrar kullanılabilir küçük parçalara ayırır. Böylece kod daha okunabilir, test edilebilir ve değiştirilebilir hâle gelir.

c-fonksiyonlari-argumanlardan-91

Devamı...

C++ API Tasarımında Değer Semantiği mi, Referans Semantiği mi?

c-api-tasariminda-87

Bir C++ API’sinin bir nesneyi kopyalaması mı, yoksa mevcut nesneye erişim sağlaması mı gerektiği küçük bir imza tercihi gibi görünebilir. Oysa bu karar; sahiplikten performansa, hata ayıklamadan eşzamanlılığa kadar bütün tasarımı etkiler. Kısacası Widget ile Widget& arasındaki tek karakterlik fark, bazen bakım maliyetinde destan yazdırır.

Devamı...

C++ Akış ve Dosya G/Ç Sistemi: Verinin Yolculuğunu Yönetmek

C++ programlarında veri bazen klavyeden gelir, bazen ekrana gider, bazen de bir dosyada yıllarca uyumayı bekler. Akış sistemi, verinin kaynağıyla hedefi arasındaki bu yolculuğu ortak ve nesne yönelimli bir arayüz üzerinden yönetir. Böylece geliştirici, klavye ile dosya arasında geçiş yaparken tamamen farklı yöntemler öğrenmek zorunda kalmaz.

c-akis-ve-62

Devamı...

Async Kodun Gizli Freni: Bloklayan Çağrılar Event Loop'u Nasıl Durdurur?

Python’da async ve await kullanmak, kodun otomatik olarak hızlı veya tamamen eşzamanlı çalışacağı anlamına gelmez. Asenkron bir fonksiyonun içine sıradan, bloklayan bir çağrı yerleştirirseniz diğer görevler beklemeye başlar. Tek şeritli bir yola park edilen kamyon gibi, küçücük görünen bu çağrı bütün event loop trafiğini durdurabilir.

Devamı...

Shell’de Tek ve Çift Tırnak: Değişkenler Ne Zaman Konuşur?

Shell dünyasında tırnak işaretleri yalnızca boşluk içeren metinleri bir arada tutmaz; değişken genişletmesinin, komut çalıştırmanın ve özel karakterlerin yorumlanmasının kaderini belirler. Tek tırnak her şeyi olduğu gibi saklayan ciddi bir güvenlik görevlisiyken, çift tırnak bazı genişletmelere izin veren daha esnek bir kapı görevlisi gibidir.

shellde-tek-ve-81

Devamı...

ROS Mimarisi: Düğümler Arası Mesajlaşma ile Modüler Robotlar

Bir robotu tek parça hâlinde programlamak, bütün müzisyenlerin aynı enstrümanı çaldığı bir orkestra kurmaya benzer: Gürültü çıkar ama yönetmesi zordur. ROS (Robot Operating System), robot yazılımını küçük ve bağımsız düğümlere (node) ayırır. Sensör okuma, haritalama, rota planlama ve motor kontrolü gibi görevler farklı düğümlerde çalışır; aralarındaki iletişim ise standart mesajlaşma mekanizmalarıyla sağlanır.

ros-mimarisi-dugumler-64

Devamı...

Python’ın Sessiz Tuzağı: Değişebilir Varsayılan Argümanlar

Python’da bir fonksiyonun varsayılan argümanına boş liste vermek son derece masum görünür. Ne yazık ki bu küçük kolaylık, farklı fonksiyon çağrılarının aynı listeyi paylaşmasına ve programın adeta önceki konuşmaları hiç unutmayan bir asistana dönüşmesine neden olabilir. Gelin bu sürpriz davranışın arkasındaki mantığı ve güvenli çözümünü inceleyelim.

Devamı...

Python Import Tuzakları: Modül Düzeyindeki Kodun Gizli Yan Etkileri

python-import-tuzaklari-84

Python’da bir modülü içe aktarmak çoğu zaman masum görünür: Bir import yazarsınız ve ihtiyacınız olan fonksiyonlara ulaşırsınız. Fakat modül düzeyinde bulunan kod; dosya okuma, ağ bağlantısı kurma, veritabanını değiştirme veya ekrana mesaj basma gibi işler yapıyorsa, yalnızca import işlemi bile uygulamanın durumunu beklenmedik biçimde değiştirebilir. Kısacası kapıyı çalarken mutfağın yeniden dekore edilmesi mümkündür!

Devamı...

Python GIL: CPU-Bound Thread’ler Neden Hızlanmıyor?

Python’da dört çekirdekli bir işlemciye dört thread verince programın yaklaşık dört kat hızlanmasını beklemek oldukça doğaldır. Ancak yoğun matematiksel hesap yapan kodunuz hızlanmak yerine bazen daha da yavaşlayabilir. Suçlu işlemciniz değil; klasik CPython yorumlayıcısında Python bytecode’unun aynı anda yalnızca bir thread tarafından çalıştırılmasına izin veren Global Interpreter Lock, yani GIL’dir.

Devamı...