<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/css" href="/css/rss.css"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog on Applied Go</title><link>https://appliedgo.net/</link><description>Recent content in Blog on Applied Go</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>Christoph Berger</managingEditor><webMaster>chris@appliedgo.net</webMaster><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.</copyright><lastBuildDate>Thu, 14 Dec 2023 17:22:58 +0100</lastBuildDate><atom:link href="https://appliedgo.net/index.xml" rel="self" type="application/rss+xml"/><item><title>From Go Code to Homebrew Tap: Writing and Deploying a Whisper CLI with GoReleaser</title><link>https://appliedgo.net/whisper-cli/</link><pubDate>Mon, 03 Mar 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/whisper-cli/</guid><description> If an existing tool is not straightforward to use, a software developer's natural reflex is to write a tailor-made CLI. Akash Joshi wrapped OpenAI's Whisper model into an intuitive command-line interface, packaged it with GoReleaser, and distributed it via Homebrew. Here are the steps for you to steal.</description></item><item><title>Beyond the Debugger: A Comprehensive Guide to Debugging Go Applications</title><link>https://appliedgo.net/debug/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/debug/</guid><description> Not all bugs are created equal. Some may be easy to pinpoint and eliminate with the help of a debugger. Others might be subtle or infrequent, and tracking them down is like searching for a needle in a haystack. Choosing the right debugging technique can significantly raise the chance of success while reducing the time to get there.</description></item><item><title>Go One-Two-Three: My Favorite Features of Go Release 1.23</title><link>https://appliedgo.net/go123/</link><pubDate>Wed, 14 Aug 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/go123/</guid><description> TL;DR: Go now officially supports ranging over function iterators, adds opt-in telemetry, is WAY faster when building with Profiled Guided Optimization enabled, fixes garbage collection of tickers and timers, and provides useful updates to many packages of the standard library. Get it while it's hot!</description></item><item><title>Distributed Computing With Dried, Salted Cod Fish, WASM, And (Tiny)Go</title><link>https://appliedgo.net/bacalhau/</link><pubDate>Sat, 02 Mar 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/bacalhau/</guid><description> You don't need monstrous software orchestration systems for collecting information from distributed data sources. Here is an easy way of sending a Go binary to where the data is.</description></item><item><title>SQL as API in Go</title><link>https://appliedgo.net/sqlasapi/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/sqlasapi/</guid><description> So your API needs to allow queries that are too complicated for plain CRUD APIs but not complicated enough to justify using GraphQL? Consider accepting a subset of SQL where clauses, with the necessary security checks implemented in Go.</description></item><item><title>Continuous refresh, or: how to keep your API client authorized</title><link>https://appliedgo.net/refresh/</link><pubDate>Wed, 18 Oct 2023 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/refresh/</guid><description> An access token should be initialized and refreshed from a central place, yet be available to umpteenth of client sessions. Dynamic futures to the rescue.</description></item><item><title>Poetry time! Go proverbs as limericks</title><link>https://appliedgo.net/limericks/</link><pubDate>Thu, 08 Dec 2022 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/limericks/</guid><description> The Go proverbs capture the essence of Go. Too concise for your taste? No worries, here is each proverb explained in a limerick.</description></item><item><title>AI times three—or how I made AI write a blog post for me</title><link>https://appliedgo.net/ai-times-three/</link><pubDate>Sat, 03 Dec 2022 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/ai-times-three/</guid><description> Writing a concurrency-safe hashmap in Go is dead easy, even an AI can do it! To prove this, I had three AI tools write this blog article, generate Go code, and create an opening image.</description></item><item><title>How I used Go to make my radio auto-switch to AUX-IN when a Raspi plays music</title><link>https://appliedgo.net/auxin/</link><pubDate>Sat, 20 Aug 2022 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/auxin/</guid><description> Ok, so your radio lacks AirPlay support but has an auxiliary input and can be remote-controlled via the Frontier Silicon API. Fetch a Raspberry Pi, put Shairport-sync and Raspotify on it, plug it into the AUX port, and glue everything together with some Go code. Et voilà - home automation in the small.</description></item><item><title>Rapid AWS Lambda development with Go and Mantil</title><link>https://appliedgo.net/mantil/</link><pubDate>Fri, 28 Jan 2022 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/mantil/</guid><description> If you need to develop an AWS Lambda function in Go, take a look at Mantil, a dev kit with staging and database connection included.</description></item><item><title>Instant Go</title><link>https://appliedgo.net/instantgo/</link><pubDate>Sat, 04 Sep 2021 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/instantgo/</guid><description> Edit and run Go code right in the browser. No backend required.</description></item><item><title>How I turned a binary search tree into a generic data structure with go2go</title><link>https://appliedgo.net/generictree/</link><pubDate>Wed, 07 Jul 2021 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/generictree/</guid><description> Some time ago I wrote about how to create a balanced binary search tree. The search keys and the data payload were both plain strings. Now it is time to get rid of this limitation. go2go lets us do that while waiting for the official generics release.</description></item><item><title>How to become the richest person on earth (and learn some Go along the way)</title><link>https://appliedgo.net/rich/</link><pubDate>Wed, 02 Jun 2021 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/rich/</guid><description> Ok, to be frank, this article is mostly about the second part of the title. We will build a market simulation with minimal Go code, and show how the rich get richer even when they are not greedy at all.</description></item><item><title>Packaging a project release (goreleaser part 2)</title><link>https://appliedgo.net/release2/</link><pubDate>Sat, 08 May 2021 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/release2/</guid><description> In the previous post, I used goreleaser to add binaries to a project release. Now let's have goreleaser build a Homebrew formula as well. Automatically, and for macOS and Linux alike.</description></item><item><title>CLI tools FTW (or: how to distribute your CLI tools with goreleaser)</title><link>https://appliedgo.net/release/</link><pubDate>Sat, 24 Apr 2021 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/release/</guid><description> “go get” is a super-simple way of installing Go binaries, but not everyone has a Go compiler installed. If you want to make your CLI tools and apps available to the world, have a look at goreleaser.</description></item><item><title>Cannot import main: a Go Module gotcha</title><link>https://appliedgo.net/testmain/</link><pubDate>Sat, 28 Nov 2020 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/testmain/</guid><description> Two questions for you: Do you name an app module simply “main”? And do you happen to write tests for a main package? If so, you are in big trouble! (Ok, that was a bit clickbait-ey…) Well, the world is not exactly going to end; however, you might encounter an unexpected error that is hard to track down.</description></item><item><title>Futures in Go, no package required</title><link>https://appliedgo.net/futures/</link><pubDate>Sat, 06 Jun 2020 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/futures/</guid><description> Futures are mechanisms for decoupling a value from how it was computed. Goroutines and channels allow implementing futures trivially. Does this approach cover all aspects of a future?</description></item><item><title>what.Happens - a debug logging package for developers only</title><link>https://appliedgo.net/what/</link><pubDate>Sun, 12 Apr 2020 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/what/</guid><description> Package what provides some handy debug-logging functions that can be enabled and disabled via build flags. No more information leaks in your production code!</description></item><item><title>Slow down your code with goroutines</title><link>https://appliedgo.net/concurrencyslower/</link><pubDate>Sat, 13 Apr 2019 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/concurrencyslower/</guid><description> Or: How adding goroutines can keep your CPU busy shuffling things around.</description></item><item><title>In the news: Go on AWS Lambda</title><link>https://appliedgo.net/awslambda/</link><pubDate>Sun, 28 Jan 2018 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/awslambda/</guid><description> Just recently, Amazon announced support for Go on AWS Lambda. Here is a summary of last week's news around this topic.</description></item><item><title>How to Create PDF Documents</title><link>https://appliedgo.net/pdf/</link><pubDate>Tue, 16 Jan 2018 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/pdf/</guid><description> Pure data is for computers and nerds like you and me. Anyone else likes nicely formatted reports. Go and a good PDF package can help.</description></item><item><title>Processing spreadsheet data in Go</title><link>https://appliedgo.net/spreadsheet/</link><pubDate>Mon, 04 Dec 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/spreadsheet/</guid><description> Your managers, all through the hierarchy, love circulating spreadsheets via email. (They simply don't know better.) How to extract and analyze the relevant data from the daily mess? Go can help.</description></item><item><title>A DIY Dashboard with Grafana</title><link>https://appliedgo.net/diydashboard/</link><pubDate>Mon, 30 Oct 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/diydashboard/</guid><description> If your code creates some stats to monitor, Grafana and the Grada package may come in handy.</description></item><item><title>Go slices are not dynamic arrays</title><link>https://appliedgo.net/slices/</link><pubDate>Thu, 03 Aug 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/slices/</guid><description> Go's slices are cleverly designed. They provide the look-and-feel of truly dynamic arrays while being optimized for performance. However, not being aware of the slice mechanisms can bring you into trouble.</description></item><item><title>goman - the missing man pages for Go binaries</title><link>https://appliedgo.net/goman/</link><pubDate>Mon, 26 Jun 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/goman/</guid><description> Most Go binaries come without any man page. The tool goman fills this gap. If the corresponding project includes a decent README file (and most projects do), goman find this README file and displays it on the terminal.</description></item><item><title>Controlling a Digispark board</title><link>https://appliedgo.net/digispark/</link><pubDate>Sun, 21 May 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/digispark/</guid><description> The Digispark is perhaps as small as a microcontroller board for DIY electronics can get. This is a short writedown about my first experiences with controlling this board through Go code, using Gobot and LittleWire.</description></item><item><title>Big Oh!</title><link>https://appliedgo.net/big-o/</link><pubDate>Mon, 01 May 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/big-o/</guid><description> You worked hard to save a few CPU cycles in the central loop, but your code is still slow? Time to think about the time complexity of your algorithm.</description></item><item><title>Text-Based User Interfaces</title><link>https://appliedgo.net/tui/</link><pubDate>Sun, 02 Apr 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/tui/</guid><description> Want to equip your command-line application with a nice visual user interface? TUI libraries are here to help.</description></item><item><title>Flow To Go</title><link>https://appliedgo.net/flow2go/</link><pubDate>Sat, 11 Mar 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/flow2go/</guid><description> If you want to do Flow-Based Programming in Go, there are a couple of frameworks and libraries available. Or you simply do it with pure Go. After all, how difficult can it be?</description></item><item><title>Get into the flow</title><link>https://appliedgo.net/flow/</link><pubDate>Sat, 25 Feb 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/flow/</guid><description> In Flow-Based Programming, programs are modeled as data flowing between independent processing units. Who would not think of channels and goroutines as a natural analogy?</description></item><item><title>TCP/IP Networking</title><link>https://appliedgo.net/networking/</link><pubDate>Wed, 25 Jan 2017 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/networking/</guid><description> Connecting two processes at TCP/IP level might seem scary at first, but in Go it is easier than one might think.</description></item><item><title>Picturesque!</title><link>https://appliedgo.net/imageprocessing/</link><pubDate>Thu, 22 Dec 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/imageprocessing/</guid><description> Let's face it: Pictures taken with a smartphone usually aren't quite like Ansel Adams masterpieces. But with a little post-processing, some of them might still reveal their true beauty. A couple of Go libraries can help.</description></item><item><title>MapReduce - munching through Big Data</title><link>https://appliedgo.net/mapreduce/</link><pubDate>Fri, 02 Dec 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/mapreduce/</guid><description> How Google tackled the problem of processing enormous amounts of data, and how you can do the same with Go.</description></item><item><title>Deliver my data, Mr. Json!</title><link>https://appliedgo.net/json/</link><pubDate>Thu, 27 Oct 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/json/</guid><description> JSON is the lingua franca of exchanging data over the net and between applications written in different programming languages. In this article, we create a tiny JSON client/server app in Go.</description></item><item><title>A Random Blog Post</title><link>https://appliedgo.net/random/</link><pubDate>Tue, 11 Oct 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/random/</guid><description> How to generate random numbers, and the difference between math/rand and crypto/rand.</description></item><item><title>Take a REST!</title><link>https://appliedgo.net/rest/</link><pubDate>Wed, 14 Sep 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/rest/</guid><description> RESTful Web API's are ubiquitous. Time for a minimalistic, five-minutes video tutorial about REST, RESTful API's, and buidling a REST server in Go.</description></item><item><title>Regular Expressions demystified</title><link>https://appliedgo.net/regexp/</link><pubDate>Mon, 29 Aug 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/regexp/</guid><description> Regular Expressions are slow, ugly, error-prone, incomprehensible,… Or are they? Find out by learning regexp basics.</description></item><item><title>Balancing a binary search tree</title><link>https://appliedgo.net/balancedtree/</link><pubDate>Sat, 13 Aug 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/balancedtree/</guid><description> Only a well-balanced search tree can provide optimal search performance. This article adds automatic balancing to the binary search tree from the previous article.</description></item><item><title>A Binary Search Tree</title><link>https://appliedgo.net/bintree/</link><pubDate>Sat, 06 Aug 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/bintree/</guid><description> Search trees are everywhere: In databases, in file systems, in board game algorithms,… This post explores the probably most basic form of a tree: a binary search tree.</description></item><item><title>Who needs generics? Use ... instead!</title><link>https://appliedgo.net/generics/</link><pubDate>Thu, 14 Jul 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/generics/</guid><description> What are generics? Why are they considered useful? Why does Go have no generics? What shall Gophers use instead?
This article examines the nature of generics, and surveys various techniques that can be used to work around the absence of this programming paradigm.</description></item><item><title>Plugins in Go</title><link>https://appliedgo.net/plugins/</link><pubDate>Thu, 30 Jun 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/plugins/</guid><description> Go is a statically compiled language. The Go runtime cannot load dynamic libraries, nor does it support compiling Go on the fly. Still, there is a number of ways of creating and using plugins in Go.</description></item><item><title>Dependency Injection in a nutshell</title><link>https://appliedgo.net/di/</link><pubDate>Thu, 23 Jun 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/di/</guid><description> Layered software architectures adhere to the Dependency Rule: Source code in a lower-level layer can make use of code in higher-level layers, but never vice versa. Control flow, however, goes in both directions. How is this possible, given that higher-level code must not know anything about the code in lower levels?</description></item><item><title>Inverse Kinematics: how to move a robotic arm (and why this is harder than it seems)</title><link>https://appliedgo.net/roboticarm/</link><pubDate>Thu, 16 Jun 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/roboticarm/</guid><description> So you have built a robotic arm? Great, let's write some Go to make it serve your five o'clock tea. Sounds simple enough. Or is it?</description></item><item><title>Perceptrons - the most basic form of a neural network</title><link>https://appliedgo.net/perceptron/</link><pubDate>Thu, 09 Jun 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/perceptron/</guid><description> Artificial Neural Networks have gained attention during the recent years, driven by advances in deep learning. But what is an Artificial Neural Network and what is it made of?
Meet the perceptron.</description></item><item><title>Message Queues Part 2: The PubSub Protocol</title><link>https://appliedgo.net/pubsub/</link><pubDate>Thu, 02 Jun 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/pubsub/</guid><description> This is the second (and, for the time being, the last) article about messaging and Mangos. After doing first steps with the Pair protocol, we now look into a slightly more complex protocol, the Publisher-Subscriber (or PubSub) protocol.</description></item><item><title>Message Queues, or how you can make processes talk to each other</title><link>https://appliedgo.net/messaging/</link><pubDate>Fri, 27 May 2016 00:00:00 +0000</pubDate><author>chris@appliedgo.net</author><guid>https://appliedgo.net/messaging/</guid><description> Consider two processes that need to exchange commands and data. You want to connect them in a way that is straightforward, efficient, and reliable. How would you do that?
Enter Message Queues.</description></item></channel></rss>