<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Init I/O - Blog</title><link>https://blog.init-io.net/</link><description>Recent content on Init I/O - Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 30 Apr 2026 20:20:32 +0200</lastBuildDate><atom:link href="https://blog.init-io.net/index.xml" rel="self" type="application/rss+xml"/><item><title>Introducing sss (S3-client)</title><link>https://blog.init-io.net/post/2025/sss/</link><pubDate>Tue, 16 Dec 2025 17:00:00 +0100</pubDate><guid>https://blog.init-io.net/post/2025/sss/</guid><description>&lt;p>Make sure to check the &lt;a href="https://github.com/sj14/sss/">repository&lt;/a> for the latest version.&lt;/p>
&lt;p>&lt;code>sss&lt;/code> is yet another S3 client. I respect all the existing clients and &lt;code>sss&lt;/code> certainly has its own shortcomings, but some reasons for starting the project:&lt;/p>
&lt;ul>
&lt;li>Having a single deployable binary.&lt;/li>
&lt;li>A CLI and config which can handle non-AWS S3 use-cases well (&lt;a href="https://github.com/aws/aws-cli/issues/4215">compare&lt;/a>).&lt;/li>
&lt;li>Get somewhat meaningful errors instead of &lt;code>'NoneType' is not iterable&lt;/code>.&lt;/li>
&lt;li>Having a read-only mode (allowing only &lt;a href="https://httpwg.org/specs/rfc9110.html#safe.methods">safe&lt;/a> HTTP methods).&lt;/li>
&lt;li>Having the S3 feature set I need.&lt;/li>
&lt;li>Be able to limit the bandwidth.&lt;/li>
&lt;li>Ergonomic usage, e.g. &lt;code>&amp;lt;bucket&amp;gt; get &amp;lt;object&amp;gt; --sse-c-key=&amp;lt;key&amp;gt;&lt;/code> (&lt;a href="https://docs.min.io/enterprise/aistor-object-store/reference/cli/mc-put/#--enc-c">compare&lt;/a>).&lt;/li>
&lt;li>Hard to misuse (no local file management like &lt;code>mc cp /mydata/ alias-typo/mybucket/mydata&lt;/code>).&lt;/li>
&lt;li>Writing the bucket name before the operation to switch the operation quickly, e.g. &lt;code>&amp;lt;bucket&amp;gt; policy get&lt;/code> and &lt;code>&amp;lt;bucket&amp;gt; policy rm&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="installation">
 &lt;a class="heading-anchor" href="#installation">
 &lt;small>»&lt;/small>
 &lt;/a>
 Installation
&lt;/h2>
&lt;h3 id="binaries">
 &lt;a class="heading-anchor" href="#binaries">
 &lt;small>»&lt;/small>
 &lt;/a>
 Binaries
&lt;/h3>
&lt;p>Binaries are available for all major platforms. See the &lt;a href="https://github.com/sj14/sss/releases">releases&lt;/a> page.&lt;/p></description></item><item><title>Introducing IP-Auth</title><link>https://blog.init-io.net/post/2025/ip-auth/</link><pubDate>Tue, 16 Dec 2025 16:00:00 +0100</pubDate><guid>https://blog.init-io.net/post/2025/ip-auth/</guid><description>&lt;p>&lt;code>ip-auth&lt;/code> is a reverse proxy to allow access only by certain IPs.
Make sure to check the &lt;a href="https://github.com/sj14/ip-auth/">repository&lt;/a> for the latest version.&lt;/p>
&lt;p>There are circumstances where properly setup Basic Auth won&amp;rsquo;t work &lt;a href="https://github.com/jellyfin/jellyfin-android/issues/123">[1]&lt;/a>.
IP Auth is a workaround by allowing specific IPs access to the service and proxying the traffic to the original service. Allowed IPs can be specified or dynamically added by passing a Basic Auth login &lt;em>once&lt;/em> from &lt;em>any&lt;/em> device on the same IP. Everything is stored in memory and will be lost on restarts.&lt;/p></description></item><item><title>S3 bits</title><link>https://blog.init-io.net/post/2025/s3-bits/</link><pubDate>Sun, 02 Feb 2025 15:50:00 +0100</pubDate><guid>https://blog.init-io.net/post/2025/s3-bits/</guid><description>&lt;p>Things might be specific to Hetzner Object-Storage instead of AWS S3.&lt;/p>
&lt;h2 id="copy-files">
 &lt;a class="heading-anchor" href="#copy-files">
 &lt;small>»&lt;/small>
 &lt;/a>
 Copy Files
&lt;/h2>
&lt;h3 id="upload">
 &lt;a class="heading-anchor" href="#upload">
 &lt;small>»&lt;/small>
 &lt;/a>
 Upload
&lt;/h3>
&lt;p>Using &lt;code>mc&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>mc cp &amp;lt;LOCAL_PATH&amp;gt; &amp;lt;ALIAS&amp;gt;/&amp;lt;BUCKET&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="download">
 &lt;a class="heading-anchor" href="#download">
 &lt;small>»&lt;/small>
 &lt;/a>
 Download
&lt;/h3>
&lt;p>Using &lt;code>mc&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>mc cp &amp;lt;ALIAS&amp;gt;/&amp;lt;BUCKET&amp;gt; &amp;lt;LOCAL_PATH&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="multipart-uploads">
 &lt;a class="heading-anchor" href="#multipart-uploads">
 &lt;small>»&lt;/small>
 &lt;/a>
 Multipart Uploads
&lt;/h2>
&lt;h3 id="list">
 &lt;a class="heading-anchor" href="#list">
 &lt;small>»&lt;/small>
 &lt;/a>
 List
&lt;/h3>
&lt;p>Using &lt;code>mc&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>mc ls --incomplete &amp;lt;ALIAS&amp;gt;/&amp;lt;BUCKET&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Using &lt;code>aws&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>aws --profile &amp;lt;PROFILE&amp;gt; s3api list-multipart-uploads --bucket &amp;lt;BUCKET&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="remove">
 &lt;a class="heading-anchor" href="#remove">
 &lt;small>»&lt;/small>
 &lt;/a>
 Remove
&lt;/h3>
&lt;p>Using &lt;code>mc&lt;/code>:&lt;/p></description></item><item><title>Kubernetes volumes with rclone (the hacky way)</title><link>https://blog.init-io.net/post/2024/kubernetes-rclone-mount/</link><pubDate>Sat, 28 Sep 2024 09:00:00 +0200</pubDate><guid>https://blog.init-io.net/post/2024/kubernetes-rclone-mount/</guid><description>&lt;h2 id="post-updates">
 &lt;a class="heading-anchor" href="#post-updates">
 &lt;small>»&lt;/small>
 &lt;/a>
 Post Updates
&lt;/h2>
&lt;ul>
&lt;li>2025-11-26: &lt;strong>There is now an &lt;a href="https://github.com/veloxpack/csi-driver-rclone">rclone CSI driver&lt;/a>&lt;/strong>.&lt;/li>
&lt;li>2024-09-30: Added a third approach with using nfsmount.&lt;/li>
&lt;li>2024-09-30: Added a second approach with using a sidecar container.&lt;/li>
&lt;/ul>
&lt;h2 id="introduction">
 &lt;a class="heading-anchor" href="#introduction">
 &lt;small>»&lt;/small>
 &lt;/a>
 Introduction
