---
date: 2017-11-16 11:58:40
tags: Tutorial Perl6 RaspberryPi Installation
description: >
  In this tutorial I'll get you through setting up a Raspberry Pi with Perl 6.
  I am using a Raspberry Pi 3 myself, but other versions should work fine too.
  However, older versions are slower, so it might take a bit longer to install
  completely.
---
= Perl 6 - Setting up a Raspberry Perl
:toc: preamble

In this tutorial I'll get you through setting up a Raspberry Pi with
https://perl6.org/[Perl 6]. I am using a Raspberry Pi 3 myself, but other
versions should work fine too. However, older versions are slower, so it might
take a bit longer to install completely.

[NOTE]
====
For those who have never had a Raspberry Pi before, you will need
the following:

- Raspberry Pi board
- Power supply (5v 2A, micro USB)
- SD card of at least 4gb, but I would advise at least 8gb
- Monitor with HDMI cable
- Keyboard
====

Perl 6 will be installed using
https://github.com/tadzik/rakudobrew[Rakudobrew], which I'll also be using to
get https://github.com/ugexe/zef[zef] installed. Zef is the recommended module
manager for Perl 6.

== Setting up Raspbian

The first step is getting the OS set up. To keep this tutorial simple, I will
stick to https://www.raspbian.org/[Raspbian], but if you feel confident in your
skills you can use any other distribution or OS. Perl 6 installs the same on
all UNIX(-like) operating systems.

=== Get the image

First, https://www.Raspberrypi.org/downloads/raspbian/[download the Raspbian
image from the Raspberry Pi download page]. I chose the `LITE` version, but if
you prefer having a graphical desktop you can go for the `DESKTOP` version
instead.

At the time of writing, this means I got the
`2017-09-07-raspbian-stretch-lite.zip`. If you want to verify you got the
correct download and nothing went wrong saving it to your disk, you can verify
the checksum. The checksum for your download is noted below the download links.
To get the checksum of the file you downloaded, use `sha256sum` as follows:

NOTE: Lines prepended with a `$` are to be ran as your normal user, whereas
lines with a `#` are ment to be ran as "super user". This can be done by using
a privilege escalation program, such as
https://www.linux.com/blog/how-use-sudo-and-su-commands-linux-introduction[`sudo`].

[source]
----
$ sha256sum 2017-09-07-raspbian-stretch-lite.zip
----

If the checksum matches the one noted below the download button you used, it
should be fine, and you can continue with extracting the image from the zip
using `unzip`:

[source]
----
$ unzip 2017-09-07-raspbian-stretch-lite.zip
----

This will result in a similarly named file, but with a `.img` extension instead
of `.zip`. This is the image that you can write to the SD card.

=== Write the image to the SD card

This step is pretty easy, but typos here can be disastrous for the system
you're using to write to the SD card.

Open a terminal and run `dmesg -w` as super user (usually doable using `sudo
dmesg -w`). This will give immediate feedback when you insert your SD card, and
shows which device it is being assigned to. In my case, this was `sdb`, which
means the device file resides at `/dev/sdb`.

Now, to actually write the image, I'll use `dd` since this is everyone's
favourite tool, it seems. If you feel adventurous enough to try out something
different, feel free to read up on
https://www.vidarholen.net/contents/blog/?p=479[Useless Use of dd].

Make sure to make the `if` argument point to the correct path with your
extracted raspbian image, and `of` to point to the correct device as identified
earlier. In order to be allowed to run this command, you must be root, which
can be achieved by using `sudo` or `doas` again.

[source]
----
# dd bs=4M status=progress if=/path/to/2017-09-07-raspbian-stretch-lite.img of=/dev/sdb
$ sync
----

Afterwards, plug it into your Raspberry Pi and attach all cables you might
need. Think of stuff like a keyboard, mouse, monitor, internet, power. Do power
last, as the Raspberry Pi will start immediatly once it receives power.

=== First boot

