Nix is a tool that helps people create
reproducible builds. This means that given the a known input, you
can get the same output on other machines.Let’s build and deploy a
small Rust service with Nix. This will not require the Rust compiler
to be installed with rustup or similar.
11 things you may have overlooked when you made your website live
A student of mine recently put up their first website and asked me
if they'd missed anything. I thought it would be useful to put up a
checklist of things that are very easily overlooked and forgotten
about when you put your shiny new site live.
A somewhat tongue-in-cheek title, but this page lists a few very
important rules you should always keep in mind when creating
makefiles. Following these rules will allow your makefiles to be
both pithy and beautiful. And they will make maintaining and
modifying them, and thus your entire life, a much more pleasant
Today we paid a visit to Avonturia, also known as "De Vogelkelder",
located in the city of The Hague. I bought two new "pets": a
Brachypelma smithi and an Aphonopelma seemanni. Read about it in my
blog post: A visit to Avonturia De Vogelkelder.
Hacking up your own shell completion
In this post I’ll be walking through a simple hack I added to my
shell that I think makes me more productive (if nothing else it
makes me happy).
Zip Files: History, Explanation and Implementation
I have been curious about data compression and the Zip file format
in particular for a long time. At some point I decided to address
that by learning how it works and writing my own Zip program. The
implementation turned into an exciting programming exercise; there
is great pleasure to be had from creating a well oiled machine that
takes data apart, jumbles its bits into a more efficient
representation, and puts it all back together again. Hopefully it is
interesting to read about too.
This article explains how the Zip file format and its compression
scheme work in great detail: LZ77 compression, Huffman coding,
Deflate and all. It tells some of the history, and provides a
reasonably efficient example implementation written from scratch in
Yes, working from home has its perks. You’re always there to accept
deliveries. You can play whatever music you want as loudly as you
want. You don’t have to abide the loud chewing or ungracious smells
of your colleagues. But you also have to contend with the Scylla and
Charybdis of isolation and distraction.
Lex and Yacc were the first popular and efficient lexers and parsers
generators, flex and Bison were the first widespread open-source
versions compatible with the original software. Each of these
software has more than 30 years of history, which is an achievement
in itself. For some people these are still the first software they
think about when talking about parsing. So, why you should avoid
them? Well, we found a few reasons based in our experience
developing parsers for our clients.
There is often some confusion about NULL value, as it is treated
differently in different languages. So there is an obvious need to
clarify what NULL is, how it works in different languages, and what
the actual value is behind the NULL.
When presented with a series of events, many developers will first
be tempted to sort them by time. This is dangerous because
timestamps do not provide the strict ordering they've assumed.
Out of order events can lead to infrequent but significant bugs:
consider "add to basket then checkout" vs "checkout then add to
Instead of timestamps, developers should prefer simple counters and
proper conflict detection. Timestamps may still be useful, but
should be approached with caution due to the complexities outlined
You have users logging in to your Linux system. Those users might
have not have sudo rights, but they quite possibly could have free
rein to poke around most of the system directory tree. You don't
want that. Why? Although those users might not be able to edit the
vast majority of your configuration files, you certainly don't want
those users viewing them. Same holds true for your client data--you
want that locked down.
There can be a number of reasons why your application performs
poorly, but perhaps none are as challenging as issues stemming from
your database. If your database's response times tend to be high, it
can cause a strain on your network and your users’ patience. The
usual culprit for a slow database is an inefficient query being
executed somewhere in your application logic.
Scale your existing asyncio application to thousands of cores with
20 lines of code. Ray added two features to enable seamless
integration with Python asyncio ecosystem. Both features help to
scale your existing asyncio application to multi-core and
Are you a Python developer with a
C or C++
library you’d like to use from Python? If so, then Python
bindings allow you to call functions and pass data from Python to
C or C++, letting you take advantage of the strengths of both
languages. Throughout this tutorial, you’ll see an overview of some
of the tools you can use to create Python bindings.