<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Lennard Berger's blog</title><link>https://fohlen.dev/</link><description>Recent content on Lennard Berger's blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 19 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://fohlen.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>A decade of software</title><link>https://fohlen.dev/posts/a-decade-of-software/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/a-decade-of-software/</guid><description>&lt;p&gt;May 2026 marks a personal milestone: getting paid to write code for one decade. It feels surreal writing this.&lt;/p&gt;&#10;&lt;p&gt;I thought I&amp;rsquo;d like to take the time to share my learnings, for interested readers. I&amp;rsquo;ll will keep it short and talk about five key topics:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="#software-is-for-humans"&gt;Software is for humans&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#software-is-your-biggest-liability"&gt;Software is your biggest liability&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#the-secret-to-get-things-done-is-to-do-them"&gt;The secret to get things done, is to do them&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#surprising-things-a-university-degree-teaches-you"&gt;Surprising things a university degree teaches you&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="#people-trump-profit-every-time"&gt;People trump profit every time&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;I hope my whimsical headings peaked your interest, so let&amp;rsquo;s dive right into it!&lt;/p&gt;</description></item><item><title>Building OCR pipelines with Google AI Studio</title><link>https://fohlen.dev/posts/document-ocr-with-google-ai-studio/</link><pubDate>Fri, 28 Nov 2025 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/document-ocr-with-google-ai-studio/</guid><description>&lt;p&gt;Recently I wanted to catalogue all the books I own in my home.&#10;It turns out, this isn&amp;rsquo;t really a solved problem. There&amp;rsquo;s an abundance of ISBN scanners, but no tool that simply takes a photo and tags the books in it.&lt;/p&gt;&#10;&lt;p&gt;Traditionally building such a system contains two steps:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Creating a segmentation model to recognise individual book titles and spines&lt;/li&gt;&#10;&lt;li&gt;Use the title / spine and OCR to get a title&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Once these steps are done one can build a search, e.g using the &lt;a href="https://developers.google.com/books"&gt;Google Books API&lt;/a&gt; to match titles against ISBN.&lt;/p&gt;</description></item><item><title>Quarto for scientific presentations</title><link>https://fohlen.dev/posts/quarto-for-presentations/</link><pubDate>Thu, 28 Aug 2025 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/quarto-for-presentations/</guid><description>&lt;p&gt;If you haven&amp;rsquo;t heard about &lt;a href="https://quarto.org/"&gt;Quarto&lt;/a&gt; yet, it self-describes as an &amp;ldquo;open-source scientific and technical publishing system&amp;rdquo;.&#10;You&amp;rsquo;ve certainly used Quarto - or consumed media produced by Quarto, in fact this very blog is powered by Quarto.&lt;/p&gt;&#10;&lt;p&gt;Quarto has some simple core ideas:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;use Markdown as a universal templating language&lt;/li&gt;&#10;&lt;li&gt;make it easy to include and its output in documents&lt;/li&gt;&#10;&lt;li&gt;make visualization easy (and fun)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Quarto is powerful and agnostic about the programming language and documents you want to render - it supports creating websites, documents and &lt;strong&gt;presentations&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Micronaut Data and pgvector</title><link>https://fohlen.dev/posts/micronaut-pgvector-integration/</link><pubDate>Mon, 17 Mar 2025 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/micronaut-pgvector-integration/</guid><description>&lt;p&gt;Recently &lt;a href="https://www.elastic.co/what-is/vector-embedding"&gt;vector embeddings&lt;/a&gt; have been all the rage. Vector embeddings are a way to project data (usually text data such as words and sentences) into a dense vector representation of a fixed size.&#10;This could be useful in natural language processing, where you want to build a retrieval augmented generation pipeline. It could be useful in object character recognition, if you want to convert your document into a searchable representation etc.&lt;/p&gt;</description></item><item><title>How accurate is the weather forecast?</title><link>https://fohlen.dev/posts/weather-forecast-accuracy/</link><pubDate>Mon, 03 Mar 2025 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/weather-forecast-accuracy/</guid><description>&lt;p&gt;Weather forecasts are one of these things we rely on daily and rarely actually think about. This blog post will disects how they work (at least in Germany). I was curious to see if the forecasts are acurate, and we&amp;rsquo;ll get to that as well.&lt;/p&gt;&#10;&lt;h1 id="ask-the-weather-frog"&gt;Ask the weather frog&lt;/h1&gt;&#10;&lt;p&gt;When you open the default weather app on iPhone it will use the forecasts by the DWD (Deutsche Wetterdienst) = German metrological association. The DWD runs a huge real-time weather simulation which takes into account hundreds of parameters like:&lt;/p&gt;</description></item><item><title>Micronaut 3x Security: Authentication with Firebase</title><link>https://fohlen.dev/posts/micronaut-firebase-authentication/</link><pubDate>Thu, 27 Feb 2025 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/micronaut-firebase-authentication/</guid><description>&lt;p&gt;This post was inspired by &lt;a href="https://medium.com/swlh/micronaut-security-authenticating-with-firebase-7f266acae4c3"&gt;Brian Schlining&amp;rsquo;s excellent post on Micronaut authentication&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;I had slightly different requirements than Brian, namely I wanted to do:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;issue id tokens using Firebase&amp;rsquo;s idToken&lt;/li&gt;&#10;&lt;li&gt;send it to my backend to verify requests&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;My solution opts to directly verify the id token at request time. When hosting on GCP services, latency to Identity Platform is very low, making this approach feasible. It has a few distinct advantages:&lt;/p&gt;</description></item><item><title>Hosting on the Google Cloud Platform</title><link>https://fohlen.dev/posts/hosting-on-gcp/</link><pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/hosting-on-gcp/</guid><description>&lt;p&gt;Let&amp;rsquo;s face it, deployment is the worst part of software engineering. In the decade I&amp;rsquo;ve been writing code, deployment has been the largest driver of headaches.&#10;When Docker first debuted in 2013, many had high hopes the times of sysadmin-battles with failing hardware and complexity would finally come to an end. Well, things have improved, but many issues remain.&lt;/p&gt;&#10;&lt;p&gt;I recently had to deploy an application with the following requirements:&lt;/p&gt;</description></item><item><title>Testing linear regression empirically</title><link>https://fohlen.dev/posts/testing-linear-regression-empirically/</link><pubDate>Mon, 04 Nov 2024 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/testing-linear-regression-empirically/</guid><description>&lt;p&gt;Linear models are intriguing because they are both simple and powerful. This simplicity can be attributed to the fact that many natural processes actually follow simple laws.&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ll give you an example: bigger objects are usually heavier. Both attributes are normally distributed (that is, there is an average size and mass for an object and fewer exceptions). These assumptions are what drives ordinary least squares (OLS) regression, in particular there are six key assumptions:&lt;/p&gt;</description></item><item><title>How much calories does an LLM burn?</title><link>https://fohlen.dev/posts/how-many-calories-does-llm-need/</link><pubDate>Fri, 20 Sep 2024 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/how-many-calories-does-llm-need/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Every request to GPT-4 burns 430 calories, approximately 17% of an average male diet&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;A clickbait quote from me for the dear reader, to tease you into the topic of AI energy consumption, something many people rarely give any thought to.&lt;/p&gt;&#10;&lt;p&gt;You might wonder, how did I come up with this number? Glad you ask, I&amp;rsquo;d like to do the math with you.&lt;/p&gt;&#10;&lt;h2 id="lets-fuel-an-llm"&gt;Let&amp;rsquo;s fuel an LLM&lt;/h2&gt;&#10;&lt;p&gt;Many people are aware of the fact that large language models consume lots of energy. It is in the name, &amp;ldquo;large&amp;rdquo; models.&#10;We don&amp;rsquo;t have the exact tally for GPT-4, as the technical paper does not outline it.&#10;&lt;a href="#ref1"&gt;see [1]&lt;/a&gt; went down the rabbit hole to find out how much energy GPT-3 and Meta&amp;rsquo;s LLama family of models consumed during training.&lt;/p&gt;</description></item><item><title>Thinking is not hierarchical, why should AI be?</title><link>https://fohlen.dev/posts/thinking-is-not-hierarchical/</link><pubDate>Sat, 01 Jun 2024 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/thinking-is-not-hierarchical/</guid><description>&lt;p&gt;This blog post will discuss Yann LeCun&amp;rsquo;s paper &lt;a href="#ref1"&gt;see [1]&lt;/a&gt; and a plethora of related ideas. Below is an illustration from &lt;a href="#ref1"&gt;see [1]&lt;/a&gt; which summaries LeCun&amp;rsquo;s AI model:&lt;/p&gt;&#10;&lt;p&gt;LeCun imagines a set of hierarchical components which interact with each other. Most importantly:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;the percept which can perceive the world (e.g. multi-modal input)&lt;/li&gt;&#10;&lt;li&gt;a world model which is built on top of the perception&lt;/li&gt;&#10;&lt;li&gt;a cost component which reflects how &lt;em&gt;&amp;ldquo;useful&amp;rdquo;&lt;/em&gt; the agent is in solving a problem&lt;/li&gt;&#10;&lt;li&gt;a configuration component which modulates an &lt;em&gt;actor&lt;/em&gt; to perform actions and directs the world model and perception&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The whole system would be end-to-end trainable with the cost component providing the objective function for optimization.&lt;/p&gt;</description></item><item><title>Word embedding similarity is tricky</title><link>https://fohlen.dev/posts/vector-distances-rust/</link><pubDate>Mon, 06 May 2024 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/vector-distances-rust/</guid><description>&lt;p&gt;This post will be a deep dive into word embeddings. Word embeddings have made multiple appearances on this blog, such as in my &lt;a href="https://fohlen.dev/posts/are-neural-networks-all-you-need/Are_neural_networks_all_you_need.html"&gt;talk about neural networks&lt;/a&gt;, or &lt;a href="https://fohlen.dev/posts/missing-spacy-benchmark/Missing_spaCy_benchmark.html"&gt;the spaCy benchmark&lt;/a&gt;. The reason I am captivated by word embeddings is threefold:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;they are very useful, the underlying building blocks for most text-based machine learning models&lt;/li&gt;&#10;&lt;li&gt;word embeddings are computationally efficient (you can encode &lt;em&gt;&amp;ldquo;all the language&amp;rsquo;s meaning&amp;rdquo;&lt;/em&gt; in a few hundred megabyte)&lt;/li&gt;&#10;&lt;li&gt;very few people actually understand what the consequences of embeddings are&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Cosine similarity is the most popular method to date to compare embeddings (such as in document retrieval). A recent paper by &lt;a href="#ref1"&gt;see [1]&lt;/a&gt; investigated the usage of cosine similarity and uncovered some surprising findings:&lt;/p&gt;</description></item><item><title>Building a property graph database from scratch</title><link>https://fohlen.dev/posts/property-graph-db/</link><pubDate>Mon, 08 Apr 2024 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/property-graph-db/</guid><description>&lt;p&gt;As can be seen from the featured image above, many natural processes can be modeled as graphs. Transactions of individuals in a payment network are classic datasets for which graphs are a natural fit.&#10;Once such a dataset is loaded into a graph we can easily answer questions such as:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;how many steps does an average transaction take?&lt;/li&gt;&#10;&lt;li&gt;who is a 2nd-level collaborator of &lt;em&gt;&amp;ldquo;x&amp;rdquo;&lt;/em&gt;?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;These questions could be answered from a relational database. However, modeling relational databases is not intuitive (for the problem), and in many cases not very performant.&#10;It is for this reason, that graph databases have steadily gained popularity, especially in the area of knowledge graphs.&lt;/p&gt;</description></item><item><title>Mapping spans from one document to another, an excellent interview question</title><link>https://fohlen.dev/posts/mapping-spans-between-documents-interview-question/</link><pubDate>Sun, 03 Mar 2024 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/mapping-spans-between-documents-interview-question/</guid><description>&lt;p&gt;Interviewing is arguably one of the worst parts of running a business. You can plan for success, and you can account for failure. When it comes to interviewing, neither applies.&lt;/p&gt;&#10;&lt;p&gt;To a certain degree this is certainly the very nature of the process itself. A company wants to hire the optimal candidate, whereas all candidates want to get hired.&#10;Thus, it is in the interest of the company to reduce barriers and design interviews in such a way to yield satisfactory results for &lt;em&gt;everyone&lt;/em&gt; involved.&#10;One way to improve technical interviews is to create better interview questions.&lt;/p&gt;</description></item><item><title>The relationship between L2 norm and dropout in linear regression</title><link>https://fohlen.dev/posts/linear-regression-l2-norm-dropout-relation/</link><pubDate>Thu, 01 Feb 2024 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/linear-regression-l2-norm-dropout-relation/</guid><description>&lt;p&gt;In 2014, Dropout was introduced &lt;a href="#ref1"&gt;see [1]&lt;/a&gt; as a simple, yet effective way of regularizing neural networks. Dropout is conceptually simple: one randomly removes connections of neurons from the network. If a network can manage to learn the data well with a certain amount of disturbance (removed nodes), it can be said to have found a good generalisation. However, the implications of dropout are not quite as trivial. In this blog post, we will look at a simple model to gain some intuition into the effects of dropout (and how it compares to other forms of regularisation).&lt;/p&gt;</description></item><item><title>Playing "The game" with Monte Carlo simulations</title><link>https://fohlen.dev/posts/simulating-the-game-with-monte-carlo/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/simulating-the-game-with-monte-carlo/</guid><description>&lt;p&gt;A while ago I was introduced to a simple card game titled &lt;a href="https://www.spiel-des-jahres.de/spiele/the-game/"&gt;&lt;em&gt;The game&lt;/em&gt; by Steffen Benndorf&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Unlike many other games, &lt;em&gt;The game&lt;/em&gt; has a unique touch, because it is a collaborative card game.&lt;/p&gt;&#10;&lt;p&gt;The rules of the game are very simple. There are four piles, two of which start at 1 and ascend to 100. The other two piles start at 100 and descend to 1. Players take turns to place cards on the piles. If they manage to put down all cards, they win. Otherwise, &lt;em&gt;The game&lt;/em&gt; wins.&lt;/p&gt;</description></item><item><title>NVIDIA resolves gRPC performance issues</title><link>https://fohlen.dev/posts/triton-grpc/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/triton-grpc/</guid><description>&lt;p&gt;As with any software architecture, deep learning models need a delivery platform. This is the job of &lt;a href="https://developer.nvidia.com/triton-inference-server"&gt;NVIDIA&amp;rsquo;s Triton Inference Server&lt;/a&gt;. The idea is conceptionally simple:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;produce your model in one of the &lt;a href="https://github.com/triton-inference-server/backend#where-can-i-find-all-the-backends-that-are-available-for-triton"&gt;supported model formats&lt;/a&gt; (such as &lt;a href="https://onnxruntime.ai"&gt;ONNX&lt;/a&gt;)&lt;/li&gt;&#10;&lt;li&gt;package your model with a definition file, letting Triton know how to process your model&lt;/li&gt;&#10;&lt;li&gt;run a simple Docker container from the NGC registry with your models on an S3 or other storage bucket&lt;/li&gt;&#10;&lt;li&gt;profit from a standardized inference runtime and built-in metrics&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Next to reliability, the main concern of any DevOps engineer will be throughput. What good does it do the production team if models have a 0% downtime, but are so slow as to be unusable?&lt;/p&gt;</description></item><item><title>Graph randomization is not the same as graph randomization</title><link>https://fohlen.dev/posts/network-randimisation/</link><pubDate>Sat, 25 Nov 2023 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/network-randimisation/</guid><description>&lt;p&gt;Recently I haven taken some interest in network science. There are many things to discuss. For this blog post I would like to share my fascination that $randomization \neq randomization$. In network science, node degree and strength [1] are important properties.&lt;/p&gt;&#10;&lt;h2 id="node-degree"&gt;Node degree&lt;/h2&gt;&#10;&lt;p&gt;In an undirected network the node degree refers to how many edges any given node has. As a linguist, if I wanted to model word relationships using graphs, I need to be aware that word frequency follows a Zipfian distribution. Therefore, the number of connected nodes should follow a similar distribution (if I want to model the same phenomena). Now, provided I wanted to randomise my graph to test wether a specific effect holds, I also need to take care this distribution stays intact.&#10;This is why there are two ways to randomize a network:&lt;/p&gt;</description></item><item><title>The missing spaCy benchmark</title><link>https://fohlen.dev/posts/missing-spacy-benchmark/</link><pubDate>Thu, 28 Sep 2023 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/missing-spacy-benchmark/</guid><description>&lt;p&gt;spaCy self-proclaims as &lt;em&gt;&amp;ldquo;Industrial-Strength Natural Language Processing&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;I can wholeheartedly agree. Over many years spaCy has served me extremely well as a base component in a diverse set of projects.&#10;The top reasons to use spaCy have always been:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;reliability&lt;/li&gt;&#10;&lt;li&gt;speed&lt;/li&gt;&#10;&lt;li&gt;ease of use&lt;/li&gt;&#10;&lt;li&gt;acceptable accuracy out-of-box&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Recently, document retrieval systems have been getting a lot of attention. In the light of this, I was curious to see how spaCy would hold up to this task.&#10;Usually spaCy is the most well-documented project in the industry. As with anything, there are edge cases.&lt;/p&gt;</description></item><item><title>A note on compression based classifiers</title><link>https://fohlen.dev/posts/compression-based-classifier/</link><pubDate>Fri, 11 Aug 2023 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/compression-based-classifier/</guid><description>&lt;p&gt;Some weeks ago I stumbled across one paper in particular titled: &lt;em&gt;&amp;quot;Low-Resource” Text Classification: A Parameter-Free Classification Method with Compressors&amp;quot;&lt;/em&gt; &lt;a href="#ref1"&gt;see [1]&lt;/a&gt;. This paper has been dubbed the &lt;em&gt;&amp;ldquo;gzip paper&amp;rdquo;&lt;/em&gt;, and has been largely discussed in the NLP community because of a refreshingly simple and efficient take on text classification. In the authors words they are matching neural networks in performance:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;There have been several studies in this field [2]; [3], most of them based on the intuition that the minimum cross entropy between a document and a language model of a class built by a compressor indicates the class of the document. However, previous works fall short of matching the quality of neural networks.&lt;/p&gt;</description></item><item><title>Modeling mindsets</title><link>https://fohlen.dev/posts/modeling-mindsets/</link><pubDate>Mon, 31 Jul 2023 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/modeling-mindsets/</guid><description>&lt;p&gt;Some while ago I read a fantastic book titled &lt;a href="https://christophmolnar.com/books/modeling-mindsets/"&gt;Modeling mindsets&lt;/a&gt; by Christoph Molnar. It prompted an idea to reiterate on a problem that is as old as any stastician&amp;rsquo;s playbook: student exams.&#10;Writing exams is difficult. However, a statistician may claim, modeling an exam result is fairly trivial.&#10;Bear with me for a moment, and you&amp;rsquo;ll see there is more to this simple problem than you might expect.&lt;/p&gt;&#10;&lt;h3 id="exam-scores"&gt;Exam scores&lt;/h3&gt;&#10;&lt;p&gt;Exam scores are a popular choice in many statistican textbooks. That&amp;rsquo;s because it is largely accepted that they follow a normal distribution (hence the term &lt;em&gt;student&amp;rsquo;s t-test&lt;/em&gt;). As they saying goes: &lt;em&gt;the proof of the pudding is in the eating&lt;/em&gt;. To demonstrate how to model exam results, we will use a dataset of 1000 fictional exams created with &lt;a href="http://roycekimmons.com/tools/generated_data/exams"&gt;Rocye Kimmon&amp;rsquo;s excellent exam scores generator&lt;/a&gt;. We can display the first few rows to get an idea of what data it contains.&lt;/p&gt;</description></item><item><title>Who wrote it first, or: why originality matters?</title><link>https://fohlen.dev/posts/why-originality-matters/</link><pubDate>Thu, 15 Jun 2023 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/why-originality-matters/</guid><description>&lt;p&gt;Ever since the introduction of language, humans have suffered from a fundamental problem: there is an exponentially growing amount of information, and only so much lifetime (of any individual), to grasp it. This has become an increasing problem with the advent of the World Wide Web. Individuals now have access to more information than any generation of humans, ever before, in history. However, access to more information doesn’t necessarily translate to better understanding.&lt;/p&gt;</description></item><item><title>Python dataclasses, a package full of surprises</title><link>https://fohlen.dev/posts/python-dataclasses-a-package-full-of-surprises/</link><pubDate>Sun, 14 May 2023 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/python-dataclasses-a-package-full-of-surprises/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;Premature optimisation is the root of all evil&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Virtually every software engineering lecture nowadays contains this wisdom by Sir Tony Hoarse.&#10;If you ask me, this truth has been perpetuated for good reason. With modern computing power, there are few motivations to worry about low-level code optimisation.&#10;Certainly, as it comes towards the triangle of software development, resources are inexpensive compared to engineering time, and more simple and maintainable software design is preferable over performance.&#10;But to every rule, there are exceptions. Today we will discuss one of the stumbling blocks in our software landscape: &lt;strong&gt;serialisation&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>yGuard is now open source - obfuscation easy as pie</title><link>https://fohlen.dev/posts/yguard-release/</link><pubDate>Wed, 08 Jan 2020 00:00:00 +0000</pubDate><guid>https://fohlen.dev/posts/yguard-release/</guid><description>&lt;p&gt;&lt;strong&gt;Disclaimer: This is not a sponsored post&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;I work for a company called &lt;a href="https://yworks.com"&gt;yWorks&lt;/a&gt;. They make &lt;a href="https://www.yworks.com/products/yfiles"&gt;libraries for graphs&lt;/a&gt; that are (imho) state of the art, and also are a fun company to work at 🍺&lt;/p&gt;&#10;&lt;p&gt;Because these libraries are sophisticated the company is very inclined to protect their intellectual property. In the golden age of Java (which was right about the time they put this onto the market) it would have been crucial to implement some sorts of protection in order to ensure this IP. This is why &lt;code&gt;yGuard&lt;/code&gt; was initially developed (side note: when I first touched the repository, some assets were as old as 11 years).&lt;/p&gt;</description></item><item><title>About me</title><link>https://fohlen.dev/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fohlen.dev/about/</guid><description>&lt;img src="me.webp" class="about-portrait" alt="Me" /&gt;&#10;&lt;p&gt;Hi there! I am a Cognitive Scientist interested in the mechanisms underpinning (human and machine) learning.&lt;/p&gt;&#10;&lt;p&gt;My tinkering is primarily done in Python 🐍, which helps me prototype very quickly. My colleagues call me a &lt;em&gt;&amp;ldquo;professional thing breaker&amp;rdquo;&lt;/em&gt;. Other than that I&amp;rsquo;m agnostic - most any problem deserves its own solution.&lt;/p&gt;&#10;&lt;h2 id="work"&gt;Work&lt;/h2&gt;&#10;&lt;p&gt;I work on the &lt;a href="https://arcprize.org/arc-agi"&gt;ARC AGI challenge&lt;/a&gt; at &lt;a href="https://uni-tuebingen.de/fakultaeten/mathematisch-naturwissenschaftliche-fakultaet/fachbereiche/informatik/lehrstuehle/cognitive-modeling/"&gt;Martin Butz&lt;/a&gt;&amp;rsquo;s lab, attempting to solve iterative planning problems in AI.&lt;/p&gt;</description></item></channel></rss>