2022-09-19に更新

Ubuntu 22.04にJupyter NotebookとIRubyをインストール(pyenv, rbenv, Bundler を使用)

読了目安:12分
  • それぞれのバージョンが上がった以外は前回の Ubuntu 18.04 のときからあまり変わっていません
    • Bundler の binstubs を利用する手順を追加しました
  • 手軽に試したい場合は公式の Docker イメージや Binder を利用するのが良いと思います(IRuby の README を参照)

大事なので2回書きます。手軽に試したい場合は公式の Docker イメージを使うか、Binder を使いましょう(IRuby の README を参照)。 下記のような面倒なインストール手順は不要ですぐ使えます。

バージョンなど

Ubuntu 18.04(コンテナ外の作業環境)
anyenv
pyenv
  Python 3.10.3
rbenv
  Ruby 3.1.2

jupyter 1.0.0
  jupyter_core 4.10.0
  notebook 6.4.11
iruby 0.7.4

Docker の用意

Docker イメージを作るのが目的ではなく、まっさらな状態に戻してあれこれ試すために使います。
Docker なしでも大体同じだと思います。

# Dockerfile

FROM ubuntu:22.04

RUN apt-get update \
  && apt-get install -y sudo git wget build-essential nano

RUN useradd --create-home --gid sudo --shell /bin/bash user1 \
  && echo 'user1:pass' | chpasswd \
  && echo 'Defaults visiblepw'           >> /etc/sudoers \
  && echo 'user1 ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER user1

WORKDIR /home/user1

CMD ["/bin/bash"]

参考: Dockerコンテナ内にsudoユーザを追加する - Qiita

ユーザ名 user1 は適当なものです。適宜読み替えます。以下同様。

イメージをビルドしてコンテナを起動。

docker build -t ubuntu_jupyter:22.04 .
docker run --rm -it -p8888:8888 ubuntu_jupyter:22.04 bash

以下はコンテナ内で作業しています。

anyenv, rbenv, pyenv のインストール

git clone https://github.com/anyenv/anyenv ~/.anyenv

## 一応バージョン指定
( cd ~/.anyenv; git checkout v1.1.4; git status )

echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(anyenv init -)"'               >> ~/.bashrc

exec bash -l

## メッセージにしたがって実行
yes | anyenv install --init

anyenv install rbenv
anyenv install pyenv

## 一応バージョン指定
( cd ~/.anyenv/envs/rbenv; git checkout v1.2.0; git status )
( cd ~/.anyenv/envs/pyenv; git checkout v2.2.5; git status )

exec bash -l

Ruby のインストール

sudo apt install -y libssl-dev zlib1g-dev
rbenv install 3.1.2

Docker のポートマッピングの確認。先に疎通確認しておきます。

rbenv shell 3.1.2
gem install webrick
ruby -run -e httpd -- --port=8888 --bind-address=0.0.0.0 .

ホスト側から http://localhost:8888/ にアクセスできることを確認して Ctrl-C で止める。

Python のインストール

sudo apt install -y libffi-dev libsqlite3-dev
env PYTHON_CONFIGURE_OPTS='--enable-shared' pyenv install 3.10.3

env PYTHON_CONFIGURE_OPTS='--enable-shared' は後で PyCall を使うための指定
https://github.com/mrkn/pycall.rb#note-for-pyenv-users

Jupyter Notebook のインストール

## ディレクトリと rbenv, pyenv の用意

mkdir ${HOME}/jupyter
cd ${HOME}/jupyter
pwd #=> /home/user1/jupyter

rbenv local 3.1.2
pyenv local 3.10.3

ruby -v   #=> ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]
python -V #=> Python 3.10.3
## bundle init みたいなもの
## "venv.d" は任意のディレクトリ名
python -m venv venv.d

## 常に bundle exec してるみたいなモードになる
## モードを抜けたい場合は deactivate を実行する
. venv.d/bin/activate

## bundle add みたいなもの
pip install jupyter

jupyter notebook --no-browser --ip=0.0.0.0

## ログイン用のトークン付きのURLが表示されるので、ホスト側のブラウザで開く

--ip=0.0.0.0 を指定しているのは Docker コンテナ内で実行してホスト側から参照するため。

確認できたら Ctrl-C で止める。

IRuby のインストール

