Generate an SSH public key

If all you have is an SSH private key and you need to generate a public key out of it, you can run the following:

ssh-keygen -y -f yoursshkey

It will spit out the public key on the standard output.

Raspberry Pi: attach a serial console

For a Raspberry Pi with GPIO pins (B, B+, 2, 3):

  1. Connect as follows:
  2. Append this line at the end of /boot/config.txt:
    enable_uart=1
  3. Access the console from your workstation like this:
    sudo screen /dev/ttyUSB0 115200

Sources:

For Raspberry Pi without pins (Pi Zero, Pi Zero W):

  1. Add the following line at the end of /boot/config.txt:
    dtoverlay=dwc2
  2. Insert the following between ‘rootwait‘ and ‘quiet‘ in /boot/cmdline.txt:
    modules-load=dwc2,g_serial
  3. Mount the linux part of the Pi SD card and add the following lines at the end of /etc/rc.local, before ‘exit 0’:
    usbconsole="[email protected]"
    if [ ! $(systemctl is-enabled "${usbconsole}") ]
    then
    echo "Enabling and starting ttyGS0 console..."
    systemctl enable "${usbconsole}"
    systemctl start "${usbconsole}"
    fi
  4. Connect a micro usb cable into the socket market ‘USB‘ on the Pi, not the one marked ‘PWR’.
  5. On your workstation, console can be accessed as:
    sudo screen /dev/ttyACM0 115200

Sources:

Learning go

I have started to learn go, Google’s system language. I really like it. I appreciate these features in particular:

  1. It is truly cross-platform, in par with java
  2. It has a huge standard library, again like java’s but without the GUI stuff
  3. It compiles to standalone executables that include the runtime! Imagine a JAR file that would carry a little JVM with it. No need to “install go” on a deployment machine!

In terms of design, it takes a little bit of time to get used to. But on the whole it is fairly easy and straightforward. I have a good knowledge of C, java, lua and bash and I had no problem to adapt to go.

Highly recommended!

How to build Xerial’s sqlite JDBC driver on Alpine Linux

These are the steps I took to build the sqlite JDBC driver so that it works on a musl-based Linux distro, namely Alpine Linux.

  1. Install a couple of dependencies:
    # apk update && apk upgrade
    # apk add git gcc make openjdk8 maven
    # apk add perl curl unzip bash musl-dev
  2. Set up JAVA_HOME:
    # export JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
  3. Clone sqlite-jdbc repository:
    # git clone https://github.com/xerial/sqlite-jdbc.git
  4. Build the shared object library and the JNI bindings:
    # cd sqlite-jdbc
    # make jni-header native
  5. Build the JAR (some tests don’t pass, you have to skip them):
    # mvn -Dmaven.test.skip=true package
  6. The jar that is produced is in the target directory:
    # ls target/sqlite-jdbc*
    target/sqlite-jdbc-3.16.2-SNAPSHOT.jar
  7. To use it in a gradle build, mkdir a lib directory in your gradle project, copy into it the jar that was built as above and add the following compile line to build.gradle:
    compile fileTree(dir: 'lib', include: '**/*.jar')

First glitch with musl

I have been using alpine linux images on docker for some time and until today, I have never encountered any problem.

What I am facing today is due to musl, the excellent glibc alternative used by alpine to keep the system very compact.

I have started to use sqlite as backend for simple lua applications and I liked it so much that I am now using it for my java/spring project as well.

To talk to it, I use the following JDBC driver: https://github.com/xerial/sqlite-jdbc 

This driver is very efficient because it embeds a compiled version of the sqlite C library into its jar. So far so good, they provide shared libs for all operating systems and processors: from Windows 32bit to Linux ARMv7, MacOSX etc.

Even though the Linux libs cover all major processor architectures (Inter 32bit or 64bit and different ARM variants), they have something in common: they are compiled against glibc!

So this driver doesn’t work by default on alpine linux.

I have at least two solutions:

  1. Build it by hand (so I cannot draw it automatically from maven central)
  2. Use its pure java implementation (but then I sacrifice the nice performance offered by the compiled lib)

Anyway, this is not a showstopper for me using sqlite in Java, but it makes things a little bit more complicated.

lua: print in colour

This a short memo on how to print in colour in lua.

Codes:

  • Red: 31
  • Green: 32
  • Yellow: 33
  • Blue: 34

Example, print “hello” in red:

lua -e 'print(string.format("\27[%dm%s\27[0m", 31, "hello"))'