<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Engineering on Markus Löning</title><link>https://www.mloning.com/tags/engineering/</link><description>Recent content in Engineering on Markus Löning</description><generator>Hugo</generator><language>en-us</language><copyright>Copyright © 2025 Markus Löning</copyright><lastBuildDate>Mon, 06 Jul 2026 18:03:47 +0200</lastBuildDate><atom:link href="https://www.mloning.com/tags/engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>Agentic engineering and skills</title><link>https://www.mloning.com/posts/agentic-engineering-skills/</link><pubDate>Fri, 05 Jun 2026 14:23:23 +0100</pubDate><guid>https://www.mloning.com/posts/agentic-engineering-skills/</guid><description>&lt;p&gt;AI agents like Claude Code or Codex are non-deterministic tools, which can be modified, tweaked and used in many different ways.
Using them effectively requires mastering them and making them your own to some degree, even when agents and the LLMs they rely on are still evolving.&lt;/p&gt;</description></item><item><title>Simulating application runs</title><link>https://www.mloning.com/posts/simulating-application-runs/</link><pubDate>Thu, 26 Mar 2026 20:59:00 +0100</pubDate><guid>https://www.mloning.com/posts/simulating-application-runs/</guid><description>&lt;h2 id="dry-runs"&gt;Dry runs&lt;/h2&gt;
&lt;p&gt;Before running a program for real, we sometimes first want to simulate the outcome, a dry run without actually changing anything, to better understand the consequences of running the application.
This is particularly useful when the program involves state changes that are difficult to revert.
For example, writing to a database, deleting files, or provisioning cloud resources.&lt;/p&gt;</description></item><item><title>Working with Claude Code</title><link>https://www.mloning.com/posts/working-with-claude-code/</link><pubDate>Sat, 07 Mar 2026 14:58:15 +0100</pubDate><guid>https://www.mloning.com/posts/working-with-claude-code/</guid><description>&lt;p&gt;Notes and links about Claude Code and agentic engineering.&lt;/p&gt;
&lt;h2 id="how-claude-code-work"&gt;How Claude Code work&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s not hard to understand the basic workings of coding agents like Claude Code:&lt;/p&gt;</description></item><item><title>EuroRust 2025</title><link>https://www.mloning.com/posts/eurorust-2025/</link><pubDate>Sat, 11 Oct 2025 11:58:15 +0200</pubDate><guid>https://www.mloning.com/posts/eurorust-2025/</guid><description>&lt;p&gt;I attended my first Rust conference, &lt;a href="https://eurorust.eu/2025/"&gt;EuroRust 2025&lt;/a&gt; in Paris.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clippy settings recommendations, including &lt;code&gt;pedantic&lt;/code&gt; or &lt;code&gt;undocumented_unsafe_blocks&lt;/code&gt; (structured safety documentation) for unsafe code&lt;/li&gt;
&lt;li&gt;best practices for Rust development by jhpratt (&lt;a href="https://jhpratt.dev/talks/#exemplary-by-design-building-and-maintaining-rust-at-scale"&gt;slides&lt;/a&gt;, also see his related talk on &lt;a href="https://jhpratt.dev/talks/#compiler-driven-development-making-rust-work-for-you"&gt;compiler-driven development&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;inner workings of the Rust compiler, compiler settings and their trade-offs including inlining, &lt;a href="https://en.wikipedia.org/wiki/Monomorphization"&gt;monomorphization&lt;/a&gt; link-time optimizations (LTO) by noratrieb (&lt;a href="https://noratrieb.dev/slides/2025-10-10-how-rust-compiles/"&gt;slides&lt;/a&gt;, &lt;a href="https://nnethercote.github.io/perf-book/"&gt;Rust performance book&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;best practices for error handling: for anticipated errors, prefer &lt;code&gt;thiserror&lt;/code&gt; for libraries to expose concrete and structured errors, and &lt;code&gt;Result&lt;/code&gt; type and &lt;code&gt;anyhow&lt;/code&gt; for application code, for unanticipated errors use &lt;code&gt;panic!&lt;/code&gt; (programmer mistake)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;criterion&lt;/code&gt; and flamegraphs for profiling&lt;/li&gt;
&lt;li&gt;inner working of atomic types for concurrency and &lt;a href="https://en.wikipedia.org/wiki/Memory_ordering"&gt;memory ordering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;prefer concrete types (e.g. enums) over generics and traits, for speed due to monomorphization and readability, especially in application code&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mfontanini.github.io/presenterm/"&gt;presenterm&lt;/a&gt; for making presentations in your terminal&lt;/li&gt;
&lt;li&gt;&lt;code&gt;embassy&lt;/code&gt; for embedded systems&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bevy&lt;/code&gt; game engine&lt;/li&gt;
&lt;li&gt;the concept of run-time &lt;a href="https://en.wikipedia.org/wiki/Reflective_programming"&gt;reflection&lt;/a&gt; and and Rust&amp;rsquo;s compile-time solutions based on procedural macros like &lt;code&gt;serde&lt;/code&gt;&amp;rsquo;s &lt;code&gt;derive&lt;/code&gt;, e.g. when you add &lt;code&gt;#[derive(Serialize, Deserialize)]&lt;/code&gt; to a struct, you are using a procedural macro that runs when you compile your code; the macro inspects the definition of your struct (e.g., the field names and types), and based on this inspection automatically generates the implementation of the core &lt;code&gt;Serialize&lt;/code&gt; and &lt;code&gt;Deserialize&lt;/code&gt; traits for your specific type&lt;/li&gt;
&lt;li&gt;triemap, a tree-based data structures primarily used for efficient storage and retrieval of associative data where the keys are strings or sequences, e.g. for fast prefix-based lookup&lt;/li&gt;
&lt;li&gt;foreign function interfaces (FFI) in Rust for using functions from other programming languages, particularly C (e.g. using &lt;code&gt;extern&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://valgrind.org/"&gt;Valgrind&lt;/a&gt; for profiling and memory debugging&lt;/li&gt;
&lt;li&gt;data engineering
&lt;ul&gt;
&lt;li&gt;OLAP (analytical)
&lt;ul&gt;
&lt;li&gt;batch operations involving complex queries, aggregations and scans across many rows but few columns&lt;/li&gt;
&lt;li&gt;primarily columnar data format, e.g. Parquet/Arrow&lt;/li&gt;
&lt;li&gt;data warehouse solutions like Delta Lake and Snowflake&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OLTP (operational)
&lt;ul&gt;
&lt;li&gt;frequent inserts, updates, deletes, and fetching full records (e.g. banking transactions, user profiles)&lt;/li&gt;
&lt;li&gt;row-based format (e.g. PostgreSQL)&lt;/li&gt;
&lt;li&gt;document-based/NoSQL databases (e.g. MongoDB), better for complex entities to avoid complicated SQL joins&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Videos will be available at: &lt;a href="https://www.youtube.com/@eurorust"&gt;https://www.youtube.com/@eurorust&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Network engineering</title><link>https://www.mloning.com/posts/network-engineering/</link><pubDate>Thu, 24 Jul 2025 23:07:58 +0200</pubDate><guid>https://www.mloning.com/posts/network-engineering/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;I recently had to think more about network engineering.
Here are my notes from reading &lt;a href="https://beej.us/guide/bgnet/"&gt;Beej&amp;rsquo;s Guide to Network Programming&lt;/a&gt; and &lt;a href="https://gaia.cs.umass.edu/kurose_ross/"&gt;Computer Networking: A Top-Down Approach&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to name things</title><link>https://www.mloning.com/posts/how-to-name-things/</link><pubDate>Thu, 16 Jan 2025 18:07:07 +0100</pubDate><guid>https://www.mloning.com/posts/how-to-name-things/</guid><description>&lt;p&gt;In software engineering (and machine learning), we often need to name things to refer to them more easily in our discussions &amp;ndash; be it projects, products or servers.&lt;/p&gt;</description></item><item><title>Signing git commits</title><link>https://www.mloning.com/posts/signing-git-commits/</link><pubDate>Tue, 14 Jan 2025 20:50:10 +0100</pubDate><guid>https://www.mloning.com/posts/signing-git-commits/</guid><description>&lt;p&gt;&lt;a href="https://withblue.ink/2020/05/17/how-and-why-to-sign-git-commits.html"&gt;https://withblue.ink/2020/05/17/how-and-why-to-sign-git-commits.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If a key expires, you can update the expiration date as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gpg --list-secret-keys&lt;/code&gt; to list the secret keys and look up the key ID, alternatively &lt;code&gt;gpg --list-keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gpg --edit-key &amp;lt;key-id&amp;gt;&lt;/code&gt; to open the gpg console&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;expire&lt;/code&gt; in the gpg console and follow the prompts to update the expiration date&lt;/li&gt;
&lt;li&gt;finally &lt;code&gt;save&lt;/code&gt; and &lt;code&gt;quit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can type &lt;code&gt;help&lt;/code&gt; in the console for other available commands.&lt;/p&gt;</description></item><item><title>Logging in a multiprocessing context in Python</title><link>https://www.mloning.com/posts/logging-in-python-multiprocessing/</link><pubDate>Mon, 02 Dec 2024 09:38:37 +0100</pubDate><guid>https://www.mloning.com/posts/logging-in-python-multiprocessing/</guid><description>&lt;p&gt;Configuring loggers in a Python application with multiprocessing isn&amp;rsquo;t straightforward.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re new to logging in Python, there&amp;rsquo;s a &lt;a href="https://docs.python.org/3/howto/logging.html#logging-basic-tutorial"&gt;basic tutorial&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Implementing the Uno card game in Rust</title><link>https://www.mloning.com/posts/implementing-uno-card-game-in-rust/</link><pubDate>Sat, 09 Mar 2024 00:06:13 +0100</pubDate><guid>https://www.mloning.com/posts/implementing-uno-card-game-in-rust/</guid><description>&lt;p&gt;After having &lt;a href="https://github.com/mloning/uno-py/"&gt;implemented&lt;/a&gt; the Uno card game in Python, I decided to &lt;a href="https://github.com/mloning/uno-rs"&gt;rewrite&lt;/a&gt; it in Rust.&lt;/p&gt;
&lt;p&gt;Rewriting Uno in Rust has taught me a lot, as Rust forces you define objects and their interactions more clearly, and encourages you to keep them as simple as possible.&lt;/p&gt;</description></item><item><title>Implementing the Uno card game in Python</title><link>https://www.mloning.com/posts/implementing-uno-card-game-in-python/</link><pubDate>Wed, 20 Dec 2023 19:16:09 +0100</pubDate><guid>https://www.mloning.com/posts/implementing-uno-card-game-in-python/</guid><description>&lt;p&gt;A friend of mine recently implemented the card game &lt;a href="https://en.wikipedia.org/wiki/Uno_(card_game)"&gt;Uno&lt;/a&gt; as a programming exercise in Python and asked me for feedback. I thought it&amp;rsquo;s a good idea to try it myself and then compare notes.&lt;/p&gt;</description></item><item><title>Run pre-commit retrospectively on all changed files in a PR</title><link>https://www.mloning.com/posts/run-precommit-retrospectively/</link><pubDate>Fri, 02 Oct 2020 16:10:57 +0200</pubDate><guid>https://www.mloning.com/posts/run-precommit-retrospectively/</guid><description>&lt;p&gt;When I was developing &lt;a href="https://github.com/sktime/sktime"&gt;sktime&lt;/a&gt;, we had set up automated checks for printing and formatting only after some time. Rather than fixing our entire code base in one go, we decided to roll out the changes slowly, and only enforce them for the changed files on a PR.&lt;/p&gt;</description></item></channel></rss>