Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Yeni Makineyi Tek Komutla Kurmak: Brewfile, WinGet Configuration, mise ile Runtime Sürümleri ve Bootstrap
Yeni bir makineyi tek komutla kurmanın yolu işi katmanlara ayırmak: makine araçlarını Brewfile ya da WinGet Configuration kurar, proje sürümlerini global.json ve mise.toml ile mise sabitler, dotfiles'ı chezmoi uygular, projeyi just setup hazırlar. Bookstore'un tekrar çalıştırılabilir bootstrap script'lerini, WinGet dosyasının şema doğrulamasını, mise'nin trust sorusunu ve eksik araçları kendiliğinden kuran mise exec'i gösteriyoruz.
Dotfiles: Ayarlarını Git'te Tutmak, chezmoi veya Stow ile Senkronlamak ve Secret Sızdırmamak
Dotfiles'ı Git'te tutmanın üç yolu var: bare repo, GNU Stow ve chezmoi; birden çok işletim sistemi ve secret varsa chezmoi en az elle iş bırakanı. Üçünü sahte bir home klasöründe deniyoruz: bare repo'da add -A tuzağı, Stow'un .config klasörünü katlaması ve --adopt'un repo'yu ezmesi, chezmoi'de template, .chezmoiignore, Windows çıktısını --override-data ile görmek, age şifrelemesi ve gitleaks'in yakalamadığı uydurma token.
Proje Komutlarını Tek Yerde Toplamak: justfile, Makefile, npm scripts, dotnet tool ve C# file-based app
Proje komutlarını README yerine repo'daki bir justfile'da topla ve CI'ın da aynı recipe'yi çağırmasını sağla. Bookstore'un justfile'ını (parametre, .env, [parallel] ile API ve Angular'ı birlikte başlatma, Windows için PowerShell), Makefile ve npm scripts karşılaştırmasını, yerel .NET tool manifest'ini, dnx'in -- tuzağını ve .NET 10 file-based app ile yazılmış seed aracını gerçek çıktılarla gösteriyoruz.
Kendi Proje Template'in: dotnet new ile Bookstore Şablonu ve Angular Schematics'e Kısa Bakış
dotnet new template'i, içinde .template.config/template.json olan sıradan bir .NET solution'ı; sourceName, parametreler ve koşullu içerikle yeni bir Bookstore servisini tek komutta üretir. Template'i paketlemeyi, yerel feed'den kurmayı, port generator'ı, NoDefaultExcludes eksikliğinin düşürdüğü .dockerignore'u, 1.1.0 güncellemesinin eski projeleri değiştirmediğini gösteren diff'i ve Angular'da özel bir schematic'i gerçek çıktılarla anlatıyoruz.
Snippet ve Live Template Yazmak: VS Code, Visual Studio ve Rider'da Kendi C# ve Angular Kısayolların
Snippet, dilin syntax'ı yüzünden her seferinde yazdığın küçük iskeletler için doğru araç; tekrar eden mantık için değil. Bookstore'un xUnit v3 testi, minimal API endpoint group'u, EF Core configuration'ı ve Angular 22 component'i için VS Code snippet'lerini, namespace'i dosya yolundan üreten transform'u, Visual Studio .snippet ve Rider live template karşılıklarını ve snippet dosyasını sessizce ignore eden .gitignore satırını gösteriyoruz.
Localhost'u İnternete Açmak ve Mock Server'lar: Dev Tunnels, Cloudflare Tunnel, ngrok, Prism ve WireMock.Net
Ödeme sağlayıcısının webhook'unu localhost'taki Bookstore.Api'ye almak için bir tünel gerekir, ama API'yi koruyan şey tünel değil imzadır. HMAC imzası ve zaman toleransıyla çalışan webhook endpoint'ini yerelde gerçek çıktıyla deniyor, Dev Tunnels, Cloudflare quick tunnel ve ngrok'u erişim ayarlarıyla karşılaştırıyor, Prism'le OpenAPI'den 401 ve 422 dönen bir mock, WireMock.Net'le senaryo ve gecikmeli kargo mock'u kuruyoruz.
HTTP Trafiğini Yakalamak: mitmproxy ve Fiddler ile Tarayıcının, HttpClient'ın ve Angular Dev Server'ın İsteklerini Görmek, Değiştirmek ve Tekrar Oynatmak
Bookstore.Api'nin kargo API'sine giden HTTPS isteğini görmek için mitmproxy'yi 127.0.0.1'de çalıştırıp HttpClient'ı HTTPS_PROXY ile ona yönlendiriyor, CA'yı sisteme değil yalnız o client'a veriyoruz. Python addon ile cevabı 3 saniye geciktirip timeout ve retry'ı gerçek çıktıyla izliyor (kullanıcı 503 alırken kargoda üç teklif oluşuyor), filtre, kayıt ve replay'i, Angular dev server ile Chromium'un loopback istisnasını ve Fiddler'ın modlarını karşılaştırıyoruz.
jq ve yq Derinlemesine: Komut Satırında JSON ve YAML Sorgulamak, Dönüştürmek ve Düzenlemek
jq olmayan bir alanı hata değil null olarak döndürür ve boş sonuçta da 0 ile çıkar; CI'da koşul olarak kullandığın her filter'a -e ekle. Bookstore.Api, kubectl, dotnet list package ve GitHub API çıktılarıyla select, group_by, reduce inputs, --arg/--argjson ve @csv'yi; yq ile image tag'ini yorumları koruyarak güncellemeyi, iki farklı yq'yu ve Windows tırnaklamasını gerçek çıktılarla gösteriyoruz.
JSON Schema ile Configuration'ı Doğrulamak: Editor IntelliSense, SchemaStore ve CI'da Validation
.NET binder yazım hatalı bir ayar key'ini sessizce yok sayar; JSON Schema'da additionalProperties: false bu hatayı dosyayı yazarken ve CI'da yakalar. Bookstore.Api için 2020-12 şeması yazıp SchemaStore, VS Code eşlemesi, YAML şema yorumu, check-jsonschema, ajv ve JsonSchema.Net ile doğruluyor; draft karışıklığını ve format'ın her yerde kontrol edilmediğini gerçek çıktılarla gösteriyoruz.
TOML, INI, .env ve Diğerleri: Hangi Configuration Formatı Ne Zaman?
Dosyayı kimin okuyacağına göre seç: tek okuyucu .NET ise JSON ve environment variable yeterli, aynı .env'i birden fazla araç okuyorsa en katı ortak alt kümeyle yaz. Aynı .env'i Compose, Node.js, dotenv, python-dotenv ve bash'le; aynı INI'yi .NET, Python ve git'le okuyup farkları, TOML 1.1'in tarih tiplerini ve Bookstore.Api ayarının beş formatta tek configuration'a dönüşmesini gösteriyoruz.
YAML 2: Multiline String'ler, Anchor/Alias, Merge Key, Çoklu Doküman ve KYAML
Script'i | ile, uzun metni > ile yaz; secret gibi tek satırlık değerlerde |- kullan, yoksa sona \n eklenir. Merge key (<<) YAML 1.2'de yok: Compose, kubectl ve kubeconform destekliyor, GitHub Actions desteklemiyor, js-yaml 5 ise ayar istiyor. Çoklu doküman, anchor'ın doküman sınırı, güvensiz tag'ler, KYAML ve Bookstore için bir yamllint kural setini gerçek çıktılarla gösteriyoruz.
YAML 1: Syntax, Tipler ve "Norway Problem": Bir YAML Dosyasını Doğru Okumak
Tırnaksız bir YAML değerinin tipini parser'ın uyguladığı kural seti belirler: YAML 1.1'de NO false, 12:30 sayı, 0755 sekizlik; YAML 1.2'de üçü de farklı. PyYAML, ruamel.yaml, js-yaml, YamlDotNet, yq, Docker Compose ve kubectl'i aynı dosyayla çalıştırıp Bookstore'un compose.yaml ve Kubernetes manifest'indeki üç gerçek tip hatasını gösteriyoruz.