Funding open-source software is a challenge, especially for projects without a large existing community. While various approaches exist, they all come with their own drawbacks. For example, asking for donations is by far the most commonly used approach but also the least effective: you can ask (or pretty much beg) for donations for years and maybe you'll receive $10 per month. Heartbleed is…
I've been running this website since 2008. Over the years I've changed hosting providers and what software to use a bunch of times. Some time in 2015 I switched to hosting it as a static website on Amazon CloudFront . A few years ago I moved from Amazon to Cloudflare, primarily because Cloudflare Pages and Cloudflare R2 have a generous free tier, and an interface that isn't a confusing mess.…
My current laptop is an aging X1 Carbon generation 7, purchased some time in mid 2019. A few months ago a few keys of the keyboard stopped working, specifically the 5, 6, - , = and Delete keys. Sometimes I can get it working again by mashing one of them for a while, but it's not consistent. Given my past experiences with X1 Carbon laptops breaking outside of warranty and the frustration that comes…
This week I've been working on a script and slides for a YouTube video about Inko . After a week of doing that I needed a bit of a break. Last week I wrote a bit about FreeBSD , and specifically about wanting to try it out on my yet to be delivered Framework 16 laptop. This got me thinking: why don't I try FreeBSD on my desktop first, then see if it's still worth trying out on a laptop? After all,…
Recently I've been playing around with FreeBSD in a virtual machine. The reason for this is that (if all goes well) some time in December my new Framework laptop will arrive, replacing my current X1 Carbon that is starting to show signs of old age (e.g. a keyboard where certain keys don't always work). Framework in turn has a strong focus on Linux compatibility, and FreeBSD compatibility to a…
The last few weeks I've been working on adding an HTTP 1.1 stack to the standard library of Inko as part of this pull request . The work is still ongoing but the initial set of changes will include an HTTP 1.1 server, client, basic cookie handling, generating and parsing of forms, and a request router. This work is based on the following RFCs: Uniform Resource Identifier (URI): Generic Syntax HTTP…
After publishing the recent 0.18.1 release of Inko , I spent a few weeks building a simple key-value database in Inko. The result of this work is KVI , a Key Value database written in Inko. One might wonder: why exactly write a simple key-value database when so many already exist? And what did you learn from it? Let's find out! Table of contents Why? The architecture Supported commands Signal…
When defining a type in Inko , it's allocated on the heap by default. For example (using the syntax for the upcoming 0.18.0 release): type User { let @id : Int let @username : String let @email : String } User(id: 42 , username: 'Alice' , email: 'alice@example.com' ) Here User is a heap allocated type, and the expression User(...) allocates an instance of this type using the system allocator (i.e.…
A feature scheduled to be released in Inko 0.18.0 is the ability to define types to allocate on the stack instead of on the heap: # Instances of this type are heap allocated. type User { let @name : String } # This goes on the stack instead due to the use of the `inline` keyword. type inline User { let @name : String } This also meant adding support for passing such values as arguments, capturing…
Recently I read about a new Rust web framework called rwf . I was especially curious about its approach to handling database migrations, as many frameworks released in recent years tend to either overlook this or provide a mechanism that won't scale to larger projects. Reading through the documentation I learned that rwf falls in the second category: it generates two SQL files, one for migrating…
Asynchronous IO (also known as "non-blocking IO") is a technique applications use to allow performing of many IO operations without blocking the calling OS thread, and without needing to spawn many threads (i.e. one thread per operation). In the late 1990s/early 2000s, an increasing amount of people using the internet meant an increasing amount of traffic web services needed to handle, better…
Ask ten developers how they think a certain piece of code should be formatted, and you'll likely get ten different opinions. Worse, these opinions are almost never based on facts. Instead, when you ask why they prefer style X over Y the answer is almost always the equivalent of "I just do". What if we could sidestep this entire debate and let a computer decide for us? No, I'm not talking about…
I joined GitLab in October 2015, and left in December 2021 after working there for a little more than six years. While I previously wrote about leaving GitLab to work on Inko , I never discussed what it was like working for GitLab between 2015 and 2021. There are two reasons for this: I was suffering from burnout, and didn't have the energy to revisit the last six years of my life (at that time) I…
In 2013, I had an idea: "what if I were to build my programming language?". Back then my idea came down to "an interpreted language that mixes elements from Ruby and Smalltalk", and not much more. Between 2013 and 2015 I spent time on and off trying different languages (C, C++, D and various others I can't remember) to see which one I would use to build my language in. While this didn't help me…
For the last 10 years or so, Arch Linux has been my Linux distribution of choice. The early years were a bit rough, and the process of moving to systemd wasn't without its challenges either, though the experience has improved dramatically since then. In spite of these improvements, certain issues persisted, such as having to manually perform update related steps every now and then, fixing broken…
Back in October 2015 I joined GitLab . I think I was employee #28 at the time, with the total number of employees being somewhere between 30 and 40 if I'm not mistaken. Fast-forward to today, and GitLab has grown to almost 1600 employees. While I enjoyed my time at GitLab, after a little over six years I feel it's time for something new. In particular, I want to be able to dedicate more time to…
It's been a while since the last update about my work on the Inko programming language . Not because there hasn't been any progress, but because I've been busy making changes. A lot of changes. For the past two years or so I have been toying with the idea of replacing Inko's garbage collector with something else. The rationale for this is that at some point, all garbage collected languages run…
libffi-rs ( GitHub repository ) is a Rust crate that provides bindings to libffi . I've been using the crate for about two years now for Inko , and it works great. Development of the crate slowed down in recent years, as the author Jesse A. Tov has been busy. To help the author out, I joined as a maintainer, and earlier today I released version 1.0.0 of the libffi crate. What's new Version 1.0.0…
June 2020 marks my 10-year anniversary of becoming a software developer. When I first started out I just turned 18 years old, and yet somehow thought I knew everything better than everybody else. Of course this wasn't true, quite the opposite in fact. Fast forward 10 years, and I have learned quite a bit. I have learned new tools, gained new skills, learned how to sit properly behind a desk, the…
How to perform garbage collection is a widely explored topic, and there are all sorts of different techniques. Sequential collectors, parallel collectors, concurrent collectors, incremental collectors, real-time collectors, the list goes on. There are also different techniques for allocators used, ranging from free list allocators to bump allocators. Deciding when to perform garbage collection…
The article "Beating C with 80 Lines of Haskell" discusses writing a simplified version of wc using Haskell, and how it performs compared to the C implementation. This resulted in various other people writing the same program in different languages, and writing about doing so. At the time of writing, there are implementations for: Ada C Common Lisp Dyalog APL Futhark Go Haskell Rust Today we will…
About a year ago I wrote "Inko: a brief introduction" , and later published the Inko website . Since then, I made a lot of progress towards making it useful for everyday use. Some recent milestones include: A Foreign Function Interface. A new process scheduler that is easier to maintain, and performs better. Non-blocking sockets, without the need for callbacks. Reduced memory usage per process.…
Inko is a programming language I started working on in early 2015. The goal of the project is to create a gradually typed, object-oriented programming language with a focus on safety and concurrency. Inko draws inspiration from various other languages, such as Smalltalk, Erlang, Rust, and Ruby. Like any other language, it is not perfect but the more time I spend working on it, the more I believe…
The process of evaluating a programming or query language is typically broken up in 3 steps: The lexing phase, which turns raw text into a sequence of "tokens". Tokens are usually a pair (e.g. an array or tuple) of a type and a value. The parsing phase, which turns a sequence of tokens into an Abstract Syntax Tree (AST) . An evaluation phase, producing a set of instructions a machine should…
I'm excited to announce that I will be joining GitLab starting October 1st. I greatly enjoyed my time at Olery , but after almost 3 years I felt it was time for a new adventure. If you're based in Amsterdam and love working with Ruby you should definitely send your details over to mailto:jobs@olery.com . At GitLab my time will be broken up in to two chunks. 80% of my time (4 days) will be spent on…
Until now if one wanted to parse XML and/or HTML in Ruby the most common choice would be Nokogiri . Nokogiri however is not without its problem, as I have discussed in the past . Other existing alternatives usually only focus on XML (such as Ox and REXML), making them unsuitable for those in need of HTML support. Starting today Ruby developers will be able to use a solid alternative as I'm happy…
In the Ruby ecosystem there are plenty of HTTP libraries. Net::HTTP, HTTParty, HTTPClient, Patron, Curb, Excon, Tyhpoeus, just to name a few. There are so many of them it's almost as if it's required that one writes an HTTP client in order to call themselves a Ruby developer. When it comes to XML/HTML parsing on the other hand the options are quite limited. The two most common libraries are…
As it turns out you can make the process discussed in this article easier by using a Rakefile instead of an extconf.rb file. See the bottom of this article for more information. In Ruby land RubyGems is the de facto package manager. RubyGems allows you to easily distribute your Ruby packages (known as "Gems"). These packages come in two flavours: Pure Ruby Gems Gems that include C code (or any…
Pry is a REPL (Read Eval Print Loop) that was written as a better alternative to IRB. It comes with syntax highlighting, code indentation that actually works and several other features that make it easier to debug code. I stumbled upon Pry when looking for an alternative to both IRB and the way I was debugging my code (placing puts all over the place, I think it's called "Puts Driven…
Almost any application will eventually need to store a collection of passwords or another type of data that has to be stored using a hashing algorithm. Blogs, forums, issue trackers, they all need to store user data and these passwords. This article covers the common mistakes made when dealing with passwords and what you should use instead. In order to fully understand this article some basic…