Photo by Michał Parzuchowski on Unsplash

RabbitMQ is a mature and stable messaging server that uses the AMQP protocol to interchange messages between producers and consumers.

It can serve several uses-cases, including: transient channels, fan-out messages, federation and others.

Here I will explain some (maybe all…) configurations and parameters for my most common use-case: Guaranteed message delivery for worker job queues.

This means that if a message is accepted by RabbitMQ, it will be consumed and only removed from the queue once acknowledge.

This will cover exchange, queue, consumer and producer setup. And will not cover RabbitMQ server reliability and clustering. …


I was reflecting the other day on the tools I know and, specially, the ones I do not know. That led me to think “why do I not know these tools by now?”.

One of the reasons is that I learnt other things, and is what lead to this text.

That might sound obvious, but I actually have to choose what to invest my time, and make trade offs.

Here I share some technologies I learned and invested and that did not really pay off, that I abandoned or that just made me take a long run.

These are not…


Here I explore a few optimization when building docker images for your clojure apps.

Image versions

One easy way to make it faster for you local development and for CI/CD is to just use smaller images, and to reuse images.

Using common public images make it more likely that you will use the same image over and over again, also pinning to the most specific version help assure the base image have not changed between builds. Choosing alpine or slim images can reduce the image size.

For the base image I use clojure:openjdk-13-tools-deps-slim-buster and openjdk:13-slim-buster. I prefer buster images over alpine due…


A few years ago I was working with geospatial analysis and came to study and compare a few alternative file formats for storing and, especially, transferring such data.

I worked mainly with vector data (polygons and points) and served that for the web. The motivation of this work was to test the gains and cost of TopoJSON, and how it fared in size (important for transfer time) and encoding time (important for server resource usage).

A more complete description of advantages of the available formats can be found at Shapefile must die!


Terraform is this amazing tool to provision and manage changes on your cloud infrastructure while following the great practice of keeping your infrastructure-as-code.

One common need on infrastructure management is to build multiple environments, such as testing and production, with mostly the same setup but keeping a few variables different, like networking and sizing.

The first tool help us with that is terraform workspaces. Previously called environments, it allows you to create different and independent states on the same configuration. And as it’s compatible with remote backend this workspaces are shared with your team.

As an example, let’s work with…


This is a simple sum up of a few experiences I had with golang with regarding to compiling binaries, “static” binaries, cross compiling and using plugins.

The basics

We all start on the same basic, to compile a simple go program you do:

$ go build -o mybin *.go

That will generate a binary “mybin” at your folder. A few things for this to work:

  • It’s a main package
  • It have a func main()

Cross compiling

That is awesome, but now I actually want this to work on my raspberry pi or my Scaleway arm servers. How do we go?

$ GOOS=linux GOARCH=arm GOARM=6…


I am very proud to announce that the project by Eduardo Dalcin and me, developed inside Brasil’s National Centre for Flora Conservation, is featured in Elastic.co user stories blog.

In Providing extinction risk assessments for biodiversity with Elasticsearch we give an overview of the processes of assessing brasillian flora with the help of the Elastic stack, using Elasticsearch for indexing and Kibana for exploratory data analysis.

The mentioned tool is the Rapid Risk Assessment Application (RRAPP).

It was a great surprise already that we were invited to run for the Elastic Cause Awards, which recognizes organizations using the Elastic Stack…


Or: Non-conversational interactive chat interfaces.

Since constraints provokes creativity and no-UI is the best UI (simplicity is king), it really is looking good to be on the chat focused apps side of things.

And from a backend developer, who can’t really come up with nice designs, it really makes sense: the UI is already there, is dead simple and there are already users. All you got to do is write an API, and in that we excel.

Talking about simplicity, you don’t even need to go the conversational AI path. I find conversational bots (those that trhow AI and pretend…


At this new year break I made a blog for my girlfriend. A simple, straightforward and customized wordpress blog, and I felt pretty good about it.

It took me about two days to air it, and I felt good because I put something for the public and it was without any hassle, and it has been a while since I was able to put something out there that was both simple and useful.

Lately all my programming world resolved around “complex” stuff: Polyglot programming, multiple databases, containers, geospatial analytisys, micro-services... and, above all that, little of that was made public…

Diogok

Nerd programmer.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store