Hexagonal Architecture 101

Kurumsal uygulamaları göz önüne aldığımızda zaman içerisinde birçok yazılım mimarisinin ortaya çıktığını görüyoruz. Programlama dillerinin gelişim, framework'lerin ortaya çıkması ve değişen müşteri ihtiyaçları sonucunda bu kavram çok daha büyük önem kazandı. Belki de her şey üç katmanlı(3-tier) yaklaşımla başlamıştı. Geldiğimiz zaman diliminde ise monolit sistemlerin modüler hale getirildiğiği Modulith'lerden mikro servislere, soğan halkaları benzetmesi ile popülerleşen Onion mimariden, servis odaklı yaklaşıma kadar birçok stil var. Bazı kaynaklarda yazılım mimarileri katmanlı(Layered) ve dağıtık(Distributed) olmak üzere iki ana kategoriye de ayrılıyor. Üzerinde uzun uzun konuşulacak olan bu kavramları elbette deneyimleyerek görmek en güzeli. Bende bir süredir bakmak istediğim Hexagonal mimari yaklaşımını öğrenmeye karar verdim ve işte karşınızdayım. Gelin .net üzerinde bu mimariyi çok temel seviyede de olsa uygulamalı olarak anlamaya çalışalım. [Daha fazla]

Microsoft DotNet Platformunda Bir MCP Server Yazmak

