Mert Özen Her Satırda Daha İleri

Blog

Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.

Seriler
347 yazı bulundu
Dosya Tabanlı Entegrasyon: SFTP ve FTP ile Dosya Alışverişi, Klasör İzleme, Idempotent İşleme ve Reconciliation
Backend SERİ 11

Dosya Tabanlı Entegrasyon: SFTP ve FTP ile Dosya Alışverişi, Klasör İzleme, Idempotent İşleme ve Reconciliation

Dosya tabanlı entegrasyonda dosyayı ancak karşı taraf hazır olduğunu işaretlediğinde (.done ya da geçici adla yükleyip rename) okursun, host key'i doğrularsın ve işlenen dosyaları içeriğin hash'iyle bir ledger'a yazarsın; böylece yarım ya da iki kez işleme olmaz. Bookstore'da tedarikçinin SFTP'deki stok dosyasını SSH.NET ile, bankanın FTPS'teki tahsilat dosyasını FluentFTP ile alıp siparişlerle mutabakat yapıyoruz.

15 Kas 2026 12 dk 7
.NET'ten SOAP Servislerine Bağlanmak: dotnet-svcutil, WCF Client, WS-Security, Sertifikalar ve Resilience
Backend SERİ 10

.NET'ten SOAP Servislerine Bağlanmak: dotnet-svcutil, WCF Client, WS-Security, Sertifikalar ve Resilience

.NET'ten bir SOAP servisine dotnet-svcutil ile WSDL'den üretilen interface, kendi kurduğun binding ve ChannelFactory ile bağlanırsın; resilience HTTP seviyesinde değil operasyon seviyesinde kurulur, çünkü SOAP fault'ları HTTP 500 ile gelir ve WCF çağrıları CancellationToken almaz. Bookstore'da kurumsal faturaları UsernameToken ve mTLS ile sahte bir e-Fatura entegratörüne gönderiyor, ETTN ile retry'ı güvenli hâle getiriyoruz.

15 Kas 2026 13 dk 10
MVC'de Request'ler Arası State: TempData, Session, Cookie ve Query String — Hangisi Ne Zaman?
Backend SERİ 15

MVC'de Request'ler Arası State: TempData, Session, Cookie ve Query String — Hangisi Ne Zaman?

Filtre için query string, tercih için onaylı cookie, anonim sepet için Data Protection ile korunan cookie, çok adımlı form için Redis'li session, flash mesaj için TempData. Bookstore.Web'i iki instance'ta çalıştırıp bellek içi session'ın formu sessizce sıfırladığını, ayrı key ring'in sepeti boşalttığını ve çerez onayının TempData'yı nasıl kapattığını gerçek çıktılarla gösteriyoruz.

15 Kas 2026 14 dk 9
MVC ve Razor Pages'te Hata Sayfaları: UseExceptionHandler, Status Code Page'leri, Özel 404/500 View'ları ve Hata Kimliği
Backend SERİ 14

MVC ve Razor Pages'te Hata Sayfaları: UseExceptionHandler, Status Code Page'leri, Özel 404/500 View'ları ve Hata Kimliği

Sayfalar için UseExceptionHandler ve UseStatusCodePagesWithReExecute kullan: status code korunur, adres değişmez; WithRedirects 302 ve 200 ile soft 404 üretir. Bookstore.Web'de öneri gösteren 404, trace id'li 503 sayfası, /api için ProblemDetails, domain exception'ları için IExceptionHandler ve hata sayfasının kendisinin çöktüğü tuzakları gerçek çıktılarla gösteriyoruz.

15 Kas 2026 12 dk 10
Node.js'te Veri Erişimi Seçenekleri: node:sqlite, pg, Query Builder (Kysely) ve ORM (Prisma) — Hangisi Ne Zaman?
Backend SERİ 22

Node.js'te Veri Erişimi Seçenekleri: node:sqlite, pg, Query Builder (Kysely) ve ORM (Prisma) — Hangisi Ne Zaman?

Node.js'te veri erişimi dört katmanda seçilir: testler ve araçlar için yerleşik node:sqlite, tam kontrol için pg ile düz SQL, derleme zamanı tip güvenliği için Kysely, şema ve migration için Prisma. Gerçek çıktılarla string gelen numeric yüzünden birleşen fiyatlar, INTEGER kolona yazılan metin, SQL Server'da çalışmayacak limit, migrate diff'in yakaladığı ilişki farkı ve dört kitap için beş sorgu üreten N+1.

15 Kas 2026 13 dk 10
worker_threads ile CPU-Bound İş: Worker, MessageChannel, Transferable'lar, Worker Pool (Piscina) ve cluster'dan Farkı
Backend SERİ 21

worker_threads ile CPU-Bound İş: Worker, MessageChannel, Transferable'lar, Worker Pool (Piscina) ve cluster'dan Farkı

Node.js'te CPU-bound iş, event loop'u dondurmamak için worker_threads'e ve tercihen Piscina gibi bir worker pool'a taşınır; büyük veri kopyalanmak yerine ArrayBuffer olarak transfer edilir, worker'dan yalnız özet döner. Gerçek çıktılarla 947 ms donan event loop'a karşı 11 ms, 11 ms'lik kopyaya karşı sıfır kopyalı transfer, transfer edilemeyen pool Buffer'ı, Atomics'siz kaybolan sayaç ve her işte yeni worker'ın 40 kat yavaşlığı.

