# Bash Environment
The default environment for standalone Bash cells
This notebook describes and creates the default Bash environment in Nextjournal. Check out the showcase if you want to see what the environment contains. To see how it’s built, see [setup](#setup).
The Bash environment is the default for a standalone Bash cell, and also serves as the base for most other images throughout Nextjournal.
# Showcase
The environment is based on the `ubuntu:18.04` [docker image](https://hub.docker.com/_/ubuntu).
```bash id=66ba3f83-4b87-4c7e-9346-7d25e665d2a8
lsb_release -d
```
These packages are installed in the default Minimal Bash environment.
```bash id=84462ff6-3cca-4526-8665-480ba1a6fc7a
dpkg -l | tr -s " " | sed -e '1,3d; 5d; s/ /,/g; s/,/ /5g' | \
sed -e "s/\"/'/g" | awk -F"," '{printf "\"%s\",\"%s\",\"%s\"\n",$2,$3,$5}' \
> /results/pkgs.csv
echo "Name,Version
$(gcloud --version | sed 's/\(.*\) /\1,/')
$(aws --version | sed 's/ .*//; s#/#,#')
$(jq --version | sed 's/-/,/')
$(bb --version | sed 's/ /,/')
jet,$(jet --version)" > /results/added-pkgs.csv
```
[pkgs.csv][nextjournal#output#84462ff6-3cca-4526-8665-480ba1a6fc7a#pkgs.csv]
[added-pkgs.csv][nextjournal#output#84462ff6-3cca-4526-8665-480ba1a6fc7a#added-pkgs.csv]
## System Packages and Basics
The packages installed include every major decompression tool, `curl`, `wget`, and `netcat`, `gnupg` and `git`, and `fontconfig`, as well as a small selection of fonts (including the fonts used in the Nextjournal UI).
Packages are installed with `apt-get`. The environment is saved without cached package lists (they would quickly outdate anyway), and so an update is required before installing any packages. It is recommended to set `DEBIAN_FRONTEND=noninteractive` for a smooth install.
```bash id=57ac4d46-7db0-4d03-ab50-27383120ecc1
apt-get -qq update
DEBIAN_FRONTEND=noninteractive \
apt-get install cowsay fortune
/usr/games/fortune | /usr/games/cowsay
```
## Displaying Files
Any file written or copied into the `/results` directory will, once the cell finishes execution, be stored in Nextjournal's immutable, versioned storage database. The editor will attempt to appropriately display files in recognized formats (text, images, CSV tables).
```bash id=c10af8c6-d61b-465c-8ab8-fb2f6a19e7be
wget -qO /results/test.svg \
https://nextjournal.com/images/nextjournal-logo.svg
```
![test.svg][nextjournal#output#c10af8c6-d61b-465c-8ab8-fb2f6a19e7be#test.svg]
These files can be accessed in subsequent cells in the same way as Uploaded files, using Ctrl-E or Cmd-E to insert a reference.
```bash id=a3fdd45c-bcd5-4958-b33d-f03c61c300a5
ls [reference][nextjournal#reference#d521bf3d-031a-44c7-b067-cae7104ac652]
```
CSV files will show as paginated tables by default.
```bash id=3f165a2a-db04-4607-ba07-18c2feb60080
echo 'a,b,c
1,2,3' > /results/test.csv
```
[test.csv][nextjournal#output#3f165a2a-db04-4607-ba07-18c2feb60080#test.csv]
Files displayed as text or tables can be changed to show as a downloadable file using the **···** menu to the upper left of the file's display area.
```bash id=7904f344-d6e1-4658-a601-970ae7270158
echo 'a b c
1 2 3' > /results/test.txt
```
[test.txt][nextjournal#output#7904f344-d6e1-4658-a601-970ae7270158#test.txt]
# Setup
## Build a Minimal Bash Environment
The minimal Bash environment is based off the Ubuntu 18.04 LTS [Docker image](https://hub.docker.com/_/ubuntu/).
[docker-environment][nextjournal#docker-environment#ee160d76-93be-4fd6-8eed-05b0cc4ed09b]
We set the timezone and install some basic packages. We've also set a number of environment variables in the runtime's settings—in particular, the value of `NEXTJOURNAL_MOUNT_CUDA` sets the default Nvidia CUDA and cuDNN versions for all descendant environments.
The basic packages installed include tools to aid in further package installation, such as decompression suites and network tools.
```bash id=fbd3514a-eccd-43eb-82f3-33a9e579de78
echo "UTC" > /etc/timezone
echo 'APT::Get::Assume-Yes "true";' > /etc/apt/apt.conf.d/90-yes
apt-get -qq update
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends \
apt-utils apt-transport-https \
ca-certificates locales tzdata sudo \
zip unzip gzip bzip2 xz-utils unrar p7zip-full \
curl wget netcat net-tools
apt-get clean
rm -r /var/lib/apt/lists/* # Clear package list so it isn't stale
```
Generate the locale that we set in the environment variables.
```bash id=4d60f925-7a8d-4561-899a-f70dd8da5cd2
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8 LANGUAGE=en_US.en LC_ALL=en_US.UTF-8
```
And ensure the GPU libraries can be used.
```bash id=efc7779c-f4f9-4775-900a-61bf26fe9f6c
echo "/usr/local/cuda/lib64" >> /etc/ld.so.conf.d/cuda.conf
echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf
ldconfig
```
Still tiny.
```bash id=9e48ebfa-00e7-4c2d-ab0e-9b1cf1c7f545
du -hsx /
```
## Build the default Bash environment
The default Bash environment adds a minimal system Python setup, GCC7 build tools, and various libraries (most notably Apache Arrow) and support tools (including `gnupg`, `git`, and cloud-service clients). We also install font tools and some basic fonts.
Install system packages and libraries, development files, and fonts.
```bash id=0d8e5bdb-d691-41d5-8222-00a78eb9298a
apt-get -qq update
```
```bash id=84678b2c-6134-4256-9e3f-ed8f399da1a9
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends \
build-essential gfortran cmake automake libtool libltdl-dev pkg-config \
python3-pip python3-setuptools python3-wheel \
gnupg git lsb-release patch perl-doc \
fontconfig fonts-dejavu fonts-liberation2
```
Install support libraries for Apache Arrow.
```bash id=0dcfdc78-d96b-4ea4-b0e7-d87cab1243a5
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends \
libblas3 liblapack3 libre2-4 libpcre16-3 libpcre32-3 libpcrecpp0v5 \
libboost-filesystem1.65.1 libboost-system1.65.1 libboost-regex1.65.1 \
libdouble-conversion1 libelf1 libgflags2.2 libgoogle-glog0v5 libjemalloc1 \
libgirepository-1.0-1 libffi6 libglib2.0-bin libglib2.0-data \
zlib1g libbrotli1 libsnappy1v5 libunwind8
```
Untar the Flatbuffers library, and the Apache Thrift compiler and Arrow system libraries and tools (includes Parquet, Gandiva, and Plasma support), compiled in [this notebook](https://nextjournal.com/mpd/apache-arrow-builds).
```bash id=30190593-f2d5-42a1-bce6-6f0cfe09223b
FILENAME="apache-arrow+-njbuild-0.15.1.tar.gz"
cd /usr/local
wget --progress=bar:force -O $FILENAME \
https://nextjournal.com/data/QmUF3NctN7s4FpAGKU3D1uRWrm1hNGhNTNwW5j8EyTys1d
tar -zxf $FILENAME
rm $FILENAME
```
Install Python dependencies for cloud clients.
```bash id=f1928f0f-0871-412b-99b0-efdb2c9b8544
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends \
python3-{botocore,crcmod,colorama,dateutil,docutils,jmespath,pyasn1-modules,rsa,s3transfer,six,urllib3,yaml}
```
Update and configure the system `pip`, and install the AWS command-line client.
```bash id=201cf414-fd78-4997-a10f-b4dd1c74345a
printf "[global]\ndisable-pip-version-check = True\n" > /etc/pip.conf
pip3 install --upgrade pip awscli
```
Install the Google Cloud SDK.
```bash id=9e6a3bc5-315c-4364-a375-6d8b56c91e69
GCSDK_VERSION="273.0.0"
gcfile="google-cloud-sdk-${GCSDK_VERSION}-linux-x86_64.tar.gz"
cd /usr/local
wget --progress=bar:force \
https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/${gcfile}
tar -zxf $gcfile
rm $gcfile
cd google-cloud-sdk
bash ./install.sh --quiet --usage-reporting false --command-completion false \
--path-update false
```
Rebuild ld.so.cache, clean up `apt`, and delete the package list so it doesn't go stale.
```bash id=0e773902-3246-4abf-b0f7-88d26f543050
ldconfig -v
apt-get clean
rm -r /var/lib/apt/lists/*
```
Download and install [jq](https://github.com/stedolan/jq), [babashka](https://github.com/borkdude/babashka), and [jet](https://github.com/borkdude/jet). Get latest versions via the Github API.
```bash id=c42362a6-b86d-4d9a-8560-0a678926f786
latest_release () {
curl -s https://api.github.com/repos/$1/releases | \
grep tag_name | head -n 1 | sed 's/.*: "\(.\+\)",$/\1/; s/[^[:digit:].]//g'
}
JQ_VERSION=$(latest_release stedolan/jq)
jq_file="jq-linux64"
jq_path="stedolan/jq/releases/download/jq-${JQ_VERSION}/${jq_file}"
jq_url="https://github.com/${jq_path}"
BB_VERSION=$(latest_release borkdude/babashka)
bb_file="babashka-${BB_VERSION}-linux-amd64.zip"
bb_path="borkdude/babashka/releases/download/v${BB_VERSION}/${bb_file}"
bb_url="https://github.com/${bb_path}"
JET_VERSION=$(latest_release borkdude/jet)
jet_file="jet-${JET_VERSION}-linux-amd64.zip"
jet_path="borkdude/jet/releases/download/v${JET_VERSION}/${jet_file}"
jet_url="https://github.com/${jet_path}"
wget --progress=bar:force $jq_url $bb_url $jet_url
mv $jq_file /usr/local/bin/jq
chmod +x /usr/local/bin/jq
unzip $bb_file
mv bb /usr/local/bin/
rm $bb_file
unzip $jet_file
mv jet /usr/local/bin/
rm $jet_file
```
Test & print versions.
```bash id=f051ebee-50eb-4aff-958e-e68247782026
echo "Name,Version
$(gcloud --version | sed 's/\(.*\) /\1,/')
$(aws --version | sed 's/ .*//; s#/#,#')
$(jq --version | sed 's/-/,/')
$(bb --version | sed 's/ /,/')
jet,$(jet --version)" > /results/ver.csv
```
[ver.csv][nextjournal#output#f051ebee-50eb-4aff-958e-e68247782026#ver.csv]
Install a small selection of open fonts available on [Google Fonts](https://fonts.google.com/) and [here](http://comicneue.com/). The Nextjournal UI uses Fira Sans, Fira Mono, and PT Serif.
[nj_fonts.tar.xz][nextjournal#file#9a6681f2-7909-4990-a852-ed084c09ac24]
```bash id=47e8b387-fa51-4105-a443-9d5ab18e7f5e
cd /usr/share/fonts/
sudo tar -Jxf [reference][nextjournal#reference#0b8c4d61-c608-4ace-8e7a-3419f453311b]
shopt -s extglob
sudo chmod -R --reference=/usr/share/fonts/truetype/dejavu \
/usr/share/fonts/!(dejavu)
fc-cache -f
fc-list
```
Configure default fonts: Nextjournal UI fonts for the generic families, and similar alternatives for some specific common fonts.
```bash id=ec81f10e-d23d-4160-8ba0-291c35e23569
echo '
serif
PT Serif
sans-serif
Fira Sans
sans
Fira Sans
monospace
Fira Mono
Arial
Liberation Sans
Helvetica
Liberation Sans
Verdana
Andika
Comic Sans
Comic Neue
' > /etc/fonts/local.conf
```
Less tiny.
```bash id=9ce5cef1-0093-4a14-bf3d-ca8d47d2f4f5
du -hsx /
```
## Build a base for Jupyter environments
This will be used as a base for any language environment that needs Python for Jupyter, but not conda. This includes R and all of the Jupyter Runtime Language environments.
Install some commonly needed libraries and development files.
```bash id=79cd6722-9a74-4ad2-bc1d-291ea902b143
apt-get -qq update
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends \
libzmq3-dev libczmq-dev zlib1g-dev libssl-dev libreadline-dev libffi-dev \
libncurses5-dev libncursesw5-dev libcurl4-openssl-dev \
libcairo2-dev libpango1.0-dev libpangocairo-1.0
apt-get clean
rm -r /var/lib/apt/lists/* # Clear package list so it isn't stale
```
Install Juypter components and dependencies. *Using development version of jupyter-core to fix connection file permissions issue—remove when 4.6.2 is released. —MPD 2019.11.24.*
```bash id=53d1a77e-8d75-4086-be9b-1e43af9f14fc
pip3 install jupyter jupyter_client \
git+https://github.com/jupyter/jupyter_core
```
```bash id=9562ba30-957e-4d3a-86fd-71887e4366e5
du -hsx /
```
[nextjournal#output#84462ff6-3cca-4526-8665-480ba1a6fc7a#pkgs.csv]:
[nextjournal#output#84462ff6-3cca-4526-8665-480ba1a6fc7a#added-pkgs.csv]:
[nextjournal#output#c10af8c6-d61b-465c-8ab8-fb2f6a19e7be#test.svg]:
[nextjournal#reference#d521bf3d-031a-44c7-b067-cae7104ac652]:
<#nextjournal#reference#d521bf3d-031a-44c7-b067-cae7104ac652>
[nextjournal#output#3f165a2a-db04-4607-ba07-18c2feb60080#test.csv]:
[nextjournal#output#7904f344-d6e1-4658-a601-970ae7270158#test.txt]:
[nextjournal#docker-environment#ee160d76-93be-4fd6-8eed-05b0cc4ed09b]:
[nextjournal#output#f051ebee-50eb-4aff-958e-e68247782026#ver.csv]:
[nextjournal#file#9a6681f2-7909-4990-a852-ed084c09ac24]:
[nextjournal#reference#0b8c4d61-c608-4ace-8e7a-3419f453311b]:
<#nextjournal#reference#0b8c4d61-c608-4ace-8e7a-3419f453311b>
This notebook was exported from https://nextjournal.com/a/CGhr8kiAQnWWEDkuoFESJF?change-id=Cd7Z8R42vgM63CS6evVHaM
```edn nextjournal-metadata
{:article
{:settings {:numbered? true, :sidebar? true, :subtitle? true},
:nodes
{"0b8c4d61-c608-4ace-8e7a-3419f453311b"
{:id "0b8c4d61-c608-4ace-8e7a-3419f453311b",
:kind "reference",
:link [:output "9a6681f2-7909-4990-a852-ed084c09ac24" nil]},
"0d8e5bdb-d691-41d5-8222-00a78eb9298a"
{:compute-ref #uuid "df442bd0-00e9-4b6c-81ef-1749d5ea5a49",
:exec-duration 4803,
:id "0d8e5bdb-d691-41d5-8222-00a78eb9298a",
:kind "code",
:output-log-lines {},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"0dcfdc78-d96b-4ea4-b0e7-d87cab1243a5"
{:compute-ref #uuid "ca21b817-1e4d-46f2-9927-67c2e6ff5673",
:exec-duration 8105,
:id "0dcfdc78-d96b-4ea4-b0e7-d87cab1243a5",
:kind "code",
:output-log-lines {:stdout 119},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"0e773902-3246-4abf-b0f7-88d26f543050"
{:compute-ref #uuid "f4e9543c-d0b9-4374-b547-dbafa13a0ea2",
:exec-duration 740,
:id "0e773902-3246-4abf-b0f7-88d26f543050",
:kind "code",
:output-log-lines {:stdout 282},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"201cf414-fd78-4997-a10f-b4dd1c74345a"
{:compute-ref #uuid "0f216d24-4ddc-4828-bbd5-38d7ff59634d",
:exec-duration 12586,
:id "201cf414-fd78-4997-a10f-b4dd1c74345a",
:kind "code",
:output-log-lines {:stdout 50},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"30190593-f2d5-42a1-bce6-6f0cfe09223b"
{:compute-ref #uuid "399438e0-5e81-4fa0-85d4-d82c693f7b47",
:exec-duration 2967,
:id "30190593-f2d5-42a1-bce6-6f0cfe09223b",
:kind "code",
:output-log-lines {:stdout 11},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"35716bb6-9dd8-4de2-844b-ef54aea4022c"
{:environment [:environment "dab15041-47f1-4ca7-84e2-b4532a4a2f70"],
:id "35716bb6-9dd8-4de2-844b-ef54aea4022c",
:kind "runtime",
:language "bash",
:name "Bash Showcase",
:type :nextjournal},
"3f165a2a-db04-4607-ba07-18c2feb60080"
{:compute-ref #uuid "1657f2fe-114a-4942-9cc0-86835c37a45c",
:exec-duration 167,
:id "3f165a2a-db04-4607-ba07-18c2feb60080",
:kind "code",
:output-log-lines {},
:runtime [:runtime "35716bb6-9dd8-4de2-844b-ef54aea4022c"]},
"3f448942-1e89-4a0f-ad1d-0efadb740e1d"
{:environment [:environment "ee160d76-93be-4fd6-8eed-05b0cc4ed09b"],
:environment? true,
:id "3f448942-1e89-4a0f-ad1d-0efadb740e1d",
:kind "runtime",
:language "bash",
:name "Minimal Bash",
:type :nextjournal,
:docker/environment-image
"docker.nextjournal.com/environment@sha256:b4c0df06280e70ed13f137093652e03e2e9932bd7ad5a24fbe9e377eee75b304",
:runtime/environment-variables
[{:name "NEXTJOURNAL_MOUNT_CUDA",
:value "10.2-cudnn7-devel-ubuntu18.04"}
{:name "BASH_ENV", :value "/.bash_profile"}
{:name "PATH",
:value
"/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}
{:name "LC_ALL", :value "en_US.UTF-8"}
{:name "LANGUAGE", :value "en_US.en"}
{:name "LANG", :value "en_US.UTF-8"}]},
"47e8b387-fa51-4105-a443-9d5ab18e7f5e"
{:compute-ref #uuid "39b7725a-07c0-447e-90a9-edf0dc5844cb",
:exec-duration 4796,
:id "47e8b387-fa51-4105-a443-9d5ab18e7f5e",
:kind "code",
:output-log-lines {:stdout 129},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"4d60f925-7a8d-4561-899a-f70dd8da5cd2"
{:compute-ref #uuid "2ccdb205-05af-4998-b593-aae3e3665f91",
:exec-duration 1572,
:id "4d60f925-7a8d-4561-899a-f70dd8da5cd2",
:kind "code",
:output-log-lines {:stdout 5},
:runtime [:runtime "3f448942-1e89-4a0f-ad1d-0efadb740e1d"]},
"53d1a77e-8d75-4086-be9b-1e43af9f14fc"
{:compute-ref #uuid "7d76d3cc-87d5-41e1-8a8b-b2981f92f9e9",
:exec-duration 20019,
:id "53d1a77e-8d75-4086-be9b-1e43af9f14fc",
:kind "code",
:output-log-lines {:stdout 120},
:runtime [:runtime "a3f8c2a0-396e-4f3f-9240-58fbfd473354"]},
"57ac4d46-7db0-4d03-ab50-27383120ecc1"
{:compute-ref #uuid "e5b03e0a-67cd-419b-8a23-b2e5c25a0bfb",
:exec-duration 9958,
:id "57ac4d46-7db0-4d03-ab50-27383120ecc1",
:kind "code",
:output-log-lines {:stdout 54},
:runtime [:runtime "35716bb6-9dd8-4de2-844b-ef54aea4022c"]},
"66ba3f83-4b87-4c7e-9346-7d25e665d2a8"
{:compute-ref #uuid "6dedcf80-3441-4f22-9f4a-930b026f71e0",
:exec-duration 1121,
:id "66ba3f83-4b87-4c7e-9346-7d25e665d2a8",
:kind "code",
:output-log-lines {:stdout 1},
:runtime [:runtime "35716bb6-9dd8-4de2-844b-ef54aea4022c"]},
"7904f344-d6e1-4658-a601-970ae7270158"
{:compute-ref #uuid "d0a7b7a2-b0ff-472c-9291-ec1f7fdb20e4",
:exec-duration 158,
:id "7904f344-d6e1-4658-a601-970ae7270158",
:kind "code",
:output-log-lines {},
:runtime [:runtime "35716bb6-9dd8-4de2-844b-ef54aea4022c"]},
"79cd6722-9a74-4ad2-bc1d-291ea902b143"
{:compute-ref #uuid "3bb2f8fb-5ec3-4c36-80ad-4fd9c72baad9",
:exec-duration 28417,
:id "79cd6722-9a74-4ad2-bc1d-291ea902b143",
:kind "code",
:output-log-lines {:stdout 465},
:runtime [:runtime "a3f8c2a0-396e-4f3f-9240-58fbfd473354"]},
"84462ff6-3cca-4526-8665-480ba1a6fc7a"
{:compute-ref #uuid "4af0965e-f450-4717-b00e-1568fe9112d4",
:exec-duration 1803,
:id "84462ff6-3cca-4526-8665-480ba1a6fc7a",
:kind "code",
:output-log-lines {},
:runtime [:runtime "35716bb6-9dd8-4de2-844b-ef54aea4022c"]},
"84678b2c-6134-4256-9e3f-ed8f399da1a9"
{:compute-ref #uuid "08581bb0-3b61-4a85-9d12-82ff29e0bbee",
:exec-duration 49966,
:id "84678b2c-6134-4256-9e3f-ed8f399da1a9",
:kind "code",
:output-log-lines {:stdout 671},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"9562ba30-957e-4d3a-86fd-71887e4366e5"
{:compute-ref #uuid "81872641-2568-4850-aa51-9b76aebfdb1f",
:exec-duration 1297,
:id "9562ba30-957e-4d3a-86fd-71887e4366e5",
:kind "code",
:output-log-lines {:stdout 1},
:runtime [:runtime "a3f8c2a0-396e-4f3f-9240-58fbfd473354"]},
"9a6681f2-7909-4990-a852-ed084c09ac24"
{:id "9a6681f2-7909-4990-a852-ed084c09ac24", :kind "file"},
"9ce5cef1-0093-4a14-bf3d-ca8d47d2f4f5"
{:compute-ref #uuid "e35eaed1-4a40-46e0-a613-42d2878684b2",
:exec-duration 1418,
:id "9ce5cef1-0093-4a14-bf3d-ca8d47d2f4f5",
:kind "code",
:output-log-lines {:stdout 1},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"9e48ebfa-00e7-4c2d-ab0e-9b1cf1c7f545"
{:compute-ref #uuid "15260fb0-fb8e-411a-abc6-576ab21497e0",
:exec-duration 1036,
:id "9e48ebfa-00e7-4c2d-ab0e-9b1cf1c7f545",
:kind "code",
:output-log-lines {:stdout 1},
:runtime [:runtime "3f448942-1e89-4a0f-ad1d-0efadb740e1d"]},
"9e6a3bc5-315c-4364-a375-6d8b56c91e69"
{:compute-ref #uuid "d40845e6-1e35-4fc8-93f5-117631700369",
:exec-duration 6332,
:id "9e6a3bc5-315c-4364-a375-6d8b56c91e69",
:kind "code",
:output-log-lines {:stdout 62},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"a3f8c2a0-396e-4f3f-9240-58fbfd473354"
{:environment [:environment "dab15041-47f1-4ca7-84e2-b4532a4a2f70"],
:environment? true,
:id "a3f8c2a0-396e-4f3f-9240-58fbfd473354",
:kind "runtime",
:language "bash",
:name "Jupyter Base",
:type :nextjournal,
:docker/environment-image
"docker.nextjournal.com/environment@sha256:9f702cbd7e326d27bfba8a3ec4f9654533a2592bfc3ec3266b0e8a2adcde0891"},
"a3fdd45c-bcd5-4958-b33d-f03c61c300a5"
{:compute-ref #uuid "362a8f6e-5087-4438-a2fe-4dcabb977d5b",
:exec-duration 694,
:id "a3fdd45c-bcd5-4958-b33d-f03c61c300a5",
:kind "code",
:output-log-lines {:stdout 1},
:runtime [:runtime "35716bb6-9dd8-4de2-844b-ef54aea4022c"]},
"c10af8c6-d61b-465c-8ab8-fb2f6a19e7be"
{:compute-ref #uuid "de4f222b-b12f-437e-8031-27c44d6a08de",
:exec-duration 184,
:id "c10af8c6-d61b-465c-8ab8-fb2f6a19e7be",
:kind "code",
:output-log-lines {},
:runtime [:runtime "35716bb6-9dd8-4de2-844b-ef54aea4022c"]},
"c42362a6-b86d-4d9a-8560-0a678926f786"
{:compute-ref #uuid "d2e33840-caa6-4e9f-a4f6-8dc365d315bf",
:exec-duration 6267,
:id "c42362a6-b86d-4d9a-8560-0a678926f786",
:kind "code",
:output-log-lines {:stdout 51},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"d521bf3d-031a-44c7-b067-cae7104ac652"
{:id "d521bf3d-031a-44c7-b067-cae7104ac652",
:kind "reference",
:link [:output "c10af8c6-d61b-465c-8ab8-fb2f6a19e7be" "test.svg"]},
"dab15041-47f1-4ca7-84e2-b4532a4a2f70"
{:environment [:environment "3f448942-1e89-4a0f-ad1d-0efadb740e1d"],
:environment? true,
:id "dab15041-47f1-4ca7-84e2-b4532a4a2f70",
:kind "runtime",
:language "bash",
:name "Bash",
:type :nextjournal,
:docker/environment-image
"docker.nextjournal.com/environment@sha256:5eb6bb2878dfc70e032c19d0473468131dbd6c612005c019471ffa6704979f43",
:runtime/environment-variables
[{:name "PATH",
:value
"/usr/local/google-cloud-sdk/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}]},
"ec81f10e-d23d-4160-8ba0-291c35e23569"
{:compute-ref #uuid "1e1a49c8-ceb8-459d-be82-51336ce12ac0",
:exec-duration 136,
:id "ec81f10e-d23d-4160-8ba0-291c35e23569",
:kind "code",
:output-log-lines {},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"ee160d76-93be-4fd6-8eed-05b0cc4ed09b"
{:id "ee160d76-93be-4fd6-8eed-05b0cc4ed09b",
:kind "docker-environment",
:docker/environment-image
"docker.nextjournal.com/environment@sha256:134c7fe821b9d359490cd009ce7ca322453f4f2d018623f849e580a89a685e5d",
:docker/import-image "ubuntu:18.04",
:environment/name "Ubuntu Base"},
"efc7779c-f4f9-4775-900a-61bf26fe9f6c"
{:compute-ref #uuid "1eb8f3e0-38b9-4b6b-afad-1c0ba8257ca9",
:exec-duration 468,
:id "efc7779c-f4f9-4775-900a-61bf26fe9f6c",
:kind "code",
:output-log-lines {},
:runtime [:runtime "3f448942-1e89-4a0f-ad1d-0efadb740e1d"]},
"f051ebee-50eb-4aff-958e-e68247782026"
{:compute-ref #uuid "eb15c18d-579c-4682-a762-14671940ba49",
:exec-duration 1179,
:id "f051ebee-50eb-4aff-958e-e68247782026",
:kind "code",
:output-log-lines {},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"f1928f0f-0871-412b-99b0-efdb2c9b8544"
{:compute-ref #uuid "61bb613c-dadc-4c75-9971-35b04288390a",
:exec-duration 14766,
:id "f1928f0f-0871-412b-99b0-efdb2c9b8544",
:kind "code",
:output-log-lines {:stdout 149},
:runtime [:runtime "dab15041-47f1-4ca7-84e2-b4532a4a2f70"]},
"fbd3514a-eccd-43eb-82f3-33a9e579de78"
{:compute-ref #uuid "86545ef8-b82b-4bff-a45a-a7022af5e505",
:exec-duration 20130,
:id "fbd3514a-eccd-43eb-82f3-33a9e579de78",
:kind "code",
:output-log-lines {:stdout 287},
:runtime [:runtime "3f448942-1e89-4a0f-ad1d-0efadb740e1d"]}},
:nextjournal/id #uuid "5b45dad0-dfdf-4576-9b8c-f90892e74c94",
:article/change
{:nextjournal/id #uuid "5e1f5709-0a0e-4a97-b9f4-a54e27c6b35e"}}}
```