基本的には
https://github.com/SciRuby/iruby
の説明を参考にしてインストールしました。

ただし、gem を Bundler で管理したいので、そのための手順を加えています。

Bundler 環境で iruby を実行するための方法として

  • binstubs を使う方法
  • ラッパースクリプトを使う方法

の2つを試しました。 binstubs を使う方が手順が簡単です。

binstubs を使う場合

sudo apt install -y libtool libffi-dev ruby ruby-dev make
sudo apt install -y libzmq3-dev libczmq-dev

bundle init
bundle config set --local path 'vendor/bundle'

bundle add ffi-rzmq iruby pycall rake

bundle binstubs iruby
## ./bin/iruby が生成される

bin/iruby register --force
## ~/.local/share/jupyter/kernels/ruby/kernel.json
## が生成される

cat ~/.local/share/jupyter/kernels/ruby/kernel.json
#=> {"argv":["/home/user1/jupyter/bin/iruby","kernel","{connection_file}"],"display_name":"Ruby 3.1.2","language":"ruby"}

## この状態で jupyter 起動
jupyter notebook --no-browser --ip=0.0.0.0
## → Ruby 3.1.2 のノートブックが新規作成できるようになる
##  (メニューに表示されるようになる)

image

ラッパースクリプトを使う場合

sudo apt install -y libtool libffi-dev ruby ruby-dev make
sudo apt install -y libzmq3-dev libczmq-dev

bundle init
bundle config set --local path 'vendor/bundle'

bundle add ffi-rzmq iruby pycall rake

bundle exec iruby register --force
## ~/.local/share/jupyter/kernels/ruby/kernel.json
## が生成される

cat ~/.local/share/jupyter/kernels/ruby/kernel.json
#=> {"argv":["/home/user1/jupyter/vendor/bundle/ruby/3.1.0/bin/iruby","kernel","{connection_file}"],"display_name":"Ruby 3.1.2","language":"ruby"}

## この状態で jupyter 起動
jupyter notebook --no-browser --ip=0.0.0.0
## → Ruby 3.1.2 のノートブックが新規作成できるようになる
## (メニューに表示されるようになる)

image

しかし、実際に新規作成を行うと次のようなエラーが jupyter を起動したターミナルに出てうまく動かない。