15 Kas 2026 10 dk 10
node:crypto ile Günlük Kriptografi: randomUUID, Hash, HMAC, scrypt ile Parola, timingSafeEqual ve Web Crypto
Backend SERİ 20

node:crypto ile Günlük Kriptografi: randomUUID, Hash, HMAC, scrypt ile Parola, timingSafeEqual ve Web Crypto

Node.js'te webhook imzası ham body üzerinden createHmac ile hesaplanıp timingSafeEqual ile karşılaştırılır, parolalar scrypt ya da yerleşik Argon2id ile saklanır, hassas alanlar her seferinde yeni IV'li AES-256-GCM ile şifrelenir. Gerçek çıktılarla JSON.stringify yüzünden tutmayan imza, saniyede iki milyonu aşan SHA-256'ya karşı 169 ms'lik scrypt, 16 eşzamanlı girişte 622 MB bellek ve sabit IV'den anahtarsız çözülen telefon numarası.

15 Kas 2026 14 dk 8
Node.js ile Script ve CLI Aracı Yazmak: process, util.parseArgs, Exit Code, readline, child_process ve Sinyaller
Backend SERİ 19

Node.js ile Script ve CLI Aracı Yazmak: process, util.parseArgs, Exit Code, readline, child_process ve Sinyaller

Node.js'te CLI aracı process.argv'yi util.parseArgs ile ayrıştırır, sonucu stdout'a, hataları stderr'e yazar, process.exit yerine process.exitCode ile çıkar ve dış komutları shell'siz execFile/spawn ile çağırır. Gerçek çıktılarla process.exit yüzünden hiç oluşmayan export dosyası, yazım hatasını yakalayan strict parseArgs, terminal yoksa soru sormayan onay, exec ile çalışan command injection ve SIGINT'te geçici dosyasını silen script.

15 Kas 2026 14 dk 9
Node.js'te HTTP Client: fetch, undici, AbortSignal.timeout, Keep-Alive, Streaming Body ve Retry
Backend SERİ 18

Node.js'te HTTP Client: fetch, undici, AbortSignal.timeout, Keep-Alive, Streaming Body ve Retry

Node.js'te dış servis çağrısı global fetch ile yapılır, ama response.ok kontrolü, AbortSignal.timeout, okunan ya da iptal edilen body ve idempotency'ye dikkat eden bir retry olmadan güvenli değildir. Gerçek çıktılarla 404'te çalışmayan catch, 301 saniye bekleyen istek, okunmayan body yüzünden tükenen connection, 329 MB yerine 131 MB ile stream edilen dosya, jitter'sız retry dalgaları ve MockAgent ile test edilen kargo takip client'ı.

15 Kas 2026 15 dk 7
Uçtan Uca: Bookstore Sipariş Belgeleri — Fatura PDF'i, Onay E-postası ve Aylık Excel Raporunun Job Zinciri
Backend SERİ 09

Uçtan Uca: Bookstore Sipariş Belgeleri — Fatura PDF'i, Onay E-postası ve Aylık Excel Raporunun Job Zinciri

Sipariş belgelerini Hangfire ile iki adımlı bir zincire bağla: fatura job'ı PDF'i storage'a yazar, continuation onay e-postasını outbox'a koyar; her adımın anahtarı yazdığı şeyin kendisi olduğu için tekrarlar zararsızdır. Bookstore'da storage kapalıyken yalnız fatura adımı tekrar denendi, aynı sipariş iki kez geldiğinde tek PDF ve tek e-posta çıktı; aylık rapor İstanbul saatiyle recurring job.

15 Kas 2026 11 dk 12
Dosya Depolama Abstraction'ı: Local Disk, Azure Blob Storage ve S3; Presigned/SAS URL ile Doğrudan Yükleme
Backend SERİ 08

Dosya Depolama Abstraction'ı: Local Disk, Azure Blob Storage ve S3; Presigned/SAS URL ile Doğrudan Yükleme

Dosyaları tek bir IFileStore arkasında tut: local diskte path'i iki kez doğrula, Azure Blob ve S3'te indirme ve yükleme için birkaç dakikalık SAS ya da presigned URL ver ve yüklenen dosyayı ancak "tamamla" adımında kontrol et, çünkü storage boyuta ve içeriğe bakmıyor. Bookstore'un faturaları ve kapakları Azurite ve RustFS ile denendi; metadata veritabanında kalıyor.

15 Kas 2026 12 dk 13
.NET'te Görsel İşleme: ImageSharp ve SkiaSharp ile Resize, Format Dönüşümü, EXIF ve Güvenli İşleme
Backend SERİ 07

.NET'te Görsel İşleme: ImageSharp ve SkiaSharp ile Resize, Format Dönüşümü, EXIF ve Güvenli İşleme

Yüklenen görseli önce ilk byte'larından ve piksel sayısından doğrula, sonra EXIF yönünü uygulayıp küçült ve metadata'sız WebP olarak kaydet. Bookstore'un kapak thumbnail'ları SkiaSharp (MIT) ile üretiliyor; ImageSharp 4 Release build'de lisans anahtarı istediği ve metadata'yı varsayılan olarak koruduğu için yalnız Debug örneğinde kaldı.

15 Kas 2026 10 dk 13
Blog Haritası