Words, precision
and power.
The details behind text processing, encoding, and document formats.
✦ AI-powered — understands natural language
How Character Frequency Reveals Who Wrote a Text — Stylometry, Forensic Linguistics, and What It Detects in AI Writing
camelCase vs snake_case Isn't a Style Choice in APIs — It's a Contract, and Changing It Breaks Your Consumers
camelCase in JSON APIs is a contract, not a preference — switching to snake_case between API versions is a breaking change even if field semantics are identical. Here's how case style encodes mutability (SCREAMING_SNAKE_CASE signals constant), why kebab-case is limited to CSS/HTML/URLs (the hyphen is a subtraction operator in real languages), and the one-boundary transformation pattern that keeps database snake_case, API camelCase, and frontend TypeScript aligned without chaos.
AI-Generated Content Has a Whitespace Fingerprint — Why Normalisation Matters Before Publishing or Processing
AI-generated content carries whitespace patterns — double-line-spacing from training data, inconsistent bullet markers, occasional zero-width Unicode characters — that cause rendering issues when pasted into CMSs. Here's how to normalise whitespace before LLM input (reducing tokens and improving output), why whitespace sensitivity in text diff changes what differences are shown, and the specific Word document whitespace artifacts (non-breaking hyphens, soft hyphens, figure spaces) that appear on export.
The "238 wpm" Average Reading Speed Describes No One Precisely — What Reading Time Estimates Actually Mean
The 238 wpm reading speed used in "8 minute read" estimates comes from a 2019 meta-analysis of college students reading non-fiction prose — it doesn't apply to technical documentation (75-150 wpm), fiction (300-400 wpm), or scanning (700+ wpm). Here's the speed-comprehension trade-off that makes speed reading programs ineffective, how Medium adjusts reading time for images, and why word count reading time estimates are calibrated for English and overestimate reading speed for German while underestimating it for Chinese characters.
CSS text-overflow: ellipsis Hides Text — It Doesn't Remove It: When to Truncate at Display vs Data Layer
CSS text-overflow: ellipsis hides overflowing text but leaves the full content in the DOM — search engines read it, screen readers may announce it, and selecting the text copies the full string. Server-side truncation actually shortens the content before it reaches the client. Here's when each is appropriate, multi-line -webkit-line-clamp, the semantically superior details/summary alternative, and why meta descriptions should be written for readability not display-limit truncation.
When Text Reversal Is a Real Algorithm Tool — Log Analysis, Palindromes, and Why Python's [::-1] Isn't Always Safe
Python's [::-1] reverses code points, not grapheme clusters — reversing "café" with a combining accent produces an accent attached to the wrong character. Here's text reversal beyond visual effects: stack-based reversal in algorithms, line reversal with the Unix tac command for log analysis (most recent first), correct Unicode-aware palindrome detection, and why word-order reversal is used for RTL localization testing before real Arabic/Hebrew text is available.
Why Git Merge Conflicts Occur Exactly Where They Do — Three-Way Merge, diff3, and Semantic Conflicts
Three-way merge — Git's algorithm for combining two branches — uses a third input (the common ancestor) to determine who changed what, enabling automatic combination when edits don't overlap. Here's why merge conflicts occur exactly where they do (both sides changed the same region), the diff3 conflict format that shows the base alongside ours/theirs, why "no merge conflicts" doesn't mean the code is correct (semantic conflicts), and why "ours" and "theirs" flip meaning between git merge and git rebase.
Why sed's s/old/new/g Fails With File Paths — Delimiters, Capture Groups, and the GNU vs BSD sed Difference
sed's `s/old/new/g` fails when patterns contain forward slashes (like file paths) — but any character can be the delimiter: `s|/usr/local|/usr/share|g` works identically. Here's the complete sed substitution syntax including & for matched content and \1 capture groups, the -i in-place editing difference between GNU sed (Linux) and BSD sed (macOS), and why grep-first-then-sed is the workflow that prevents data loss.
Why Testing With Repeated Strings Reveals the Limits Your Code Doesn't Know It Has
String repetition in infrastructure contexts hits non-obvious limits: HTML maxlength vs database VARCHAR mismatches, DNS TXT records' 255-byte string limit requiring splits, HTTP header size limits enforced by the web server not the application, and template engine escaping that expands < to < — multiplying the size 4×. Here's the specific system limits worth testing at (255, 256, 4096, 65535 bytes) and the legitimate production uses for padding and progress bars.
Slug Design Beyond Single Pages — How Hierarchy, Tags, Authors, and Languages Shape Your URL Structure
Flat vs nested slug structures, author page cardinality problems, tag proliferation diluting content quality signals, and when CMS-generated slugs from titles produce wrong results for numbers and acronyms. Here's the slug architecture decisions that affect content series, taxonomies, and international content, plus why the language identifier belongs in the path prefix rather than embedded in the slug itself.
Why Stable Sorting Matters — Multi-Key Composition, Algorithm Stability, and the JavaScript Array.sort Change
A stable sort preserves the relative order of equal elements — which enables multi-key sorting by composing stable sorts. Sort by amount first, then by date (stable): the final result is ordered by date, with amount order preserved within each date. Here's which algorithms are stable (merge sort, Timsort, insertion sort) vs unstable (quicksort, heapsort), why JavaScript's Array.sort stability changed in 2018, and why numbers stored as text sort "10" before "2".
What Does "Duplicate" Actually Mean? The Normalization and Merge Decisions Behind Effective Deduplication
Deduplication is a business logic decision masquerading as a technical one — "duplicate" means different things for contact lists (same email, different fields) vs URL lists (case sensitivity, trailing slashes) vs product catalogs (same SKU, different descriptions). Here's the exact vs near-duplicate distinction, normalization as the preprocessing step that determines deduplication quality, CRM merge strategies, and URL-specific case sensitivity rules.
AR, SK, and 73: The Prosigns and Q Codes That Make Morse Code a Complete Communication Protocol
Morse code prosigns — like AR (end of message / "over"), SK (signing off / "out"), and KN (only the named station should reply) — are a complete communication protocol built into the code. Q codes like QTH (location), QSL (confirm receipt), and QRP (low power) provide internationally standardized shorthand that works across language barriers. Here's how a complete amateur radio Morse contact (QSO) is structured, and why 73 means "best regards."