Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
JavaScript'te Animasyon ve Scroll API'leri: element.animate, getAnimations, finished Promise'i, scrollIntoView ve scrollend
JavaScript'te animasyonu element.animate ile başlatır, dönen Animation object'iyle yönetir, bitişini finished promise'iyle beklersin; kaydırmada scrollIntoView ve scrollBy ile hedefe gider, işi scrollend ile kaydırma bitince yaparsın. Bookstore'da sepete uçan kapak, checkout'ta hatalı alana gitme ve kitap şeridi oklarıyla, gerçek tarayıcı çıktılarıyla gösteriyoruz.
JavaScript Intl ile Yerelleştirme: Collator ile Türkçe Sıralama, PluralRules, ListFormat, Segmenter, DisplayNames ve DurationFormat
Türkçe sıralama için Intl.Collator("tr"), tekil/çoğul metin için PluralRules, "Dune, Emma ve The Hobbit" için ListFormat, emoji'li yorumda karakter sınırı için Segmenter ve okuma süresi için DurationFormat kullanılır. Bookstore örnekleriyle her birini, tarayıcı farklarını ve instance'ları cache'lemenin neden önemli olduğunu gerçek çıktılarla gösteriyoruz.
HTML'de Global Attribute'lar, Link Türleri ve Inline SVG: data-*, hidden, contenteditable, spellcheck, translate, download, mailto/tel ve Erişilebilir İkon
contenteditable bir form control'ü değildir: plaintext-only zengin metni düz metne çevirir ama not form'la sunucuya gitmez, doğru element textarea. Bu yazıda data-*, hidden="until-found", spellcheck, autocapitalize ve translate'i Chromium ve WebKit'te ölçüyor; tel:, mailto: ve download'ın aynı origin sınırını, erişilebilir SVG ikonları ve <svg hidden> tuzağını Bookstore üzerinde gösteriyoruz.
Angular'da Animasyon: animate.enter, animate.leave, CSS ile Geçişler ve @angular/animations'tan Geçiş
Angular 20.2 ile gelen animate.enter ve animate.leave, element DOM'a girerken ve çıkarken bir CSS class'ı ekleyip animasyonun bitmesini bekler; @angular/animations gerekmez. Bookstore sepetinde satır ve toast animasyonları, prefers-reduced-motion, @starting-style, withViewTransitions ve eski trigger kodundan geçişi anlatıyoruz.
Angular'da i18n: $localize, i18n Attribute'u, ICU Mesajları, ng extract-i18n ve Locale Başına Build
Angular'ın build-time i18n'i metni i18n attribute'u ve $localize ile işaretler, ng extract-i18n ile XLIFF dosyasına çıkarır ve her dil için ayrı bir uygulama build eder. Bookstore arayüzünü TR/EN yapıyor, ICU plural/select, LOCALE_ID, ASP.NET Core'da /tr ve /en yönlendirmesi ile eksik çeviriyi build'de yakalamayı anlatıyoruz.
Angular'da Kendi Form Control'ünü Yazmak: FormValueControl, FormCheckboxControl ve Eski Kodda ControlValueAccessor
Angular 22'de bir component'in form control olması için value = model() yeterli: FormValueControl ve FormCheckboxControl ile adet stepper'ı ve hediye paketi düğmesi yazıyor, aynı control'ü Reactive Forms ve ngModel ile kullanıyor, eski ControlValueAccessor kodunu okuyup taşıyoruz.
Angular Signal Forms Pratikte: form(), Schema, Built-in ve Custom Validator'lar, Async Doğrulama ve submit()
Signal Forms'ta veri bir model signal'inde durur, form() onun üstüne tipli bir FieldTree kurar. Bookstore checkout form'unu schema, built-in ve custom validator'lar, applyWhen/applyEach, debounce'lu validateHttp ile kupon kontrolü ve sunucu hatalarını field'lere dağıtan submit() ile kuruyoruz.
Flutter 3 ve Dart 3'te Gelenler: Impeller, Pattern'ler, Widget Previews, material_ui ve Sırada Ne Var
Dart 3.0 null safety'yi zorunlu yapıp record, pattern ve sealed class getirdi; 3.6–3.13 digit separator'dan primary constructor'a kadar küçük ama günlük kodu değiştiren adımlar attı. Flutter tarafında Impeller, SwiftPM, UIScene, Widget Previews ve 3.44–3.50 arasında Material'in material_ui paketine ayrılması var; dil sürümünün pubspec'ten geldiğini ve yükseltme pratiğini gerçek çıktılarla gösteriyoruz.
Flutter Uygulamasını Yayınlamak: Google Play ve App Store, Signing, Versioning, Flavor'lar ve CI
Flutter uygulaması iki mağazada da aynı yoldan geçer: release build, imzalama, test kanalı, inceleme ve kademeli yayın. Bookstore için sürüm numaralarını, --dart-define-from-file ile ortamları (ve neden secret taşıyamadıklarını), Android upload key ve Play App Signing'i, iOS imzalama ve TestFlight'ı, 2026 mağaza kurallarını ve GitHub Actions'ta imzalı App Bundle build'ini anlatıyoruz.
Flutter'da Test: Unit, Widget ve Integration Test, Fake Repository'ler ve Golden Test
Flutter'da testin omurgası fake repository'lerle yazılan unit ve widget testleridir; mock yalnız "bu çağrı yapıldı mı?" sorusu için, integration_test kritik akışlar için, golden test de tek platformda görsel değişiklikleri yakalamak için. Bookstore'un 86 testi, provider ve go_router'lı checkout akışı, mocktail'in registerFallbackValue tuzağı ve golden'ın platform farkıyla.
Flutter'da Local Storage ve Offline: shared_preferences, flutter_secure_storage, SQLite/drift ve Cache Stratejisi
Flutter'da küçük ve gizli olmayan ayarlar shared_preferences'a, token'lar flutter_secure_storage'a (iOS Keychain, Android Keystore), sorgulanan veri drift ile SQLite'a yazılır. Bookstore'un sepetini drift'e taşıyor, migration ve reactive query'yi deniyor, katalogu fresh cache, ağ ve stale cache sırasıyla internet yokken de gösteriyoruz; ViewModel'ler değişmeden.
Flutter'da API Entegrasyonu: http/dio, JSON Serialization, Repository ve ASP.NET Core Bookstore API'ye Bağlanmak
Flutter uygulamasını bir ASP.NET Core API'ye bağlamanın sağlam yolu, HTTP'yi tek bir ApiClient'ta toplamak (timeout, yalnız GET için retry, 401'de tek refresh), JSON'u domain modeline tek noktada çevirmek ve repository'yi değiştirip ViewModel'e dokunmamaktır. Bookstore API'nin SQLite kopyasına karşı gerçek yanıtlar, ProblemDetails eşlemesi, 10.0.2.2, cleartext ve CORS tuzaklarıyla.