MCP(Model Context Protocol), yapay zeka araçları için tool desteği sağlamak amacıyla kullanılan bir protokol olarak düşünülebilir. Anthropic tarafından geliştirilmiş bir standarttır. Bu protokolün geliştirilmesinde amaç yapay zeka araçlarına belli bir standart dahilinde harici araç desteği sunabilmektir. Genel senaryoda bir dil modeline gitmeden önce bu protokol üzerinden hizmet veren MCP Server`lara gidilerek sağlanan araçlar kullanılabilir. Araçlar da arka planda çoğunlukla REST API hizmetlerini çağırır ama bu zorunluluk değildir. Bir başka deyişle MCP server'ın sağladığı araç seti arka planda sarmalladığı herhangi bir başka araca da gidebilir. MCP, yapay zeka araçları için standart bir protokol sunduğundan tüm MCP server'lar bir yapay zeka aracı tarafından çağırılabilir. [Daha fazla]

Copilot SDK ile İlk Deneyimler

İçimiz dışımız, sağımız solumuz yapay zekadan geçilmiyor. Öyle bir dönemdeyiz ne ona burun kıvırabiliriz ne de her şeyimizle teslim. Halen daha işin özünde problemi anlamanın, parçalara bölebilmenin, doğru metodolojileri ve araçları kullanarak ideal çözüm yollarını geliştirebilmenin önemli olduğunu düşünüyorum. Bunun içinde kendimizi donatmaya devam etmemiz gerektiğini biliyorum. Ayrıca yapay zeka araçlarını tanımanın ve yazılımcılara ne gibi avantajlar ya da tam tersi dezavantajlar getireceğini de araştırmalıyız diyorum. Ne yazık ki yapay zeka denildiğinde onu sadece chat-gpt'den ibaret bir şey olduğunu düşünenler var. Bunun böyle olmadığını deneyimlediğim araçlar bana gösteriyor. Tanımak lazım. İşte bugünkü yazımızın konularından birisi de bu; Microsoft'un Copilot SDK paketini kullanarak neler yapabilirizin basit bir Hello World demosu. [Daha fazla]

Bunu Bir Dene 00 - Metot Argümanlarında Değişiklik (C#, Rust ve Zig)

C# programlama dilinde sınıf nesne örnekleri(Class Object Instance) metotlara varsayılan olarak referans türü(reference type) olarak iletilir. Bu, metot içinde yapılan değişikliklerin çağıran tarafı etkileyebileceği anlamına gelir. Bu çalışmada söz konusu senaryonun Rust ve Zig gibi programlama dillerinde nasıl ele alındığını incelemeye çalışıyorum. Sırf meraktan...Başlamadan şu notu düşmek isterim; Çalışmamdaki amaç üç dili birbiriyle kıyaslamak değil, her bir dilin bu tip senaryolardaki yaklaşımını incelemek. Normal koşullarda bir stok takip programını Rust veya Zig ile geliştirmeyi tercih etmem. [Daha fazla]

Project Lighthouse Social

Project Lighthouse Social, C# ile uçtan uca bir Web projesi geliştirilme serüvenidir. Konu, dünya üzerindeki deniz fenerlerine ait fotoğrafların paylaşıldığı, yorumlandığı ve puanlandığı bir sosyal platform hazırlamaktır. Projede mümkün mertebe yazılım dünyasının efsane konularına olan ihtiyaçları ortaya koymaya çalışmak ilk amaçlarımdan birisidir. Örneğin, hiçbir mimari kalıba uymadan sadece belli prensipleri (soyutlamalar, bağımlılıkları tersine çevirme, sorumlulukları dağıtma vs gibi) baz alarak bir proje iskeleti oluşturup, sonrasında sorularla yaklaşımın doğruluğunu değerlendirmek, açık noktaları tespit etmek ve standartlaşmış bir mimari kalıba çevirmek gibi. [Daha fazla]

Ollama Yardımıyla Deepseek Dil Modelini .Net Platformunda Kullanmak

Yakın zamanda AI hizmetlerini .Net uygulamalarına adapte edebilmek için iki soyutlama paketi tanıtıldı. Microsoft.Extensions.AI ve Microsoft.Extensions.AI.Abstractions. Bu kütüphanelerden yararlanarak birçok dil modelini basit metot çağrıları ile kullanabiliyoruz. OpenAI, Azure OpenAI, Azure AI Infrence ve Ollama kullanabileceğimiz servislerden birkaçı. Bu servisler birçok dil modelini çalıştırmak için birer sunucu olarak da hareket ediyorlar. Microsoft .Net kütüphaneleri ise bu servisleri kullanmak için gerekli fonksiyonellikleri sağlayarak kullanımı kolaylaştırıyor. [Daha fazla]

Switch Case Kullanmadan Kod Yazılabilir mi?

Bu yazıda switch case kullanmadan nasıl kod yazabileceğimizi anlamaya çalışacağız. İşin içerisine SOLID(Single Responsibility, Open Closed, Liskov Substituion, Interface Segregation, Dependency Inversion) ilkelerinden open-closed principle ve tasarım kalıplarından Strateji girecek. Eğlenceli olduğu kadar Sonarqube bulgularını memnun edecek bir kod parçasını nasıl geliştirebileceğimizi göreceğiz. [Daha fazla]

Dependency Injection'ın TDD'deki Yeri

Test odaklı yazılım geliştirirken özellikle entegrasyon testlerinde(Integration Tests) yaşadığımız önemli sorunlardan birisi de test edilen nesnelerin diğer nesnelerle olan bağımlılıklarıdır. Söz gelimi test edilmek istenen birimin bağımlılıkları arasında servis çağrıları, veritabanı operasyonları veya uzak sunucu dosya hareketleri gibi işlemler söz konusuysa otomatik olarak çalıştırılan birim testlerinin CI sürecini sekteye uğratmaması için bir şeyler yapılması gerekebilir. Biliyorum çok karışık bir paragraf ile işe başladım. O yüzden problemi ortaya koymak adına aşağıdaki kod parçalarını göz önüne alalım. [Daha fazla]

JSON to BSON

Amacımız çalışan listesinin içeriğini BSON formatında bir dosyaya yazdırmak ve sonrasında bu içeriği tekrar okuyup ters-serileştirme işlemini gerçekleştirerek ekrana yazdırmak. [Daha fazla]

Tek Fotoluk İpucu 133 - Yüklü OLEDB Provider Listesinin Bulunması

Malumunuz büyük çaplı sistemler kolay kolay yenilenmiyorlar. Ancak teknolojik gereklilikler ve değişen ihtiyaçlar ister istemez bu yaşayan organizmaların yeni sunucular üzerinde hayata devam etmelerini gerektirebiliyor. Yeniden yazma maliyetlerinin yüksek olduğu durumlarda var olan sistemin kullandığı pek çok bileşenin de bu sunucular ile uyumlu olması gerekiyor(bekleniyor). Uyumlu olmayanların yerine geçici çözümler uygulanıyor. Tabii mümkün mertebede. Bazen yeni sunuculara taşınan sistem üzerinde yıllardır yaşamını sürdüren C,C++ gibi derlendikten sonra pek de geri çevrilip içeriği görülemeyeccek kodlar da söz konusu oluyor. Böyle bir durumla karşı karşıya kalırsanız vay halinize. Ben ve değerli ekip arkadaşım bu durumdam çok çektik. [Daha fazla]

Oracle View' ları için Otomatik DataTable' lar Üretmek

Üzerinde çalıştığımız ve uzun süredir canlı ortamda yaşamakta olan eski bir ürünümüz geçtiğimiz günlerde kod kalite taramalarından birisine girdi. Vaktinde her zaman olduğu gibi alel acele yazılmak zorunda olan kodlar bir kaç ana kategori altında çeşitli tipte ihlallere yakalandı. Bunlardan birisi de Strongly Typed DataSet kullanımına ilişkindi. [Daha fazla]

Tek Fotoluk İpucu 128 - IFormattable ile Sihir

Bildiğiniz üzere .Net Framework çatısı altında bir çok arayüz(Interface) vardır. Özellikle plug-in tabanlı geliştirmelerde sıklıkla başvurduğumuz bu arayüzleri zaman zaman inceliyor ve nerelerde kullanılabileceğine bakıyorum. Yine bu araştırmaları yaptığım bir gün IFormattable arayüzünün kullanımına ilişkin örnekler ile karşılaştım. Senaryomuz şu; bir nesne örneğini String sınıfının Format metodu ile kullanırken {0:JSON} gibi bir ifade kullanabilmek ve çalışma zamanı içeriğini JSON(JavaScript Object Notation) formatında elde etmek istiyoruz. Hatta {0:ALL} , {0:ID,Title} gibi ifadelere de yer vermek istiyoruz. [Daha fazla]

Hamming Distance Algoritmasının Basit Kullanımı

Hamming Distance, Amerikalı Matematikçi Richard Hamming tarafından bulunmuş olan ve kodlama teorisinde geçen vektör bazlı bir karşılaştırma algoritmasıdır(Bu adresten teori hakkında biraz bilgi alabiliriz) Programlama tarafından baktığımızda çoğunlukla eşit uzunluktaki içeriklerin benzerliklerine ilişkin bir mesafe ölçüsünün bulunmasında kullanılır. Bu sayede bir metnin diğerine dönüştürülebilmesi için kaç adımlık değişime ihitiyaç duyulduğu da hesaplanabilir. Ya da benzerliğin ne kadarlık bir değere denk geldiği anlaşılabilir. Hata tespiti ve düzeltilmesi, grafik dosyaları üzerinden şekil eşleştirmelerinin(Shape Recognation) yapılması gibi hesaplamalarda kullanılmaktadır. Aslında örnekler ile konuyu daha iyi anlayabiliriz. Basit düşünmeye çalışalım ve aşağıdaki gibi bir kaç kelime çiftini ele alalım. [Daha fazla]

Bir Tip Ağacındaki Aynı İsimli Özelliklere Değer Atamak

Çalışmakta olduğumuz projelerde zaman zaman bizi zorlayan vakalar ile karşılaşıyoruz. Bu gibi durumlarda Google abimiz en büyük yardımcımız olabiliyor. Hatta pek çoğumuz sorunların çözümünde Stackoverflow gibi kaynaklardan yararlanıyor ya da daha deneyimli birisinden yardım istiyor. Ne var ki bazı vakaları kendimiz çözmeye çalışsak çok daha yararlı olabilir. [Daha fazla]

Tek Fotoluk İpucu 122 - Regex ile MatchEvaluator Kullanımı

Vaktiyle zamanında üyelerine çeşitli finansal verilerden harmanlanmış metinsel içerik sağlayan bir kurum varmış. Bu kurum geliştirme döneminde bakmış ki verinin boyutu epeyce büyük. Ne yapalım ne edelim derken, üretilen metinsel içerikte çok sık tekrar eden bazı karakterler olduğunu fark etmişler. "Nasıl yapsak da bu çok sayıda tekrar eden karakteri metin içerisinden kırpsak ama bütünün anlamını bozmasak" demişler. Bunu üzerine tekrar eden kısımların yerine geçecek ve orada bunlardan kaç tane olduğunu ifade edecek basit söz dizimleri kullanmaya karar vermişler. Demişler ki, örneğin @9@ geçen bir aslında 9 tane 0 karakterini ifade etsin. [Daha fazla]

TCP Bazlı Soket Haberleşmesinde Sertifika Kullanımı

Günümüzde geliştirilen yazılım ürünleri çoğunlukla farklı uygulamalar ile de konuşmak durumunda. Sistemler sürekli birbirleri ile konuşan parçalar bütünü halinde genişlemeye devam ediyor. Akıllı cihazlar büyük ölçekli sistemlerin birer parçası olup çeşitli iş süreçlerinin işletilmesinde rol alıyor. Bu iletişimde servislerin de yeri var. [Daha fazla]

Biyütıful Kod - Ninject ile Bir Dependency Injection Macerası

Her yazılım geliştirici özellikle büyük bir projeye girdiğinde kodlarının kaliteli olması için uğraşır. Bu yönde adımlar atar. Çoğu zaman bu bir sanata dahi dönüşebilir. Okunabilir kodlar oluşturmanın dışında, mimari açıdan büyüleyici olan, yeniden kullanılabilirliğin üst seviyede olduğu, fazla uğraşılmadan genişleyebilen ürünler ortaya çıkartmak en büyük gayelerden birisi haline gelir. Martin Fowler' ın ilkeleri sıkı sıkıya takip edilir. Kurumsal çözüm içerisinde Fluent API' ler kullanılmaya, "Dependency Injection Container" gibi kavramlar konuşulmaya başlanır. Ne kadar başarılabilir bilinmez ama amaçlardan birisi de Biyütıful Kodu ortaya çıkartmaktır. [Daha fazla]

NLog için Oracle Database Kullanmak

Daha önceden Log4Net aracını incelemiş ve pek çok projede kullanmıştım ama hayat bizi farklı kaynaklarla çalışmaya da itebiliyor. Öyle ki yakın zamanda popüler loglama araçlarından olan NLog kütüphanesini kullanma fırsatı buldum. Ve bu sefer gerek kayıt altına alınacak bilgiler gerekse logun yazılacağı ortam biraz farklıydı. Log’ ların veritabanına, kurumun Audit mekanizmasına uygun kurallar dahilinde yazılması zorunluydu. Yıllarca alışkın olduğum SQL Server yerine bu kez karşımda Oracle vardı. Ve sonuçta bir vaka çalışması ortaya çıktı. Haydi gelin senaryomuz ile makalemize başlayalım. [Daha fazla]

C# 6.0–Yeni Esintiler

İngilizce kelime anlamı Build olan inşa etmek(yapmak, kurmak) üzerine bu aralar uzak uzak diyarlarda da yapılmakta olan konuşmalar da var. Evet tahmin ettiğiniz gibi Microsoft’ un Build etkinlikleri dolayısıyla yazılım dünyasında hareketli günler yaşanmakta. Yeni ürünler, var olan ürünlere eklenen yeni özellikler, gelecek ile ilişkili planlamalar ve diğerleri. Konuşulabilecek ve üzerinde durulabilecek pek çok konu var. Benim dikkatimi çeken nokta ise bir süredir varlığından haberdar olduğumuz ve şu anda Roslyn’ in End User Preview sürümü ile Visual Studio 2013 üzerinden anında inceleyebileceğimiz C# 6.0 dili ile ilişkili yeni kabiliyetler. Bu yazımızda söz konusu yeteneklerden bir kaçına kısaca değinmeye çalışacağım. Amacımız öncelikli olarak söz konusu bu yeteneklerin ne olduklarını kavrayabilmek. [Daha fazla]

Excel İçeriğini DataSet Olarak Sisteme Katmak

Bazen geliştirme ortamımız ile yazılan uygulamanın taşınacağı ortamlar arasında ciddi ve keskin farklılıklar bulunur. İki resim arasındaki 9 farkı bulunuzdan öte, geliştirici ekiplerinin bu farkları bilerek kodlama yapmasında yarar vardır. Tabi bazı yazılım ekiplerinde Development sunucularının sanallaştırılmış versiyonları üzerinde geliştirme yapabilme imkanı da vardır. [Daha fazla]

Fluent Interface Prensibi ile Daha Okunabilir Kod Geliştirmek -2nci Yarı

Bir önceki görsel dersimizde Fluent Interface prensibini nasıl kullanabileceğimizi görmüştük. Bu sefer Generic tip kullanan bir versiyonunu geliştireceğiz. İşin içerisine Generic mimari Reflection kavramı ile Expression<> ve Func gibi tipleri de katacağız. Amacımız sadece belirli bir tip için değil bazı kıstaslara uyan her hangibir T tipi için Fluent Interface prensiplerini uygulatabilmek. Buyrun izleyelim. [Daha fazla]

Fluent Interface Prensibi ile Daha Okunabilir Kod Geliştirmek - 1nci Yarı

Keşfedilmesi, anlaşılması ve okunması kolay kod geliştirmek, özellikle dışarıya açık arayüzü bulunan API’ ler için oldukça önemlidir. Bir Domain Specific Language’ in olmassa olmazı kodun kolayca keşfedilebilirliğidir. Ruby ve Scala gibi diller built-in olarak bu kolaylığı sunarlar. LINQ(Language INtegrated Query) ifadeleri, zincir şeklinde bir birlerine bağlanabilen Extension metodlar ile aynı esnekliği vermektedir. Test süreçlerinde kullanılan pek çok Mock nesne API’si benzer kabiliyetlere sahiptir. Tüm bunlar aynı prensipten yararlanır. Fluent Interface… Bu görsel dersimizde Martin Fowler tarafından yıllar önce ortaya konan yaklaşımın uygulanışını incelemeye çalışıyoruz. [Daha fazla]

Dosya Satır Sayısını Bulmak

Malum Bankaların sistemleri halen daha eski olabildiğinden, bölümler arası veya uygulamalar arası veri aktarmanın en popüler yollarından birisi olarak Text tabanlı dosya formatları göz önüne alınmaktadır. Bazen onlarca megabyte' ı aşan ve milyonlarca satırdan oluşabilen düzenli text dosyaları söz konusu olur ve bunların bir şekilde uygulamaların konuştuğu veritabanı ortamlarına işlenerek, ilişkisel veri bütünlüğü içerisinde yerlerini alması beklenir. [Daha fazla]