All posts
IT Literacy for Non-Developers #5: Git and Version Control — How Many People Edit One Codebase
This post explains, without any code, what developers mean by commit, push, merge, and PR. It closes the series by unpacking Git and version control - the way many people edit the same code without losing track of versions - at a non-developer's level.
K8s Basics #7: Namespaces and Labels — Organizing the Cluster
One thing slipped past quietly through this series — every Pod, Deployment, Service, ConfigMap, and Secret we created landed in the default namespace. And labels have been with us since [#4](/en/posts/k8s-basics-4)'s selector but never got their own pass. This post wraps the series with the two tools — Namespace and labels — that turn a cluster into something a human can read, and previews the next track (K8s Intermediate).
Modern Python Intermediate #5: Decorator patterns
Every form of decorators that wrap functions — basic form, parameterized decorators, functools.wraps, class decorators, and ParamSpec.
TypeScript Basics #7: Utility Types and tsconfig
Standard utility types you will use every day (Partial/Pick/Omit/ReturnType, etc.) and the key tsconfig.json options that control compile behavior — wrapping up the series.
Angular Intermediate #2: Template-driven Forms and a Comparison
Angular's other form approach — Template-driven Forms — and how it compares to the Reactive Forms we just covered. Which one to pick when, and why.
AWS Intermediate #3: S3 — static hosting and presigned URLs
AWS's oldest object storage, S3. The shape of a bucket and the global uniqueness of names, policies and Public Access Block, static site hosting, presigned URLs, and how to lower cost with storage classes.
Django Intermediate #2: ORM Advanced — annotate, aggregate, F/Q, prefetch_related
The proper Django ORM tools — aggregation, expressions, complex conditions, relation prefetch. The N+1 problem and how to solve it.
Docker Advanced #2: Multi-Architecture Images — amd64 and arm64 Together
The "image built on Apple Silicon doesn't run on the production server" incident vanishes with one multi-arch build line. The shape of a manifest list, the cost of QEMU emulation, native ARM builders, and verifying results with docker buildx imagetools.
K8s Basics #6: ConfigMap and Secret — Splitting Out Configuration
Through [#5](/en/posts/k8s-basics-5), one thing in our manifest is still awkward — image tags, ports, and domains are written directly into it. This post pulls those out into two objects: ConfigMap and Secret. The K8s way to apply the 12-factor "store config in the environment" rule, three injection methods (env / envFrom / volume), the one-line caveat that Secret is not actually encryption, and why a Pod restart is needed when config changes.
Modern Python Intermediate #4: Iterables/generators/yield from
How for works — the iterable protocol, generator functions and expressions, delegation with yield from, and send/throw — all in one place.
RHEL Intermediate #5: Log Management — journald, rsyslog, log rotation
RHEL 9 uses journald as the primary log tool and rsyslog as the secondary, with text log files rotated automatically by logrotate. This post covers journald's retention policy and disk usage control, rsyslog's continuing role as the old-guard standard, the flow of collecting logs on a central server, and how to write logrotate rules from scratch — all from an operational perspective.
TypeScript Basics #6: Generics in Depth
Tools that draw out the real expressive power of generics — constraints, multiple type parameters, generic interfaces/classes, keyof, and indexed access types.