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 みたいなもの ## &quot;venv.d&quot; は任意のディレクトリ名 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