Setting up Rust development environment using VSCode on a Mac

This post is a part of the upcoming series on different ways of setting up your Rust development environment. It's time for VSCode.

Completion and highlighting

While on Linux VSCode with the Rust plugin seems to work more or less out of the box, on a Mac I needed to spend some time configuring it.

First things first though, let's start by installing Rust version manager, rustup.

curl -sSf | sh

We will be using nightly version of rust as to have one version that can compile all of our tools. This is mostly due to clippy requiring a nightly compiler.

rustup install nightly
rustup default nightly

We will need Rust Language Server to provide the code completion.

rustup component add rls-preview --toolchain nightly
rustup component add rust-analysis --toolchain nightly
rustup component add rust-src --toolchain nightly

For a more wholesome experience, please have some tools as well:

cargo install clippy rustfmt rustsym

Now finally, for the VSCode itself, press cmd-p and ext install vscode-rust. I'm using the new Rust extension as Rusty Code has been discontinued.

If you're lucky - that's it, you should have working completion and highlighting in Rust files. Check this by opening any Rust source code file. If you're greeted by this message: You have chosen RLS mode but neither RLS executable path is specified nor rustup is installed - then we need to get the extension to get to know your setup a bit:

In VSCode go to Settings using cmd-, and put the following config elements there:

    "rust.cargoPath": "/Users/yourusername/.cargo/bin/cargo",
    "rust.cargoHomePath": "/Users/yourusername/.cargo",
    "rust.rustfmtPath": "/Users/yourusername/.cargo/bin/rustfmt",
    "rust.rustsymPath": "/Users/yourusername/.cargo/bin/rustsym",
    "rust.rustLangSrcPath": "/Users/yourusername/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/src/rust/src",
    "rust.mode": "rls",
    "rust.rls": {
        "executable": "/Users/yourusername/.cargo/bin/rls",
        "useRustfmt": true

As the paths in the config need to be absolute, remember to adjust to your situation (system username) accordingly.

Now when you reload and start editing a Rust file you should see RLS: Analysis finished on the bottom bar and the completion and highlighting should all work. Yay !

Building and testing

VSCode has a system of tasks that we can leverage to run the build and test from within VSCode. If you go to Tasks->Configure tasks it will create an empty tasks.json file in your repository. Change it to the following to allow for cargo to be hooked up as your build tool and test runner.

    "version": "2.0.0",
    "tasks": [
            "label": "build",
            "type": "shell",
            "command": "cargo build",
            "group": {
                "kind": "build",
                "isDefault": true
            "problemMatcher": []
            "label": "test",
            "type": "shell",
            "command": "cargo test",
            "group": {
                "kind": "test",
                "isDefault": true

You can use cmd-shift-b to run the build now.


For the native debugger to work we need to install another extension to VSCode called 'LLDB Debugger'. That would be cmd-p and ext install vadimcn.vscode-lldb.

After reloading VSCode you should be able to set breakpoints on the side gutter and run the program using debugger by pressing F5. First time doing this will result in the debugger choice window. Choose LLDB Debugger as your debugger and you will be greeted with a JSON configuration file in which you need to tell the debugger a few details on your project. It may look like this:

    "version": "0.2.0",
    "configurations": [
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "program": "${workspaceRoot}/target/debug/name_of_your_executable",
            "args": [],
            "cwd": "${workspaceRoot}",
            "preLaunchTask": "build"

And that should be it !

Now you should be able to set breakpoints and debug through the code.

Start the debugging session by pressing F5 again - this should result in the build proceeding and then the debugger launching.

Questions ?

Any questions ? Ask on and ping me the link to the post on Twitter or email it to me at This way the answer will be visible to everyone in the community.

Keep on Rusting !

Adding graphs to posts in Nikola

I really like to teach, try to explain things in a simple manner. There is often no better way of making an explanation than visualizing it. The problem is that I really can't draw, especially on a computer. Wouldn't it be awesome if I could make the computer draw for me ? I found out that, unsurprisingly, there is a software for that already. The one I like is called mermaid - it renders a simple text description of a graph or diagram into an html representation. Can look something like this.

graph TB subgraph one a1-->a2 end subgraph two b1-->b2 end subgraph three c1-->c2 end c1-->a2

This blog is rendered by Nikola hence I would like to show you how I've added mermaid support to my Nikola installation. I use USE_BUNDLES = False in as for it gives me more control and is more HTTP/2 friendly. With that disabled I can include mermaid's style and js files like so (also in

<link rel="stylesheet" type="text/css" href="/assets/css/fontawesome.css">
<link rel="stylesheet" type="text/css" href="/assets/css/titillium.css">
<link rel="stylesheet" type="text/css" href="/assets/css/mermaid.forest.css">

BODY_END = """
<script src="/assets/js/mermaid.js"></script>
<script>mermaid.initialize({startOnLoad:true, cloneCssStyles: false});</script>

Where do all these files come from though ? In my case, I have a custom theme, based on zen called zen-cyplo. The assets in the sources are located under themes/zen-cyplo/assets/. Oh, and cloneCssStyles: false is there as the default of true made the different css styles on my blog clash. Finally, to use mermaid in the post do (for reStructured Text):

.. raw:: html

        <div class="mermaid">
        graph TB
                        subgraph one
                        subgraph two
                        subgraph three

You can click on source button located below the title of this post to see it in action. If you are interested in the build process and how all these come together - the complete sources for this blog are hosted under

Upload your site to Netlify using their incremental deployment API

I've recently switched to a setup where I do all my builds for this blog on Travis. While doing so I needed to migrate away from using Netlify's internal build infrastructure. This resulted in a quick python script that allows you to upload arbitrary directory tree to Netlify and does so using their incremental deployment API. All that means that while this site is quite big in size the deployments go rather quickly ! There are some known issues but apart from them the script should just work for any custom Netlify deployment you would like to have. I use it on this very site, to have a preview of any PR before merging it as well as for deploying the main site after the PR is merged. I hope you will find it useful and please do not hesitate if you want to post an issue or a PR !

Running host programs in isolation inside one-off Docker containers

I am quite bad at remembering how to launch docker to have everything set up correctly. Hence the following - a script that launches any commandline specified in its arguments inside a new docker container. Current directory is mounted inside the container automatically, so the thing you are executing can have its local dependencies satisfied.

CURRENT_DIRECTORY=`pwd -P` # untangle symbolic links if needed - SELinux needs the real path

if [[ -z $1 ]]; then
    echo "usage: `basename $0` command_to_run_inside_a_container"
    exit 1

docker run -i -t -v "$CURRENT_DIRECTORY":"$MOUNT_PATH":Z $IMAGE bash -c "useradd -M -d '$MOUNT_PATH' $USERNAME && cd '$MOUNT_PATH' && bash -c '$RESOLVED_ARGUMENTS'"

# restore SELinux context for the current directory
restorecon_path=`which restorecon`
if [[ -x "$restorecon_path" ]]; then
    restorecon -R "$CURRENT_DIRECTORY"

I use vanilla Debian Jessie as a run platform there, mostly because this is what most of my servers run. The script covers setting up SELinux and mounting the directory from which it is run as /mnt inside the container while also having the default non-root user added.

Run Jessie, run !

Using ad hoc Docker volumes on SELinux systems

I've recently tried running some quick Docker commands using host's directory as a volume:

docker run -i -t -v `pwd`:/mnt debian:jessie bash -c "ls -hal /mnt"
ls: cannot open directory /mnt: Permission denied

I use Fedora as my main OS, which, it turns out, has some pretty nice SELinux settings. These deny access from inside the container to the outside. Said Fedora consists mostly of almost-newest-but-stable everything though, which makes Docker to be in a fairly recent version. A version that understands how to change a SELinux context for the directory we're mounting, by itself ! You need at least Docker v1.7 for this.

docker run -i -t -v `pwd`:/mnt:Z debian:jessie bash -c "ls -hal /mnt"
total 8.0K
drwxrwxr-x.  2 1000 1000 4.0K Dec 30 18:34 .
drwxr-xr-x. 21 root root  242 Dec 30 19:07 ..

Please notice the capital Z as a mount parameter. And that is it. Mostly. Some cleanup remains, as docker leaves the host's directory with a changed SELinux context. To restore it you need to

restorecon -R `pwd`

Or use any other path you'd like instead of `pwd` in the examples above. Happy dockerizing !

RustFest - organization was the best. Also rhymes.

I went to RustFest and it was amazing !

It was clearly the best conference organizational-wise I've been to so far. It made me think of what I really liked there. What made it so awesome and welcomy ? To me this was a large number of small things just coming together. I listing them here for me to remember and for others to use. Let's make conferences at least this friendly, together !

Before the event:

  • very clear emails, repeating messages couple of times in different emails for the important stuff
  • maps of the popular routes provided, e.g. from the airport and bus station
  • supporter ticket sale - two times the price - you pay for another person that wouldn't be able to get a ticket otherwise
  • survey on dietary requirements/allergies
  • survey on childcare needs
  • clear statement of the code of conduct for the conference

During the event:

  • very good MC person

    • keeping people entertained through the tech breaks
    • keeping tabs on the talk length, allowing appropriate amount of questions if the time allowed
  • live captioning of all talks - small screen outside of the view of the main screen with the text live

  • getting the next speaker prepared and mic-tested before the end of the current talk

  • quiet room to rest with clear rules on no talking and interrupting there

  • clear signage for the different parts of the venue (washrooms, quiet room, party space etc)

  • washrooms

    • all same, ungendered

    • basic items for free in said washrooms

      • chewing gum
      • tooth paste
      • tampons, pads
      • baby wipes
  • info desk/registration

    • clear info during registration, handing out programme
    • asking people if they want to be on the photos - giving out lanyards accordingly - flashy red lanyards for people who do not want photos of them taken
  • emergency number to call with stated purpose

    • code of conduct violation
    • if you are lost in the city

The best terminal emulator for Windows 10's Bash or how to run X applications

update as of 03/2017
As this article is by far the most popular on my site right now I feel that an update is necessary, as the landscape evolved a bit since the original publish date.
Conemu started to support Bash on Windows properly now and this is what I settled on in the end.
The article below is still relevant for the running X applications on Windows part though.

I've been playing a bit with GNU/kWindows a.k.a. Bash on Windows a.k.a Windows Subsystem for Linux (Beta). I was especially interested whether I can use my regular Linux dotfiles to recreate my working environment of zsh + tmux + vim. The biggest troubles I had were with the terminal emulator. While the default one, invoked by saying bash is much better than powershell or cmd.exe already - it lacks some things I've learned to rely on, like 256-colour palette support. Thus the search for the ultimate terminal emulator begun. I tried ConEmu, cmder and their spinoffs to no avail. Either the colours were lacking, or the emulator would swallow up certain strokes like the arrow keys. Then I thought - hey, I use terminator on Linux, maybe it would be possible to use it here as well. To my surprise the answer was - yes !

  • install Windows Subsystem for Linux
  • restart Windows
  • install VcXsrv
  • run VcXsrv
  • invoke the following from the bash console:
sudo apt-get install terminator
DISPLAY=:0 terminator -u
  • profit !


The font rendering is not ideal and the borderless mode does not work, but hey, it is quite usable nonetheless ! It even has bidirectional clipboard sharing with Windows' windows, which is good. P.S. konsole and gnome-terminal do seem to have troubles launching (crashy-crashes there)

Don't throw away. Fix.

Try fixing your things. It's already broken - no need to sweat.
You might learn something.
Level 2 - push for things to be easily fixable.
It's good for you. It's good for the planet.

image0 image1 image2 image3 image4

Conferences you did not know existed and now you know you just need to go to

Go to conferences. It's good for you.

Ever wondered why to go to conferences ? Is it worth it, especially if you do not feel confident that the conference is on something that would be in an immediate realm of your day-to-day interests ? Just go ! You might end up learning something and meeting new people. And new people mean more variables to mix up your life. A bit scary, I know. Still worth it though. Wondered what conference in Europe are weird enough so people wouldn't mind having another misfit ? Here you go.

Now imagine something niche within the industry. To me, AI comes to mind. Mages in robes in their towers, sending out autonomous robot armies against each other. Right ? There's a conference for that ! At, in July, in Vienna, you can meet AI professionals from academia and industry alike, most of them coming from game development background. The atmosphere is very newcomer-friendly, the only requirement is that you're interested in AI, not necessarily having anything to do with it professionally. Petra and Alex, the organizers, are wonderful people that make this conference quite unique. It's happy fun to see ideas floating from academia to the industry and vice versa. Don't forget the presentations on work-in-progress major AAA games ! I've learned there that the everyday programming in the games industry is quite different than the one I do in terms of best practices and patterns. Definitely worth a try !

Erlang User Conference

Speaking of something completely different. Erlang ! Was functional before being functional was considered cool. Very practical, very fast, parallelize everything ! Processes everywhere ! Message passing ! Want to feel the groove as well ? Visit Stockholm in September for Erlang User Conference. Meet creators of the language, talk about massive scale deployments. Other FP languages are welcome. I would even say, the more strange the better. Idris seems to be the topic of interest as well.  Eat good food, walk the city of dynamite. Erlang has a quite close-knit community which gives you this warm family feeling.


Speaking of family. There's a family of conferences known as SoCraTes. Software Crafstmanship and Testing. SoCraTes. Get it ? :D As it's more than one conference a year, it's harder to go to all of them. I only went to Codefreeze, in Finland, in January, and only once, but loved it already. Codefreeze, Finland, in January. Get it ?! :D First thing is that you don't know what will happen there. You just go, meet the people and then you sit down and everyone talks about what they would like to learn and what they can share. This way you come up with some loose agenda you follow more or less. One track, very intense. Talking, swimming in ice water, learning, sauna going. Very intimate feel, not many people, lots of things to learn.

Chaos Communication Congress

Speaking of lots of people and intimate feel. Chaos Communication Congress is, I think, the biggest gathering of all nerds and freaks in Europe, yet being there feels quite at home. The best organized conference I've been to. Friendly people showing their wares on their humble tables, 4 simultaneous tracks, huge building with intricate hallways. It's cyberpunk, it's inclusive, it's about hardcore infosec topics, it's about politics. Everything's there, everyone's there. 4 days of data being constantly uploaded to your brain, on the waves of Club Mate. Feels like an extended holiday present, as it's happening in the last week of December.

The Camps

Chaos Communication Camp and The Dutch Camp. Imagine CCC, the Congress, but in the woods. Middle of nowhere, multigigabit internet connection. sleeping in the tent, then going to a world-class lecture. Both CCC, the camp, and The Dutch Camp, the camp, are happening every 4 years, each of them taking alternating slots. So every 2 years there is a camp somewhere. Did I mention that the location changes every event ? Happy camping !


So go out there. Explore. Meet people. Learn. Have fun. None of the above are much expensive and most of the events have a policy of "write to us if you want to go but can't afford the ticket". Friendly people fixing problems together. July, tickets around 250EUR
EUC: September, tickets around 350EUR
SoCraTes: the cost and the time depend on the event
CCC: last week of December, tickets around 100EUR
The Camps: summer, tickets around 125EUR

Productive New Year's Eve

It turns out that the last day of the year can be quite productive. I've managed to sneak in a PCB layout for the input measurement and protection board for my sunpowered server . Got it ordered, can't wait to test it ! I got carried away with via stitching there a bit - we'll see how hard it will be to solder the larger components because of that. The whole project is hosted here - it's open hardware so please do take a look.

image0 image1 image2