&lt;/h2>
&lt;p>Kubernetes has a wide list of various CSI-drivers for mounting remote storage.
I was looking for mounting Hetzner Cloud Object Storage, but unfortunately, the given options were not to my satisfaction.
There are several options for mounting S3-compatible storage, but few of them offer transparent encryption and if they do, you are stuck with the tool. When I have to be stuck with a tool, why not a very popular one I can use almost everywhere?
When I can mount volumes with rclone and its crypt module in Kubernetes, I can use the same settings for mounting the bucket on my other machines, and that was my goal.
Unfortunately, there is no rclone CSI-driver yet, so I went with the hacky solution of directly using the host path of the Node.&lt;/p></description></item><item><title>Introducing jellyctl</title><link>https://blog.init-io.net/post/2024/jellyctl/</link><pubDate>Thu, 09 May 2024 09:00:00 +0100</pubDate><guid>https://blog.init-io.net/post/2024/jellyctl/</guid><description>&lt;p>jellyctl is a CLI for managing your &lt;a href="https://jellyfin.org/">Jellyfin&lt;/a> server.
Make sure to check the &lt;a href="https://github.com/sj14/jellyctl/">repository&lt;/a> for the latest version of jellyctl.&lt;/p>
&lt;p>As I didn&amp;rsquo;t want to craft every HTTP call to the API myself, I generated a Go client from the OpenAPI spec. You can find the Go client in the &lt;a href="https://github.com/sj14/jellyfin-go">jellyfin-go&lt;/a> repository.&lt;/p>
&lt;h2 id="installation">
 &lt;a class="heading-anchor" href="#installation">
 &lt;small>»&lt;/small>
 &lt;/a>
 Installation
&lt;/h2>
&lt;h3 id="precompiled-binaries">
 &lt;a class="heading-anchor" href="#precompiled-binaries">
 &lt;small>»&lt;/small>
 &lt;/a>
 Precompiled Binaries
&lt;/h3>
&lt;p>Binaries are available for all major platforms. See the &lt;a href="https://github.com/sj14/jellyctl/releases">releases&lt;/a> page.&lt;/p>
&lt;h3 id="homebrew">
 &lt;a class="heading-anchor" href="#homebrew">
 &lt;small>»&lt;/small>
 &lt;/a>
 Homebrew
&lt;/h3>
&lt;p>Using the &lt;a href="https://brew.sh/">Homebrew&lt;/a> package manager for macOS:&lt;/p></description></item><item><title>Introducing Calculon</title><link>https://blog.init-io.net/post/2023/calculon/</link><pubDate>Tue, 27 Jun 2023 07:50:00 +0100</pubDate><guid>https://blog.init-io.net/post/2023/calculon/</guid><description>&lt;p>Calculon is a basic, open-source, cross-platform, and &amp;ldquo;note-style&amp;rdquo; calculator inspired by &lt;a href="https://numi.app/">Numi&lt;/a>.&lt;/p>
&lt;p>Calculon is written in Java and uses the &lt;a href="https://www.objecthunter.net/exp4j/">exp4j&lt;/a> library for evaluating the mathematical expressions. It&amp;rsquo;s developed with the Netbeans IDE and the Swing GUI Builder.&lt;br>
It is a very rudimentary implementation, just enough to solve around 80% of my problem, so it is not very polished right now and the code is far away from best practices.&lt;/p>
&lt;p>Repository: &lt;a href="https://github.com/sj14/calculon/">github.com/sj14/calculon&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://blog.init-io.net/img/2023/calculon/screenshot.png" alt="screenshot">&lt;/p></description></item><item><title>Go bits</title><link>https://blog.init-io.net/post/2023/go-bits/</link><pubDate>Thu, 22 Jun 2023 07:50:00 +0100</pubDate><guid>https://blog.init-io.net/post/2023/go-bits/</guid><description>&lt;h2 id="cross-compile-using-zig">
 &lt;a class="heading-anchor" href="#cross-compile-using-zig">
 &lt;small>»&lt;/small>
 &lt;/a>
 Cross compile using Zig
&lt;/h2>
&lt;p>When you need a &lt;code>CGO&lt;/code> enabled build and want to cross compile, you can use &lt;a href="https://ziglang.org/">Zig&lt;/a> for effortlessly cross compiling the C part.&lt;/p>
&lt;p>Example for compiling to amd64 linux:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>env CGO_ENABLED&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#b48ead">1&lt;/span> GOOS&lt;span style="color:#81a1c1">=&lt;/span>linux GOARCH&lt;span style="color:#81a1c1">=&lt;/span>amd64 CC&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;zig cc -target x86_64-linux&amp;#34;&lt;/span> CXX&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;zig c++ -target x86_64-linux&amp;#34;&lt;/span> go build -o output_binary main.go
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>References:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://dev.to/kristoff/zig-makes-go-cross-compilation-just-work-29ho">https://dev.to/kristoff/zig-makes-go-cross-compilation-just-work-29ho&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/goreleaser/example-zig-cgo">https://github.com/goreleaser/example-zig-cgo&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="vs-code-debugging">
 &lt;a class="heading-anchor" href="#vs-code-debugging">
 &lt;small>»&lt;/small>
 &lt;/a>
 VS Code debugging
&lt;/h2>
&lt;p>Add the following to your user settings (or just the &lt;code>configurations&lt;/code> object inside the &lt;code>.vscode/launch.json&lt;/code> file in the root of your project) :&lt;/p></description></item><item><title>Introducing Kubedump</title><link>https://blog.init-io.net/post/2023/kubedump/</link><pubDate>Sun, 16 Apr 2023 07:20:00 +2000</pubDate><guid>https://blog.init-io.net/post/2023/kubedump/</guid><description>&lt;p>&lt;a href="https://github.com/sj14/kubedump/">kubedump&lt;/a> is a tool for dumping manifests from your Kubernetes clusters. It&amp;rsquo;s highly inspired by the available shell scripts (&lt;a href="https://gist.github.com/negz/c3ee465b48306593f16c523a22015bec">1&lt;/a>, &lt;a href="https://github.com/WoozyMasta/kube-dump/">2&lt;/a>) and just a Go implementation with similar behaviour I wrote mostly for fun.
A clear drawback of the Go implementation is the enormous binary size for such small functionality. Currently, the code is not even 200 lines of code but due to the imports from the Kubernetes ecosystem, the binary is around 30 MB. Nevertheless, having a binary instead of a shell script might have other benefits, e.g. no other required dependencies and compared to the scripts it seems to be very fast.&lt;/p></description></item><item><title>Replacing Docker Desktop with Podman Desktop on macOS</title><link>https://blog.init-io.net/post/2023/podman/</link><pubDate>Wed, 15 Feb 2023 15:20:00 +0100</pubDate><guid>https://blog.init-io.net/post/2023/podman/</guid><description>&lt;h2 id="post-updates">
 &lt;a class="heading-anchor" href="#post-updates">
 &lt;small>»&lt;/small>
 &lt;/a>
 Post Updates
