<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Alex Pliutau - Blog</title>
		<link>https://pliutau.com/</link>
		<description>Recent content on Alex Pliutau - Blog</description>
		<generator>Hugo</generator>
		<language>en</language>
		
		
		
		
			<lastBuildDate>Fri, 16 Oct 2026 03:24:54 +0000</lastBuildDate>
		
			<atom:link href="https://pliutau.com/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Reading List</title>
				<link>https://pliutau.com/reading-list/</link>
				<pubDate>Fri, 16 Oct 2026 03:24:54 +0000</pubDate>
				<guid>https://pliutau.com/reading-list/</guid>
				<description>&lt;p&gt;This page is auto-generated from Github Actions workflow that runs every day at night and fetches the 5 latest articles from each of my favorite blogs.&lt;/p&gt;</description>
			</item>
			<item>
				<title>De-Googling: Replacing Google Search with Kagi</title>
				<link>https://pliutau.com/from-google-to-kagi/</link>
				<pubDate>Mon, 31 Aug 2026 10:00:00 +0200</pubDate>
				<guid>https://pliutau.com/from-google-to-kagi/</guid>
				<description>&lt;p&gt;A few weeks ago my main Google account was blocked by Google without any reason provided or a way to reclaim it. At its scale, Google probably uses various automated signals and AI to ban accounts and by mistake can easily close yours. I was already slowly &amp;ldquo;de-googling&amp;rdquo; things, but this incident made it a higher priority all of a sudden. You see, I don&amp;rsquo;t want to lose access to my files or emails because of some blackbox automated process. There are many tools that I ditched in the last month: Drive and Photos are the main ones. Last week I also stopped using Google search too.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Books I Read in 2025</title>
				<link>https://pliutau.com/books-2025/</link>
				<pubDate>Wed, 24 Dec 2025 13:00:00 +0100</pubDate>
				<guid>https://pliutau.com/books-2025/</guid>
				<description>&lt;p&gt;Books I read in 2025, in no particular order. In the past I used the e-ink readers, but in the last few years I prefer to read and collect the physical books. This is not that expensive if you buy second hand books. This year I found a great service called bookbot.de where you can find many books locally.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Running MinIO locally with Docker Compose</title>
				<link>https://pliutau.com/local-minio-docker-compose-buckets/</link>
				<pubDate>Sat, 04 Oct 2025 11:00:00 +0000</pubDate>
				<guid>https://pliutau.com/local-minio-docker-compose-buckets/</guid>
				<description>&lt;p&gt;When developing applications that interact with object storage like AWS S3, it&amp;rsquo;s useful to have a local setup that mimics the real service. &lt;a href=&#34;https://min.io/&#34;&gt;MinIO&lt;/a&gt; is an open-source S3-compatible object storage server that fits perfectly for this purpose.&lt;/p&gt;</description>
			</item>
			<item>
				<title>About</title>
				<link>https://pliutau.com/about/</link>
				<pubDate>Mon, 29 Sep 2025 09:00:00 +0000</pubDate>
				<guid>https://pliutau.com/about/</guid>
				<description>&lt;p&gt;Hi, thanks for visiting my personal website!&lt;/p&gt;&#xA;&lt;p&gt;My name is Alex Pliutau. I am currently employed as a Staff Software Engineer at Entyre Care.&lt;/p&gt;&#xA;&lt;p&gt;I write this blog in my personal time to share my experience and knowledge about software development, Golang, and few other topics. I also write a newsletter &lt;a href=&#34;https://packagemain.tech&#34;&gt;packagemain.tech&lt;/a&gt; as well as make some videos on &lt;a href=&#34;https://www.youtube.com/c/packagemain&#34;&gt;YouTube&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Projects</title>
				<link>https://pliutau.com/projects/</link>
				<pubDate>Thu, 11 Sep 2025 14:00:00 +0000</pubDate>
				<guid>https://pliutau.com/projects/</guid>
				<description>&lt;p&gt;Here are some of the projects I work on in my free time:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/plutov/practice-go&#34;&gt;practice-go&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;A collection of Go programming challenges with tests and benchmarks.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/plutov/paypal&#34;&gt;paypal&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>.gitignore everything by default</title>
				<link>https://pliutau.com/git-ignore-everything-by-default/</link>
				<pubDate>Thu, 04 Sep 2025 11:00:00 +0200</pubDate>
				<guid>https://pliutau.com/git-ignore-everything-by-default/</guid>
				<description>&lt;p&gt;We&amp;rsquo;ve all been there. You&amp;rsquo;re working on a project, making commits, and suddenly realize you&amp;rsquo;ve been committing &lt;code&gt;.DS_Store&lt;/code&gt; files, &lt;code&gt;node_modules&lt;/code&gt;, IDE configuration files, or other junk that shouldn&amp;rsquo;t be in your repository. Then comes the embarrassing cleanup: adding these files to &lt;code&gt;.gitignore&lt;/code&gt;, removing them from the repository history, and hoping no one noticed.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Deploy Hugo static site to Hetzner</title>
				<link>https://pliutau.com/deploy-hugo-to-hetzner-vps/</link>
				<pubDate>Wed, 03 Sep 2025 11:00:00 +0200</pubDate>
				<guid>https://pliutau.com/deploy-hugo-to-hetzner-vps/</guid>
				<description>&lt;p&gt;Recently I ditched my AWS account and moved my personal small projects to a Hetzner VPS, what a nice feeling tinkering with your own server again! As a part of this process I also had to change how I deploy this blog, so I thought I would share my setup in case anyone else is interested.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Auto-generated Reading List</title>
				<link>https://pliutau.com/reading-list-rss/</link>
				<pubDate>Thu, 10 Jul 2025 00:00:00 +0000</pubDate>
				<guid>https://pliutau.com/reading-list-rss/</guid>
				<description>&lt;p&gt;I don&amp;rsquo;t know about you, but I love the RSS feed, and over the years, I&amp;rsquo;ve accumulated various blogs that I follow. However, it&amp;rsquo;s hard to keep track of them all, as I don&amp;rsquo;t use any RSS clients. So, I decided to create a GitHub Action that automatically generates and publishes a reading list from the RSS feeds of the blogs I follow.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Minesweeper with Raylib Go Bindings</title>
				<link>https://pliutau.com/minesweeper-in-golang-raylib/</link>
				<pubDate>Fri, 28 Feb 2025 20:00:00 +0100</pubDate>
				<guid>https://pliutau.com/minesweeper-in-golang-raylib/</guid>
				<description>&lt;p&gt;I remember when I was in school and didn&amp;rsquo;t have yet a PC at home (probably year ~2000), I would visit my Mom&amp;rsquo;s office to play some videogames on her work PC :) It was some Pentium and didn&amp;rsquo;t have many games in the beginning, but Minesweeper was always there as it came with Windows installation. Great times btw!&lt;/p&gt;</description>
			</item>
			<item>
				<title>My first Zig program - zigping</title>
				<link>https://pliutau.com/my-first-zig-program-zigping/</link>
				<pubDate>Thu, 06 Feb 2025 22:00:00 +0200</pubDate>
				<guid>https://pliutau.com/my-first-zig-program-zigping/</guid>
				<description>&lt;p&gt;For me the best way to learn something new is to actually build something with it. Yes, there is some hype around Zig nowadays (Ghostty, Bun are build in Zig), but don&amp;rsquo;t listen to it, go try it out and see for yourself if it solves your problem or not.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Map with Expiration in Go</title>
				<link>https://pliutau.com/map-with-expiration-go/</link>
				<pubDate>Wed, 02 Oct 2024 20:17:12 +0200</pubDate>
				<guid>https://pliutau.com/map-with-expiration-go/</guid>
				<description>&lt;p&gt;In some cases your application doesn&amp;rsquo;t need Redis, and internal in-memory map with locks and expiration will suffice.&lt;/p&gt;&#xA;&lt;p&gt;For example you already know the size of the map and you don&amp;rsquo;t need to store a lot of data. Use cases could be IP rate limiting, or any other short-lived data.&lt;/p&gt;</description>
			</item>
			<item>
				<title>My first experience with OCaml</title>
				<link>https://pliutau.com/my-first-experience-with-ocaml/</link>
				<pubDate>Tue, 17 Sep 2024 15:00:00 +0200</pubDate>
				<guid>https://pliutau.com/my-first-experience-with-ocaml/</guid>
				<description>&lt;p&gt;Recently I&amp;rsquo;ve been motivated to learn more about functional programming and the name OCaml came up quite a few times. I have seen some praise about it from the people I follow on social media and decided to give it a try. I finally finished a small project in OCaml and would like to share my first impressions while the memory is still fresh.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Centrally Collecting Events from Go Microservices</title>
				<link>https://pliutau.com/centrally-collecting-events-in-go-microservices/</link>
				<pubDate>Thu, 12 Sep 2024 13:00:00 +0200</pubDate>
				<guid>https://pliutau.com/centrally-collecting-events-in-go-microservices/</guid>
				<description>&lt;p&gt;In the beginning at &lt;a href=&#34;https://solsten.io&#34;&gt;Solsten&lt;/a&gt; our engineering team focused on building products, tools, services but we never had the time to measure what was going on in our platform (it was an early-stage startup). Even though we had a feeling of what was right or not thanks to our customers, the pain grew too strong and forced our department to allocate time in order to measure things.&lt;/p&gt;</description>
			</item>
			<item>
				<title>An Ode to Logging</title>
				<link>https://pliutau.com/an-ode-to-logging/</link>
				<pubDate>Mon, 02 Sep 2024 13:00:00 +0200</pubDate>
				<guid>https://pliutau.com/an-ode-to-logging/</guid>
				<description>&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Oh, log, a nerdy scribe,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;In you, all errors hide.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;To write it well - not an easy quest,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Let&amp;#39;s see how we can do it best!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;True hackers always start with print()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Don&amp;#39;t judge! They&amp;#39;ve got no time this sprint.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;But push to prod - a fatal flaw.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Use proper logger - that&amp;#39;s the law!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Distinguish noise from fatal crash -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Use Info, Error, Warn, and Trace.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Put a clear level in each line,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;To sift through data, neat design!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;You log for humans, this is true...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;But can a machine read it too?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Structure is key, JSON, timestamp...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Grafana tells you: &amp;#34;You&amp;#39;re the champ!&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Events, like books, have start and end.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Use Spans to group them all, my friend.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Then take these Spans and build a tree,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;We call it Trace, it&amp;#39;s cool agree?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Redact your logs: remove emails,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;addresses, PII details.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Or data breach is soon to come,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;and trust me, it&amp;#39;s not fun :(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;In modern distributed world,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do centralize your logs, my Lord.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Retention policy in place?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Or cloud bill you will embrace!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;(No LLMs have been used to write this)&lt;/strong&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>My first experience with Gleam Language</title>
				<link>https://pliutau.com/my-first-experience-with-gleam-lang/</link>
				<pubDate>Tue, 27 Aug 2024 08:00:00 +0200</pubDate>
				<guid>https://pliutau.com/my-first-experience-with-gleam-lang/</guid>
				<description>&lt;p&gt;Over the past few months, I saw a growing amount of posts on X about the Gleam language (probably the X algorithm doing its thing), and decided to give it a try. I was not disappointed, with few exceptions.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Snake game in Go using Ebiten</title>
				<link>https://pliutau.com/ebiten-snake/</link>
				<pubDate>Mon, 01 Aug 2022 16:08:07 +0200</pubDate>
				<guid>https://pliutau.com/ebiten-snake/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://ebitengine.org/images/gopherandgame.png&#34; alt=&#34;Snake game in Go using Ebiten&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://ebitengine.org/&#34;&gt;Ebiten&lt;/a&gt; is an open source game library in Go for building 2D games that can be ran across multiple platforms. Ebiten games work on desktop, web browsers (through WebAssembly), as well as on Mobile and even on Nintendo Switch.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Logging in Go using logrus</title>
				<link>https://pliutau.com/logging-in-go-logrus/</link>
				<pubDate>Mon, 12 Apr 2021 09:23:54 +0200</pubDate>
				<guid>https://pliutau.com/logging-in-go-logrus/</guid>
				<description>&lt;p&gt;Logging is a very essential part of large software, it&amp;rsquo;s hard to overstate the importance of logging, be it performance metrics logging, error logging, or debug logging for troubleshooting later.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Engineering Management Books</title>
				<link>https://pliutau.com/engineering-management-books/</link>
				<pubDate>Sun, 06 Dec 2020 12:00:05 +0100</pubDate>
				<guid>https://pliutau.com/engineering-management-books/</guid>
				<description>&lt;p&gt;We live in the world where there are so many offerings of information in all possible formats: podcasts, videos, blogs, etc. But reading a good book is something that you&amp;rsquo;ll never regret.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Writing testable Go code</title>
				<link>https://pliutau.com/writing-testable-go-code/</link>
				<pubDate>Mon, 04 May 2020 21:34:44 +0200</pubDate>
				<guid>https://pliutau.com/writing-testable-go-code/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/testable-go.jpg&#34; alt=&#34;Writing testable Go code&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;When I say &amp;ldquo;testable code&amp;rdquo;, what I mean is code that can be easily programmatically verified. We can say that code is testable when we don&amp;rsquo;t have to change the code itself when we&amp;rsquo;re adding a unit test to it. It doesn&amp;rsquo;t matter if you&amp;rsquo;re following test-driven development or not, testable code makes your program more flexible and maintainable, due to its modularity.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Writing REST API Client in Go</title>
				<link>https://pliutau.com/writing-api-go-client/</link>
				<pubDate>Mon, 27 Apr 2020 12:36:20 +0200</pubDate>
				<guid>https://pliutau.com/writing-api-go-client/</guid>
				<description>&lt;p&gt;API clients are very helpful when you&amp;rsquo;re shipping your REST APIs to the public. And Go makes it easy, for you as a developer, as well as for your users, thanks to its idiomatic design and type system. But what defines a good API client?&lt;/p&gt;</description>
			</item>
			<item>
				<title>Mounting Google Cloud Storage bucket to Kubernetes Pod</title>
				<link>https://pliutau.com/mount-gcs-bucket-k8s/</link>
				<pubDate>Thu, 23 Apr 2020 12:57:00 +0200</pubDate>
				<guid>https://pliutau.com/mount-gcs-bucket-k8s/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/gcs-k8s.png&#34; alt=&#34;Mounting Google Cloud Storage bucket to Kubernetes Pod&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;You may ask why doing this if we can use a PersistentVolume? Though there may be multiple scenarios when mounting a GCS bucket to you Kubernetes Pod is a good option:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Google Home Action to manage your Kubernetes cluster</title>
				<link>https://pliutau.com/google-home-k8s/</link>
				<pubDate>Mon, 26 Aug 2019 12:22:12 +0200</pubDate>
				<guid>https://pliutau.com/google-home-k8s/</guid>
				<description>&lt;p&gt;I always wanted to find a good use case of Google Home to make some DevOps tasks funnier. For example voice deployments, system metrics, etc. Since I use Kubernetes a lot, I thought it would be fun to control it via voice commands.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Rate Limiting HTTP Requests in Go based on IP address</title>
				<link>https://pliutau.com/rate-limit-http-requests/</link>
				<pubDate>Fri, 09 Aug 2019 10:52:38 +0200</pubDate>
				<guid>https://pliutau.com/rate-limit-http-requests/</guid>
				<description>&lt;p&gt;If you are running HTTP server and want to rate limit requests to the endpoints, you can use well-maintained tools such as &lt;a href=&#34;https://github.com/didip/tollbooth&#34;&gt;github.com/didip/tollbooth&lt;/a&gt;. But if you&amp;rsquo;re building something very simple, it&amp;rsquo;s not that hard to implement it on your own.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Building Desktop App in Go using Wails</title>
				<link>https://pliutau.com/wails-go-vuejs/</link>
				<pubDate>Mon, 06 May 2019 21:27:13 +0200</pubDate>
				<guid>https://pliutau.com/wails-go-vuejs/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/desktop+wails.jpg&#34; alt=&#34;desktop+wails.jpg&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This post is a text version of &lt;a href=&#34;https://www.youtube.com/watch?v=Dg9rUXxNV-c&#34;&gt;packagemain #6: Building Desktop App in Go using Wails&lt;/a&gt; video.&lt;/p&gt;&#xA;&lt;p&gt;As we all know, Go is mostly used to build APIs, web backends, CLI tools. But what&amp;rsquo;s interesting is that Go can be used in places we were not expecting to see it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Database Migrations with Go and Kubernetes</title>
				<link>https://pliutau.com/database-migrations-with-go-and-k8s/</link>
				<pubDate>Mon, 18 Feb 2019 11:41:00 +0100</pubDate>
				<guid>https://pliutau.com/database-migrations-with-go-and-k8s/</guid>
				<description>&lt;p&gt;Applications with database layer mostly need to execute database migration as part of its deployment process. Usually, running migrations is the first step when deploying the application.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Google Cloud Functions in Go</title>
				<link>https://pliutau.com/google-cloud-functions-in-go/</link>
				<pubDate>Mon, 21 Jan 2019 09:15:41 +0100</pubDate>
				<guid>https://pliutau.com/google-cloud-functions-in-go/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/googlecloudfu.png&#34; alt=&#34;googlecloudfu.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Earlier this month Google Cloud Functions team finally announced beta support of Go, the runtime uses Go 1.11, which includes go modules as we know.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Ultimate ClickHouse Helm Chart</title>
				<link>https://pliutau.com/ultimate-clickhouse-helm-chart/</link>
				<pubDate>Wed, 02 Jan 2019 13:29:37 +0100</pubDate>
				<guid>https://pliutau.com/ultimate-clickhouse-helm-chart/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/clickhouse-helm.jpg&#34; alt=&#34;clickhouse-helm.jpg&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Seems like ClickHouse is experiencing growth in industries like IoT, Web Analytics, AdTech, Log Management, because of its robustness with big amounts of data.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Table driven tests in Go</title>
				<link>https://pliutau.com/table-driven-tests-in-go/</link>
				<pubDate>Tue, 07 Aug 2018 11:02:46 +0700</pubDate>
				<guid>https://pliutau.com/table-driven-tests-in-go/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/table.png&#34; alt=&#34;Table driven tests in Go&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;In &lt;a href=&#34;https://github.com/plutov/practice-go&#34;&gt;practice-go&lt;/a&gt; we often use table driven testing to be able to test all function scenarios. For example the &lt;code&gt;FindAnagrams()&lt;/code&gt; function returns us a list of anagrams found in the dictionary for given input. To be able to test this function properly we need to test multiple cases, like empty input, valid input, invalid input, etc. We could right different asserts to make it, but it&amp;rsquo;s much more easier to use table tests.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Getting Started with OAuth2 in Go</title>
				<link>https://pliutau.com/getting-started-with-oauth2-in-go/</link>
				<pubDate>Wed, 30 May 2018 14:48:29 +0700</pubDate>
				<guid>https://pliutau.com/getting-started-with-oauth2-in-go/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/oauth2.jpg&#34; alt=&#34;oauth2&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is a text version of this video: &lt;a href=&#34;https://youtu.be/OdyXIi6DGYw&#34;&gt;packagemain #11: Getting started with OAuth2 in Go&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;getting-started-with-oauth2-in-go&#34;&gt;Getting started with OAuth2 in Go&lt;/h3&gt;&#xA;&lt;p&gt;Authentication usually is very important part in any application. You can always implement your own authentication system, but it will require a lot of work, registration, forgot password form, etc. That&amp;rsquo;s why OAuth2 was created, to allow user to log in using one of the many accounts user already has.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Building a Slack Bot with Go and Wit.ai</title>
				<link>https://pliutau.com/building-slack-bot-with-go/</link>
				<pubDate>Wed, 23 May 2018 08:27:36 +0700</pubDate>
				<guid>https://pliutau.com/building-slack-bot-with-go/</guid>
				<description>&lt;p&gt;If you&amp;rsquo;re looking to create AI agents and bots without any coding, &lt;a href=&#34;https://runbear.io/posts/How-to-Build-Your-Own-AI-Slack-Bot?utm_source=pliutau-a&#34;&gt;Runbear&lt;/a&gt; makes it super easy by offering a no-code platform that integrates seamlessly with Slack, MS Teams, HubSpot, and Zendesk, allowing you to set up custom AI assistants in just minutes.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Transitioning from Engineer to Engineering Manager</title>
				<link>https://pliutau.com/transitioning-from-eng-to-em/</link>
				<pubDate>Sat, 12 May 2018 09:21:50 +0700</pubDate>
				<guid>https://pliutau.com/transitioning-from-eng-to-em/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/em.jpg&#34; alt=&#34;em.jpg&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;A couple of months ago I moved from a Team Lead position to being an engineering manager at Wizeline Vietnam on a small sized team. I&amp;rsquo;ve found that this role change comes with a mindset change. Some things that mattered before when I was an individual contributor (writing good code, applying best engineering practices) became less important. On the other hand, new things became more important, e.g. team health, team success and team career growth.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Face Detection in Go using OpenCV and MachineBox</title>
				<link>https://pliutau.com/face-detection-in-go-machinebox-opencv/</link>
				<pubDate>Fri, 19 Jan 2018 10:32:25 +0700</pubDate>
				<guid>https://pliutau.com/face-detection-in-go-machinebox-opencv/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/DETECT.jpg&#34; alt=&#34;Face Detection in Go using OpenCV and MachineBox&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is a text version of this video: &lt;a href=&#34;https://youtu.be/rbZeZNVA-Q4&#34;&gt;packagemain #5: Face Detection in Go using OpenCV and MachineBox&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Go tools are awesome</title>
				<link>https://pliutau.com/go-tools-are-awesome/</link>
				<pubDate>Mon, 11 Dec 2017 10:39:55 +0700</pubDate>
				<guid>https://pliutau.com/go-tools-are-awesome/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/gotools.jpeg&#34; alt=&#34;gotools&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Yes, they are. And that&amp;rsquo;s why I love Go. Almost all important tools come together with Go installation, but there are also some you can install additionally depending on your needs: golint, errcheck, etc.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Slack Stranger Bot in Go</title>
				<link>https://pliutau.com/slack-stranger-bot-in-go/</link>
				<pubDate>Thu, 12 Oct 2017 10:17:18 +0700</pubDate>
				<guid>https://pliutau.com/slack-stranger-bot-in-go/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/wizeline-random.png&#34; alt=&#34;wizeline-random.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I am enjoying writing programs in a short time, like in a Hackathon way. Here in Vietnam we don&amp;rsquo;t have Hackathons often, so yesterday I decided to make one for myself with a time limit in 3 hours. The goal was to build/deploy something that will work and people can try it. I decided to go with Bot for Slack (or another messenger in the future).&lt;/p&gt;</description>
			</item>
			<item>
				<title>Benchmarking gRPC&#43;Protobuf vs HTTP&#43;JSON in Go</title>
				<link>https://pliutau.com/benchmark-grpc-protobuf-vs-http-json/</link>
				<pubDate>Sun, 08 Oct 2017 14:48:53 +0700</pubDate>
				<guid>https://pliutau.com/benchmark-grpc-protobuf-vs-http-json/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/grpc-json.png&#34; alt=&#34;grpc-json.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Simplest possible solution for communication between services is to use JSON over HTTP. Though JSON has many obvious advantages - it’s human readable, well understood, and typically performs well - it also has its issues. In the case of internal services the structured formats, such as Google’s Protocol Buffers, are a better choice than JSON for encoding data.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Garbage Collection in Git</title>
				<link>https://pliutau.com/git-gc/</link>
				<pubDate>Fri, 21 Jul 2017 15:48:14 +0700</pubDate>
				<guid>https://pliutau.com/git-gc/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/git-gc.png&#34; alt=&#34;git-gc&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;To understand git garbage collector, we need to understand how branches work. Branches are just pointers to commits that move whenever a new commit is created.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Using different Git emails</title>
				<link>https://pliutau.com/using-different-git-emails/</link>
				<pubDate>Sun, 09 Jul 2017 22:28:23 +0700</pubDate>
				<guid>https://pliutau.com/using-different-git-emails/</guid>
				<description>&lt;p&gt;Usually at work and at home we use different Git name/email pairs, or even per project. Pushing with correct email guarantees that your commits will be authored with a correct user identity.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Working with DB datetime/date columns in Go</title>
				<link>https://pliutau.com/working-with-db-time-in-go/</link>
				<pubDate>Fri, 26 May 2017 13:27:00 +0700</pubDate>
				<guid>https://pliutau.com/working-with-db-time-in-go/</guid>
				<description>&lt;p&gt;This post shows how to work with &lt;code&gt;DATETIME&lt;/code&gt; / &lt;code&gt;DATE&lt;/code&gt; database columns and use Go standard &lt;code&gt;time.Time&lt;/code&gt; avoiding manual string parsing. This article contains examples using 2 packages: &lt;code&gt;database/sql&lt;/code&gt; and &lt;code&gt;github.com/go-sql-driver/mysql&lt;/code&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Multi-stage Dockerfile for Golang application</title>
				<link>https://pliutau.com/multi-stage-dockerfile-for-golang-application/</link>
				<pubDate>Sun, 30 Apr 2017 12:47:27 +0700</pubDate>
				<guid>https://pliutau.com/multi-stage-dockerfile-for-golang-application/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/multi-stage.png&#34; alt=&#34;multi-stage&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;A common workaround for building Golang application in Docker is to have 2 Dockerfiles - one to perform a build and another to ship the results of the first build without  tooling in the first image. It called &lt;code&gt;Builder Pattern&lt;/code&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Useful Git global config and ignore rules</title>
				<link>https://pliutau.com/useful-global-git-config-and-ignore-rules/</link>
				<pubDate>Fri, 28 Apr 2017 10:47:24 +0700</pubDate>
				<guid>https://pliutau.com/useful-global-git-config-and-ignore-rules/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/git-pretty-log.png&#34; alt=&#34;git-pretty-log&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I am working with &lt;code&gt;git&lt;/code&gt; every single day, from different machines and accounts. And all these hosts have the same global git configuration. I sync it using tiny bash script.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Different ways to block Go runtime forever</title>
				<link>https://pliutau.com/different-ways-to-block-go-runtime-forever/</link>
				<pubDate>Mon, 24 Apr 2017 20:39:13 +0700</pubDate>
				<guid>https://pliutau.com/different-ways-to-block-go-runtime-forever/</guid>
				<description>&lt;p&gt;The design of Go&amp;rsquo;s runtime assumes that the programmer is responsible for detecting when to terminate a goroutine and when to terminate the program. Normally, a program can be terminated in a normal way by calling &lt;code&gt;os.Exit&lt;/code&gt; or by returning from the &lt;code&gt;main()&lt;/code&gt; function. There are a lot of ways of blocking runtime forever, I will show all of them for better understanding of blocking in Go.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How to build Go plugin with data inside</title>
				<link>https://pliutau.com/how-to-build-go-plugin-with-data-inside/</link>
				<pubDate>Tue, 04 Apr 2017 20:45:14 +0700</pubDate>
				<guid>https://pliutau.com/how-to-build-go-plugin-with-data-inside/</guid>
				<description>&lt;p&gt;Go 1.8 gives us a new tool for creating shared libraries, called plugins! This new plugin buildmode is currently only supported on Linux. But what if we build plugin with data in binary format inside? So we can ship only one &lt;code&gt;.so&lt;/code&gt; file.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How to use go-bindata with html/template</title>
				<link>https://pliutau.com/go-bindata-html-template/</link>
				<pubDate>Mon, 27 Mar 2017 14:26:12 +0700</pubDate>
				<guid>https://pliutau.com/go-bindata-html-template/</guid>
				<description>&lt;h4 id=&#34;what-is-go-bindata-and-why-do-we-need-it&#34;&gt;What is go-bindata and why do we need it?&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/jteeuwen/go-bindata&#34;&gt;go-bindata&lt;/a&gt; converts any text or binary file into Go source code, which is useful for embedding data into Go programs. So you can build your whole project into 1 binary file for easier delivery.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How to separate Unit and Integration tests in Go</title>
				<link>https://pliutau.com/separate_unit_integration_tests/</link>
				<pubDate>Thu, 02 Mar 2017 11:25:19 +0700</pubDate>
				<guid>https://pliutau.com/separate_unit_integration_tests/</guid>
				<description>&lt;p&gt;Usually integration tests take long time, because they&amp;rsquo;re doing real requests to real system. And it&amp;rsquo;s not necessary to run them every time we type &lt;code&gt;go test&lt;/code&gt;. For example we have &lt;a href=&#34;https://github.com/logpacker/PayPal-Go-SDK&#34;&gt;Golang client&lt;/a&gt; to work with PayPal SDK, it has some exported functions to send data to PayPal, then parse response and handle errors. So I wrote test functions to check that our client works properly with the real system, and be aware if PayPal changes response format or error codes. Also I have some client tests to check client types and validations, pure unit tests. And I want to launch only these tests when I do &lt;code&gt;go test&lt;/code&gt; or when tests are triggered by CI system.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How to mock exec.Command in Go</title>
				<link>https://pliutau.com/how_to_mock_exec_command/</link>
				<pubDate>Mon, 27 Feb 2017 10:15:26 +0700</pubDate>
				<guid>https://pliutau.com/how_to_mock_exec_command/</guid>
				<description>&lt;p&gt;In some of my projects we have code that needs to run external executables, and it&amp;rsquo;s very difficult to test them, especially when your function is based on some kind of stdout parcing. So how to mock these commands in Go? Let&amp;rsquo;s check how this goal is achieved in os/exec package. In &lt;a href=&#34;https://github.com/golang/go/blob/master/src/os/exec/exec_test.go#L33&#34;&gt;exec_test.go&lt;/a&gt; we can see a &lt;code&gt;helperCommand&lt;/code&gt;. When running go tests, the go tool compiles an executable from your code, runs it and passes all the flags. Thus, while your tests are running, &lt;code&gt;os.Args[0]&lt;/code&gt; is the name of the test executable. So the executable is already there and runnable, by definition.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swaggerize your APIs</title>
				<link>https://pliutau.com/swaggerize-your-api/</link>
				<pubDate>Mon, 03 Oct 2016 12:27:19 +0700</pubDate>
				<guid>https://pliutau.com/swaggerize-your-api/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;http://swagger.io/swagger-ui/&#34;&gt;Swagger UI&lt;/a&gt; is a great tool and a must have for any respectable API project. It has an intuitive design, all endpoints can be tested from the interface. For example, let&amp;rsquo;s have a look at &lt;a href=&#34;http://kubernetes.io/kubernetes/third_party/swagger-ui/&#34;&gt;Kubernetes API&lt;/a&gt;, where endpoints are grouped by version, and everything is accessible in easy way. In this post I&amp;rsquo;ll show how to build it together with your API written in Go.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Go templates. Helper to render a struct</title>
				<link>https://pliutau.com/struct-render-helper/</link>
				<pubDate>Thu, 08 Sep 2016 10:17:34 +0700</pubDate>
				<guid>https://pliutau.com/struct-render-helper/</guid>
				<description>&lt;p&gt;The Go language comes with a powerful built-in template engine. In Go, we have the &lt;a href=&#34;https://golang.org/pkg/html/template/&#34;&gt;template&lt;/a&gt; package to help handle templates. We can use functions like &lt;code&gt;Parse&lt;/code&gt;, &lt;code&gt;ParseFile&lt;/code&gt; and &lt;code&gt;Execute&lt;/code&gt; to load templates from plain text or files, then evaluate the dynamic parts. Also it&amp;rsquo;s possible to create user-defined functions and call it from templates.&lt;/p&gt;</description>
			</item>
			<item>
				<title>UUID without dependencies in Go</title>
				<link>https://pliutau.com/uuid-without-dependencies/</link>
				<pubDate>Fri, 26 Aug 2016 14:17:34 +0700</pubDate>
				<guid>https://pliutau.com/uuid-without-dependencies/</guid>
				<description>&lt;p&gt;Today I saw that the size of my &lt;code&gt;vendor/&lt;/code&gt; folder in Golang project is around 150M. I am using &lt;code&gt;glide&lt;/code&gt; there and there are 24 dependencies (it&amp;rsquo;s a program with multiple data storage connectors, notifications, etc.), so I decided to review it and reduce the amount of 3rd party libraries.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Concurrency. Data race</title>
				<link>https://pliutau.com/concurrency-data-race/</link>
				<pubDate>Thu, 21 Jul 2016 07:52:29 +0700</pubDate>
				<guid>https://pliutau.com/concurrency-data-race/</guid>
				<description>&lt;p&gt;What does data race mean in Golang? Data race is a common mistake in concurrent systems. A data race occurs when two goroutines access the same variable concurrently and at least one of the accesses is a write. It’s really hard to recognize it without specific tools or without an eagle eye, because when you run a program it’s always a chance that you won’t see your mistake or it will be very transparent.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Working with DB nulls in Golang</title>
				<link>https://pliutau.com/working-with-db-nulls/</link>
				<pubDate>Thu, 07 Apr 2016 09:17:49 +0700</pubDate>
				<guid>https://pliutau.com/working-with-db-nulls/</guid>
				<description>&lt;p&gt;This post shows how to marshall NULL values from the database into Go struct and how to avoid mistakes during fetching optional values with SELECT query. I&amp;rsquo;ll show standard types sql.NullString, sql.NullInt64, etc types.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Optimize Go binary size</title>
				<link>https://pliutau.com/optimize-go-binary-size/</link>
				<pubDate>Tue, 01 Mar 2016 10:18:54 +0700</pubDate>
				<guid>https://pliutau.com/optimize-go-binary-size/</guid>
				<description>&lt;p&gt;Well, I found yesterday that &lt;a href=&#34;https://logpacker.com&#34;&gt;LogPacker&lt;/a&gt; Daemon weights about 21MB. This application is written in Go language, it&amp;rsquo;s really doing a lot of things, has built-in connectors to different Data-Storages, has Cluster solution inside, etc.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Quiz yourself in Golang. Part 1</title>
				<link>https://pliutau.com/go-lang-test/</link>
				<pubDate>Fri, 05 Feb 2016 18:08:43 +0700</pubDate>
				<guid>https://pliutau.com/go-lang-test/</guid>
				<description>&lt;p&gt;30 basic questions to measure your Golang knowledge. Answers and .go files you can find on &lt;a href=&#34;https://github.com/logpacker/go-questions&#34;&gt;GitHub page&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Don&amp;rsquo;t hesitate to create a Pull Request in case of some found errors, typos.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Measure performance changes with benchcmp</title>
				<link>https://pliutau.com/measure-performance-changes/</link>
				<pubDate>Tue, 26 Jan 2016 16:10:23 +0700</pubDate>
				<guid>https://pliutau.com/measure-performance-changes/</guid>
				<description>&lt;p&gt;Go has a great option to write your benchmarks and run it together with &lt;em&gt;go test&lt;/em&gt; with option &lt;em&gt;-bench&lt;/em&gt;. To create a benchmark function you must do the following:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Supported Go types for gomobile bind</title>
				<link>https://pliutau.com/gomobile-bind-types/</link>
				<pubDate>Mon, 25 Jan 2016 13:12:43 +0700</pubDate>
				<guid>https://pliutau.com/gomobile-bind-types/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://pliutau.com/gotypes.jpg&#34; alt=&#34;LogPacker&#34;&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;gomobile-bind&#34;&gt;gomobile bind&lt;/h4&gt;&#xA;&lt;p&gt;With &lt;a href=&#34;golang.org/x/mobile/cmd/gomobile&#34;&gt;gomobile&lt;/a&gt; we can generate language bindings that make it possible to call Go functions from Java. And it&amp;rsquo;s awesome. Now you can write Android applications in Go (unfortunately without UI features and with pure SDK coverage, but I hope it will grow up from experiment to production-ready tool).&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
