# Dennis Felsing

Published articles for Dennis Felsing.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Finding Bugs using LLMs

DevFeed: [Finding Bugs using LLMs](<https://devfeed.tech/articles/finding-bugs-using-llms-30816.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/finding-bugs-using-llms/>)

Published: 2026-05-21T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [AI-assisted coding](<https://devfeed.tech/topics/ai-assisted-coding.md>), [Large Language Model](<https://devfeed.tech/topics/llm.md>), [anthropic](<https://devfeed.tech/topics/anthropic.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [anthropic](<https://devfeed.tech/tags/anthropic.md>), [code](<https://devfeed.tech/tags/code.md>), [coding](<https://devfeed.tech/tags/coding.md>), [coding-agents](<https://devfeed.tech/tags/coding-agents.md>), [llm](<https://devfeed.tech/tags/llm.md>), [llms](<https://devfeed.tech/tags/llms.md>), [programming](<https://devfeed.tech/tags/programming.md>)

### AI overview

Materialize describes using LLM-based coding agents to find bugs in existing code and open pull requests since February 2026, and introduces the system's design considerations and lessons learned.

### Source excerpt

At Materialize we've had success in finding bugs in existing code and open pull requests using LLM-based coding agents since February 2026, coinciding with the release of Anthropic's Opus 4.6 (now mostly running on 4.7). In this post we'll look into some of the considerations that went into the system we are currently using as well as lessons learned. Read the rest of the blog post over on the Materialize blog.

## Workload Capture & Replay

DevFeed: [Workload Capture & Replay](<https://devfeed.tech/articles/workload-capture-replay-30845.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/workload-capture-replay/>)

Published: 2026-02-09T23:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Tooling](<https://devfeed.tech/topics/tooling.md>), [Docker Compose](<https://devfeed.tech/topics/docker-compose.md>), [synthetic-data](<https://devfeed.tech/topics/synthetic-data.md>)

Tags: [blog-post](<https://devfeed.tech/tags/blog-post.md>), [docker-compose](<https://devfeed.tech/tags/docker-compose.md>), [regression](<https://devfeed.tech/tags/regression.md>), [state](<https://devfeed.tech/tags/state.md>), [synthetic](<https://devfeed.tech/tags/synthetic.md>)

### AI overview

This article introduces workload capture and replay tooling for reproducing production issues. It records a Materialize instance's state, recent queries, and ingestion rates, then replays them in a Docker Compose environment using synthetic data.

### Source excerpt

When customers hit issues in production, it can be an effort to locally reproduce them, especially when external sources are involved. Reproducing issues is useful not just to figure out the root cause, but also to verify the fix and add a regression test. The newly introduced workload capture & replay tooling records a Materialize instance's state as well as recent queries and ingestion rates, then replays them in a Docker Compose environment with synthetic data. In this blog post I'll show how it works and talk about some of the challenges and future work. Read the rest of the blog post over on the Materialize blog.

## Speeding up Materialize CI

DevFeed: [Speeding up Materialize CI](<https://devfeed.tech/articles/speeding-up-materialize-ci-30835.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/speeding-up-materialize-ci/>)

Published: 2025-08-07T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [ci](<https://devfeed.tech/topics/ci.md>), [test](<https://devfeed.tech/topics/test.md>), [pull-requests](<https://devfeed.tech/topics/pull-requests.md>)

Tags: [blog](<https://devfeed.tech/tags/blog.md>), [blog-post](<https://devfeed.tech/tags/blog-post.md>), [ci](<https://devfeed.tech/tags/ci.md>), [continuous-integration](<https://devfeed.tech/tags/continuous-integration.md>), [developers](<https://devfeed.tech/tags/developers.md>), [integration](<https://devfeed.tech/tags/integration.md>), [pipeline](<https://devfeed.tech/tags/pipeline.md>), [programming](<https://devfeed.tech/tags/programming.md>), [pull-requests](<https://devfeed.tech/tags/pull-requests.md>), [test](<https://devfeed.tech/tags/test.md>), [tests](<https://devfeed.tech/tags/tests.md>), [work](<https://devfeed.tech/tags/work.md>)

### AI overview

The article describes how the Materialize team significantly sped up its continuous integration test pipeline in July, particularly for pull requests requiring a build and full test run. The effort aimed to reduce developer waiting time as tests and code had increased CI duration.

### Source excerpt

In the previous post I talked about how we test Materialize. This time I'll describe how I significantly sped up our Continuous Integration (CI) Test pipeline in July, especially for pull requests that require a build and full test run. The goal is to make developers more productive by reducing the time waiting for CI to complete. We always kept CI runtime in mind, but it still slowly crept up over the years through adding tests, the code itself growing larger, as well as hundreds of minor cuts adding up. Read the rest of the blog post over on the Materialize blog.

## How to Use the Materialize Emulator

DevFeed: [How to Use the Materialize Emulator](<https://devfeed.tech/articles/how-to-use-the-materialize-emulator-30825.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/materialize-emulator/>)

Published: 2024-10-15T22:00:00Z

Content type: tutorial

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Emulator](<https://devfeed.tech/topics/emulator.md>), [Docker Image](<https://devfeed.tech/topics/docker-image.md>), [Testing](<https://devfeed.tech/topics/testing.md>)

Tags: [docker-image](<https://devfeed.tech/tags/docker-image.md>), [emulator](<https://devfeed.tech/tags/emulator.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [qa](<https://devfeed.tech/tags/qa.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This article introduces the Materialize Emulator, a Docker image used during testing to maintain a locally hosted version of Materialize. It directs readers to the Materialize blog for the full post.

### Source excerpt

In our last blog about our Quality Assurance (QA) team, we gave an overview of the QA process, including our software and testing methods. One of our key tools during testing is the Materialize Emulator, a Docker image that allows you to maintain a locally hosted version of Materialize. Read the rest of the blog post over on the Materialize blog.

## The CI Flake

DevFeed: [The CI Flake](<https://devfeed.tech/articles/the-ci-flake-30838.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/the-ci-flake/>)

Published: 2024-08-15T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [ci](<https://devfeed.tech/topics/ci.md>), [Docker Compose](<https://devfeed.tech/topics/docker-compose.md>), [debug](<https://devfeed.tech/topics/debug.md>), [Python](<https://devfeed.tech/topics/python.md>)

Tags: [bugs](<https://devfeed.tech/tags/bugs.md>), [ci](<https://devfeed.tech/tags/ci.md>), [continuous-integration](<https://devfeed.tech/tags/continuous-integration.md>), [debug](<https://devfeed.tech/tags/debug.md>), [docker](<https://devfeed.tech/tags/docker.md>), [docker-compose](<https://devfeed.tech/tags/docker-compose.md>), [integration](<https://devfeed.tech/tags/integration.md>), [python](<https://devfeed.tech/tags/python.md>)

### AI overview

The article investigates a rare flaky test failure in Materialize CI that became more frequent after tests moved from AWS to Hetzner Cloud. It documents attempts to diagnose the issue, including flushing a generated docker-compose.yaml file, reproducing the failure, and examining parallel execution and CI setup.

### Source excerpt

I analyzed a flaky test failure in our Materialize CI today: $ docker compose up -d --scale default=0 default no such service: default mzcompose: error: running docker compose failed (exit status 1) I had seen this error already once or twice in the last year, but it was incredibly rare in our Continuous Integration (CI) runs, and never happened locally. As usual, there were more pressing product issues to debug, so I never looked into it. But last week I switched most of our CI tests to run on Hetzner Cloud instead of AWS to save some money. Suddenly this issue started occurring more often in CI, so my thinking was that it must somehow be timing-dependent. Before investigating my first instinct was that we are not writing the docker-compose.yaml file properly, which had already led to flaky calls to Docker Compose before (source code): file = self.files.get(thread_id) if not file: file = TemporaryFile(mode="w") os.set_inheritable(file.fileno(), True) yaml.dump(self.compose, file) self.files[thread_id] = file So yesterday I added a file.flush() after the yaml.dump and hoped to be done with it. This morning I woke up and the issue was still occurring! Based on the logged docker call this should be the code causing the problem (source code): def handle_composition( self, args: argparse.Namespace, composition: Composition ) -> None: if args.workflow not in composition.workflows: # Restart any dependencies whose definitions have changed. # This is Docker Compose's default behavior for `up`, but # not for `run`, which is a constant irritation that we # paper over here. The trick, taken from Buildkite's # Docker Compose plugin, is to run an `up` command that # requests zero instances of the requested service. if args.workflow: composition.invoke( "up", "-d", "--scale", f"{args.workflow}=0", args.workflow, ) super().handle_composition(args, composition) else: [...] Running the test in an endless loop locally had no success of reproducing the issue: while true; do bin/mzcom

## Port Scan with Spoofed IP Addresses

DevFeed: [Port Scan with Spoofed IP Addresses](<https://devfeed.tech/articles/port-scan-with-spoofed-ip-addresses-30831.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/port-scan-with-spoofed-ip-addresses/>)

Published: 2024-03-18T23:00:00Z

Content type: opinion

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [spoofing](<https://devfeed.tech/topics/spoofing.md>), [Cybersecurity](<https://devfeed.tech/topics/cybersecurity.md>), [networking](<https://devfeed.tech/topics/networking.md>), [incident](<https://devfeed.tech/topics/incident.md>)

Tags: [cybersecurity](<https://devfeed.tech/tags/cybersecurity.md>), [game-servers](<https://devfeed.tech/tags/game-servers.md>), [incident](<https://devfeed.tech/tags/incident.md>), [network](<https://devfeed.tech/tags/network.md>), [networking](<https://devfeed.tech/tags/networking.md>), [spoofing](<https://devfeed.tech/tags/spoofing.md>)

### AI overview

The article describes how spoofed-source port scans can cause abuse reports to be misattributed to a victim's VPS, potentially leading a hoster to suspend or terminate the server. It presents the scenario in a satirical, adversarial tone and discusses defensive traffic-blocking measures.

### Source excerpt

Or how to make naïve hosters shut down your victim's server. Do you want to bring down your victim's game servers? Do they host their game servers on cheap VPSes at hosters who are not that experienced with networking? Is running an actual DoS against the server too expensive and illegal for you? Just grab a server for yourself from a questionable hoster with IP address spoofing allowed on their network. Next run a port scan using nmap (man page) with a spoofed source address (-S or -D for multiple decoys) using your victim's IP address(es). As the target of the port scan choose a university with a cybersecurity department that likes to send security incident reports to abuse mail addresses. To the target university of the port scan it will look like the scan came from your victim, since you are spoofing their IP address, so they will send a serious sounding email to the victim's hoster: As a consequence your victim's VPS will most likely be shut down for a few hours or even days. To prevent this your victim will try to block all of their incoming and outgoing TCP traffic on their VPS, and also block the reporting university's IP range entirely: $ iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 147.251.0.0/16 anywhere DROP tcp -- anywhere anywhere tcp ctstate NEW multiport dports !27685,6546,ssh Chain OUTPUT (policy ACCEPT) target prot opt source destination DROP all -- anywhere 147.251.0.0/16 And yet you can rerun your port scan against the university's network every day, which will trigger automatic abuse mails to the victim's hoster, who will still trust these abuse mails more than the victim, since the hoster is unlikely to be able to monitor the network traffic of the VPS to check if those packets actually originated there. At some point the hoster will be so annoyed that they simply terminate the VPS and throw out the customer, victory! Congratulations, you have brought down some small-fish game servers in the DDNet commu

## Haskell: Game Programming with GIF Streams

DevFeed: [Haskell: Game Programming with GIF Streams](<https://devfeed.tech/articles/haskell-game-programming-with-gif-streams-30819.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/haskell-game-programming-with-gif-streams/>)

Published: 2023-09-06T22:00:00Z

Content type: tutorial

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Haskell](<https://devfeed.tech/topics/haskell.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Code](<https://devfeed.tech/topics/code.md>), [image animation](<https://devfeed.tech/topics/image-animation.md>), [HTTP](<https://devfeed.tech/topics/http.md>), [browser](<https://devfeed.tech/topics/browser.md>)

Tags: [animation](<https://devfeed.tech/tags/animation.md>), [browser](<https://devfeed.tech/tags/browser.md>), [gif](<https://devfeed.tech/tags/gif.md>), [haskell](<https://devfeed.tech/tags/haskell.md>), [http](<https://devfeed.tech/tags/http.md>), [programming](<https://devfeed.tech/tags/programming.md>)

### AI overview

A tutorial for implementing the Snake game in Haskell using the gifstream framework. The game generates animated GIF frames through an HTTP server, displays them in a browser, and accepts WASD input from the terminal.

### Source excerpt

Note: This is translated from the German original, which was used as a homework for the Programming Paradigms course at Karlsruhe Institute of Technology a long long time ago when I was co-holding the practical courses. Snake is a computer game in which a snake has to be moved through a playing field. Eating food increases the snake's length. When the snake collides with a wall or itself the game ends. In this homework you will implement Snake in Haskell. For this you will require the framework from the gifstream repository. The output of the game happens in an animated GIF stream, which you can watch in your browser. 64 colors are supported, which can be respresented as Int tuples of (0,0,0) up to (3,3,3). type RGB = (Int,Int,Int) A single frame of a GIF is defined as a list of rows, wherein each row is a list of RGB values. type Frame = [[RGB]] The framework provides a \texttt{server} function, which runs an HTTP server on the supplied port. The server sends each client a new frame of the GIF animation at the set interval. In the passed logic function new frames will be generated dynamically. server :: PortNumber -> Int -> Logic -> IO () The Snake.hs file contains the basis for writing the Snake game. Compile the game and run it (You'll need to install the network and random Haskell packages too): $ ghc -O3 -threaded Snake.hs [1 of 2] Compiling GifStream ( GifStream.hs, GifStream.o ) [2 of 2] Compiling Main ( Snake.hs, Snake.o ) Linking Snake ... $ ./Snake Listening on http://127.0.0.1:5002/ Open the supplied address in a browser. By pressing the WASD keys in the terminal you can influence the GIF in your browser. Other participants in your network can watch the GIF stream as well, by using your network IP address instead of 127.0.0.1. Furthermore it is possible to record the GIF stream and watch it later: wget -O game.gif http://127.0.0.1:5002/ The most important function in Snake.hs is logic: logic wait getInput sendFrame = initialState >>= go where go (State ol

## God writes Haskell

DevFeed: [God writes Haskell](<https://devfeed.tech/articles/god-writes-haskell-30817.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/god-writes-haskell/>)

Published: 2023-06-02T22:00:00Z

Content type: opinion

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Haskell](<https://devfeed.tech/topics/haskell.md>), [quantum mechanics](<https://devfeed.tech/topics/quantum-mechanics.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>), [Data structures](<https://devfeed.tech/topics/data-structures.md>)

Tags: [arrays](<https://devfeed.tech/tags/arrays.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [haskell](<https://devfeed.tech/tags/haskell.md>), [memory-leak](<https://devfeed.tech/tags/memory-leak.md>), [programming](<https://devfeed.tech/tags/programming.md>), [quantum](<https://devfeed.tech/tags/quantum.md>), [quantum-mechanics](<https://devfeed.tech/tags/quantum-mechanics.md>), [type-system](<https://devfeed.tech/tags/type-system.md>)

### AI overview

A humorous commentary compares Haskell concepts--including lazy evaluation, immutability, linked lists, type checking, and memory retention--to ideas from quantum mechanics and the physical universe.

### Source excerpt

God famously does not play dice with the universe, but he seems to enjoy writing Haskell: Consider the wave-particle duality in quantum mechanics. Every particle behaves as a wave, as long as you haven't interacted with it. Thanks to Haskell's lazy evaluation values are also only evaluated once they are accessed (interacted with particles), and stay unevaluated thunks (waves) in the meantime. Two particles can be Quantum-entangled, so that their states depend on each other, even though the particles are seperated by any distance. In Haskell a value, whether it's evaluated yet or not, can also be shared and then used in a totally different location in the program without having to copy it. The value is even immutable, so that you can't change it from one location and thus influence the other. Similarly for entangled particles you can't manipulate one to change the state of the other particle, which might be far away and thus break the maximum speed of information. Since values are immutable they have to be cleaned up more often in Haskell than typically in imperative languages. GHC, the most commonly used Haskell compiler, allocates new data in a special area. Only after a supernova will the still-relevant data be ejected into the larger universe. Haskell beginners often use lists instead of arrays. You can't do random access in a linked list, but only access the first element and then the rest of the list. The real world also doesn't allow you random access, you are limited by the speed of light and have to go from one location to the next. Time also seems to be a linked list, not even doubly linked, since you can't go back after accessing the current element. Seems like an awkward bug. Since the Haskell type system is so good at catching bugs, you often feel like you don't even need to write tests. This is unfortunately untrue, as the strange physical bugs of our universe demonstrate: The speed of light happens to stay the same, no matter what speed you move at. Th

## Database Testing at Yugabyte

DevFeed: [Database Testing at Yugabyte](<https://devfeed.tech/articles/database-testing-at-yugabyte-30810.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/database-testing-at-yugabyte/>)

Published: 2023-01-13T23:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Database](<https://devfeed.tech/topics/database.md>), [Cloud](<https://devfeed.tech/topics/cloud.md>), [Scalability](<https://devfeed.tech/topics/scalability.md>), [rdbms](<https://devfeed.tech/topics/rdbms.md>)

Tags: [cloud](<https://devfeed.tech/tags/cloud.md>), [cloud-native](<https://devfeed.tech/tags/cloud-native.md>), [database](<https://devfeed.tech/tags/database.md>), [qa](<https://devfeed.tech/tags/qa.md>), [quality](<https://devfeed.tech/tags/quality.md>), [quality-assurance](<https://devfeed.tech/tags/quality-assurance.md>), [rdbms](<https://devfeed.tech/tags/rdbms.md>), [scalability](<https://devfeed.tech/tags/scalability.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This article introduces YugabyteDB's database testing philosophy, approaches, and implementations. It describes YugabyteDB as a cloud-native database designed for continuous availability, horizontal scalability, and strong RDBMS features, and directs readers to the YugabyteDB blog for the full post.

### Source excerpt

YugabyteDB is a cloud-native database for business-critical enterprise applications. It is designed to provide continuous availability as well as horizontal scalability, while retaining a strong set of RDBMS features. This objective creates a strong quality incentive for us in the Yugabyte Quality Assurance (QA) team. As a member of this team, I am giving an overview of the testing philosophy, approaches, and implementations for YugabyteDB. Read the rest of the blog post over on the YugabyteDB blog.

## Update on DoS Attacks against our Online Game

DevFeed: [Update on DoS Attacks against our Online Game](<https://devfeed.tech/articles/update-on-dos-attacks-against-our-online-game-30814.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/dos-attacks-update/>)

Published: 2022-05-15T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [spoofing](<https://devfeed.tech/topics/spoofing.md>), [servers](<https://devfeed.tech/topics/servers.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [Protocol (disambiguation)](<https://devfeed.tech/topics/protocol.md>), [client](<https://devfeed.tech/topics/client.md>)

Tags: [attacks](<https://devfeed.tech/tags/attacks.md>), [https](<https://devfeed.tech/tags/https.md>), [ipv4](<https://devfeed.tech/tags/ipv4.md>), [ipv6](<https://devfeed.tech/tags/ipv6.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [server](<https://devfeed.tech/tags/server.md>), [servers](<https://devfeed.tech/tags/servers.md>), [spoofing](<https://devfeed.tech/tags/spoofing.md>), [udp](<https://devfeed.tech/tags/udp.md>)

### AI overview

This update describes ongoing DoS attacks against the open-source DDraceNetwork online game. It explains how spoofed UDP connection attempts overload single-threaded game servers and outlines an HTTPS-based IP whitelist, along with limitations involving capacity, IPv4, IPv6, and ISP address translation.

### Source excerpt

In my previous post 8 months ago I described how our open source online game DDraceNetwork has been suffering under DoS attacks for about 8 years, basically since its inception. Recently the attacks have gotten much worse, forcing us to work on further approaches. Since many players made suggestions recently, I'm writing this blog post to summarize what we are attempting and to ask for help again. These traffic graphs are from two of the servers we are running, note the logarithmic x-axis. Each spike represents an incoming DoS attack, as you can see some of them last for nearly a day. Recently the attacks have been relatively weak in terms of incoming bandwidth, using spoofed IP addresses imitating our UDP-based connection process. At first the CPU gets overloaded since the server suddenly has to try and handle hundreds of thousands of connection attempts per second. Since our game servers are mostly running on cheap VPSes and each game server runs single-threaded, it is quite easy to overload a system in this manner. HTTPS-based Whitelist To prevent spoofing we collect all players' IP addresses and whitelist those. Since we also develop the game client, we can modify the client to connect to a server via HTTPs for this whitelisting. The iptables rules and ipset setup on the game servers for this whitelist look something like this: ipset create official iphash ipset create whitelist-ip iphash iptables -N serverinfo iptables -A serverinfo -m hashlimit --hashlimit-above 40/s --hashlimit-mode dstport --hashlimit-name si_dstport -j DROP iptables -N game iptables -A game -m set --match-set official src -j ACCEPT iptables -A game -m set --match-set whitelist-ip src -m u32 --u32 "38=0x67696533" -j serverinfo iptables -A game -m set --match-set whitelist-ip src -m u32 --u32 "38=0x66737464" -j serverinfo iptables -A game -m set --match-set whitelist-ip src -j ACCEPT # Still allow non-whitelisted players when there is no attack iptables -A game -m limit --limit 10000 -j ACCEP

## macOS Setup after 15 Years of Linux

DevFeed: [macOS Setup after 15 Years of Linux](<https://devfeed.tech/articles/macos-setup-after-15-years-of-linux-30823.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/macos-setup/>)

Published: 2021-12-25T23:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [macOS](<https://devfeed.tech/topics/macos.md>), [Homebrew](<https://devfeed.tech/topics/homebrew.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [cpu](<https://devfeed.tech/topics/cpu.md>)

Tags: [command-line](<https://devfeed.tech/tags/command-line.md>), [homebrew](<https://devfeed.tech/tags/homebrew.md>), [intel](<https://devfeed.tech/tags/intel.md>), [linux](<https://devfeed.tech/tags/linux.md>), [macos](<https://devfeed.tech/tags/macos.md>)

### AI overview

A developer describes moving from a long-established Linux desktop setup to using an M1 Pro MacBook Pro as a daily driver. The article discusses the hardware, Homebrew installation choices, ARM64 compatibility issues with mpv, and video playback performance using Rosetta 2, Firefox, and a custom FFmpeg build.

### Source excerpt

About 3 years ago I wrote about my Linux Desktop Setup and having used pretty much the same software setup for 10-15 years. My setup used to be heavily keyboard based. Now for work I am for the first time using a macOS-based Macbook Pro with an M1 Pro CPU. I spent the last 3 weeks using it as a daily driver, tweaking it here and there. Here are my experiences. Hardware-wise the machine is great. With the 10 core ARM64 CPU I get about 2-3 times the CPU performance of my desktop system with an Intel i7 6700k. In DDNet I can reach 1800 FPS which is clearly more than enough and about 10 times the FPS I have with the 6700k's iGPU. I haven't heard the fan turn on at all yet, so either my workloads, and even my compilations, are too light-weight, or the fan is pretty quiet. The integrated 120 Hz screen is far better than anything I've had before, with clearer colors and smoother motion. Installing Software macOS's AppStore doesn't seem to have most of the relevant applications for me. Homebrew seems to be the most popular third-party package manager for macOS, so I chose that, hoping that it would support most programs I want to use. Command line applications can be installed with brew install, while graphical applications that you want acccessible in the regular Applications directory need a brew install --cask. For some applications like mpv this can be a bit confusing since there is both a command-line Formulae and a GUI Cask available for it. The Cask doesn't support arm64 natively yet, since the maintainer of it doesn't have an M1 Mac and mpv doesn't provide official binaries. So here I noticed a major difference in how Homebrew seems to work compared to Arch Linux for example. On Arch Linux applications are built from source code centrally instead of relying on binaries from a vendor. Luckily it was easy enough to build a DMG of mpv myself, which I then installed by dragging it into the Applications folder: git clone https://github.com/mpv-player/mpv cd mpv git clean

## DoS Attacks against our Online Game

DevFeed: [DoS Attacks against our Online Game](<https://devfeed.tech/articles/dos-attacks-against-our-online-game-30813.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/dos-attacks-against-online-game/>)

Published: 2021-09-26T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Network](<https://devfeed.tech/topics/network.md>), [servers](<https://devfeed.tech/topics/servers.md>), [Latency](<https://devfeed.tech/topics/latency.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [hosting](<https://devfeed.tech/topics/hosting.md>), [Cloudflare](<https://devfeed.tech/topics/cloudflare.md>), [Database](<https://devfeed.tech/topics/database.md>), [MySQL](<https://devfeed.tech/topics/mysql.md>), [SQLite](<https://devfeed.tech/topics/sqlite.md>), [Rust](<https://devfeed.tech/topics/rust.md>)

Tags: [attacks](<https://devfeed.tech/tags/attacks.md>), [cloudflare](<https://devfeed.tech/tags/cloudflare.md>), [database](<https://devfeed.tech/tags/database.md>), [hosting](<https://devfeed.tech/tags/hosting.md>), [latency](<https://devfeed.tech/tags/latency.md>), [mysql](<https://devfeed.tech/tags/mysql.md>), [network](<https://devfeed.tech/tags/network.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [rust](<https://devfeed.tech/tags/rust.md>), [server](<https://devfeed.tech/tags/server.md>), [servers](<https://devfeed.tech/tags/servers.md>), [sqlite](<https://devfeed.tech/tags/sqlite.md>)

### AI overview

The article describes recurring DoS attacks against DDNet, an open-source online game, and their effects on geographically distributed game servers and a community tournament. It outlines the attack types, hosting problems, and measures including a secret database address, local SQLite fallback, and Cloudflare-protected web components.

### Source excerpt

DDraceNetwork is an open source online game I've been running since 2013 with a community of volunteers. The game is available for free, I'm hosting servers for it in many countries around the world so that we have trusted official ranks. The servers are paid for by donations, which I stop collecting once the cost of the servers for the current year is covered. I wrote about DDNet in a previous post in 2016 and also a bit about the game history in 2013. Pretty much since the beginning we have been suffering from DoS attacks against the servers. Since the Steam release in 2020 the player number has increased significantly, so that we have about 1300 players playing on average. Based on the rising player number the urge to deal with the DoS problem is larger than ever. A few months ago for example we organized a Tournament for everyone in the community to participate. Unfortunately the event was the continuous target of DoS attacks for multiple hours, with players fleeing from one server to the next, trying to find a safe refuge. These bandwidth graphs for our servers in Netherlands and Germany respectively illustrate the problem: Since DDNet only runs online and you feel every small network latency it is predestined as a target for DoS attacks. Outside of attacks our servers don't need to be particularly powerful for regular gameplay, 1 CPU core can support 150 players concurrently, memory consumption is minimal. So the total we are paying for our ~23 servers around the world is only ~2300 EUR  for the year 2021. What we have tried The kinds of attacks we receive are varied. There are generic reflection and amplification attacks, as well as spoofed game specific attacks of considerable strength. Some hosters have thrown us out following attacks impacting their other customers, and most hosters will blackhole our IP address for multiple hours before it gets to that. There is even a Wireshark dissector for DDNet/Teeworlds available, written in Rust: Some components of our

## Quest for the Lost Home Server

DevFeed: [Quest for the Lost Home Server](<https://devfeed.tech/articles/quest-for-the-lost-home-server-30833.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/quest-for-the-lost-home-server/>)

Published: 2019-10-14T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Homelab](<https://devfeed.tech/topics/homelab.md>), [OpenSSH](<https://devfeed.tech/topics/openssh.md>), [Hardware](<https://devfeed.tech/topics/hardware.md>), [systems](<https://devfeed.tech/topics/systems.md>), [backups](<https://devfeed.tech/topics/backups.md>)

Tags: [backups](<https://devfeed.tech/tags/backups.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [glibc](<https://devfeed.tech/tags/glibc.md>), [hardware](<https://devfeed.tech/tags/hardware.md>), [home-server](<https://devfeed.tech/tags/home-server.md>), [intel](<https://devfeed.tech/tags/intel.md>), [ssh](<https://devfeed.tech/tags/ssh.md>)

### AI overview

A remote troubleshooting account of recovering access to a home server after SSH connections and pings failed. The author traced the problem to a changed dynamic IP address, found the server by scanning the likely ISP subnet on a custom SSH port, and identified cronie's inability to spawn processes after a glibc update.

### Source excerpt

Today I lost access to my home server. As I described in a previous post I depend heavily on the server to fetch my emails, as a file server, to synchronize files, for newsbeuter and irssi sessions and many other things. As no one was going to be in proximity of the server for the next few hours, my goal for today was to solve the problem remotely. The symptom was that my SSH connection attempts failed. The server also didn't respond to pings. As the server is sitting at home behind a regular DSL connection it uses a dynamic IP address that is shuffled every 24 hours. So my first hunch was that the daily reconnect might just have happened at a different time today and I gave the server some time to broadcast its new IP address to my domain registrar. After about an hour I still couldn't connect, so I started investigating. Maybe the API of the domain registrar changed (as happened before) or my script failed for another reason? I know that my home server does nightly backups of the other servers I run. So I connected to one of them and checked the journalctl log. To my surprise no connection from the server happened last night. My worst fear was that the server was hanging due to a hardware problem, as I ran into similar problems with this Intel Bay Trail CPU before. (The issue seems to be that Intel underdesigned the power delivery on those systems, which the graphics driver is trying to work around.) But I wasn't ready to give up yet, so I tried to think of any other activities the server would do that might leave a trace. I found out that my email hoster doesn't provide easy access to the IP addresses that access the mailbox. I couldn't think of any other traces at the time, but next time I might check if my IP address is visible on some IRC server. As a last resort I remembered that my ISP usually gives me quite similar IP addresses, so I used whois on yesterday's IP address to see how large the subnet is. I got back a subnet of only 2¹⁴ addresses, which seemed

## Chinese Traffic to time.gif

DevFeed: [Chinese Traffic to time.gif](<https://devfeed.tech/articles/chinese-traffic-to-time-gif-30806.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/chinese-traffic-time.gif/>)

Published: 2019-05-20T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [nginx](<https://devfeed.tech/topics/nginx.md>), [Network](<https://devfeed.tech/topics/network.md>), [Haskell](<https://devfeed.tech/topics/haskell.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [DDoS](<https://devfeed.tech/topics/ddos.md>)

Tags: [cpu](<https://devfeed.tech/tags/cpu.md>), [haskell](<https://devfeed.tech/tags/haskell.md>), [http](<https://devfeed.tech/tags/http.md>), [linux](<https://devfeed.tech/tags/linux.md>), [memory-leaks](<https://devfeed.tech/tags/memory-leaks.md>), [network](<https://devfeed.tech/tags/network.md>), [nginx](<https://devfeed.tech/tags/nginx.md>), [proxy](<https://devfeed.tech/tags/proxy.md>), [server](<https://devfeed.tech/tags/server.md>)

### AI overview

The article investigates a sudden surge of traffic to an endless UTC time GIF. Logs and user-agent data indicate that much of the traffic came from WeChat and QQ users on Chinese mobile networks. The author measures the traffic's effect on a Debian VPS running nginx and a Haskell program, including high request volume, bandwidth usage, long-lived connections, and nginx connection limits, and describes efforts to keep the server running.

### Source excerpt

Nearly two years ago I posted this endless GIF that always shows the current time in UTC: Now looking at my GoAccess dashboard I can see that it is picking up in popularity rather suddenly: But strangely I can't find anything about time.gif being linked on the web. So this might just be an attempted Denial of Service (DoS) attack? At least that would be something I am familiar with from the DDNet direction, but it's certainly strange on HookRace. But instead of simply shutting down time.gif I decided to try to find out who is accessing it and whether I can keep the server up. Let's look into the nginx logs, since I use nginx to proxy the requests to the Haskell program. There I see about 40 new requests per second looking like this: hookrace.net 123.185.XXX.XXX - - [21/May/2019:21:21:27 +0200] "GET /time.gif HTTP/2.0" 200 3335 "XXX" "Mozilla/5.0 (Linux; Android 8.1.0; V1818A Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044681 Mobile Safari/537.36 MMWEBID/XXX MicroMessenger/7.0.4.1420(0x2700043A) Process/tools NetType/WIFI Language/zh_CN" 8.055 hookrace.net 111.62.XXX.XXX - - [21/May/2019:21:21:27 +0200] "GET /time.gif HTTP/2.0" 200 32061 "XXX" "Mozilla/5.0 (Linux; Android 5.1; OPPO A59s Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044704 Mobile Safari/537.36 MMWEBID/XXX MicroMessenger/7.0.4.1420(0x2700043B) Process/tools NetType/WIFI Language/zh_CN" 89.256 hookrace.net 111.29.XXX.XXX - - [21/May/2019:21:21:27 +0200] "GET /time.gif HTTP/2.0" 200 543830 "XXX" "Mozilla/5.0 (Linux; Android 7.1.1; OPPO R11 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044704 Mobile Safari/537.36 MMWEBID/XXX MicroMessenger/7.0.4.1420(0x2700043A) Process/tools NetType/WIFI Language/zh_CN" 1540.238 hookrace.net 112.2.XXX.XXX - - [21/May/2019:21:21:27 +0200] "GET /time.gif HTTP/2.0" 200 172102 "

## Linux Desktop Setup

DevFeed: [Linux Desktop Setup](<https://devfeed.tech/articles/linux-desktop-setup-30822.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/linux-desktop-setup/>)

Published: 2019-01-14T23:00:00Z

Content type: opinion

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Linux](<https://devfeed.tech/topics/linux.md>), [Arch Linux](<https://devfeed.tech/topics/archlinux.md>), [Kernel](<https://devfeed.tech/topics/kernel.md>), [Shell](<https://devfeed.tech/topics/shell.md>)

Tags: [desktop](<https://devfeed.tech/tags/desktop.md>), [distribution](<https://devfeed.tech/tags/distribution.md>), [kernel](<https://devfeed.tech/tags/kernel.md>), [linux](<https://devfeed.tech/tags/linux.md>), [linux-desktop-setup](<https://devfeed.tech/tags/linux-desktop-setup.md>), [news](<https://devfeed.tech/tags/news.md>), [shell](<https://devfeed.tech/tags/shell.md>), [terminal](<https://devfeed.tech/tags/terminal.md>)

### AI overview

A personal overview of a Linux desktop software setup and the author's priorities for local, terminal-based, efficient, and composable software. The article discusses using Arch Linux across computers and private servers, including kernel-module and restart issues after upgrades.

### Source excerpt

Russian Translation by Akhmad Karimov My software setup has been surprisingly constant over the last decade, after a few years of experimentation since I initially switched to Linux in 2006. It might be interesting to look back in another 10 years and see what changed. A quick overview of what's running as I'm writing this post: Motivation My software priorities are, in no specific order: Programs should run on my local system so that I'm in control of them, this excludes cloud solutions. Programs should run in the terminal, so that they can be used consistently from anywhere, including weak computers or a phone. Keyboard focused is nearly automatic by using terminal software. I prefer to use the mouse where it makes sense only, reaching for the mouse all the time during typing feels like a waste of time. Occasionally it took me an hour to notice that the mouse wasn't even plugged in. Ideally use fast and efficient software, I don't like hearing the fan and feeling the room heat up. I can also keep running older hardware for much longer, my 10 year old Thinkpad x200s is still fine for all the software I use. Be composable. I don't want to do every step manually, instead automate more when it makes sense. This naturally favors the shell. Operating Systems I had a hard start with Linux 12 years ago by removing Windows, armed with just the Gentoo Linux installation CD and a printed manual to get a functioning Linux system. It took me a few days of compiling and tinkering, but in the end I felt like I had learnt a lot. I haven't looked back to Windows since then, but I switched to Arch Linux on my laptop after having the fan fail from the constant compilation stress. Later I also switched all my other computers and private servers to Arch Linux. As a rolling release distribution you get package upgrades all the time, but the most important breakages are nicely reported in the Arch Linux News. One annoyance though is that Arch Linux removes the old kernel modules once yo

## Theme Switcher in Nginx

DevFeed: [Theme Switcher in Nginx](<https://devfeed.tech/articles/theme-switcher-in-nginx-30839.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/theme-switcher-nginx/>)

Published: 2019-01-08T23:00:00Z

Content type: tutorial

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Dark Mode](<https://devfeed.tech/topics/dark-mode.md>), [nginx](<https://devfeed.tech/topics/nginx.md>), [CSS](<https://devfeed.tech/topics/css.md>), [modern web development](<https://devfeed.tech/topics/modern-web-development.md>)

Tags: [color](<https://devfeed.tech/tags/color.md>), [css](<https://devfeed.tech/tags/css.md>), [nginx](<https://devfeed.tech/tags/nginx.md>), [performance](<https://devfeed.tech/tags/performance.md>)

### AI overview

This article explains a dark-mode theme switcher implemented with static HTML, a cookie, CSS, and Nginx. It replaces a JavaScript-based switcher with server-side CSS selection, avoiding rendering flicker. The article also describes an inline CSS alternative and notes that the approach prevents the CSS file from being cached.

### Source excerpt

Some people really liked the dark DDNet theme for Halloween by Soreu, so we decided to keep it possible to use the default bright or the dark theme. Thanks to xse we got a JavaScript based theme switcher. After some improvements I finally I switched it away from JavaScript entirely and finally am also using it on this blog with an OLED friendly dark theme. The final result is quite simple, and only requires static HTML, a cookie for the theme and Nginx for setting and returning the correct CSS file for it. You can try it out by clicking on the Switch Theme button at the top of this page, which just redirects you to /switch-theme/. Doing the CSS decision server-side instead of in JavaScript has the advantage that you don't get any flicker on rendering, no matter what theme you chose. The entire nginx logic is: location /switch-theme/ { if ($http_cookie ~* "user_theme=/public/css-dark.css") { add_header Set-Cookie "user_theme=/public/css-empty.css;path=/;domain=hookrace.net"; return 302 $http_referer; } add_header Set-Cookie "user_theme=/public/css-dark.css;path=/;domain=hookrace.net"; return 302 $http_referer; } location /public/css-dark.css { if ($http_cookie ~* "user_theme=/public/css-dark.css") { return 302 /public/css/css-dark.css; } return 302 /public/css/css-empty.css; } Note that the /switch-theme/ location sends the user back to the $http_referer. /public/css-dark.css is statically included on each page, but what it does depends on the cookie value. The 302 Moved Temporarily response makes the client send another request, adding another roundtrip to the page rendering. If the CSS is small enough you can just pull it directly into the Nginx config: location /public/css-dark.css { if ($http_cookie ~* "user_theme=/public/css-dark.css") { return 200 "body {color: #fff; background-color: #000;} .page-title, .post-title, .post-title a, h1, h2, h3, h4, h5, h6 {color: #ccc;} .masthead-title a {color: #bbb;}"; } return 200 ""; } One side effect of this entire approach

## Turning Down a Blockchain Job Offer

DevFeed: [Turning Down a Blockchain Job Offer](<https://devfeed.tech/articles/turning-down-a-blockchain-job-offer-30841.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/turning-down-blockchain/>)

Published: 2018-01-21T23:00:00Z

Content type: opinion

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Blockchain](<https://devfeed.tech/topics/blockchain.md>), [proof of work](<https://devfeed.tech/topics/proof-of-work.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Hardware](<https://devfeed.tech/topics/hardware.md>)

Tags: [blockchain](<https://devfeed.tech/tags/blockchain.md>), [consensus](<https://devfeed.tech/tags/consensus.md>), [energy](<https://devfeed.tech/tags/energy.md>), [hardware](<https://devfeed.tech/tags/hardware.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [job](<https://devfeed.tech/tags/job.md>), [programming](<https://devfeed.tech/tags/programming.md>), [proof-of-work](<https://devfeed.tech/tags/proof-of-work.md>), [work](<https://devfeed.tech/tags/work.md>)

### AI overview

The author explains why they declined a generous, remote job developing a blockchain implementation. Although they found Bitcoin's electronic-cash concept and the programming opportunity appealing, they objected to proof-of-work's hardware and energy costs and to hype and questionable practices surrounding cryptocurrencies and token offerings.

### Source excerpt

I have recently received a job offer to work on a blockchain implementation. While the offer was very generous, I had to turn it down. In this post I want to collect the thoughts that went into my decision process leading to this conclusion. Introduction I have not touched blockchain technology much before, other than reading the original Bitcoin paper shortly after it was released and accepting Bitcoin donations for DDNet. But I have always used those donations pretty much immediately, and thus I have no investment in cryptocurrencies either way and am thus impartial to their fate. The Good I consider the Bitcoin idea to be quite interesting as an electronic cash system that doesn't require any trusted intermediary. This is a small and simple idea that combines old cryptographic ideas into something new. The job I got offered had a significantly higher salary attached than my current job. The new job would have been remote, thus enabling me to spend more time with my girlfriend and live in any location I wish. I would have been able to work in a nice programming language, developing a blockchain implementation from the ground up with a small group of colleagues. The Bad Proof of work in the form of mining is currently the most common form of trustless consensus in blockchain systems. It requires immense amounts of computational hardware in the form of ASICs and GPUs as well as energy to supply them. The only function of this is to prevent any one actor to take over more than 50% of the mining market and thus controlling the currency. This is a large price to pay for replacing trust. Looking at it the other way: Trust can be seen as a shortcut that humanity has used for a long time in order not to require expensive proof of work. For most applications this still works fine. Companies are doing initial coin offerings (ICOs), giving out their own cryptotoken to public investors, circumventing a proper IPO process. While companies often claim that their tokens will hav

## HANA C++ Development Environment and Processes

DevFeed: [HANA C++ Development Environment and Processes](<https://devfeed.tech/articles/hana-c-development-environment-and-processes-30818.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/hana-cpp-development/>)

Published: 2017-12-07T23:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [C++](<https://devfeed.tech/topics/c-plus-plus.md>), [Development](<https://devfeed.tech/topics/development.md>), [Linux](<https://devfeed.tech/topics/linux.md>), [Database](<https://devfeed.tech/topics/database.md>), [Python](<https://devfeed.tech/topics/python.md>), [Git](<https://devfeed.tech/topics/git.md>), [cpu](<https://devfeed.tech/topics/cpu.md>), [datacenter](<https://devfeed.tech/topics/datacenter.md>)

Tags: [build](<https://devfeed.tech/tags/build.md>), [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [data-center](<https://devfeed.tech/tags/data-center.md>), [database](<https://devfeed.tech/tags/database.md>), [development](<https://devfeed.tech/tags/development.md>), [git](<https://devfeed.tech/tags/git.md>), [linux](<https://devfeed.tech/tags/linux.md>), [python](<https://devfeed.tech/tags/python.md>)

### AI overview

A C++ developer describes the HANA Core Platform development environment and release process at SAP. The article covers HANA's C++ codebase, Python tests, Linux-based development, powerful workstations, remote data-center access, and compile-cluster improvements that reduce build time.

### Source excerpt

I started working as a C++ developer in the HANA Core Platform team at SAP in Walldorf, Germany more than a year ago. In this time I have gotten some insights into the development environment and processes. I will use this post to illustrate them by the example of adding a small new feature and explaining the steps on the way of getting it released. Some of this will be specific to HANA, some to my team inside HANA, some to my own system. Compilation HANA is the in-house database powering many of SAP's products. It is written in C++ with Python tests, and the entire code base lives inside of a single git repository. Hundreds of developers from all around the world are developing on about 10 million lines of C++ code and 15 million lines of Python tests. Since HANA is deployed on Linux exclusively, many developers are using Linux on their workstations as well. So far Windows is still supported as a development environment, but this will change in 2019, leaving Linux as the only choice. During day-to-day work you still get to interact with Windows a bit (more than I would prefer), since the Laptop has Windows with the traditional Microsoft Office products on it. But since the actual development happens on Linux, I am happy enough, being able to use the xmonad window manager and software environment I have gotten used to over the last decade. HANA is deployed on some rather impressive machines, so in order to test the code adequately the developer workstations are quite beefy as well. I am typing this text from a 20 core / 40 thread Xeon E5-2660 v3 CPU with 128 GB of RAM. Still compiling HANA is no quick feat. Expect something around 2 hours to build it from scratch on your local machine (illustrated below), and be prepared for some heat output, which is especially noticeable in summer. About half of the colleagues have chosen to move their workstations to the data center and access it remotely instead of working on it locally. Since they are still in one of our SAP bu

## C++ Quiz #1

DevFeed: [C++ Quiz #1](<https://devfeed.tech/articles/c-quiz-1-30808.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/cpp-quiz-1/>)

Published: 2017-11-30T23:00:00Z

Content type: tutorial

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [C++](<https://devfeed.tech/topics/c-plus-plus.md>), [Parser](<https://devfeed.tech/topics/parser.md>), [Programming](<https://devfeed.tech/topics/programming.md>)

Tags: [c-plus-plus](<https://devfeed.tech/tags/c-plus-plus.md>), [code](<https://devfeed.tech/tags/code.md>), [constructor](<https://devfeed.tech/tags/constructor.md>), [parsing](<https://devfeed.tech/tags/parsing.md>), [programming](<https://devfeed.tech/tags/programming.md>)

### AI overview

This C++ tutorial examines how ambiguous parsing affects constructor expressions, temporary objects, and variable shadowing. It explains why similar-looking lines produce different constructor calls and notes a related mutex-locking hazard and an upcoming Clang warning.

### Source excerpt

What is the output of this small snippet that is based on real C++ code? #include <iostream> struct Foo { Foo() { std::cout << "standard" << std::endl; } Foo(const Foo&) { std::cout << "copy" << std::endl; } Foo(int) { std::cout << "int" << std::endl; } Foo(int, int) { std::cout << "int, int" << std::endl; } Foo(const Foo&, int) { std::cout << "Foo, int" << std::endl; } Foo(int, const Foo&) { std::cout << "int, Foo" << std::endl; } }; void f(Foo) {} struct Bar { int m_i; int m_j; Bar() { f(Foo(m_i, m_j)); f(Foo(m_i)); Foo(m_i, m_j); Foo(m_i); Foo(m_i, m_j); } }; int main() { Bar(); } The code compiles without warnings with clang++ 5.0.0 as well as g++ 7.2.0 using -Wall -Wextra. Solution The preliminaries are simple: We have a struct Foo with a few different constructors, each of which prints a text that represents its parameter types. We have a struct Bar with two members, m_i and m_j. The main function calls the standard constructor of Bar. The constructor of Bar is where the magic happens, so let's go through it line by line: f(Foo(m_i, m_j)) creates a temporary Foo object by calling the Foo constructor with m_i and m_j as parameters, so int, int is printed. The resulting Foo object is then passed to the function f. f(Foo(m_i)) works analogously, it calls the Foo constructor with m_i as parameter, so int is printed. The resulting Foo object is then passed to the function f. Foo(m_i, m_j) works the same as the first line, except it doesn't pass the resulting temporary Foo object to a function, so it is destroyed again immediately, int, int is printed again. So far so good, but now look closely. Foo(m_i) surprisingly behaves entirely differently from all the previous lines. It does not call the Foo constructor with m_i as the parameter. Instead it creates a Foo object of the name m_i, just like Foo m_i would. So standard is printed. Now the last line looks just like the third line, but it still does something different. Why? Because the name m_i is no longer referri

## time.gif

DevFeed: [time.gif](<https://devfeed.tech/articles/time-gif-30840.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/time.gif/>)

Published: 2017-08-10T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Haskell](<https://devfeed.tech/topics/haskell.md>), [Code](<https://devfeed.tech/topics/code.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [HTTP](<https://devfeed.tech/topics/http.md>), [IO](<https://devfeed.tech/topics/io.md>)

Tags: [2017](<https://devfeed.tech/tags/2017.md>), [browsers](<https://devfeed.tech/tags/browsers.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [encoding](<https://devfeed.tech/tags/encoding.md>), [gif](<https://devfeed.tech/tags/gif.md>), [haskell](<https://devfeed.tech/tags/haskell.md>), [http](<https://devfeed.tech/tags/http.md>), [programming](<https://devfeed.tech/tags/programming.md>), [server](<https://devfeed.tech/tags/server.md>)

### AI overview

time.gif is an endless GIF that displays the current UTC time. Written in Haskell, it generates each frame dynamically and streams the frames over an HTTP connection. The article notes Safari compatibility issues and describes optimizations for CPU use, connection capacity, and bandwidth.

### Source excerpt

This is an endless GIF that always shows the current time in UTC: Source Code (From reports it doesn't seem to work on Safari, other browsers should be fine.) time.gif is written in Haskell and works by dynamically generating each frame of the GIF and slowly feeding them over the HTTP connection. There is no guarantee that this GIF shows a reasonable time and this is just for fun anyway, so better don't build your next project based on the time from this GIF. If my server is overloaded, you can try compiling it yourself and run it locally. Update: Optimized, runs at less than 1% CPU with 500 simultaneous connections open, LZW encoding reduces bandwidth from 4 KB/s to 300 B/s. -- Wait for incoming connections and start delivering a GIF to them loop :: Int -> FrameSignal -> Socket -> IO () loop delay frameSignal sock = do (conn, _) <- accept sock forkIO $ body conn loop delay frameSignal sock where body c = do f <- receiveMSignal frameSignal sendAll c $ msg $ initialFrame (delay `div` 10000) f nextFrame c nextFrame c = do f <- receiveMSignal frameSignal sendAll c $ frame (delay `div` 10000) f nextFrame c msg content = B.intercalate "\r\n" [ "HTTP/1.0 200 OK" , "Server: gifstream/0.1" , "Content-Type: image/gif" , "Content-Transfer-Encoding: binary" , "Cache-Control: no-cache" , "Cache-Control: no-store" , "Cache-Control: no-transform" , "" , content ] This is cannibalized from gifstream, which lets you play snake and have people watch a GIF livestream. It was actually created as a Christmas exercise for students of the Programming Paradigms course at KIT. Discuss on Hacker News (2022-10-27) (previous thread from 2017-08-12)

## Nim Code Coverage

DevFeed: [Nim Code Coverage](<https://devfeed.tech/articles/nim-code-coverage-30829.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/nim-code-coverage/>)

Published: 2016-10-31T23:00:00Z

Content type: tutorial

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Nim](<https://devfeed.tech/topics/nim.md>), [test-coverage](<https://devfeed.tech/topics/test-coverage.md>), [Command-line interface](<https://devfeed.tech/topics/cli.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>)

Tags: [code-coverage](<https://devfeed.tech/tags/code-coverage.md>), [command-line](<https://devfeed.tech/tags/command-line.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [nim](<https://devfeed.tech/tags/nim.md>)

### AI overview

A tutorial on generating Nim code coverage reports with gcov and lcov. It shows how to enable Nim line information and compiler coverage flags, while noting that optimization and dead-code elimination can exclude impossible code and uncovered functions from coverage results.

### Source excerpt

Creating code coverage reports with Nim is surprisingly easy. You can simply use the good old gcov and lcov tools. Nim can be told to insert its own line information with the --debugger:native command line parameter. Here's the small example program we're looking at: var x = 0 if x > 1: echo "foo" echo "bar" Note that if we change the condition to if false: the Nim compiler optimizes the impossible code away and it will not count as uncovered. The same thing can happen with entire uncovered functions when optimizations and dead code elimination are enabled. The file is saved as x.nim. Here's the script I use to create the code coverage report: #!/bin/sh rm -rf *.info html nimcache nim --debugger:native --passC:--coverage --passL:--coverage c x lcov --base-directory . --directory . --zerocounters -q ./x lcov --base-directory . --directory . -c -o x.info lcov --remove x.info "lib/*" -o x.info # remove Nim system libs from coverage genhtml -o html x.info You can look at the final html report generated.

## A Taste of Haskell

DevFeed: [A Taste of Haskell](<https://devfeed.tech/articles/a-taste-of-haskell-30804.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/a-taste-of-haskell/>)

Published: 2016-10-20T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Haskell](<https://devfeed.tech/topics/haskell.md>), [Functional programming](<https://devfeed.tech/topics/functional-programming.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>)

Tags: [compiler](<https://devfeed.tech/tags/compiler.md>), [functional-programming](<https://devfeed.tech/tags/functional-programming.md>), [haskell](<https://devfeed.tech/tags/haskell.md>), [java](<https://devfeed.tech/tags/java.md>), [programming](<https://devfeed.tech/tags/programming.md>)

### AI overview

An introductory article exploring Haskell through comparisons with Java, explanations of functional programming, and interactive examples using the Glasgow Haskell Compiler. It describes Haskell as purely functional, lazily evaluated, statically typed, and equipped with type inference.

### Source excerpt

In this post I want to highlight a few fun aspects of the Haskell programming language. The purpose is to give you a taste of Haskell so that you will want to learn more of it. Don't consider this as a tutorial or guide but rather as a starting point, as it is based on a short talk I held at work, which in turn is based on my favorite material from holding practical courses about Haskell at university. Let's start by seeing how programmers compare Haskell to a mainstream programming language, for example Java: Image Source: Hammer Principle Doesn't sound that good for Java, what do people say about Haskell? Image Source: Hammer Principle Sounds much better and makes it seem like a reasonable endeavour to learn Haskell! So what is Haskell actually? Haskell is a purely functional, lazily evaluated, statically typed programming language with type inference. While this definition sounds complicated you should understand more of it after reading this post. Let's start with the basics: What's the difference between an imperative programming language and a functional one? In imperative programming the basic operation is changing a stored value. In functional programming the basic operation is applying a function to arguments. Haskell itself was designed in 1990 by a scientific committee with the purpose of being a basis for functional programming research. The Glasgow Haskell Compiler (GHC) is the most popular implementation and the one we will be using. You can get it as part of the Haskell Platform as well. Haskell code can be compiled (ghc), but also interpreted (ghci, interactive). In the rest of this blog post we will look at some key features of Haskell interactively, so you can get your own installation of GHC and follow along and experiment with the code. Arithmetic I belive that the best way to learn a programming language is by playing around with it. So that's what we're going to do now. I'll show a few examples and explain the cool Haskell features that we enco

## New Hardware and Hacks

DevFeed: [New Hardware and Hacks](<https://devfeed.tech/articles/new-hardware-and-hacks-30826.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/new-hardware-hacks/>)

Published: 2016-07-02T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Hardware](<https://devfeed.tech/topics/hardware.md>), [pc](<https://devfeed.tech/topics/pc.md>), [cpu](<https://devfeed.tech/topics/cpu.md>), [intel](<https://devfeed.tech/topics/intel.md>), [pcie](<https://devfeed.tech/topics/pcie.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [cpu](<https://devfeed.tech/tags/cpu.md>), [hardware](<https://devfeed.tech/tags/hardware.md>), [intel](<https://devfeed.tech/tags/intel.md>), [noctua](<https://devfeed.tech/tags/noctua.md>), [pc](<https://devfeed.tech/tags/pc.md>), [pcie](<https://devfeed.tech/tags/pcie.md>)

### AI overview

A personal account of building a compact, quiet Mini-ITX PC with Intel Skylake hardware, including the In Win Chopin case, its integrated 150 W power supply, and a Noctua NH-L9i CPU cooler. The article explains the author's design choices and plans to measure CPU temperatures.

### Source excerpt

In my latest post I showed some examples of how I ran mostly the same PC hardware over a period of 8 years. Today I finally finished setting up my new PC hardware in my new home, so I can report about what I did differently, my thought process, and some problems I encountered and hacks I did to solve them. I'm not sure if this article is interesting for anyone, but I had some fun setting the new system up and felt like writing about it, so here we go: Case I wanted a smaller case since the old one was a huge ATX tower with way too many useless ports and fans. I still want a pretty performant system, so an Intel NUC is out of the question. I don't need a GPU, since the most challenging graphics I need is DDNet client, which easily runs at 400 fps at 1920x1080 and 130 fps at 3840x2160 on Intel's HD Graphics 530 IGP integrated on Skylake CPUs. But it's still nice to have a PCIe port in case you ever need it. So Mini-ITX it is. Unfortunately the Streacom DB4 is not available yet, as it would have made for a beautiful silent Mini-ITX cube. Instead I went with the In Win Chopin, which is even smaller, features no GPU port and has a small integrated PSU rated at 150 W. I was a bit worried about the PSU being strong enough, but you can read more about that later in this post. There really aren't that many good-looking and reasonable Mini-ITX cases. The idea of the In Win Chopin is to use the CPU fan as the only fan to cool the entire case, pulling air directly from the side, pushing it out of the top. That's a stark contrast to my old machine with a total of 9 fans whirring inside the case. CPU Cooler Of course that means I need a good CPU cooler for the small space. With just 43 mm space for the cooler my choice fell on the Noctua NH-L9i. Unfortunately the manufacturer claims a 91 W Skylake CPU barely runs with the NH-L9i. So let's check out the CPU and measure some actual temperatures. Even though I switched to a small form factor, another goal of mine is still to keep th

## Broken Hardware, Fixes and Hacks over 8 Years

DevFeed: [Broken Hardware, Fixes and Hacks over 8 Years](<https://devfeed.tech/articles/broken-hardware-fixes-and-hacks-over-8-years-30805.md>)

Original publisher: [Read original article](<https://hookrace.net/blog/broken-hardware-fixes-hacks-8-years/>)

Published: 2016-06-20T22:00:00Z

Content type: article

Language: en

Sources: [Dennis Felsing](<https://devfeed.tech/sources/dennis-felsing.md>)

Topics: [Hardware](<https://devfeed.tech/topics/hardware.md>), [Image](<https://devfeed.tech/topics/image.md>)

Tags: [article](<https://devfeed.tech/tags/article.md>), [durability](<https://devfeed.tech/tags/durability.md>), [electronics](<https://devfeed.tech/tags/electronics.md>), [experience](<https://devfeed.tech/tags/experience.md>), [hardware](<https://devfeed.tech/tags/hardware.md>), [personal](<https://devfeed.tech/tags/personal.md>)

### AI overview

A personal overview of eight years of using, repairing, and working around failures in computing hardware. The article emphasizes frugal reuse and discusses common problems such as failed capacitors in consumer electronics.

### Source excerpt

After reading the feedback of my recent article about running DDNet, I noticed that people found it interesting how I'm trying to minimize money and resources. I also noticed that I had been doing something similar with my personal computing hardware setup for an even longer time. I've mostly been using the same hardware for personal computation purposes over the last 8 years. In this article I want to talk about some of the hardware I've been using, how it broke and how I fixed the problems or worked around them. My goal was to be frugal about hardware, to keep using the same hardware for a long time and repair it when possible instead of simply buying new hardware. The reason for this post is that I'm moving and abandoning my old hardware setup. There may be some interesting tales in here. Depending on how you value your time it is probably cheaper to simply buy new stuff instead of repairing old ones, but I consider it a fun activity and a much more rewarding experience. Whether you call it planned obsolescence or just cheap manufacturing, it's a fact that electronic hardware tends to break rather quickly. Most reviews don't take any note of this and so it is difficult to find out which hardware to buy if you value durability. The best I can do is tell you what you should and should not have bought 8 years ago. For each of these topics there are probably much more detailed reports and guides online, so I will keep it short and just give an overview. If you're interested in fixing your own hardware, a search engine of your choice is your friend. Tools used The tools I use are absolutely simple: Mostly I just used a Weller WECP-20 for soldering, regular screwdrivers and some other, older hardware to steal replacement parts from. Nothing fancy and I don't claim to do anything special with it. Liquid-Crystal Displays Let's start with what in my experience was the most common problem in consumer electronics, resulting in their failure: broken capacitors Or at least it

[Next page](<https://devfeed.tech/sources/dennis-felsing.md?cursor=WyIyMDE2LTA2LTIwVDIyOjAwOjAwKzAwOjAwIiwgImZlNGFkMmIxLTM0Y2MtNDFjYy1hNmQ4LTQ0MzIyZGM4Mzg0ZCJd>)