Meraklı bir bilgisayar programcısının notları.
Merhaba! Ben Burak Selim Şenyurt - yazılım geliştirici, blogger ve öğrenme tutkunu.
Bu blogda yazılım mühendisliği, sistem tasarımı, programlama dilleri ve yeni teknolojiler üzerine yazılar paylaşıyorum. Özellikle .NET, Rust, Zig, yapay zeka araçları ve mimari konularına ilgi duyuyorum. Kendimi sürekli geliştirmeye ve yeni şeyler öğrenmeye adıyorum.
-
Duck Typing Nedir?
Son bir yıldır Ruby ve Python gibi script diller üzerinde araştırmalar yapıyorum. Daha çok bu dilleri öğrenme, anlama gayretindeyim. En azından orta seviye bilgi sahibi olmak benim için yeterli. Bu dilleri incelerken uzun yıllardır çalıştığım dinamik tip sistemli ve derleyici odaklı yaklaşımları da sorgulamak durumunda kalıyoum. Nitekim farklı programlama yaklaşımlarına sahipler.
-
Gopher Olma Çalışmaları
Geçtiğimiz sene Ruby diliye uğraşmaya başlamıştım. Ruby dilini sevenler ve ona gönül verenlere Rubyist deniyor. Benzer bir yaklaşım meğer Go tarafında da varmış. Onlarda kendilerine logolarına esin kaynağı olan Gopher diyorlarmış. Aslında Go dilinin logosu gerçekten bir canlıdan esinlenilerek tasarlanmış. Yaklaşık 15 ila 20 cm boylarında olan gopher’lar oldukça sevimliler (Bana göre) Elbette logo çok daha sevimli. Bu arada Gopher aynı zamanda TCP/IP tabanlı HTTP öncesi bir internet protokolu olarak da geçiyor. Detaylara Wikipedia adresinden bakabilirsiniz.
-
Tek Fotoluk İpucu 151 - C#, Reflection ve About Info
Programlardaki About Info kısımlarını bilirsiniz. Yazdığımız uygulama hakkında bir takım bilgiler verir. Genellikle ürünün adı, bir iki cümle ile ne yaptığı, üreticisi ve hatta versyion numarası ve benzeri bilgiler yer alır. Micorosoft.Net tarafında aslında bu tip bilgileri Assembly’a ait niteliklerde (attribute) belirtiriz. Aynen aşağıdaki ekran görüntüsünde olduğu gibi.
-
Tek Fotoluk İpucu 150 - Sertifika Tabanlı REST Çağrısı Yapmak
Geçtiğimiz günlerde üzerinde çalıştığımız projede şöyle bir ihtiyaç oldu: Uygulamanın şirket ağı dışındaki bir kuruma ait REST (Representational State Transfer) tabanlı servis noktalarını kullanması gerekiyordu. Bu noktalara göndereceğimiz HTTP Get,Post taleplerine göre bir takım sonuçlar alacak ve kurum içi süreçleri işletecekti. Söz konusu servis ve sunduğu EndPoint’ler ile olan iletişim ise X509 standardındaki bir sertifika üzerinden gerçekleştirilmeliydi. Test ortamında yaptığımız çalışmada, sunucu sertifikasının doğrulanması sonrası devreye girecek Callback operasyonunda hata mesajı aldık. Kurumla yaptığımız mutabakat sonrasında ise bu adımı atlayabileceğimizi öğrendik. Çözüm olarak küçük bir hile yaptık. Nasıl mı? Aynen aşağıdaki fotoğrafta görüldüğü gibi.
-
Go Dilini Anlamaya Çalışırken
Liseye başladığım 1990 yılından beri arkadaşım ve aynı zamanda adaşım olan sevgili dostum Burak ile üniversite yıllarında öğrenip oynamaya başladığımız GO oyunu geldi aklıma. Öğrenmesi zor, kavramak için yıllar geçmesi gereken, iyi bir oyuncu olmak için sizden daha iyi birisiyle yine yıllarca maç yapmanızı gerektiren zevkli bir strateji oyunu. Ünlü matematikçi John Forbes Nash’ten Albert Einstein’a, Alan Turing’den Bill Gates’e tarihi değiştiren pek çok kişinin de oynadığı bir oyun.
-
Tek Fotoluk İpucu 149 - SecureString ile Caydırıcılık
Elimizde veritabanı bağlantı bilgisi, kullanıcı şifresi, uygulamamıza özel port numaraları, finansal oranlar gibi hassas olabilecek içerikleri tutan bir sınıf olduğunu düşünelim. Bu sınıfı kullanmak için doğal olarak bir şekilde örneklenmesi gerekir. Nesnenin kullanılabilir olması içeriği ile birlikte belleğe açılması anlamına da gelir. Uygulama,.Net’in çalışma zamanı ortamında kendisi için oluşturulan Application Domain içerisinde yaşar.
-
Ruby Kod Parçacıkları 31 - Kendi gem Paketimizi Hazırlamak
Bildiğiniz gibi günümüz popüler programlama dillerinin çoğunun internet üzerinden ulaşılabilen paket destekleri mevcut. Özellikle açık kaynak tabanlı ürünlerde önem verilen bir konu olduğu ortada. Yazılımcıların birbirlerinin kullanımına açtığı bu paketler Ruby tarafında da mevcut ve gem olarak adlandırılmakta. Hatta şu adresten bir çok değerli mücehvere ulaşabilir kendi paketlerinizi de yükleyebilirsiniz. Peki kendi gem paketlerimizi en basit haliyle nasıl yazabiliriz? Hatta yazdığımız bir gem’i herkesin kullanımına nasıl açabiliriz? Gelin bu konuyu kısaca incelemeye çalışalım.
-
Ruby Kod Parçacıkları 30 - Programın Çalışma Zamanını İzlemek
Diyelim ki geliştirdiğimiz kodların çalışma zamanındaki işleyişlerini izlemek istiyoruz. Sırasıyla hangi nesneler örnekleniyor, çağırılan metodlar ve varsa sonuçları hangi aşamada icra ediliyor, devreye giren C veya block çağrıları bulunuyor mu? Bu gibi sorular aslında bir uygulamayı Monitor etmek olarak da adlandırılmakta. Büyük kod parçalarında işleyiş sıralarını takip etmek ve olası istisna durumlarında kodun hangi aşamada kalmış olduğunu görmek açısından değerli bir konu. Peki Ruby kodlarının çalışma zamanı işleyişlerini nasıl izleyebiliriz. Konu ile ilgili bir çok gem veya API olsa da gömülü olarak gelen TracePoint sınıfı bize basit anlamda izleme kabiliyetleri sunmakta. Aşağıdaki örnek kod parçasını bu anlamda ele alabiliriz.
-
Ruby Kod Parçacıkları 29 - Kod Yazan Kodlar
Ruby programlama dilinin öne çıkan özellikleri arasında dinamiklik ve meta programlama yetenekleri de yer almaktadır. Aslında işin özeti kod yazan kodlardır diyebiliriz. Ruby yorumlamalı bir dildir ve doğal olarak her şey çalışma zamanında icra edilmektedir. Ancak bazı senaryolarda metinsel olarak gelen bir içeriğin kod parçası şeklinde değerlendirilmesi ve çalışma zamanında yürütülmesi istenebilir. Hatta çalışan kod üzerinde değişiklikler yapılabilmesi de belli ölçülerde mümkündür. Konu pek tabii benim burada anlatacağım kadar basit değil. Örneğin Amazon’da bu konu üzerine yazılmış kitaplar bulabilirsiniz. Bu yazımızda kodu çalışma zamanında üretmek veya çalışan kodu manipule etmek için yapılabileceklerden bir kaçına değinmeye çalışacağız.
-
Tek Fotoluk İpucu 148 - Hassas Bilgiyi Hash'leyerek Saklayalım
Yazdığımız bir uygulamada kullanıcının anne kızlık soyadı, kimlik numarası, şifre ve benzeri bilgilerini aldığımızı düşünelim. Bir arayüz üzerinden giriliyor olabilirler. Bu bilgileri herhangibir amaçla veritabanında sakladığımızı varsayalım. Şirket güvenlik politikları gereği ilgili bilgiler açık bir şekilde tutulmamalı. Yani anne kızlık soyadı, şifre veya kimlik numarası gözle okunabilir halde tutulmamalı. Buna göre ilgili bilgileri veritabanı üzerinde maskeleyerek saklamak doğru bir çözüm olabilir. Bunu yapabilmek için akla gelen yollardan birisi de tahmin edileceği üzere Hash algoritmalarına başvurmaktır. Peki güçlü bir Hash algoritması ile bu maskeleme işlemini yapmak ister misiniz? Aşağıdaki fotoğraf size yol gösterebilir.
-
Ruby Kod Parçacıkları 28 - Multithreading ve Mutex Kullanımı
Ruby Kod Parçacıkları serimizin bir önceki bölümünde çoklu iş parçacıklarının (Multithreading) nasıl yazılabileceğini incelemeye başlamıştık. Başrol oyuncumuz olan Thread sınıfının kullanımını gördük. Lakin birden fazla iş parçacığının ele alındığı senaryolarda dikkat edilmesi gereken önemli konulardan birisi de ortak veriler üzerinde işlemler yapıldığında ortaya çıkmaktadır. Eş zamanlı olarak çalışan iş parçacıkları bazı durumlarda verinin tutarlılığının bozulmasına neden olabilir. Nitekim n sayıda iş parçacığının farklı anlarda aynı veri üzerinde işlem yapması söz konusudur. Birbirlerinin işlerini kesebilirler.
-
Tek Fotoluk İpucu 147 - Port Dinlemek
Diyelim ki bir sunucu üzerinde tanımlı portların anlık durumları hakkında bilgi sahibi olmak istiyorsunuz (Örneğin sunucuda SQL Server yüklü ise varsayılan 1433 portu açık mı veya ftp portu cevap verir konumda mı vb) Ruby dilinde bu tip bir işlevselliği gerçekleştirmek son derece basit. Tek yapmamız gereken makine adı ve port bilgisini kullanmak. Nasıl mı? Aynen aşağıdaki fotoğrafta olduğu gibi.
-
Ruby Kod Parçacıkları 27 - Hello Multithreading
Multithreading, programlamanın zor konularından birisidir. Aslında amaç işlemciye aynı andan birden fazla iş yaptırabilmek ya da bir işi parçalara bölerek eş zamanlı olarak yürütebilmektir. İşlemcinin bu farklı iş parçacıkları (Thread) arasında kısa sürelerde geçişler yapması sonucu istenen sonuçlara daha çabuk ulaşılması sağlanır. Bu, performans gerektiren bazı vakalarda oldukça önemlidir. Büyük veri kümelerinde arama yapan algoritmalar, yüksek boyutlu video görüntülerinin render eden programla, çeşitli matematik problemleri, oyun programlama ve daha pek çok alanda çoklu iş parçacığı tekniklerine başvurulur.
-
Ruby Kod Parçacıkları 26 - Eğlenerek Binary Dosya Okumak
Vakit buldukça Ruby programlama dili ile ilgili bir şeyler yapmaya çalışıyorum. Halen daha dilin kabiliyetlerini tanıma aşamasındayım. Geçtiğimiz günlerde de Ruby Cookbook kitabından binary dosyalar üzerinde yapılan işlemlere ait örnekleri inceliyordum. Hoşuma giden uygulamalardan birisi de MP3 dosyalarına ait Tag bilgilerinin elde edilmesiydi. Gerçek hayat örneği olduğundan benim için daha öğretici idi. Örnekleri inceledim ve kendime göre farklılaştırarak basit bir kod parçası oluşturmaya çalıştım.
-
Ruby Kod Parçacıkları 25 - Unit Test Yazmak
İyi yazılım geliştirmenin olmazsa olmaz parçalarından birisi de birim testleridir (Unit Tests) Tahmin edileceği üzere Test Driven Development denildiğinde (aklımızda hemen Red Green Blue - Fail, Fix, Refactoring oluşmalı) birim testleri ön plana çıkmaktadır. Pek çok programlama ortamında birim testler için hazır kütüphaneler yer alır. Ruby dilinde ise standart kütüpanede yer alan Test::Unit modülü kullanılmaktadır. Testlere dahil edilecek savlar (assert diyelim) oldukça geniştir. assert, assert_not_equal, assert_nil, assert_respond_to, assert_raise ve benzeri fonksiyonellikler söz konusudur (Kullanılabilecek savların listesine şuradan bakabilirsiniz) Aşağıdaki kod parçasında basit bir test düzeneğine yer verilmiştir.
-
Ruby Kod Parçacıkları 24 - Binary Tree ve Morse Kodları
Geçtiğimiz günlerde çalışma arkadaşımla aramızda gelişen teknolojiler üzerine bir takım konuşmalar geçti. Amazon Alexa’dır, Facebook’un Face Recognation teknolojileridir, Arduino’dur, Drone’lardır vs derken OCR konusuna da değindik. Bükük duran bir kağıdın fotoğrafını çeken uygulamanın, kağıt üzerindeki şekli düz bir biçimde algılayabilidiğini, bunu yapmak içinse matematik’teki Laplace denklemleri ve Fourier serilerine başvurduğunu öğrendik. Bir Matematik Mühendisi olarak bu dersleri hep teorik olarak okumuştum. Tabii o zamanlarda bu tip denklemlerin gerçek hayat uygulamalarını pek görememiştim. Bu yüzden çoğu teori soyut olarak kalmıştı.
-
Tek Fotoluk İpucu 141 - Dosyadan Rastgele Satır Çekmek
Elinizde N sayıda şarkı adının kayıtlı olduğu fiziki bir dosya olduğunu düşünün. Amacımız ise bu dosya içerisinden rastgele şarkılar çekmek. Ancak bunu yaparken ilgili dosyanın tamamını belleğe açmak istemiyorsunuz. Nitekim dosyayı okuma modunda açıp readlines gibi bir metod ile tüm içeriğ okuduktan sonra içinden rastgele bir satırı seçme yolunu tercih edebilirsiniz. Ama bu büyük boyutlu bir dosyanın tamamen belleğe yüklenmesine de neden olacaktır. Performans ve hız açısından farklı bir şey yapılabilmelidir. Örneğin belleğe sadece o anki satırı okuyup ileri yönlü hareket edecek bir iterasyon kodu geliştirilebilir. Peki Ruby’de bunun için nasıl bir yol izlerdiniz? Aşağıdaki fotoğraftaki gibi olabilir mi?
-
Tek Fotoluk İpucu 140 - Distributed Ruby(dRuby)
Eğitmenlik yaptığım dönemlerde.Net’in en zor alanlarından birisi de Remoting idi. Konu aslında Client-Server mantığına uygun olacak şekilde farklı process’ler arasında veri alışverişinin yapılmasından ibaretti ancak uygulaması web servis geliştirmek kadar kolay olmuyordu. TCP/IP bazlı ağlarda.Net Remoting epeyce iyi performans sergilemekteydi. Özellikle ağ üzerinde hareket eden nesnelerin Binary olarak serileşmesi ve TCP/IP protokolünün devrede olması hız avantajı sağlıyordu. Zaman içerisinde servis odaklı yaklaşımlarda kullanılan WCF gibi alt yapılar.Net Remoting yerine tercih edilmeye başlandı. Dağıtık Uygulamalar (Distributed Applications) olarak geçen bu konu Ruby dilinde de kullanılabiliyor. Üstelik çok çok daha basit. Standart Ruby kurulumu ile birlikte gelen drb modülü bu işler için ele alınmakta (dRuby, Masatoshi Seki tarafından geliştirilmiş bir üründür ve standart Ruby kütüphanesi içerisinde yer almaktadır)
-
Tek Fotoluk İpucu 139 - Singleton Method
Gün geçmiyor ki Ruby dilinde beni şaşırtan bir kabiliyet ile daha karşılaşmayayım. Dün gece Ruby kitapları arasında dolanırken öğrendiğim yeni bir kavram var; Singleton Method. Instance metodlarından farklı olarak sadece belli bir nesne örneği için çalışabilecek fonksiyonellikler tanımlayabilmemizi sağlayan önemli bir yetenek. Yani sınıf tanımı içerisinde yer almayıp nesne örneği üzerinden tanımlanabilen ve sadece o örnek için kullanılabilen fonksiyonlar geliştirebildiğimizi düşünün. Konuyu aşağıdaki fotoğrafta yer alan kod parçasında daha net bir şekilde görebiliriz.
-
Tek Fotoluk İpucu 138 - Bir Web Sayfa İçeriğini İndirmek
Vakti zamanında (90lı yılların ortaları diyelim) internette dolanırken bir şeyler öğrenmeye çalıştığım geliştirici siteleri olurdu. Internet o zamanlar kıymetli olduğundan site içeriklerini offline olarak da dolaşabilmek için bazı yardımcı uygulamaları kullanırdık. O yıllarda Delphi konulu makaleler içeren bir sitenin tüm içeriğini indirdiğimi hatırlıyorum. Geçenlerde bu tip bir uygulamayı nasıl yazabilirim diye düşünerken işe web içeriklerini nasıl indirebileceğimi araştırarak başlayayım dedim..Net tarafında bununla ilgili daha önceden uğraşmıştım ama bu sefer Ruby’yi seçtim. Aşağıdaki ekran görüntüsünde bu işi gerçekleştiren basit bir kod parçasını görebilirsiniz (Fotoğraftaki Zero Hour Maps tab’ına aldırmayın:D)