Notes on Software Engineering
SELECT * FROM posts ORDER BY updated DESC;Log Quad: Domesticate Your Logging Bill
TL;DR: To safely tune your logging bill, you must first understand your log emissions. Evaluate them through the Log Quad: (intents severity frequency code-marker).
Updated:2026-06Published:2026-03
Brain-Work, Brain-Toil and Mentoring AI Agents
TL;DR: see it as a collaborator who has read a thousand books on programming but has never written a single line of code. A collaborator who possesses immense knowledge but lacks any sort of wisdom and insight that comes from experience.
Updated:2026-06Published:2025-10
AI Agents: Rich Oases of Knowledge, Barren Deserts of Wisdom
Everyone keeps writing or sharing about how powerful AI Agents are and how they can fundamentally change the way we do this or that.
Updated:2026-03Published:2025-10
Flow: A Pragmatic Approach to Composable Business Logic in C#
Only recently, after reading the book Effect Oriented Programming, did the true benefits of functional programming fully click for me: the beauty of composition, the containment of side effects, and the decoupling of intent from execution.
This realisation led me to look at a large C# codebase I was working on, a critical service at EarnIn, and see a clear opportunity to apply these ideas.
And so began a journey that led to the creation of Flow.
Updated:2026-03Published:2025-09
Laziness and Impatience - An Engineer’s Journey
I used to have a relatively derelict blog (the one you’re on now) where I would jot down some of my thoughts and experiences…maybe once a year.
Updated:2026-03Published:2025-08
Did we just swap “compilation time” for “completion time”?
I’ve been a software engineer for long enough to have seen our workflows evolve dramatically.
Updated:2026-03Published:2025-08
Shell Scripts: Safe Short/Long Option Parsing
Stop manually parsing $1, $2, etc. in your shell scripts. Use getopt to define and parse arguments like a command-line pro.
Updated:2025-10Published:2025-08
The Tale of Two Teams: How We End Up With Useless Software
Engineering is all about trade-offs and balancing, between absolute correctness (science) and money.
Updated:2026-03Published:2025-08
GNU Make’s Two Personalities: Understanding Simple (:=) vs. Recursive (=) Variables
There are two major flavours of variables in GNU Make: “simple” and “recursive”.
Updated:2025-10Published:2025-08
The Tyranny of Choice: My Case for Opinionated Software
Opinionated software can make familiar workflows simpler and deliver value quickly. In domains without a common path, flexible tools may be the better fit.
Updated:2026-03Published:2025-08
The “Zero Incidents” Trap: Why Chasing Perfection Backfires
The “zero incidents” goal can create a culture of fear that hides small failures and increases risk. Site Reliability Engineering uses SLOs and error budgets to manage risk pragmatically, so teams can innovate while keeping services stable.
Updated:2026-03Published:2025-08
Instantly Test Any Dependency with Groovy or Scala
Use Groovy’s groovysh with Grape, or Scala’s scala-cli, to load JVM dependencies directly into a REPL. Both let you explore a library without setting up a project, and tab completion makes interactive experiments even more useful.
Updated:2025-08Published:2025-02
My awesome Scid setup!
Two screenshots of Scid running on my ThinkPad with openSUSE Tumbleweed.
Updated:2024-12Published:2024-07
GNU Make: Unconditionally Run a Target Before Any Other Target
Define a non-phony target for a file that does not exist, then include that target as if it were a makefile. GNU Make will attempt to update it before processing the requested targets.
Updated:2026-10Published:2023-10
Copy a Firefox Profile to Another Machine
Carry a configured Firefox profile, with its settings, add-ons and bookmarks, to another machine by copying the profile folder.
Updated:2026-10Published:2023-07
Firefox Multi-Account Containers For The Win!
If you use multiple Firefox profiles, want to limit unwanted ads, or are concerned about Facebook tracking you across the internet, try Firefox Multi-Account Containers, an extension developed by the Firefox team. It helps you manage privacy, organise everyday browsing, and keep a cleaner workflow.
Updated:2022-05Published:2022-05
macOS: Open Files and Folders with Emacs
Use an Automator Quick Action to open selected files or the current Finder folder in Emacs, then assign the action a keyboard shortcut.
Updated:2026-10Published:2021-12
Common Lisp Tips and Tricks
Inspect and stop threads in SBCL or Bordeaux Threads, and enable compiler settings that make Common Lisp easier to debug.
Updated:2021-12Published:2020-05
Farewell and thank you, Plone
After nearly nine years with Plone and Zope, I retired my last server as my websites and priorities changed.
Updated:2019-03Published:2019-03
Forth Interpreter and Abstract Machine
A compact diagram traces how a Forth word moves from input through the dictionary and interpreter, using memory, a return stack and a parameter stack.
Updated:2026-03Published:2015-10
Grab Packt With Groovy
Automatically add Packt’s daily free e-book to your account with a self-contained Groovy script.
Updated:2021-12Published:2015-06
Grab Packt With Racket
Use a Racket script to log in to Packt’s free learning offer and claim its daily e-book automatically.
Updated:2021-12Published:2015-06
aria2: An Ultra Fast Download Manager on Linux
Set up aria2 for resumable, parallel downloads, then use it for one-off, batch or scheduled jobs.
Updated:2021-12Published:2015-06
More Thoughts on a JVM-Based Forth
This continuation explores abstraction levels, built-in types, and Java interoperability in a Forth implementation for the JVM.
Updated:2026-03Published:2015-01
Responsibly Upgraded Your Lisp Machine!
A Linux fortune cookie imagines how a new Lisp optimisation works, then makes a rather optimistic speed claim.
Updated:2021-12Published:2015-01
C++ Syntax Intuitiveness: An IQ Test
A real-world example of C++ syntax that made an experienced polyglot stop and look it up.
Updated:2026-03Published:2015-01
How I Made Peace With Ubuntu
A personal account of desktop Linux from 2008 to 2014, and why Ubuntu 14.04 finally won my trust back.
Updated:2019-03Published:2015-01
Tab Completion in the Python Shell
Python’s newer interactive shell already completes names with Tab. For the classic Unix shell, a short startup file enables completion with GNU readline.
Updated:2021-12Published:2014-12
Load Environment Variables from a File for One Command
Load a trusted shell-compatible environment file for a single command without relying on fragile xargs parsing.
Updated:2021-12Published:2014-12
Add Logging to a Clojure Application
Add a small logging facade and a maintained backend to a Leiningen application, then send log events to the console and a rotating file.
Updated:2021-12Published:2014-12
Thoughts on JVM-Based Forth Implementation
A proposal for implementing Forth on the JVM using JVM objects and Java libraries.
Updated:2026-03Published:2014-12
One-Time Flash Messages in Tornado
Show a one-time status message after a redirect with Tornado’s signed-cookie API, without putting submitted form data in a client-side cookie.
Updated:2021-12Published:2014-04
Spec: Arrange a Pharo Greeter with Rows and Columns
Use nested Spec row and column layouts to turn the greeter from the first tutorial into a tidier Pharo GUI.
Updated:2021-12Published:2013-11
Spec: Build a Pharo Greeter from the Basics
Build a small Pharo GUI step by step, using Spec presenters, a layout and event handlers to create a greeter.
Updated:2021-12Published:2013-11
Using Scala for ADempiere Customisations
This 2013 walkthrough shows how a small Scala project was assembled against ADempiere’s Java libraries, with an SBT build and optional IDE project files.
Updated:2021-12Published:2013-08
Grails: Secure an Application with Spring Security Core
This historical tutorial shows how Spring Security Core was added to a Grails 2.3 application to create user and role classes and protect a controller action.
Updated:2021-12Published:2013-08
Could Pharo Work for Business Applications?
In 2013, I explored whether Pharo and Smalltalk could provide a productive foundation for a hosted business application. This is that early perspective, revisited as a historical essay.
Updated:2026-03Published:2013-06
Immutant with Noir: A 2012 Walkthrough
In 2012, I tried Immutant as an application server for a Clojure web application. This walkthrough records how I connected it to Noir and used a remote development REPL.
Updated:2021-12Published:2012-12
How To Setup A Fossil Server
In 2012, I set up a Fossil server behind nginx on CentOS. This revised post records that setup and the lessons I took from it.
Updated:2019-03Published:2012-02
What Is Enterprise Resource Planning (ERP)?
ERP software connects information and workflows across an organisation’s core functions. This article explains the idea through a trading business, and why integration alone does not guarantee good decisions or good practice.
Updated:2026-03Published:2011-04
Amailyser: The E-mail Analyser
Amailyser extracts useful fields from mbox and Maildir mailboxes and stores them in a relational database for analysis and reporting.
Updated:2019-03Published:2011-03
Talks at foss.ir: How to Promote Open Source In Iran and Role of ADempiere
Notes from a 2008 meeting on growing open-source adoption in Iran and the proposed role of ADempiere.
Updated:2026-03Published:2008-12
Open Source Communication Tricks or How to Avoid Flame Wars
Read carefully, write calmly, and make your point about the work. These six habits can help keep open-source discussions productive.
Updated:2026-03Published:2008-11
Returned 44 posts.




























Comments
Post a Comment