[I 05:17:21.886 NotebookApp] KernelRestarter: restarting kernel (3/5), new random ports
/home/user1/.anyenv/envs/rbenv/versions/3.1.2/lib/ruby/3.1.0/rubygems.rb:265:in `find_spec_for_exe': can't find gem iruby (>= 0.a) with executable iruby (Gem::GemNotFoundException)
        from /home/user1/.anyenv/envs/rbenv/versions/3.1.2/lib/ruby/3.1.0/rubygems.rb:284:in `activate_bin_path'
        from /home/user1/jupyter/vendor/bundle/ruby/3.1.0/bin/iruby:25:in `<main>'

これはおそらく rbenv + bundler 環境で実行できていないせいなので、iruby コマンドのラッパー iruby.sh を用意して対処してみる。
(他に良い方法があるかもしれませんが、とりあえずこれで動きました。)

cat <<'EOB' > iruby.sh
#!/bin/bash

JUPYTER_DIR=~/jupyter

export PYENV_ROOT="${HOME}/.anyenv/envs/pyenv"
export LIBPYTHON=${PYENV_ROOT}/versions/3.10.3/lib/libpython3.10.so.1.0
export PYTHON=${JUPYTER_DIR}/venv.d/bin/python
# これでもいい?
# export PYTHON=${PYENV_ROOT}/shims/python

export RBENV_ROOT="${HOME}/.anyenv/envs/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"

rbenv shell 3.1.2

BUNDLE_GEMFILE=${JUPYTER_DIR}/Gemfile \
  bundle exec iruby "$@"
EOB
## 実行権限を付ける
chmod u+x iruby.sh

## iruby のパスを修正
nano ~/.local/share/jupyter/kernels/ruby/kernel.json

{
  "argv": [
    "/home/user1/jupyter/iruby.sh",  ...ここだけ修正
    "kernel",
    "{connection_file}"
  ],
  "display_name":"Ruby 3.1.2",
  "language":"ruby"
}

## もう一度 jupyter を起動
jupyter notebook --no-browser --ip=0.0.0.0

これで ruby カーネルが動くようになった。

IRuby のノートブックを使う

基本的な使い方については IRuby Notebook 利用者ガイド が参考になります。

matplotlib を使っている箇所があるので、下記でインストールしておく必要があります。

pip install matplotlib
bundle add matplotlib

ライブラリの追加

Python のライブラリを追加したい場合

pip install lib_foo

Ruby のライブラリを追加したい場合

bundle add lib_foo

カーネルを再起動(ノートブックのページのメニューの Kernal → Restart)すると require できるようになる。

バージョン詳細

pip freeze

argon2-cffi==21.3.0
argon2-cffi-bindings==21.2.0
asttokens==2.0.5
attrs==21.4.0
backcall==0.2.0
beautifulsoup4==4.11.1
bleach==5.0.0
cffi==1.15.0
debugpy==1.6.0
decorator==5.1.1
defusedxml==0.7.1
entrypoints==0.4
executing==0.8.3
fastjsonschema==2.15.3
ipykernel==6.13.0
ipython==8.3.0
ipython-genutils==0.2.0
ipywidgets==7.7.0
jedi==0.18.1
Jinja2==3.1.2
jsonschema==4.5.1
jupyter==1.0.0
jupyter-client==7.3.0
jupyter-console==6.4.3
jupyter-core==4.10.0
jupyterlab-pygments==0.2.2
jupyterlab-widgets==1.1.0
MarkupSafe==2.1.1
matplotlib-inline==0.1.3
mistune==0.8.4
nbclient==0.6.2
nbconvert==6.5.0
nbformat==5.4.0
nest-asyncio==1.5.5
notebook==6.4.11
packaging==21.3
pandocfilters==1.5.0
parso==0.8.3
pexpect==4.8.0
pickleshare==0.7.5
prometheus-client==0.14.1
prompt-toolkit==3.0.29
psutil==5.9.0
ptyprocess==0.7.0
pure-eval==0.2.2
pycparser==2.21
Pygments==2.12.0
pyparsing==3.0.8
pyrsistent==0.18.1
python-dateutil==2.8.2
pyzmq==22.3.0
qtconsole==5.3.0
QtPy==2.1.0
Send2Trash==1.8.0
six==1.16.0
soupsieve==2.3.2.post1
stack-data==0.2.0
terminado==0.13.3
tinycss2==1.1.1
tornado==6.1
traitlets==5.1.1
wcwidth==0.2.5
webencodings==0.5.1
widgetsnbextension==3.6.0

jupyter --version

Selected Jupyter core packages...
IPython          : 8.3.0
ipykernel        : 6.13.0
ipywidgets       : 7.7.0
jupyter_client   : 7.3.0
jupyter_core     : 4.10.0
jupyter_server   : not installed
jupyterlab       : not installed
nbclient         : 0.6.2
nbconvert        : 6.5.0
nbformat         : 5.4.0
notebook         : 6.4.11
qtconsole        : 5.3.0
traitlets        : 5.1.1

cat Gemfile.lock

GEM
  remote: https://rubygems.org/
  specs:
    data_uri (0.1.0)
    ffi (1.15.5)
    ffi-rzmq (2.0.7)
      ffi-rzmq-core (>= 1.0.7)
    ffi-rzmq-core (1.0.7)
      ffi
    io-console (0.5.11)
    irb (1.4.1)
      reline (>= 0.3.0)
    iruby (0.7.4)
      data_uri (~> 0.1)
      ffi-rzmq
      irb
      mime-types (>= 3.3.1)
      multi_json (~> 1.11)
      native-package-installer
    mime-types (3.4.1)
      mime-types-data (~> 3.2015)
    mime-types-data (3.2022.0105)
    multi_json (1.15.0)
    native-package-installer (1.1.4)
    pycall (1.4.1)
    rake (13.0.6)
    reline (0.3.1)
      io-console (~> 0.5)

PLATFORMS
  x86_64-linux

DEPENDENCIES
  ffi-rzmq (~> 2.0)
  iruby (~> 0.7.4)
  pycall (~> 1.4)
  rake (~> 13.0)

BUNDLED WITH
   2.3.7

参考


この記事を読んだ人は(ひょっとしたら)こちらも読んでいます

Originally published at qiita.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

sonota486

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント