tag:crieit.net,2005:https://crieit.net/tags/Jupyternotebook/feed
「Jupyternotebook」の記事 - Crieit
Crieitでタグ「Jupyternotebook」に投稿された最近の記事
2022-09-19T15:07:22+09:00
https://crieit.net/tags/Jupyternotebook/feed
tag:crieit.net,2005:PublicArticle/18295
2022-09-19T15:01:30+09:00
2022-09-19T15:07:22+09:00
https://crieit.net/posts/ubuntu-2204-jupyter-notebook-iruby-pyenv-rbenv-bundler
Ubuntu 22.04にJupyter NotebookとIRubyをインストール(pyenv, rbenv, Bundler を使用)
<ul>
<li><del>それぞれのバージョンが上がった以外は<a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/06/07/112841">前回の Ubuntu 18.04 のとき</a>からあまり変わっていません</del>
<ul>
<li>Bundler の binstubs を利用する手順を追加しました</li>
</ul></li>
<li>手軽に試したい場合は公式の Docker イメージや Binder を利用するのが良いと思います(<a target="_blank" rel="nofollow noopener" href="https://github.com/SciRuby/iruby/blob/master/README.md">IRuby の README</a> を参照)</li>
</ul>
<hr />
<p><strong>大事なので2回書きます。手軽に試したい場合は公式の Docker イメージを使うか、Binder を使いましょう(<a target="_blank" rel="nofollow noopener" href="https://github.com/SciRuby/iruby/blob/master/README.md">IRuby の README</a> を参照)。 下記のような面倒なインストール手順は不要ですぐ使えます。</strong></p>
<h1 id="バージョンなど"><a href="#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AA%E3%81%A9">バージョンなど</a></h1>
<pre><code>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
</code></pre>
<h1 id="Docker の用意"><a href="#Docker+%E3%81%AE%E7%94%A8%E6%84%8F">Docker の用意</a></h1>
<p>Docker イメージを作るのが目的ではなく、まっさらな状態に戻してあれこれ試すために使います。<br />
Docker なしでも大体同じだと思います。</p>
<pre><code class="sh"># 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"]
</code></pre>
<p>参考: <a target="_blank" rel="nofollow noopener" href="https://qiita.com/iganari/items/1d590e358a029a1776d6">Dockerコンテナ内にsudoユーザを追加する - Qiita</a></p>
<p>ユーザ名 <code>user1</code> は適当なものです。適宜読み替えます。以下同様。</p>
<p>イメージをビルドしてコンテナを起動。</p>
<pre><code>docker build -t ubuntu_jupyter:22.04 .
docker run --rm -it -p8888:8888 ubuntu_jupyter:22.04 bash
</code></pre>
<p>以下はコンテナ内で作業しています。</p>
<h1 id="anyenv, rbenv, pyenv のインストール"><a href="#anyenv%2C+rbenv%2C+pyenv+%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">anyenv, rbenv, pyenv のインストール</a></h1>
<pre><code class="sh">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
</code></pre>
<h1 id="Ruby のインストール"><a href="#Ruby+%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Ruby のインストール</a></h1>
<pre><code>sudo apt install -y libssl-dev zlib1g-dev
rbenv install 3.1.2
</code></pre>
<p>Docker のポートマッピングの確認。先に疎通確認しておきます。</p>
<pre><code class="sh">rbenv shell 3.1.2
gem install webrick
ruby -run -e httpd -- --port=8888 --bind-address=0.0.0.0 .
</code></pre>
<p>ホスト側から http://localhost:8888/ にアクセスできることを確認して Ctrl-C で止める。</p>
<h1 id="Python のインストール"><a href="#Python+%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Python のインストール</a></h1>
<pre><code class="sh">sudo apt install -y libffi-dev libsqlite3-dev
env PYTHON_CONFIGURE_OPTS='--enable-shared' pyenv install 3.10.3
</code></pre>
<p><code>env PYTHON_CONFIGURE_OPTS='--enable-shared'</code> は後で PyCall を使うための指定<br />
<a target="_blank" rel="nofollow noopener" href="https://github.com/mrkn/pycall.rb#note-for-pyenv-users">https://github.com/mrkn/pycall.rb#note-for-pyenv-users</a></p>
<h1 id="Jupyter Notebook のインストール"><a href="#Jupyter+Notebook+%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Jupyter Notebook のインストール</a></h1>
<pre><code class="sh">## ディレクトリと 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
</code></pre>
<pre><code class="sh">## 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が表示されるので、ホスト側のブラウザで開く
</code></pre>
<p><code>--ip=0.0.0.0</code> を指定しているのは Docker コンテナ内で実行してホスト側から参照するため。</p>
<p>確認できたら Ctrl-C で止める。</p>
<h1 id="IRuby のインストール"><a href="#IRuby+%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">IRuby のインストール</a></h1>
<p>基本的には<br />
<a target="_blank" rel="nofollow noopener" href="https://github.com/SciRuby/iruby">https://github.com/SciRuby/iruby</a><br />
の説明を参考にしてインストールしました。</p>
<p>ただし、gem を Bundler で管理したいので、そのための手順を加えています。</p>
<p>Bundler 環境で iruby を実行するための方法として</p>
<ul>
<li>binstubs を使う方法</li>
<li>ラッパースクリプトを使う方法</li>
</ul>
<p>の2つを試しました。 binstubs を使う方が手順が簡単です。</p>
<h2 id="binstubs を使う場合"><a href="#binstubs+%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88">binstubs を使う場合</a></h2>
<pre><code class="sh">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 のノートブックが新規作成できるようになる
## (メニューに表示されるようになる)
</code></pre>
<p><a href="https://crieit.now.sh/upload_images/a28566d432610fa1952ea6c4f741348c63280709d5558.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a28566d432610fa1952ea6c4f741348c63280709d5558.png?mw=700" alt="image" /></a></p>
<h2 id="ラッパースクリプトを使う場合"><a href="#%E3%83%A9%E3%83%83%E3%83%91%E3%83%BC%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88">ラッパースクリプトを使う場合</a></h2>
<pre><code class="sh">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 のノートブックが新規作成できるようになる
## (メニューに表示されるようになる)
</code></pre>
<p><a href="https://crieit.now.sh/upload_images/a28566d432610fa1952ea6c4f741348c63280709d5558.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a28566d432610fa1952ea6c4f741348c63280709d5558.png?mw=700" alt="image" /></a></p>
<p>しかし、実際に新規作成を行うと次のようなエラーが jupyter を起動したターミナルに出てうまく動かない。</p>
<pre><code>[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>'
</code></pre>
<p>これはおそらく rbenv + bundler 環境で実行できていないせいなので、iruby コマンドのラッパー <code>iruby.sh</code> を用意して対処してみる。<br />
(他に良い方法があるかもしれませんが、とりあえずこれで動きました。)</p>
<pre><code class="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
</code></pre>
<pre><code class="sh">## 実行権限を付ける
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
</code></pre>
<p>これで ruby カーネルが動くようになった。</p>
<h1 id="IRuby のノートブックを使う"><a href="#IRuby+%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%82%92%E4%BD%BF%E3%81%86">IRuby のノートブックを使う</a></h1>
<p>基本的な使い方については <a target="_blank" rel="nofollow noopener" href="https://github.com/RubyData/workshop-materials/blob/master/iruby_guides/users_guide.md">IRuby Notebook 利用者ガイド</a> が参考になります。</p>
<p>matplotlib を使っている箇所があるので、下記でインストールしておく必要があります。</p>
<pre><code>pip install matplotlib
bundle add matplotlib
</code></pre>
<h1 id="ライブラリの追加"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0">ライブラリの追加</a></h1>
<h2 id="Python のライブラリを追加したい場合"><a href="#Python+%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88">Python のライブラリを追加したい場合</a></h2>
<pre><code class="sh">pip install lib_foo
</code></pre>
<h2 id="Ruby のライブラリを追加したい場合"><a href="#Ruby+%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88">Ruby のライブラリを追加したい場合</a></h2>
<pre><code class="sh">bundle add lib_foo
</code></pre>
<p>カーネルを再起動(ノートブックのページのメニューの Kernal → Restart)すると require できるようになる。</p>
<h1 id="バージョン詳細"><a href="#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E8%A9%B3%E7%B4%B0">バージョン詳細</a></h1>
<p>pip freeze</p>
<pre><code>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
</code></pre>
<p>jupyter --version</p>
<pre><code>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
</code></pre>
<p>cat Gemfile.lock</p>
<pre><code>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
</code></pre>
<h1 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h1>
<ul>
<li>2018-04 <a target="_blank" rel="nofollow noopener" href="https://github.com/RubyData/workshop-materials/blob/master/iruby_guides/installation_guide.md">IRuby インストールガイド (RubyData/workshop-materials)</a></li>
<li>2017-05 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/methane/items/5afdabd513a18049c34f">Rubyist が pyenv を使うときに知っておいてほしいこと - Qiita</a></li>
</ul>
<hr />
<ul>
<li>2019-12 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/kojix2/items/456259f40d5563005cd1">Rubyでグラフを描画するツール GR.rb の紹介 - Qiita</a></li>
</ul>
<h1 id="この記事を読んだ人は(ひょっとしたら)こちらも読んでいます"><a href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A0%E4%BA%BA%E3%81%AF%EF%BC%88%E3%81%B2%E3%82%87%E3%81%A3%E3%81%A8%E3%81%97%E3%81%9F%E3%82%89%EF%BC%89%E3%81%93%E3%81%A1%E3%82%89%E3%82%82%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%84%E3%81%BE%E3%81%99">この記事を読んだ人は(ひょっとしたら)こちらも読んでいます</a></h1>
<ul>
<li><p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/86afece3b2595648a656">SVG::Graph(svg-graph gem)で散布図を描く</a></p></li>
<li><p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/da02c6f9f85c5a33f0a1">Ruby + Numo::Gnuplot(numo-gnuplot gem)で散布図を描く</a></p></li>
<li><p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/b586e96f7805a5695a34">Galaaz を触ってみた(TruffleRuby + ggplot2 で散布図を描いてみた)</a></p></li>
</ul>
sonota486