&lt;/h2>
&lt;ul>
&lt;li>2023-02-17: There is an official documentation about migrating from Docker to Podman Desktop which I missed when searching for it. So instead of reading this post, you should checkout &lt;a href="https://podman-desktop.io/docs/migrating-from-docker">Migration from Docker to Podman Desktop&lt;/a> first.&lt;/li>
&lt;/ul>
&lt;h2 id="setup">
 &lt;a class="heading-anchor" href="#setup">
 &lt;small>»&lt;/small>
 &lt;/a>
 Setup
&lt;/h2>
&lt;p>Install Podman Desktop, e.g. with homebrew:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>brew install podman-desktop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Install the Podman Helper for compatibility with tools using the Docker socket.&lt;/p></description></item><item><title>$tool bits</title><link>https://blog.init-io.net/post/2022/tools-bits/</link><pubDate>Sun, 28 Aug 2022 13:52:00 +0100</pubDate><guid>https://blog.init-io.net/post/2022/tools-bits/</guid><description>&lt;p>Same procedure as last time? Same procedure, just for stuff which won&amp;rsquo;t require an own post (yet).&lt;/p>
&lt;h2 id="adb-android-debug-bridge">
 &lt;a class="heading-anchor" href="#adb-android-debug-bridge">
 &lt;small>»&lt;/small>
 &lt;/a>
 ADB (Android Debug Bridge)
&lt;/h2>
&lt;p>USB Devices are connected automatically.&lt;/p>
&lt;p>Connect device via network:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>adb connect &amp;lt;IP:PORT&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>List connected devices:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>adb devices -l
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Sideload:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>adb sideload &amp;lt;file&amp;gt;.zip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="curl">
 &lt;a class="heading-anchor" href="#curl">
 &lt;small>»&lt;/small>
 &lt;/a>
 curl
&lt;/h2>
&lt;p>Save with remote filename (short &lt;code>-O&lt;/code>):&lt;/p></description></item><item><title>MySQL bits</title><link>https://blog.init-io.net/post/2022/mysql-bits/</link><pubDate>Sat, 20 Aug 2022 06:59:00 +0100</pubDate><guid>https://blog.init-io.net/post/2022/mysql-bits/</guid><description>&lt;p>Recently, I had to examine a performance issue of a MySQL query. Here are some notes with helpful stuff I&amp;rsquo;ve used. All the commands &lt;em>might&lt;/em> work with MariaDB too, but this was not tested by me.&lt;/p>
&lt;p>Update 2023-05-18: I found &lt;a href="https://blog.mastermind.dev/indexes-in-postgresql">Understanding database Indexes in PostgreSQL&lt;/a> by Paweł Dąbrowski which contains similar and more detailed information but for PostgreSQL.&lt;/p>
&lt;h2 id="common">
 &lt;a class="heading-anchor" href="#common">
 &lt;small>»&lt;/small>
 &lt;/a>
 Common
