November 21, 2024

The Danger of Running Untrusted Code

Recently I was invited to a project on UpWork by someone claiming to have issues running his code. Before he started the contracted, I was invited to a GitHub repository, accepted - and executed the code locally. Nothing looked suspicious, until I dwelled deeper into the code. Lesson learned: never run untrusted code on your machine. Read more

May 6, 2024

How I failed to properly transfer this website's domain

I used to run my blog at a different domain, ribice.ba .For personal reasons and other projects that I now host on this domain, I decided to transfer my programming blog to dev.ribic.ba. As I had no experience with domain migrations, I just set up the 301 redirect and submitted this change to Google Search Console. It went horribly wrong. Read more

January 29, 2024

Deploying to EMR Serverless via EMR CLI

Recently as part of my academic studies I had to deploy a PySpark application to EMR Serverless. I encountered a couple of issues along the way - most of them related to me trying to get a newer version of Python running on the cluster. This post will cover the issues I encountered and how I resolved them. Read more

February 25, 2023

Defer your mutex Unlocks

A few weeks ago we had an incident where our RabbitMQ was blocked and no new messages were processed. Restarting the service temporary resolved the issue, but the underlying the problem was still there. It was caused by a mutex that stayed locked after a panic. Even though we did recover from panic - the mutex remained to be locked. Read more

August 3, 2022

Easy memory-saving tricks in Go

Unless you’re prototyping a service - you probably care about the memory usage of your application. With a smaller memory footprint, the infrastructure costs are reduced and scaling becomes a bit easier/delayed. Even though Go is known for not consuming a lot of memory, there are ways to further reduce the consumption. Some of them require lots of refactoring, but many are very easy to do. Read more

July 27, 2021

Glice v2 - Adding support for go.mod

Glice has been the first open-source project I published on my GitHub account. It’s a dependency checker for Go that used to go through all .go files, parse the imports and fetch the licenses for third-party dependencies. Long overdue I’ve added support for projects using Go Modules and did a major refactor simultaneously. Read more

April 14, 2021

HTTP logging in Go

Having good logging is crucial for running and debugging applications in production. It reduces your issue to resolution time by providing details about every action, request, and response. Designing a good logging system isn’t a trivial task, and requires an eye for detail. Here’s how I do it in Go! Read more

February 17, 2021

Removing null values from maps or JSON with Go

Recently I was given a task of removing all keys that have null values from an arbirtrary json. We do data processing of Excel/csv files and have default config generated for them server-side. Users provide custom configuration (column types, names, headers, sorting …) and these two get merged. Problem was - if key existed and had null value it would override the key that had a value. Obviously there may be other ways to do this, but this is a very generic solution that can be used in most cases. Read more

August 2, 2020

A robust RabbitMQ client in Go

A few months ago I started working on a project that heavily relies on RabbitMQ as a message broker. We have two clients communicating with Go, one via AMQP (RabbitMQ) and the other through HTTP. As our dependency on RabbitMQ is big, I had to write a robust client that does graceful shutdowns, panic recoveries, is multithreaded, logs everything nicely, and more. Read more

May 23, 2020

Pushing data upstream in Context

Go’s context is a hefty tool that was added as an official package back in 1.7. The context package provides contextual information that a goroutine may need such as how long it should run and how and when it should end. It can also pass informational key-value pairs for use down the call chain. But what if we need to pass information up in the call chain? Pointers come to the rescue. Read more

February 2, 2020

Updating Goroutines post-creation

One of the greatest things about Go is how it deals with concurrency. It is far simpler compared to other languages. It uses so-called goroutines - a lightweight thread managed by the Go runtime. While they are mostly used for asynchronous, fire-and-forget stuff (most common usage being HTTP multiplexers), I recently needed to have them updated post creation. The obvious first choice in Go would be to use channels, but trying to build the solution with them caused me some issues, which made me opt for a far simpler one - maps. Read more

January 20, 2020

Writing RESTful APIs in Go, 3 years later

I’ve started working with Go in early 2017, and since then most of my work has been writing RESTful APIs with it. With time I gained experience. and I constantly change the way I write APIs in Go. After a year of working with Go, I’ve released Gorsk - a Golang RESTful starter kit, and an update to it 6 months later. I get many emails and questions on how to use it properly, which means that something like Gorsk is highly needed. Over time I’d like to keep it up-to-date with my latest views on how to write REST APIs in Go, and this blog post serves as a first step in the next iteration. Read more

October 10, 2019

dt - Go's missing datetime package

Go’s standard library contains a single date package - time. The type provided by it, Time, contains date, time and location information. More often than not we don’t need location info, or we need to represent date/time only. dt provides exactly that, a time-zone-independent representation of time that follows the rules of the proleptic Gregorian calendar with exactly 24-hour days, 60-minute hours, and 60-second minutes. Read more

2024 © Emir Ribic - Some rights reserved; please attribute properly and link back. Code snippets are MIT Licensed

Powered by Hugo & Kiss.