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
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.