&lt;/h2>
&lt;ul>
&lt;li>Currently, my preferd mySQL GUI management tool on macOS: &lt;a href="https://github.com/Sequel-Ace/Sequel-Ace">Sequel Ace&lt;/a>.&lt;/li>
&lt;li>Alternative cross-platform and cross-database GUI tools: &lt;a href="https://github.com/dbgate/dbgate">DbGate&lt;/a>, &lt;a href="https://github.com/Wisser/Jailer">Jailer&lt;/a>&lt;/li>
&lt;li>Use backticks (`) e.g. `table-name` when the name contains &amp;ldquo;unusual&amp;rdquo; characters such as &lt;code>-&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="describe-table">
 &lt;a class="heading-anchor" href="#describe-table">
 &lt;small>»&lt;/small>
 &lt;/a>
 Describe table
&lt;/h2>
&lt;p>Get an overview of the table:&lt;/p></description></item><item><title>Bash bits</title><link>https://blog.init-io.net/post/2022/bash-bits/</link><pubDate>Mon, 08 Aug 2022 18:06:00 +0100</pubDate><guid>https://blog.init-io.net/post/2022/bash-bits/</guid><description>&lt;p>Another post with stuff I can&amp;rsquo;t remember or might forget again 🤷‍♂️&lt;/p>
&lt;h2 id="bash-shebang">
 &lt;a class="heading-anchor" href="#bash-shebang">
 &lt;small>»&lt;/small>
 &lt;/a>
 Bash shebang
&lt;/h2>
&lt;p>Specify the explicit path:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#5e81ac;font-style:italic">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Let the environment decide:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#5e81ac;font-style:italic">#!/usr/bin/env bash
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Explanation: &lt;a href="https://stackoverflow.com/a/16365367/7125878">Alec Bennett&lt;/a>&lt;/p>
&lt;h2 id="fail-fast--and-more">
 &lt;a class="heading-anchor" href="#fail-fast--and-more">
 &lt;small>»&lt;/small>
 &lt;/a>
 Fail fast &amp;hellip; and more
&lt;/h2>
&lt;p>Best added directly after the shebang.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1">set&lt;/span> -o xtrace &lt;span style="color:#616e87;font-style:italic"># output every line which gets executed&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1">set&lt;/span> -o nounset &lt;span style="color:#616e87;font-style:italic"># fail if an unset variable is used&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1">set&lt;/span> -o errexit &lt;span style="color:#616e87;font-style:italic"># fail if a command exits with non-zero&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1">set&lt;/span> -o pipefail &lt;span style="color:#616e87;font-style:italic"># fail if a command in a pipe fails&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>or in short:&lt;/p></description></item><item><title>Python bits</title><link>https://blog.init-io.net/post/2022/python-bits/</link><pubDate>Wed, 13 Jul 2022 10:35:00 +0100</pubDate><guid>https://blog.init-io.net/post/2022/python-bits/</guid><description>&lt;h2 id="pip">
 &lt;a class="heading-anchor" href="#pip">
 &lt;small>»&lt;/small>
 &lt;/a>
 pip
&lt;/h2>
&lt;p>Remove all packages to get a somewhat clean system (e.g. when you forgot to use a virtual environment, like I did&amp;hellip;):&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>pip freeze &amp;gt; requirements.txt &amp;amp;&amp;amp; pip uninstall -r requirements.txt -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>or without creating a &lt;code>requirements.txt&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>pip uninstall -y -r &amp;lt;(pip freeze)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Credits to &lt;a href="https://towardsdatascience.com/14-must-know-pip-commands-for-data-scientists-and-engineers-a59ebbe0a439">Giorgos Myrianthous&lt;/a>&lt;/p>
&lt;h2 id="venv">
 &lt;a class="heading-anchor" href="#venv">
 &lt;small>»&lt;/small>
 &lt;/a>
 venv
&lt;/h2>
&lt;p>Create a virtual environment:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>python3 -m venv venv/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Activate the environment:&lt;/p></description></item><item><title>Introducing Confible</title><link>https://blog.init-io.net/post/2022/confible/</link><pubDate>Sun, 10 Jul 2022 10:17:00 +0100</pubDate><guid>https://blog.init-io.net/post/2022/confible/</guid><description>&lt;h2 id="introduction">
 &lt;a class="heading-anchor" href="#introduction">
 &lt;small>»&lt;/small>
 &lt;/a>
 Introduction
&lt;/h2>
&lt;p>Many people backup and sync their configs by just copying the whole dotfiles. Unfortunately, I&amp;rsquo;m not a big fan of this because then I backup a lot of lines I do not care about. Usually, I do only add a few lines to a config so that it fits my preferences. Otherwise, I like using the default settings the tools come with.
So, I tried to find a tool which would fit my preferences but was unlucky. &lt;a href="https://github.com/sj14/confible">Confible&lt;/a> was born. It can adjust config files and execute commands. Check the repository for the latest version and readme.&lt;/p></description></item><item><title>Python astral library ported to Go</title><link>https://blog.init-io.net/post/2021/04-19-astral-go/</link><pubDate>Mon, 19 Apr 2021 18:13:00 +0200</pubDate><guid>https://blog.init-io.net/post/2021/04-19-astral-go/</guid><description>&lt;p>Calculations for the position of the sun and moon.&lt;/p>
&lt;p>This is a Go port of the Python &lt;a href="https://github.com/sffjunkie/astral">astral&lt;/a> package.
Check out the latest Go version on &lt;a href="https://github.com/sj14/astral">Github&lt;/a>.&lt;/p>
&lt;p>The &lt;code>astral&lt;/code> package provides the means to calculate the following times of the sun:&lt;/p>
&lt;ul>
&lt;li>dawn&lt;/li>
&lt;li>sunrise&lt;/li>
&lt;li>noon&lt;/li>
&lt;li>midnight&lt;/li>
&lt;li>sunset&lt;/li>
&lt;li>dusk&lt;/li>
&lt;li>daylight&lt;/li>
&lt;li>night&lt;/li>
&lt;li>twilight&lt;/li>
&lt;li>blue hour&lt;/li>
&lt;li>golden hour&lt;/li>
&lt;li>&lt;del>rahukaalam&lt;/del> TODO&lt;/li>
&lt;/ul>
&lt;p>plus solar azimuth and elevation at a specific latitude/longitude.
It can also calculate the moon phase for a specific date.&lt;/p></description></item><item><title>Kubernetes bits</title><link>https://blog.init-io.net/post/2021/02-15-some-k8s-bits/</link><pubDate>Mon, 15 Feb 2021 22:44:00 +0100</pubDate><guid>https://blog.init-io.net/post/2021/02-15-some-k8s-bits/</guid><description>&lt;h2 id="post-updates">
 &lt;a class="heading-anchor" href="#post-updates">
 &lt;small>»&lt;/small>
 &lt;/a>
 Post Updates
&lt;/h2>
&lt;ul>
&lt;li>2023-03-22: Added bootstrap manifest.&lt;/li>
&lt;li>2022-09-21: Added ephemeral debug containers.&lt;/li>
&lt;li>2022-02-23: Added contexts and Service FQDN.&lt;/li>
&lt;li>2022-01-24: Added logs with &lt;code>stern&lt;/code> section.&lt;/li>
&lt;li>2021-12-01: Added Wireshark section.&lt;/li>
&lt;li>2021-10-09: Added Kubescape section.&lt;/li>
&lt;li>2021-04-21: Replaced &lt;code>ctr&lt;/code> with &lt;code>crictl&lt;/code> for finding the PID.&lt;/li>
&lt;/ul>
&lt;h2 id="switching-contexts">
 &lt;a class="heading-anchor" href="#switching-contexts">
 &lt;small>»&lt;/small>
 &lt;/a>
 Switching Contexts
&lt;/h2>
&lt;p>Credits to &lt;a href="https://sarasagunawardhana.medium.com/kubernetes-configure-context-and-switching-contexts-in-multiple-clusters-part-4-e93677737328">Sarasa Gunawardhana&lt;/a>&lt;/p>
&lt;p>List all contexts:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-console" data-lang="console">&lt;span style="display:flex;">&lt;span>kubectl config view -o jsonpath=&amp;#39;{.contexts[*].name}&amp;#39; | tr &amp;#34; &amp;#34; &amp;#34;\n&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Get current context:&lt;/p></description></item><item><title>Deploy a free Kubernetes cluster in the cloud</title><link>https://blog.init-io.net/post/2021/01-30-free-k8s-cloud-cluster/</link><pubDate>Sat, 30 Jan 2021 14:17:00 +0100</pubDate><guid>https://blog.init-io.net/post/2021/01-30-free-k8s-cloud-cluster/</guid><description>&lt;h2 id="post-updates">
 &lt;a class="heading-anchor" href="#post-updates">
 &lt;small>»&lt;/small>
 &lt;/a>
 Post Updates
&lt;/h2>
&lt;ul>
&lt;li>2022-08-20: The &lt;code>k3os&lt;/code> project seems to be dying and currently I would &lt;strong>not recommend&lt;/strong> it for new cluster installations. Personally, I&amp;rsquo;ve switched to &lt;a href="https://github.com/siderolabs/talos">Talos&lt;/a>.&lt;/li>
&lt;li>2021-09-17: Added a new section about securing web applications with TLS.&lt;/li>
&lt;li>2021-07-08: Oracle now offers 4 Ampere (ARM) instances with cumulated memory of 24GB. So, multi-main clusters are now possible and resources are less of a problem.&lt;/li>
&lt;/ul>
&lt;h2 id="introduction">
 &lt;a class="heading-anchor" href="#introduction">
 &lt;small>»&lt;/small>
 &lt;/a>
 Introduction
&lt;/h2>
&lt;p>For installing a completely free Kubernetes cluster, you can use the free instances of &lt;a href="https://www.oracle.com/cloud/free/#always-free">Oracle Cloud&lt;/a>.
The free tier is of course very low-end but it&amp;rsquo;s enough for some testing and playing around without always running something like
&lt;a href="https://minikube.sigs.k8s.io/docs/">minikube&lt;/a>, &lt;a href="https://kind.sigs.k8s.io/">kind&lt;/a> or &lt;a href="https://k3d.io/">k3d&lt;/a> on your local machine.&lt;/p></description></item><item><title>Docker bits</title><link>https://blog.init-io.net/post/2020/09-13-some-docker-bits/</link><pubDate>Sun, 13 Sep 2020 13:08:00 +0200</pubDate><guid>https://blog.init-io.net/post/2020/09-13-some-docker-bits/</guid><description>&lt;h2 id="post-updates">
 &lt;a class="heading-anchor" href="#post-updates">
 &lt;small>»&lt;/small>
 &lt;/a>
 Post Updates
&lt;/h2>
&lt;p>2023-03-01: Added Nixery as useful project.&lt;br>
2022-05-16: Added example for mounting the current directory into a docker container.&lt;br>
2021-06-12: Added &lt;code>--all --volumes --force&lt;/code> args to &lt;code>docker system prune&lt;/code> and removed separate commands for removing all images and volumes.&lt;/p>
&lt;h2 id="shell-into-a-fresh-container">
 &lt;a class="heading-anchor" href="#shell-into-a-fresh-container">
 &lt;small>»&lt;/small>
 &lt;/a>
 Shell into a fresh container
&lt;/h2>
&lt;p>Handy for some quick testing.&lt;/p>
&lt;h3 id="debian">
 &lt;a class="heading-anchor" href="#debian">
 &lt;small>»&lt;/small>
 &lt;/a>
 Debian
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker run -it debian /bin/bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="alpine">
 &lt;a class="heading-anchor" href="#alpine">
 &lt;small>»&lt;/small>
 &lt;/a>
 Alpine
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker run -it alpine /bin/ash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="mount-the-current-directory">
 &lt;a class="heading-anchor" href="#mount-the-current-directory">
 &lt;small>»&lt;/small>
 &lt;/a>
 Mount the current directory
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker run -it --volume &lt;span style="color:#81a1c1;font-weight:bold">$(&lt;/span>&lt;span style="color:#81a1c1">pwd&lt;/span>&lt;span style="color:#81a1c1;font-weight:bold">)&lt;/span>:/hostdir alpine /bin/ash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="hostname-of-the-host">
 &lt;a class="heading-anchor" href="#hostname-of-the-host">
 &lt;small>»&lt;/small>
 &lt;/a>
 Hostname of the host
&lt;/h2>
&lt;p>When you are inside a docker container, you can use &lt;code>host.docker.internal&lt;/code> for connections to the host machine.&lt;/p></description></item><item><title>Quick Tip: Simulate a bad network connection on macOS (and Linux)</title><link>https://blog.init-io.net/post/2020/06-19-mac-fake-network-issues/</link><pubDate>Fri, 19 Jun 2020 17:11:00 +0200</pubDate><guid>https://blog.init-io.net/post/2020/06-19-mac-fake-network-issues/</guid><description>&lt;h2 id="introduction">
 &lt;a class="heading-anchor" href="#introduction">
 &lt;small>»&lt;/small>
 &lt;/a>
 Introduction
&lt;/h2>
&lt;p>Yesterday, I got a hint from a colleague to fake a poor network connection (for debugging an issue) with &lt;code>tc&lt;/code> (&lt;a href="https://man7.org/linux/man-pages/man8/tc.8.html">man page&lt;/a>):&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>tc qdisc add dev eth0 root netem loss 30% delay 500ms 300ms
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>This works with Linux and will add a delay and packet loss to the &lt;code>eth0&lt;/code> interface.&lt;/p>
&lt;p>I was curious if there is someting similar for macOS, and there is: &lt;code>pfctl&lt;/code> and &lt;code>dnctl&lt;/code>.
This following commands are mainly copy-pasted from the posts from &lt;a href="https://spin.atomicobject.com/2016/01/05/simulating-poor-network-connectivity-mac-osx/">John Ruble&lt;/a> and &lt;a href="https://salferrarello.com/mac-pfctl-port-forwarding/">Sal Ferrarello&lt;/a>. Check their posts and the man pages of the commands for more details.&lt;/p></description></item><item><title>Quick Tip: Hiding changes of specific folders in GitLab merge requests</title><link>https://blog.init-io.net/post/2020/04-17-gitlab-nodiff-vendor/</link><pubDate>Fri, 17 Apr 2020 20:24:00 +0200</pubDate><guid>https://blog.init-io.net/post/2020/04-17-gitlab-nodiff-vendor/</guid><description>&lt;p>When you store third-party dependencies (such as a &lt;code>vendor&lt;/code> folder for Go, &lt;code>node_modules&lt;/code> for npm, or &lt;code>venv&lt;/code> for Python) in your repositories and don&amp;rsquo;t want changes in the dependencies to show up in your merge requests, you can collapse all diffs for specific folders.&lt;/p>
&lt;p>All you have to do is creating a &lt;code>.gitattributes&lt;/code> file with the following content:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>vendor/* -diff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Just replace &lt;code>vendor&lt;/code> with the folder which contains the changes you want to ignore. This is only applied when the &lt;code>.gitattributes&lt;/code> file is already merged in your default branch (e.g. &lt;code>master&lt;/code>). Otherwise, it will still show the diffs in all merge requests!&lt;/p></description></item><item><title>Working with CSV datasets in Go</title><link>https://blog.init-io.net/post/2020/03-24-csvutil/</link><pubDate>Tue, 24 Mar 2020 20:00:39 +0100</pubDate><guid>https://blog.init-io.net/post/2020/03-24-csvutil/</guid><description>&lt;p>&lt;strong>See the &lt;a href="https://github.com/sj14/csvutil">repository&lt;/a> for the current version!&lt;/strong>&lt;/p>
&lt;h2 id="installation">
 &lt;a class="heading-anchor" href="#installation">
 &lt;small>»&lt;/small>
 &lt;/a>
 Installation
&lt;/h2>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>go get -u github.com/sj14/csvutil
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="examples">
 &lt;a class="heading-anchor" href="#examples">
 &lt;small>»&lt;/small>
 &lt;/a>
 Examples
&lt;/h2>
&lt;p>For all options please check the godoc. The examples ignore all error handling!&lt;/p>
&lt;hr>
&lt;h3 id="create-a-new-dataset">
 &lt;a class="heading-anchor" href="#create-a-new-dataset">
 &lt;small>»&lt;/small>
 &lt;/a>
 Create a new dataset
&lt;/h3>
&lt;p>All datasets should contain a header for further processing.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>records &lt;span style="color:#81a1c1">:=&lt;/span> &lt;span style="color:#eceff4">[][]&lt;/span>&lt;span style="color:#81a1c1">string&lt;/span>&lt;span style="color:#eceff4">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;first_name&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;last_name&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;username&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;Rob&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;Pike&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;rob&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;Ken&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;Thompson&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;ken&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;Robert&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;Griesemer&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;gri&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eceff4">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ds &lt;span style="color:#81a1c1">:=&lt;/span> csvutil&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">New&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>records&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="add-a-new-row">
 &lt;a class="heading-anchor" href="#add-a-new-row">
 &lt;small>»&lt;/small>
 &lt;/a>
 Add a new row
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">AddRow&lt;/span>&lt;span style="color:#eceff4">([]&lt;/span>&lt;span style="color:#81a1c1">string&lt;/span>&lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;my first name&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my last name&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my nick&amp;#34;&lt;/span>&lt;span style="color:#eceff4">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>first_name,last_name,username
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rob,Pike,rob
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Ken,Thompson,ken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Robert,Griesemer,gri
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>my first name,my last name,my nick
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="add-multiple-rows">
 &lt;a class="heading-anchor" href="#add-multiple-rows">
 &lt;small>»&lt;/small>
 &lt;/a>
 Add multiple rows
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">AddRows&lt;/span>&lt;span style="color:#eceff4">([][]&lt;/span>&lt;span style="color:#81a1c1">string&lt;/span>&lt;span style="color:#eceff4">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;my first name 0&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my last name 0&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my nick 0&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;my first name 1&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my last name 1&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my nick 1&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;my first name 2&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my last name 2&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my nick 2&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eceff4">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>first_name,last_name,username
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rob,Pike,rob
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Ken,Thompson,ken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Robert,Griesemer,gri
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>my first name 0,my last name 0,my nick 0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>my first name 1,my last name 1,my nick 1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>my first name 2,my last name 2,my nick 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="add-a-new-column-at-index-1">
 &lt;a class="heading-anchor" href="#add-a-new-column-at-index-1">
 &lt;small>»&lt;/small>
 &lt;/a>
 Add a new column at index 1
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">AddCol&lt;/span>&lt;span style="color:#eceff4">([]&lt;/span>&lt;span style="color:#81a1c1">string&lt;/span>&lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;column_headline&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my row 1&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my row 2&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;my row 3&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span> &lt;span style="color:#b48ead">1&lt;/span>&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Write&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>os&lt;span style="color:#eceff4">.&lt;/span>Stdout&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>first_name,column_headline,last_name,username
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rob,my row 1,Pike,rob
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Ken,my row 2,Thompson,ken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Robert,my row 3,Griesemer,gri
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="extract-column">
 &lt;a class="heading-anchor" href="#extract-column">
 &lt;small>»&lt;/small>
 &lt;/a>
 Extract Column
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>lastNames&lt;span style="color:#eceff4">,&lt;/span> _ &lt;span style="color:#81a1c1">:=&lt;/span> ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">ExtractCol&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;last_name&amp;#34;&lt;/span>&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fmt&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Println&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>lastNames&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>[last_name Pike Thompson Griesemer]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="rename-column">
 &lt;a class="heading-anchor" href="#rename-column">
 &lt;small>»&lt;/small>
 &lt;/a>
 Rename Column
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">RenameCol&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;username&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;nick&amp;#34;&lt;/span>&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>first_name,last_name,nick
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rob,Pike,rob
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Ken,Thompson,ken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Robert,Griesemer,gri
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="delete-column">
 &lt;a class="heading-anchor" href="#delete-column">
 &lt;small>»&lt;/small>
 &lt;/a>
 Delete Column
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">DeleteCol&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;first_name&amp;#34;&lt;/span>&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>last_name,nick
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Pike,rob
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Thompson,ken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Griesemer,gri
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="modify-column">
 &lt;a class="heading-anchor" href="#modify-column">
 &lt;small>»&lt;/small>
 &lt;/a>
 Modify Column
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>addRowNumber &lt;span style="color:#81a1c1">:=&lt;/span> &lt;span style="color:#81a1c1;font-weight:bold">func&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>val &lt;span style="color:#81a1c1">string&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> i &lt;span style="color:#81a1c1">int&lt;/span>&lt;span style="color:#eceff4">)&lt;/span> &lt;span style="color:#81a1c1">string&lt;/span> &lt;span style="color:#eceff4">{&lt;/span> &lt;span style="color:#81a1c1;font-weight:bold">return&lt;/span> fmt&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Sprintf&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;%v (%v)&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> val&lt;span style="color:#eceff4">,&lt;/span> i&lt;span style="color:#eceff4">)&lt;/span> &lt;span style="color:#eceff4">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">ModifyCol&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;first_name&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> addRowNumber&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Write&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>os&lt;span style="color:#eceff4">.&lt;/span>Stdout&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>first_name,last_name,username
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rob (1),Pike,rob
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Ken (2),Thompson,ken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Robert (3),Griesemer,gri
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="write-the-dataset">
 &lt;a class="heading-anchor" href="#write-the-dataset">
 &lt;small>»&lt;/small>
 &lt;/a>
 Write the dataset
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Write&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>os&lt;span style="color:#eceff4">.&lt;/span>Stdout&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>first_name,last_name,username
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rob,Pike,rob
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Ken,Thompson,ken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Robert,Griesemer,gri
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="write-options">
 &lt;a class="heading-anchor" href="#write-options">
 &lt;small>»&lt;/small>
 &lt;/a>
 Write options
&lt;/h4>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Write&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>os&lt;span style="color:#eceff4">.&lt;/span>Stdout&lt;span style="color:#eceff4">,&lt;/span> csvutil&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Delimiter&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>&lt;span style="color:#a3be8c">&amp;#39;|&amp;#39;&lt;/span>&lt;span style="color:#eceff4">),&lt;/span> csvutil&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">UseCLRF&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>&lt;span style="color:#81a1c1;font-weight:bold">true&lt;/span>&lt;span style="color:#eceff4">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>first_name|last_name|username
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rob|Pike|rob
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Ken|Thompson|ken
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Robert|Griesemer|gri
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="get-dataset-as-string">
 &lt;a class="heading-anchor" href="#get-dataset-as-string">
 &lt;small>»&lt;/small>
 &lt;/a>
 Get dataset as [][]string
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>fmt&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Println&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>ds&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Raw&lt;/span>&lt;span style="color:#eceff4">())&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>[[first_name last_name username] [Rob Pike rob] [Ken Thompson ken] [Robert Griesemer gri]]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="compare-two-raw-datasets">
 &lt;a class="heading-anchor" href="#compare-two-raw-datasets">
 &lt;small>»&lt;/small>
 &lt;/a>
 Compare two (raw) datasets
&lt;/h3>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>a &lt;span style="color:#81a1c1">:=&lt;/span> &lt;span style="color:#eceff4">[][]&lt;/span>&lt;span style="color:#81a1c1">string&lt;/span>&lt;span style="color:#eceff4">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;a&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;b&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;c&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;d&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;e&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;f&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eceff4">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>b &lt;span style="color:#81a1c1">:=&lt;/span> &lt;span style="color:#eceff4">[][]&lt;/span>&lt;span style="color:#81a1c1">string&lt;/span>&lt;span style="color:#eceff4">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;g&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;h&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;i&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">{&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;j&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;k&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;l&amp;#34;&lt;/span>&lt;span style="color:#eceff4">},&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eceff4">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>result &lt;span style="color:#81a1c1">:=&lt;/span> csvutil&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Equals&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>a&lt;span style="color:#eceff4">,&lt;/span> b&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fmt&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Println&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>result&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>false
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div></description></item><item><title>Using reCAPTCHA with Go</title><link>https://blog.init-io.net/post/2020/03-21-go-recaptcha/</link><pubDate>Sat, 21 Mar 2020 17:54:39 +0100</pubDate><guid>https://blog.init-io.net/post/2020/03-21-go-recaptcha/</guid><description>&lt;p>&lt;strong>See the &lt;a href="https://github.com/sj14/recaptcha">repository&lt;/a> for the current version!&lt;/strong>&lt;/p>
&lt;h2 id="installation">
 &lt;a class="heading-anchor" href="#installation">
 &lt;small>»&lt;/small>
 &lt;/a>
 Installation
&lt;/h2>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>go get -u github.com/sj14/recaptcha
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="usage">
 &lt;a class="heading-anchor" href="#usage">
 &lt;small>»&lt;/small>
 &lt;/a>
 Usage
&lt;/h2>
&lt;p>The result will always return an error when any kind of failure occured, thus only checking the error is sufficient.&lt;/p>
&lt;h3 id="recaptcha-v2">
 &lt;a class="heading-anchor" href="#recaptcha-v2">
 &lt;small>»&lt;/small>
 &lt;/a>
 reCAPTCHA v2
&lt;/h3>
&lt;p>See &lt;a href="https://developers.google.com/recaptcha/docs/display">reCAPTCHA v2 docs&lt;/a>&lt;/p>
&lt;h4 id="html">
 &lt;a class="heading-anchor" href="#html">
 &lt;small>»&lt;/small>
 &lt;/a>
 HTML
&lt;/h4>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eceff4">&amp;lt;&lt;/span>&lt;span style="color:#81a1c1">html&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;&lt;/span>&lt;span style="color:#81a1c1">head&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;&lt;/span>&lt;span style="color:#81a1c1">script&lt;/span> &lt;span style="color:#8fbcbb">src&lt;/span>&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;https://www.google.com/recaptcha/api.js&amp;#34;&lt;/span> &lt;span style="color:#8fbcbb">async&lt;/span> &lt;span style="color:#8fbcbb">defer&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&amp;lt;/&lt;/span>&lt;span style="color:#81a1c1">script&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;/&lt;/span>&lt;span style="color:#81a1c1">head&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;&lt;/span>&lt;span style="color:#81a1c1">body&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;&lt;/span>&lt;span style="color:#81a1c1">form&lt;/span> &lt;span style="color:#8fbcbb">action&lt;/span>&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;?&amp;#34;&lt;/span> &lt;span style="color:#8fbcbb">method&lt;/span>&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;POST&amp;#34;&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;&lt;/span>&lt;span style="color:#81a1c1">div&lt;/span> &lt;span style="color:#8fbcbb">class&lt;/span>&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;g-recaptcha&amp;#34;&lt;/span> &lt;span style="color:#8fbcbb">data-sitekey&lt;/span>&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;&amp;lt;YOUR_SITE_KEY&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&amp;lt;/&lt;/span>&lt;span style="color:#81a1c1">div&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;&lt;/span>&lt;span style="color:#81a1c1">br&lt;/span>&lt;span style="color:#eceff4">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;&lt;/span>&lt;span style="color:#81a1c1">input&lt;/span> &lt;span style="color:#8fbcbb">type&lt;/span>&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;submit&amp;#34;&lt;/span> &lt;span style="color:#8fbcbb">value&lt;/span>&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;Submit&amp;#34;&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;/&lt;/span>&lt;span style="color:#81a1c1">form&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#eceff4">&amp;lt;/&lt;/span>&lt;span style="color:#81a1c1">body&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eceff4">&amp;lt;/&lt;/span>&lt;span style="color:#81a1c1">html&lt;/span>&lt;span style="color:#eceff4">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="go">
 &lt;a class="heading-anchor" href="#go">
 &lt;small>»&lt;/small>
 &lt;/a>
 Go
&lt;/h4>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>result&lt;span style="color:#eceff4">,&lt;/span> err &lt;span style="color:#81a1c1">:=&lt;/span> recaptcha&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">VerifyV2&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>recaptchaSecret&lt;span style="color:#eceff4">,&lt;/span> httpRequest&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1;font-weight:bold">if&lt;/span> err &lt;span style="color:#81a1c1">!=&lt;/span> &lt;span style="color:#81a1c1;font-weight:bold">nil&lt;/span> &lt;span style="color:#eceff4">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> log&lt;span style="color:#eceff4">.&lt;/span>&lt;span style="color:#88c0d0">Fatalf&lt;/span>&lt;span style="color:#eceff4">(&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;recaptcha failed: %v\n&amp;#34;&lt;/span>&lt;span style="color:#eceff4">,&lt;/span> err&lt;span style="color:#eceff4">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#eceff4">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic">// result is not necessary to check, only required for more details&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="recaptcha-v3">
 &lt;a class="heading-anchor" href="#recaptcha-v3">
 &lt;small>»&lt;/small>
 &lt;/a>
 reCAPTCHA v3
&lt;/h3>
&lt;p>See &lt;a href="https://developers.google.com/recaptcha/docs/v3">reCAPTCHA v3 docs&lt;/a>&lt;/p></description></item><item><title>Installing FFmpeg on Mac</title><link>https://blog.init-io.net/post/2020/03-14-ffmpeg-mac-installer/</link><pubDate>Sat, 14 Mar 2020 13:44:00 +0100</pubDate><guid>https://blog.init-io.net/post/2020/03-14-ffmpeg-mac-installer/</guid><description>&lt;p>Check the &lt;a href="https://github.com/sj14/playground/tree/master/ffmpeg-mac">repository&lt;/a> for the current version of the script.&lt;/p>
&lt;h2 id="why">
 &lt;a class="heading-anchor" href="#why">
 &lt;small>»&lt;/small>
 &lt;/a>
 Why?
&lt;/h2>
&lt;p>&lt;code>brew install ffmpeg&lt;/code> installs too many dependencies.&lt;br>
This script downloads the static binary and moves it to &lt;code>/usr/local/bin/&lt;/code>, thats all.&lt;/p>
&lt;h2 id="usage">
 &lt;a class="heading-anchor" href="#usage">
 &lt;small>»&lt;/small>
 &lt;/a>
 Usage
&lt;/h2>
&lt;p>Latest stable:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -s https://raw.githubusercontent.com/sj14/playground/master/ffmpeg-mac/install.sh &lt;span style="color:#eceff4">|&lt;/span> bash -s
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Latest snapshot:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -s https://raw.githubusercontent.com/sj14/playground/master/ffmpeg-mac/install.sh &lt;span style="color:#eceff4">|&lt;/span> bash -s snapshot
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="updating">
 &lt;a class="heading-anchor" href="#updating">
 &lt;small>»&lt;/small>
 &lt;/a>
 Updating
&lt;/h2>
&lt;p>For updating to the latest stable or snapshot build, just run the desired command again, it will overwrite the previously installed version.&lt;/p></description></item><item><title>Introducing review-bot.com</title><link>https://blog.init-io.net/post/2020/02-17-review-bot-com/</link><pubDate>Mon, 17 Feb 2020 21:30:00 +0100</pubDate><guid>https://blog.init-io.net/post/2020/02-17-review-bot-com/</guid><description>&lt;p>Based on the CLI tool &lt;a href="https://github.com/sj14/review-bot">review-bot&lt;/a>, I created a new SaaS product &lt;a href="https://www.review-bot.com">review-bot.com&lt;/a>. It will allow you to send reminders without hosting anything yourself or dealing with the command line and cron jobs.&lt;/p>
&lt;p>&lt;img src="https://blog.init-io.net/img/2020/02-17-review-bot-com/review-bot-com.png" alt="review-bot.com home">&lt;/p>
&lt;p>That&amp;rsquo;s all folks, just check the website for more information :=)&lt;/p></description></item><item><title>Get the SonarQube Quality Gate status for the current commit</title><link>https://blog.init-io.net/post/2019/08-10-sonarqube-status/</link><pubDate>Sat, 10 Aug 2019 14:30:00 +0100</pubDate><guid>https://blog.init-io.net/post/2019/08-10-sonarqube-status/</guid><description>&lt;p>&lt;strong>Update 2021-03-05:&lt;/strong> Simplified Code&lt;/p>
&lt;p>&lt;strong>Update 2021-01-11:&lt;/strong> Added authentication&lt;/p>
&lt;p>When you use SonarQube and want to fail a pipeline if the Quality Gate result for the current &lt;code>git&lt;/code> commit is not &amp;ldquo;OK&amp;rdquo;, this script might be helpful for you.&lt;/p>
&lt;p>You can always find the latest version in my &lt;a href="https://github.com/sj14/playground/tree/master/sonarqube-status">git repository&lt;/a>. Open an issue or a pull request for questions and enhancements.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">30
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">31
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">32
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">33
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">34
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">35
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">36
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">37
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">38
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">39
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">40
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">41
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">42
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">43
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">44
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">45
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">46
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">47
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">48
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">49
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">50
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">51
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">52
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">53
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">54
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">55
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6c6f74">56
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#5e81ac;font-style:italic">#!/usr/bin/env bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#5e81ac;font-style:italic">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># Description&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># ===========&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># Get the SonarQube Quality Gate status of a specific project for the current git commit.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># When the Quality Gate analysis is &amp;#34;OK&amp;#34;, return 0, otherwise, return 1.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># Well suitable for usage in a build pipeline.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># Requirements&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># ============&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># git, curl, jq&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># Usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># =====&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># Execute this script `./sonar-status.sh &amp;lt;host&amp;gt; &amp;lt;auth_token&amp;gt; &amp;lt;project_key&amp;gt;` and check for the return code.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># Example: `./sonar-status.sh http://localhost:9000 d7981b9c1333bef3ff83502cea6f6cd6ce4d70f6 test`&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1">set&lt;/span> -euf -o pipefail
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>SONAR_HOST&lt;span style="color:#81a1c1">=&lt;/span>$1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>AUTH_TOKEN&lt;span style="color:#81a1c1">=&lt;/span>$2 &lt;span style="color:#616e87;font-style:italic"># project key token or user token (see https://docs.sonarqube.org/latest/user-guide/user-token/)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>PROJECT_KEY&lt;span style="color:#81a1c1">=&lt;/span>$3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GIT_COMMIT&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#81a1c1;font-weight:bold">$(&lt;/span>git rev-parse HEAD&lt;span style="color:#81a1c1;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>retry&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#b48ead">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1;font-weight:bold">while&lt;/span> &lt;span style="color:#81a1c1">[&lt;/span> $retry -lt &lt;span style="color:#b48ead">6&lt;/span> &lt;span style="color:#81a1c1">]&lt;/span>&lt;span style="color:#eceff4">;&lt;/span> &lt;span style="color:#81a1c1;font-weight:bold">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#616e87;font-style:italic"># get latest analysis id to corresponding git commit hash&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> analysis_id&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#81a1c1;font-weight:bold">$(&lt;/span>curl -s -u &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$AUTH_TOKEN&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>: &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$SONAR_HOST&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>/api/project_analyses/search?project&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$PROJECT_KEY&lt;span style="color:#a3be8c">&amp;#34;&lt;/span> &lt;span style="color:#eceff4">|&lt;/span> jq &lt;span style="color:#a3be8c">&amp;#39;.analyses[] | select(.revision == &amp;#34;&amp;#39;&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$GIT_COMMIT&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>&lt;span style="color:#a3be8c">&amp;#39;&amp;#34;) | .key&amp;#39;&lt;/span> &lt;span style="color:#eceff4">|&lt;/span> head -n 1&lt;span style="color:#81a1c1;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#616e87;font-style:italic"># remove double quotes from analysis id (e.g. &amp;#34;AWv6wb07Y5FuS8wxa-xk&amp;#34; -&amp;gt; AWv6wb07Y5FuS8wxa-xk)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> analysis_id&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#81a1c1;font-weight:bold">$(&lt;/span>&lt;span style="color:#81a1c1">echo&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$analysis_id&lt;span style="color:#a3be8c">&amp;#34;&lt;/span> &lt;span style="color:#eceff4">|&lt;/span> tr -d &lt;span style="color:#a3be8c">&amp;#34;\&amp;#34;\`&amp;#39;&amp;#34;&lt;/span>&lt;span style="color:#81a1c1;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#616e87;font-style:italic"># get quality gate status of this anlysis&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> analysis_status&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#81a1c1;font-weight:bold">$(&lt;/span>curl -s -u &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$AUTH_TOKEN&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>: &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$SONAR_HOST&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>/api/qualitygates/project_status&lt;span style="color:#ebcb8b">\?&lt;/span>analysisId&lt;span style="color:#81a1c1">=&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$analysis_id&lt;span style="color:#a3be8c">&amp;#34;&lt;/span> &lt;span style="color:#eceff4">|&lt;/span> jq &lt;span style="color:#a3be8c">&amp;#39;.projectStatus.status&amp;#39;&lt;/span>&lt;span style="color:#81a1c1;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#616e87;font-style:italic"># break this loop when analysis was found,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#616e87;font-style:italic"># otherwise, try again (next loop iteration)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#81a1c1;font-weight:bold">if&lt;/span> &lt;span style="color:#81a1c1">[&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$analysis_status&lt;span style="color:#a3be8c">&amp;#34;&lt;/span> !&lt;span style="color:#81a1c1">=&lt;/span> null &lt;span style="color:#81a1c1">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#81a1c1;font-weight:bold">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#81a1c1">break&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#81a1c1;font-weight:bold">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#81a1c1">echo&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;Retry &lt;/span>$retry&lt;span style="color:#a3be8c">: &lt;/span>$PROJECT_KEY&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#81a1c1">((&lt;/span> retry&lt;span style="color:#81a1c1">=&lt;/span>retry+1 &lt;span style="color:#81a1c1">))&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep 10s
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1;font-weight:bold">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#616e87;font-style:italic"># print and return status depending on result&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1">printf&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;%s \t %-35s \t &lt;/span>$SONAR_HOST&lt;span style="color:#a3be8c">/dashboard?id=%s\n&amp;#34;&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$analysis_status&lt;span style="color:#a3be8c">&amp;#34;&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$PROJECT_KEY&lt;span style="color:#a3be8c">&amp;#34;&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$PROJECT_KEY&lt;span style="color:#a3be8c">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1;font-weight:bold">if&lt;/span> &lt;span style="color:#81a1c1">[&lt;/span> &lt;span style="color:#a3be8c">&amp;#34;&lt;/span>$analysis_status&lt;span style="color:#a3be8c">&amp;#34;&lt;/span> !&lt;span style="color:#81a1c1">=&lt;/span> &lt;span style="color:#ebcb8b">\&amp;#34;&lt;/span>&lt;span style="color:#a3be8c">&amp;#34;OK\&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#81a1c1">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#81a1c1;font-weight:bold">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#81a1c1">exit&lt;/span> &lt;span style="color:#b48ead">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#81a1c1;font-weight:bold">fi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div></description></item></channel></rss>