<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Tekin Ali</title>
    <link>https://tekinali.com/en/</link>
    <description>Computer Engineer · .NET, iOS &amp; NLP</description>
    <language>en</language>
    <item>
      <title>Top-N per group in SQL: matching the query to your data</title>
      <link>https://tekinali.com/en/blog/first-row-per-group-sql</link>
      <guid>https://tekinali.com/en/blog/first-row-per-group-sql</guid>
      <pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate>
      <description>A guide to selecting the first or top-N row per group in SQL Server, PostgreSQL, EF Core and Spark: how each pattern executes, why data distribution decides which one wins, which indexes they need, and how to verify the choice in the plan.</description>
      <category>sql</category>
      <category>sql-server</category>
      <category>postgresql</category>
      <category>performance</category>
    </item>
    <item>
      <title>Calling async code from sync code in C#: deadlocks, the thread pool and the right approach</title>
      <link>https://tekinali.com/en/blog/calling-async-from-sync-csharp</link>
      <guid>https://tekinali.com/en/blog/calling-async-from-sync-csharp</guid>
      <pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate>
      <description>How blocking on a Task deadlocks UI apps and starves the thread pool in ASP.NET Core, what to do when blocking is unavoidable, where ConfigureAwait(false) and .NET 8's ConfigureAwaitOptions matter, and how hidden async void crashes processes.</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>async</category>
    </item>
    <item>
      <title>Concurrency-safe upserts in SQL Server, PostgreSQL and SQLite</title>
      <link>https://tekinali.com/en/blog/upsert-sql-server-postgresql-sqlite-guide</link>
      <guid>https://tekinali.com/en/blog/upsert-sql-server-postgresql-sqlite-guide</guid>
      <pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate>
      <description>How upserts break under concurrency and how to write them safely: UPDLOCK and SERIALIZABLE or MERGE in SQL Server, ON CONFLICT, MERGE and RETURNING in PostgreSQL, native UPSERT in SQLite, and why INSERT OR REPLACE is not one.</description>
      <category>sql</category>
      <category>sql-server</category>
      <category>postgresql</category>
      <category>sqlite</category>
    </item>
    <item>
      <title>Partitioning in Spark: repartition(), coalesce() and Adaptive Query Execution</title>
      <link>https://tekinali.com/en/blog/spark-repartition-vs-coalesce-aqe</link>
      <guid>https://tekinali.com/en/blog/spark-repartition-vs-coalesce-aqe</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <description>How partition count shapes Spark performance, what repartition() and coalesce() really do, why coalesce(1) can push a whole job onto one task, and how Adaptive Query Execution (on by default since Spark 3.2) handles most partition tuning at runtime.</description>
      <category>spark</category>
      <category>pyspark</category>
      <category>performance</category>
    </item>
    <item>
      <title>Beyond NOLOCK: row versioning, RCSI and SQL Server 2025 optimized locking</title>
      <link>https://tekinali.com/en/blog/why-nolock-is-still-wrong</link>
      <guid>https://tekinali.com/en/blog/why-nolock-is-still-wrong</guid>
      <pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate>
      <description>How NOLOCK really behaves (dirty reads, skipped and duplicated rows, error 601), how RCSI and SNAPSHOT isolation replace it, and what SQL Server 2025 optimized locking adds on top, including its limits.</description>
      <category>sql-server</category>
      <category>concurrency</category>
      <category>performance</category>
    </item>
    <item>
      <title>Main actor, @concurrent and [weak self]: concurrency habits for Swift 6.2</title>
      <link>https://tekinali.com/en/blog/swift-6-2-main-thread-and-weak-self</link>
      <guid>https://tekinali.com/en/blog/swift-6-2-main-thread-and-weak-self</guid>
      <pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate>
      <description>How Swift 6.2's default main-actor isolation, nonisolated(nonsending) and @concurrent change where your code runs, why async does not mean background, and when [weak self] in a Task still matters.</description>
      <category>ios</category>
      <category>swift</category>
      <category>concurrency</category>
    </item>
    <item>
      <title>Keeping text fields above the keyboard in UIKit and SwiftUI</title>
      <link>https://tekinali.com/en/blog/ios-keyboard-covering-text-field</link>
      <guid>https://tekinali.com/en/blog/ios-keyboard-covering-text-field</guid>
      <pubDate>Sat, 05 Sep 2026 00:00:00 GMT</pubDate>
      <description>How the software keyboard interacts with your layout, and the modern tools for it: UIKeyboardLayoutGuide in UIKit, the keyboard safe area in SwiftUI, and @FocusState, onSubmit and scrollDismissesKeyboard for focus and dismissal.</description>
      <category>ios</category>
      <category>uikit</category>
      <category>swiftui</category>
    </item>
    <item>
      <title>Data flow between screens: from UIKit injection to SwiftUI's @Observable</title>
      <link>https://tekinali.com/en/blog/passing-data-between-screens-observable</link>
      <guid>https://tekinali.com/en/blog/passing-data-between-screens-observable</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>Passing data forward and back between UIKit view controllers without singletons, sharing state in SwiftUI with @Observable, @State, @Environment and @Bindable, value-based navigation, and what changed about @State initial values in Xcode 27.</description>
      <category>ios</category>
      <category>swift</category>
      <category>uikit</category>
      <category>swiftui</category>
    </item>
    <item>
      <title>How this site works</title>
      <link>https://tekinali.com/en/blog/how-this-site-works</link>
      <guid>https://tekinali.com/en/blog/how-this-site-works</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate>
      <description>Why I put my CV inside an IDE and a real SQLite database, and how the SQL console below is kept safe.</description>
      <category>dotnet</category>
      <category>sqlite</category>
      <category>security</category>
    </item>
    <item>
      <title>Fast and safe bulk inserts in SQLite: transactions, WAL and iOS</title>
      <link>https://tekinali.com/en/blog/sqlite-insert-performance-ios</link>
      <guid>https://tekinali.com/en/blog/sqlite-insert-performance-ios</guid>
      <pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate>
      <description>Why SQLite bulk inserts are slow by default, the three techniques that fix it, what synchronous=OFF and journal_mode=MEMORY really risk, why WAL with synchronous=NORMAL is a safer default, and how it all applies to Core Data, SwiftData and .NET.</description>
      <category>sqlite</category>
      <category>ios</category>
      <category>dotnet</category>
      <category>performance</category>
    </item>
    <item>
      <title>Service lifetimes in ASP.NET Core: transient, scoped, singleton and the captive dependency trap</title>
      <link>https://tekinali.com/en/blog/transient-scoped-singleton-captive-dependency</link>
      <guid>https://tekinali.com/en/blog/transient-scoped-singleton-captive-dependency</guid>
      <pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate>
      <description>What transient, scoped and singleton really mean, how a scoped DbContext gets trapped in a singleton, how scope validation catches it, and how to handle background services, thread safety, keyed services (.NET 8) and HttpClient lifetimes.</description>
      <category>dotnet</category>
      <category>aspnet-core</category>
      <category>dependency-injection</category>
    </item>
    <item>
      <title>Bulk inserts, updates and deletes in EF Core: from SaveChanges batching to SqlBulkCopy</title>
      <link>https://tekinali.com/en/blog/ef-core-bulk-insert-update-delete</link>
      <guid>https://tekinali.com/en/blog/ef-core-bulk-insert-update-delete</guid>
      <pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate>
      <description>How EF Core's batched SaveChanges differs from the EF6-era approach, how ExecuteUpdate/ExecuteDelete work and where they bite, EF Core 10's conditional setters, SqlQuery for unmapped types, and when to switch to SqlBulkCopy or PostgreSQL COPY.</description>
      <category>dotnet</category>
      <category>efcore</category>
      <category>performance</category>
    </item>
    <item>
      <title>Token counting, conversation state and 429 errors in the OpenAI Responses API</title>
      <link>https://tekinali.com/en/blog/openai-api-token-counting-conversation-state</link>
      <guid>https://tekinali.com/en/blog/openai-api-token-counting-conversation-state</guid>
      <pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate>
      <description>How the OpenAI API has changed, how to count input tokens before a request, three ways to keep conversation state (manual replay, previous_response_id, Conversations API), and how to tell quota errors from rate limits on a 429, with Python and C# examples.</description>
      <category>openai</category>
      <category>ai</category>
      <category>python</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>