Evcxrを使ってJupyter Notebook(JupyterLab)でRustを実行する

2019.10.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

EvcxrはRust用のREPLです。GitHubでOSSとして公開されています(Google Organization配下で公開されていますが、Googleのオフィシャルなプロダクトではありません)。

文字通りのREPLを提供するevcxr_replの他、Jupyter Kernel(evcxr_jupyter)もリリースされています。本ブログ記事ではこのevcxr_jupyterを使って、JupyterLab上でRustを実行する手順をご紹介します。

動作環境

今回はDockerを使って環境を構築します。

  • OS : macOS Mojave v10.14.6
  • Docker:Docker Desktop Community v2.1.0.3
  • Rust:v1.38.0
  • Evcxr:v0.4.5
  • JupyterLab:v1.1.3

Dockerイメージの作成

今回はJupyterの公式Dockerイメージminimal-notebookをベースに、RustとEvcxrを追加でインストールする形でDockerイメージを作成します。RustのインストールはRustの公式DockerイメージのDockerfileに倣います。

Dockerfile

FROM jupyter/minimal-notebook

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

## Install Rust
USER root
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    wget \
    cmake \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
ENV RUSTUP_HOME=/usr/local/rustup \
    CARGO_HOME=/usr/local/cargo \
    PATH=/usr/local/cargo/bin:$PATH \
    RUST_VERSION=1.38.0

RUN set -eux; \
    dpkgArch="$(dpkg --print-architecture)"; \
    case "${dpkgArch##*-}" in \
        amd64) rustArch='x86_64-unknown-linux-gnu'; rustupSha256='36285482ae5c255f2decfab27d32ba19465804cb3ddf5a23e6ff2a7b0f6e0250' ;; \
        armhf) rustArch='armv7-unknown-linux-gnueabihf'; rustupSha256='cb20e54566d4b13434dea1776a961cf7f97afcc292cb4b0fec533503dd2434d0' ;; \
        arm64) rustArch='aarch64-unknown-linux-gnu'; rustupSha256='58e19ae12101103ccc50b04a2579b9238163f87a27da5078cefc900098f257ab' ;; \
        i386) rustArch='i686-unknown-linux-gnu'; rustupSha256='d3c42fb8b25f87eb049b6177611eea7d4fd51273de4113706f43cccf5610cfc7' ;; \
        *) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \
    esac; \
    url="https://static.rust-lang.org/rustup/archive/1.19.0/${rustArch}/rustup-init"; \
    wget "$url"; \
    echo "${rustupSha256} *rustup-init" | sha256sum -c -; \
    chmod +x rustup-init; \
    ./rustup-init -y --no-modify-path --default-toolchain $RUST_VERSION; \
    rm rustup-init; \
    chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
    rustup --version; \
    cargo --version; \
    rustc --version;
## Install Evcxr
USER 1000
RUN cargo install evcxr_jupyter && \
    evcxr_jupyter --install

docker-compose.yml

Docker Composeを使って、シングルコマンドでコンテナの起動・停止ができるようにしておきます。

version: "3"
services:
  jupyter:
    build:
      context: .
      dockerfile: Dockerfile
    image: jupyterlab
    environment:
      - TZ=Asia/Tokyo
      - JUPYTER_ENABLE_LAB=yes
    ports:
      - 8888:8888
    volumes:
      - ${PWD}/work:/home/jovyan/work

JupyterLabを利用するために、環境変数にJUPYTER_ENABLE_LAB=yesを設定します。Jupyter Notebookを利用したい場合はこの環境変数の設定を削除またはコメントアウトしてください。

Dockerイメージのビルド

docker-compose buildでDockerイメージをビルドします。手元の環境ではイメージサイズは「3.91GB」になりました。

execute docker-compose build command

JupyterLabの起動

docker-compose up -dでコンテナを作成&起動します。

execute docker-compose up command

デフォルトで、JupyterLabのトークン認証が有効になっています。docker-compose logsでトークンパラメータ付きのURLを確認します。

get jupyter url with token

WebブラウザでJupyterLabにアクセスします。ランチャーにRustが表示されます。

launcher screen of jupyter

Evcxrの使い方

  • Hello World

セル内の最後の式の結果が出力されます。

print hello world

  • :がメタコマンドです。:depで外部モジュールを読み込めます。

use-external-crate-uuid

  • :varsで変数を参照できます。

print a table of defined variables

その他、詳しい使い方はGitHub上のチュートリアルを参照ください。

まとめ

社内のRust勉強会に参加しているのですが、その中でRustのサンプルコードを動かす機会が多くあります。インタラクティブにRustのコードを実行できる環境はかなり重宝しそうです。

参考