Finding A Regular Expression Tool

Once again this year I will be teaching a “bash Beginners” workshop at the AUC’s World conference.

I’ve started re-working and improving the workshop and I’ve decided to spend at least some time on regular expressions in sed and awk as they are so often the hard bits of shell programming. Sorry about that cough, must have been some terrible syntax caught in my throat.

Do you know how hard it is to find a good regular expression experiment and demonstration tool that is compatible with those venerable tools? Well nigh impossible. Perl, Ruby and cough PHP compatible you can find but not for those two.

What I did find was an excellent web app, stream-editor. The biggest problem with this solution is that a web app isn’t the sort of thing you want to recommend to beginners. Getting it working can be fun.

The other problem with it was that I couldn’t get it to work on either my Mac or an Ubuntu VM.

Given that it was written in node this might take some fixing. The biggest step in fixing it was when my big brother told me that sometimes node is installed as node and sometimes nodejs. It turns out that the Ubuntu package installs it as nodejs and stream-editor was calling it as node so I created a link – sudo ln -s /usr/bin/nodejs /usr/bin/node and that problem went away.

The second problem was with the GitHub repo for stream-editor. Git does not create empty directories in a repo and the code for stream-editor relied on writing a file to a directory called “dist”. This meant that if you just cloned the repo the code failed to run. That one was also easy to fix when I figured it out.

(By the way, if you need an empty directory then the best thing to do is to put a README file in there saying why the directory exists and then git will have the directory and the README in the repo.)

So now I had a version that worked fine on my Mac and in the Ubuntu VM. Still not easy for a beginner to install and run.

Docker to the rescue. Could I create a Docker container to do all the hard work?
Sure I could. The process was quite easy.

First, create a brand new Ubuntu VM. Now install all the requirements for the web app, documenting them as I went. Get it running, documenting those steps. Here are the exact notes:

sudo apt install git
sudo apt install npm
sudo apt install python-pip3
sudo ln -s /usr/bin/nodejs /usr/bin/node
cd
mkdir dev
cd dev
git clone https://github.com/liddiard/stream-editor.git
cd stream-editor
pip3  install -r requirements.txt
python3 runserver.py &&
cd stream_editor/static
mkdir dist
npm install && npm start &&

Then to write the Dockerfile

# DockerFile for stream-editor
# v1.0
# 2 May 2018
# Tony Williams (ARW)

FROM ubuntu:16.04

EXPOSE 5000

COPY . /usr/local/stream-editor

# required software
RUN apt-get update && apt-get install -y \
    npm \
    python3-pip

RUN ln -s /usr/bin/nodejs /usr/bin/node
RUN cd /usr/local/stream-editor ; pip3 install -r requirements.txt
RUN mkdir /usr/local/stream-editor/stream_editor/static/dist

# run the software
WORKDIR /usr/local/stream-editor

ENTRYPOINT ["./run.sh"]
CMD ["--editor"]

You can see how the Dockerfile pretty much writes itself from my notes on how to get the application installed. The other important bit is that run.sh – it’s a trick I learnt from “Best practices for writing Dockerfiles”. Here it is :-

#!/bin/bash
set -e

if [ "$1" = '--editor' ]; then
    python3 runserver.py &
    cd stream_editor/static
    npm install
    npm start
    exit 0
fi

exec "$@"

The advantage of using this simple shell script it is allows you to do such things as run the container and drop into bash easily. Just docker run -it stream-editor bash and we get bash instead of our application. Putting that facility into our container makes life easier if we have to debug a problem.

So now I can offer my students a tool for learning and experimenting with regular expressions. It isn’t as easy as running an app, but it’s certainly easier than futzing with python and npm.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s