The Raspberry Pi should start booting the moment you supply it with power. If
you attach the HDMI after the power, it's possible you won't have display
working, so make sure HDMI is attached before powering up.

You'll see some text scrolling by, up to a point where it asks you for a
`login`, and accepts keyboard input. The default username is `pi`, and the
default password is `Raspberry`. You are strongly advised to change the
password upon login, which can be done in the next step.

=== Configuration

The Raspberry Pi comes with its own configuration tool, `raspi-config`. Run
this with `sudo` prepended in front of it so you gain the right privileges. I
would advise you to at least change the user password from here. After this you
should go to `Advanced Options` and expand the filesystem. This will grow the
filesystem to the entire SD card's size.

TIP: To get to the buttons on the bottom (`Select`, `Finish` and `Back`), use
the arrow keys to go left or right.

You can look around the tool for other interesting things to modify. Once you
are satisfied, go back to the main menu and choose `Finish`. It will ask to
reboot, which you should accept. This will apply all the new configurations you
just made.

=== Updating and installing additional packages

It's rare for the system to be completely up to date after installing the image
on the SD card. Additionally, you also need some extra packages in order to get
rakudobrew, and to install Perl 6 itself. For this, we use the package manager
bundled with raspbian, `apt`:

[source]
----
# apt update
# apt upgrade
----

This will update the package lists, and then upgrade all outdated packages to
their newest versions. You should do this at least once a week to make sure
your system stays up to date.

Once the upgrades are finished, you can install some new packages which are
needed later on in this tutorial:

[source]
----
# apt install git build-essential
----

`git` is required to get the rakudobrew repository and is also used by
rakudobrew itself to get the sources needed to build Perl 6 and to install zef.
The `build-essential` package comes with all sorts of tools to build software,
which is required to build Perl 6.

== Installing Perl 6

Now, we've got a working Raspberry Pi installation. We can start doing things
with it, such as playing around with Perl 6.

=== Setting up Rakudobrew

Rakudobrew is a nice tool to manage Perl 6 installations on your system. It can
also install `zef` for you, so you don't have to deal with this manually. This
is all documented on the repository's `README.md` file as well, but I'll
explain it here too. I do make a few small tweaks here and there to match my
preferred setup more closely.

Clone the repository to your system, and add it to your `$PATH` to be able to
use the scripts bundled with it:

[source]
----
$ mkdir -p ~/.local/var
$ git clone https://github.com/tadzik/rakudobrew.git ~/.local/var/rakudobrew
$ export PATH=${HOME}/.local/var/rakudobrew/bin:$PATH
$ hash -r
----

The `hash -r` call will rehash your PATH, so you can tab-complete `rakudobrew`.
Next, initialize rakudobrew:

[source]
----
$ rakudobrew init
----

This will give you a notification to automatically load rakudobrew next time.
It is advised you follow that message, so you won't have to do it manually each
time you log in to the system.

=== Installing Perl 6 with MoarVM backend

Now that rakudobrew is installed and available to use, it's time to make use of
it to install Perl 6.

[source]
----
$ rakudobrew build moar
----

=== Installing zef, the module manager

Getting zef to work isn't much harder than installing Perl 6, but its a lot
faster. You can have rakudobrew take care of this too:

[source]
----
$ rakudobrew build zef
----

== Final words

And that should be it, you now have a working Perl 6 installation with the zef
module manager to take care of installing and upgrading modules. Now you just
need to come up with a nice project to work on to start using and learning the
wonders of Perl 6.

If you need any help on getting started, try the `#perl6` IRC channel on
Freenode, or check out some of the Perl 6 documentation and introduction sites:

- https://docs.perl6.org/
- http://perl6intro.com/

For starting projects that are easy to start with and can bring quick results,
consider making an IRC bot using
https://github.com/zoffixznet/perl6-IRC-Client[`IRC::Client`], or a small web
application using https://github.com/Bailador/Bailador[`Bailador`].
