In April 2025, I’ve ordered two OrangePi RV2, as soon as they announced Ubuntu 22.04 support, they are running 24x7 since then. The Ky X1 CPU is a RISC-V (RISC-V is open and royalty-free), 8 Core, the architecture is riscv64, (so not arm64/aarch64). Linux risc5 6.6.63-ky #1.0.0 SMP PREEMPT Wed Mar 12 09:04:00 CST 2025 riscv64 riscv64 riscv64 GNU/Linux It has two M.2 sockets, I have it…
TLDR: A recent Qt update let you do gRPC calls directly from QML, allowing to interact with gRPC from the UI without requiring C++. Qt is a rich ecosystem for UI development, but its roots are in C++. QML is a declarative language specialized in designing user interface applications on top of Qt. Qt supported gRPC for a long time but only via C++ code, recently they added gRPC calls directly from…
Apache Superset is a popular data visualization tool, often referred to as a Business Intelligence (BI) tool. It provides polyglot visual interfaces to various databases. Integrating DuckDB with Superset can significantly enhance its capabilities, enabling it to read Parquet files and perform spatial queries among other features. TL;DR: You can use DuckDB with Superset using a slightly modified…
The CLI tools ecosystem is very alive, I feel this trend restarted with the Go and Rust languages, for the best. I’ve used some CLI commands for multiple decades, it’s hard to force new habits, but some of those new tools really justify some efforts. This is a list of some I’ve adopted already or trying to adopt, obviously opiniated choices: Yazi Terminal file manager You can…
Benthos, now renamed Redpanda Connect and the fork Bento, is a data stream processor, think anything Inputs: Kafka, NATS, SQS, S3, a socket, HTTP … modify the content, then send it to anything outputs. I love that tool so much, that I was convinced I’ve blogged about it already which I did not. It can be used for mostly anything streams related. Surely we could do the same thing with…
Previous post was about discovering a new offer in the Kubernetes Gateway space Envoy Gateway, in this one I’ll share some notes to make it to production. Envoy Gateway is still rough on the edges, but remember Gateway is mainly a Kubernetes API frontend to provision Envoy Proxy, Envoy Proxy configuration can still be patched to enable a specific feature. Enable Patching Patching is not…
Envoy Proxy is a well known proxy load balancer offering HTTP, gRPC, TCP, customizable with Lua, Go, WASM … It’s often the core component used to build gateways/proxies for Kubernetes. For example Istio is using it as a proxy load balancer for ingresses but also as a sidecar to create a “mesh network”. Envoy Gateway is a more recent project to manage Envoy proxies inside…
H3 is a geospacial indexing library created by Uber. If you are familiar with this blog it’s similar to S2. Uber is providing h3 for Go. Unfortunately it’s a CGO version, a C to Go binding as you may know CGO is not Go. Having a native Go library is easier to deal with but would mean a full rewrite. Transpiling You may have heard about a recent effort to transpile C to Go using ccgo…
I’m still using my arm64 4 nodes cluster for experimentation and even to serve some websites. Since I wanted to test some new Cloudflare features, I migrated one of my domain which has a bunch of websites on it. But first a quick and simple way to serve some static pages: Serving Static Pages One way is to build an image with the actual pages in it and let Kubernetes serves them.
My buddy and I bought some lands (20ha/50acres) in the Quebec province. Creating a new problem It all started because as a new “forest owner”, I wanted to do a tree survey. There are some good mobile apps to recognize flowers and trees but nothing professionally graded I knew (except paying for human expert). I also needed a solution that would work offline since the mobile network…
I’ve already posted about gomobile on this blog: “Using gomobile for real”. For a lot of people it seems crazy to run Go on iOS and Android for some others it’s just routine, Zenly & Tailscale to name a few. Since I’m reviving the idea for a geo database on iPhone here are some details. I’ve started to port spatialite with the required dependencies to realize…
Swig is a tool to generate bindings for c/c++, it can produce bindings for Python, Java, Go and more. Unfortunately Swig for Go is very limited, so as the Swig & Go documentation. Here are some notes taken while writing a binding from c++ to Go: To bind standard types into Golang Let’s look at this c++ function: int64_t Ticks() const; Simply include sdtint into Swig %include 'stdint.i' It…
TL;DR; simply run docker pull akhenakh/kvtiles:planet-9-latest for a self hosted free performant world map (more maps and levels available see kvtiles docker tags). I’ve blogged in the past to describe how to generate and serves your own map tiles server, but I wanted an easier solution. KVTiles kvtiles is a map tiles self hosted solution written in Go, it’s using Mapbox vector format…
To simplify distribution k3s does not ship with zfs support. But can work with by relying on an existing containerd enabled zfs, here is how: Requierements Install cni-plugins and crictl Ensure your containerd includes the zfs plugins: ctr plugins ls ... io.containerd.snapshotter.v1 zfs linux/amd64 ok Configuration Create the default containerd config file mkdir -p /etc/containerd/ containerd…
TL;DR; Knowing your data helps compress them better than common algorithms. Problem For one of my side projects, an IoT database, I wanted a specialized time series to store timestamps coupled with coordinates. I needed a simple solution which allows live and cold compressed storage with gaps in it: IoT devices can be off for days then reappear. But couldn’t find anything fitting my needs,…
Here in Quebec, winter is so cold it can drain your phone battery very fast. I wanted a private and secure solution for my hikes, so I can be followed on a map. This post will introduce you to LoRaWAN and how to install your own IoT mapping application using open source tools and a new project I’m working on written in Go. Radio Network LoRaWAN is a network layer protocol for managing…
If you are familiar with this blog you know I really appreciate Kubernetes: as a former ops I strongly believe Kubernetes is one way to bundle “the sum of 20y ops good practices”. But there are others solutions one is Nomad. It’s made by Hashicorp, creators of Vault, Consul, Terraform… In general Hashicorp is synonym with quality. Nomad is a task scheduler, a task could be…
Following my earlier post about Traefik 2 and Kubernetes, here are some advanced configuration examples and a full yaml example at the end of this post: Protecting a route with a password Create an htpasswd file named users for a user admin htpasswd -c users admin Use kubectl to create the secret (easier for multi lines file). kubectl create secret generic admin-authsecret --from-file=users Create…
Maps are fun, self hosted maps are awesome ! Serving world maps was reserved to big companies like Google, thanks to the OpenStreetMap project, we now have access to an open world of data. Generating Tiles MapBox (and others) worked hard to create a vector format bundled in a SQLite file: mbtiles format. It’s vector based as opposed to older raster maps containing 256x256 PNG images. The…
I’ve been using Google Compute Platform (GCP) & Google Kubernetes Engine (GKE) for years. And I love it, I hated AWS since the first release to these days, naming is cumbersome, UX is terrible… Here are a quick survey of the tools and how I’ve used them for small to medium projects: Cloud Build Cloud Build is super easy, it’s a scriptable CI/CD, very similar to Github…
Traefik 2.0 is here ! Traefik is a reverse proxy load balancer (and more), it can learn the routes to respond to by discovering them in multiple providers, Docker, Kubernetes … Traefik v1.x is very stable, v2.x is fresh new tech, with breaking changes and unfinished documentation, so test it first. From Traefik’s documentation: Providers discover the services that live on your…
Github delivered a beta Github Actions, it’s a worflow that can run almost anything related to your code, like a CI/CD. Here is a workflow for Go 1.13 module projects and golangci-lint. name: golangci-lint on: [push] jobs: build: name: Build runs-on: ubuntu-latest steps: - name: Set up Go 1.13 uses: actions/setup-go@v1 with: go-version: 1.13 id: go - name: Check out code into the Go module…
Here is a simple yet useful trick to access web interface within your cluster. As stated in the Kubernetes documentation you can use kubectl proxy. I’ve seen a lot of people using the proxy to access the dashboard but you can use it to access any web interfaces, without the need to create an ingress and protect it, especially useful in dev environment.…
I’m still playing with my 3 nodes arm64 cluster, having some stability issues with k3s, I turned into kubeadm to deploy a bare metal non HA one master two workers Kubernetes cluster. My host is Arch which is theoretically not supported but still works. Required tasks sudo pacman -S ethtool ebtables socat cni-plugins Install aur/kubelet-bin and aur/kubeadm-bin I needed a private registry to…
I’m evaluating k3s a Lightweight Kubernetes on a 3 nodes arm64 cluster (RK3328 Quad arm64). At the time of writing the stable release is k3s v0.6.1. Here are my notes: If you haven’t installed k3s with the install.sh, you may need to load some modules: br_netfilter and overlay Docker is not needed since k3s is using containerd but it seems I had to start docker to initialized the whole…
The H96 Max + is an Android 8.1 box with a Rockchip 3328, 4Gb RAM and 32G or 64G builtin eMMC, it’s the same chipset as the Rock64, it costs around 60 USD. The only downside of this board is the 100Mb network link, can be a non issue using a USB network adapter. July 2020 EDIT: Works with mainline, look at the bottom. Here are some notes how to install Arch Linux on the H96 to make it a…
Here are my notes to install Arch on a Rock64 and boot on USB first. Warning, you can brick your device (but can unbrick it), you are on your own. Follow Arch Instructions to Install on an SD Card Boot on it Insert your USB device and follow the exact same installation but this time to the /dev/sdadevice At the end Mount / into root again Run blkid to grab the UUID of your /
Caddy is the swiss army of the web server, and with the recent commercial license changes, it’s time to give it some love back. I have several static websites, some generated with Hugo, some are plain HTML. I wanted a small container, to run it inside a Kubernetes cluster, capable of pulling some git repos and serve them. Caddy-git Caddy is already capable of that with the help of caddy-git…
Context I wanted to blog about this for years: how to connect to a Kubernete’s loadbalanced service? How to deal with disconnections/re-connections, maintenance? What about gRPC specifically? The answer is heavily connected to the network stack used by Kubernetes, but with the “Mesh Network” revolution, It’s not always clear how it works anymore and what the options are.…
Following my recent blog post on setting up a dev environment in Kubernetes, here are some tips to use Traefik as a gRPC load balancer. Traefik can be used on the edge and route incoming HTTP traffic to your Kubernetes cluster, but it’s also supporting gRPC. gRPC Load Balancing with Traefik Here I have a gRPC service I want to expose on the edge. apiVersion: v1 kind: Service metadata: name:…
Introduction When starting on a new project or prototyping on a new idea, I find myself doing the same tasks again and again. Thanks to Kubernetes it’s possible to setup a new env from scratch really fast. Here is a quick setup (mostly notes) to create a dev environment using Minikube and the workflow I’m using with it. Not knowing in advance where this future project will be hosted, I…
I needed a reason to use the new Go 1.11 Wasm port for “real”. To make it short, it compiles Go code to Wasm binary format for a virtual machine running in web browsers. I’ve always needed a debug tool to display S2 Cells on a map for different shapes, some online tools already exist: s2map.com unfortunately the backend is often/currently dead. regioncoverer which doesn’t…
This is my journey building an open source car system with Go & Qt, rear camera, live OpenGL map … Cross compilation In Part I, I had to patch qtmultimedia for the camera to work, but Qt compilation is resource hungry, same goes for the osrm compilation, the memory of the Raspberry Pi is too small. I had to to set up a cross compilation system in my case for armv7h.
At first I needed a car rear camera, one thing led to another… My Car, from 2011, only has an LCD display and no rear camera, so I bought a PAL rear camera, we passed some cables from the rear window to the front then everything begun. Here is my journey to transform my car into a modern system running on RPi3 (a never ending project). Hardware I’m using an Rpi3 (old model).
Having multiple clients to handle multiple networks is a mess, especially the Slack client which is really heavy and annoying. Slack is deprecating its IRC gateway interface on May 15h 2018. Bitlbee is an IRC server working as a gateway to different IMs. Optionally Bitlbee can be compiled with LibPurple to support even more networks, like Slack and Hangouts. Here are some notes for Slack, Facebook…
Google is working again on S2 a spatial library !!! And they even have created a website to communicate about it s2geometry. The C++ port contains a Python Swig interface. I’ve been using an unofficial Python port with Jupyter for years now things are way more simpler. If you are on Arch I’ve create a package, simply install AUR s2geometry-git First we want a clean Jupyter install from…
One year ago I’ve started to collect temperature from my house using Acurite sensors. These sensors are not too expensive and good quality but the “base” aka the radio receiver connected to internet is costly and totally closed, it’s sending your data to the Cloud™, it’s not just Acurite, all those “IOT” devices are generally poor on the software side.…
PacBSD is a FreeBSD kernel/world with a PacMan Arch package manager and an optionnal OpenRC init system. In short ZFS, DTrace and the FreeBSD kernel but the simplicity of Arch for packages management but the Gentoo init. It’s experimental, uncompleted, unfinished, lacks proper documentations but it works and could be/should be the solution we are waiting for :). Here is some notes on…
I’ve got an Asus C301S at work, it’s a Chromebook with Chromeos. I like those little laptops, for the price it’s actually a very good little machine. ChromeOS is responding very well, ssh and Chrome are working too. But I often need more, like X11 forwarding or offline coding … You will see the C301SA is marked as a C300SA internally. Here are the steps to install Arch…
I’ve been a long time UNIX user, ditched Microsoft back in the 90s for FreeBSD, Solaris and Linux on the desktop, but when Apple released MacOS X, I’ve used it as a workstation. For the last years I’ve used Linux desktops but not on my main computer, today here I am switching back to Linux. This post is not about the reasons I’m switching, they are simple. My typical work…
There are a lot of different solutions when it comes to collecting metrics, I found myself happy with this hybrid solution. Telegraf is an agent written in Go for collecting metrics from the system it’s running on. It’s developed by Influxdata the people behind InfluxDB, but Telegraf has a lot of outputs plugins and can be used without InfluxDB. Many different platform (FreeBSD, Linux,…
If you are following Go development you probably know that: Go 1.7 moves the golang.org/x/net/context package into the standard library as context, Yeah ! Unfortunately it won’t work for everything, I’ve spent some time understanding this one. For example if you are using gRPC you can hit this problem, here is an interface generated by gRPC: type APRSServer interface {…
Go Mobile can generate native framework for iOS and Android using Go code, I was curious what could be achieved with it. Most tutorials are Hello world and I wanted to test it with real code. You can use it to generate a full app only using Go code, but I’m only interested by the bindings part (SDK applications), using a native ObjC/Swift app calling Go code. I’m using some existing Go…
I’ve been using gRPC at work and in several personal projects for months and happy with it, but when it comes to load balancing gRPC does not come with batteries included. For a long time the only document was the Load Balancing draft in the gRPC repo, the clients should implement a Picker interface to know about the servers, so the pooling and controling the load were handled by the…
I have found the right setup to stream in 1080p from a Raspberry Pi using the camera to TwitchTV while injecting audio on the fly! Create an account on Twitch and grab you stream key in the Dashboard. This stream.sh script will create a FIFO start rtl_fm at freq 162.550M to listen to Canada weather bulletin (use your local NOAA channel) and inject and encode the audio to the existing h264 stream…
I’ve been using Jetbrains editor (the free Idea community edition) or Pycharm with the Go plugins and very happy with this setup, the editor is providing some realtime linting but I was missing gometalinter. First install gometalinter go get -u github.com/alecthomas/gometalinter gometalinter --install --update To add support inside Jetbrains editors use the External tools feature. In…
If you read this blog, you know I’ve recently released a project called regionagogo, a geo shape lookup database, described in this blogpost. It uses the current Go S2 implementation, which is not yet as complete as the C++ implementation, for example the region coverer of a shape does not really compute cell around the shape but around the bounding box instead. Using the shape of the…
On a previous post, I’ve described how to use the S2 geo library to create a fast geo database, but it was to store locations (points) and only to perform range queries, a complete geo database would have regions/polygons queries. Looking for a solution I had this need: querying for the countries or subregions of hundreds of coordinates per second, without relying on an external service. One…
Six months ago, I wrote on this blog about Geohashes and LevelDB with Go, to create a fast geo database. This post is very similar as it works the same way but replacing GeoHashes with Google S2 library for better performances. There is an S2 Golang implementation maintened by Google not as complete as the C++ one but close. For the storage this post will stay agnostic to avoid any troll, but it…
I’m happy to announce a new side project: MyAPRS, a modern iOS APRS application, for radio amateur enthusiasts. I’ve already mentioned APRS on this blog, it will mainly be useful for radio amateurs but can be interesting to RTL-SDR listeners too. The application is built around LevelDB and geo hashing as mentioned in this post blog, it’s a lot faster than using SQLite especially…