Mert Özen Further With Every Line

Blog

Mert Özen's blog posts on software development, backend, frontend, and DevOps.

Series
49 posts found
Terminal Multiplexing with tmux: Panes, Sessions and Surviving a Dropped SSH Connection
Developer Tools PART 06

Terminal Multiplexing with tmux: Panes, Sessions and Surviving a Dropped SSH Connection

In tmux, shells run inside a background tmux server and your terminal is just a client; that's why a job outside tmux dies when SSH drops while a job inside tmux keeps going (shown with a real experiment). We cover sessions, windows and panes, prefix shortcuts, a development script that opens dotnet watch and ng serve with one command, copy mode, a minimal .tmux.conf that accounts for default changes between tmux 3.4 and 3.8, and the nested tmux and TERM pitfalls.

14 Nov 2026 12 min 2
Modern CLI Tools: a Daily Workflow with fzf, ripgrep, fd, bat, eza, zoxide and jq
Developer Tools PART 05

Modern CLI Tools: a Daily Workflow with fzf, ripgrep, fd, bat, eza, zoxide and jq

Because ripgrep and fd respect .gitignore, they find fewer but correct results than grep in the Bookstore repo, about 90 times faster; fzf is a picker you can put in front of any list. We cover installing the tools with brew, winget and apt (Ubuntu's fdfind/batcat names and old fzf), Ctrl-R/Ctrl-T integration, branch and test pickers, processing API, dotnet package list and npm ls output with jq, and why scripts shouldn't depend on these tools.

14 Nov 2026 12 min 2
A Developer Terminal with PowerShell 7: the Object Pipeline, $PROFILE, PSReadLine and Equivalents for Bash Users
Developer Tools PART 04

A Developer Terminal with PowerShell 7: the Object Pipeline, $PROFILE, PSReadLine and Equivalents for Bash Users

In PowerShell, .NET objects flow through the pipe instead of text, so the Bookstore API's JSON can be filtered and grouped directly with Invoke-RestMethod (prices arrive as doubles; convert to decimal for money). With real output we cover $PROFILE and modules, what the execution policy really protects, winget, a bash equivalents table, curl.exe, what 7.6 LTS brought and 7.4's support ending on 10 November 2026, plus encoding and CRLF pitfalls.

14 Nov 2026 13 min 2
Configuring zsh: .zshrc, Aliases, Functions, Plugins, the Prompt and Startup Time
Developer Tools PART 03

Configuring zsh: .zshrc, Aliases, Functions, Plugins, the Prompt and Startup Time

A good .zshrc is written in a fixed order: history, completion, aliases and functions, plugins, and the prompt last; slowness usually comes not from a framework but from external commands that run on every start. With real measurements we cover when to pick an alias, a function or a script, installing zsh-autosuggestions and zsh-syntax-highlighting by hand, a Starship prompt showing the git branch and the .NET version, and a completion cache that took startup from 206 ms to 21 ms.

14 Nov 2026 12 min 2
Being Fast from the Keyboard: Line Editing Shortcuts, History Search, Tab Completion and CLI Completions
Developer Tools PART 02

Being Fast from the Keyboard: Line Editing Shortcuts, History Search, Tab Completion and CLI Completions

Working with Ctrl-A/E/W/K/Y, Alt-. and Ctrl-R instead of the arrow keys brings most of your speed in the terminal; bash, zsh and PSReadLine share the same shortcut family. We show with a real experiment in three shells how history stores secrets, and cover the right history settings, .NET 10's dotnet completions script, ng completion and the fixes for two completion traps we hit in zsh.

14 Nov 2026 12 min 2
Terminal, Shell, Console and Prompt: Telling Them Apart and the Right Setup for Each OS
Developer Tools PART 01

Terminal, Shell, Console and Prompt: Telling Them Apart and the Right Setup for Each OS

The terminal emulator draws the window, the shell interprets the line you type, and the PTY in between carries keys and signals; they are separate programs, so you install and update them separately. We show with a real experiment which settings file bash, zsh and PowerShell read and when, and give a decision table for PowerShell 7.6 + Windows Terminal + WSL 2 on Windows and zsh on macOS, plus where the repo should live.

14 Nov 2026 13 min 2
What Changed in Diagnostics from .NET 8 to .NET 11: The System.Runtime Meter, New dotnet-trace Profiles, collect-linux, Runtime Async Stacks and In-Process Crash Reports
Developer Tools PART 10

What Changed in Diagnostics from .NET 8 to .NET 11: The System.Runtime Meter, New dotnet-trace Profiles, collect-linux, Runtime Async Stacks and In-Process Crash Reports

.NET 9 replaced the old EventCounters with the System.Runtime Meter, .NET 10 brought new dotnet-trace defaults and collect-linux, and .NET 11 added lossless event buffering, runtime async and in-process crash reports. We give a mapping table from old to new metric names and show, with real runs on .NET 10 and 11, the cpu-sampling and Block mode errors, runtime async stacks before and after a suspension, and crash report output.

14 Nov 2026 11 min 4
Diagnose, Fix, Prove: An End-to-End Performance Case in Bookstore
Developer Tools PART 09

Diagnose, Fix, Prove: An End-to-End Performance Case in Bookstore

The way to solve a performance problem is to measure in order: a wide view with dotnet-counters, the hot path with dotnet-trace, the growing type with gcdump, then proof with BenchmarkDotNet and k6 under the same load. We find that what pushes Bookstore checkout's p99 to 537 ms is not the new JsonSerializerOptions the code review blamed but reading 2,000 rules on every request and a cache that never gets a hit, bring p99 down to 1.5 ms and give a report template.

14 Nov 2026 11 min 4
Diagnostics in Production: dotnet-monitor, Collection Rules, Kubernetes Sidecars and Continuous Profiling
Developer Tools PART 08

Diagnostics in Production: dotnet-monitor, Collection Rules, Kubernetes Sidecars and Continuous Profiling

dotnet-monitor collects traces, gcdumps and dumps through an HTTP API and collection rules, so nobody has to get into the container; rules need Listen mode, and security needs a localhost-bound API, an API key and restricted egress. We run Bookstore with a sidecar on kind, measure rules triggered by slow report requests and by our own meter, the throttling of Limits and the suspend/nosuspend difference, and look at the alpha status of OpenTelemetry Profiles.

14 Nov 2026 11 min 4
Visual Studio and Rider Profilers: CPU Usage, .NET Object Allocation, Instrumentation, Database and Async Tools
Developer Tools PART 07

Visual Studio and Rider Profilers: CPU Usage, .NET Object Allocation, Instrumentation, Database and Async Tools

IDE profilers give the fastest results on a developer machine; Visual Studio's Database tool shows an N+1 as hundreds of short queries with the same text. On Bookstore's My Orders page we measure, by reading the same events from the command line, that lazy loading sends 80 SQL commands per request and clogs the thread pool, raise throughput 30-fold with Include and 41-fold with a projection, and place the Copilot Profiler Agent and Rider's dotTrace/dotMemory counterparts.

14 Nov 2026 11 min 6
Deep Analysis with PerfView: GC Stats, JIT Stats, Grouping/Folding and Diffing Two Traces
Developer Tools PART 06

Deep Analysis with PerfView: GC Stats, JIT Stats, Grouping/Folding and Diffing Two Traces

PerfView's power lies in GroupPats, Fold%, diffs and the GCStats/JITStats reports; since they all rest on the TraceEvent library, you can run the same analysis in code on Linux. In Bookstore we diff two traces to find that 2.6 seconds of a regression is GC waiting, measure with JITStats that ReadyToRun cuts the methods JIT-compiled at startup only from 980 to 928, and build a CI allocation gate whose noise we measured first.

14 Nov 2026 13 min 4
Hunting Memory Leaks: dotnet-gcdump, Heap Snapshot Diffing and Common Leak Patterns
Developer Tools PART 05

Hunting Memory Leaks: dotnet-gcdump, Heap Snapshot Diffing and Common Leak Patterns

A memory leak is found not with a single snapshot but with the difference between two gcdumps taken under the same load and the retention path that holds the growing object from a root. In Bookstore we catch, with dotnet-gcdump, a scoped handler that subscribes to a singleton event and never unsubscribes, taking the heap from 17.8 MB to 348.5 MB in 20,000 requests; we compare gcdump with full dumps, prove the fix with a third snapshot and list common leak patterns.

14 Nov 2026 11 min 4
Blog Map