tag:crieit.net,2005:https://crieit.net/tags/Jupyter/feed 「Jupyter」の記事 - Crieit Crieitでタグ「Jupyter」に投稿された最近の記事 2022-09-19T15:07:22+09:00 https://crieit.net/tags/Jupyter/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 tag:crieit.net,2005:PublicArticle/16315 2020-12-09T02:33:59+09:00 2020-12-09T12:41:39+09:00 https://crieit.net/posts/NET-Interactive-C-PowerShell .NET Interactive で C# と PowerShell を股に掛ける <p>この記事は、「<a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2020/csharplang">C# Advent Calendar 2020</a>」 9日目の記事、かつ 「<a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2020/powershell">PowerShell Advent Calendar 2020</a>」 9日目の記事だ。</p> <p>スミマセン。横着した。</p> <p>この時期になれば .NET Interactive の Preview 4 が出てるだろうしその記事でも書こうかな~ などと目論んでいたものの、 残念ながら登場しなかった。</p> <p>このため、 .NET Interactive .NET 5 対応版の導入と、 Variable sharing の内容でお茶を濁そうと思う。</p> <p>.NET Interactive のなんたるかについては、以前の以下の記事で取り扱っているので、そちらを参照願いたい。<br /> <a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/?p=1379">.NET Interactive の C# REPL を Jupyter で | Aqua Ware つぶやきブログ</a></p> <h2 id=".NET Interactive を .NET 5 で動かしてみる"><a href="#.NET+Interactive+%E3%82%92+.NET+5+%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">.NET Interactive を .NET 5 で動かしてみる</a></h2> <p>いきなり本題とは関係ない話になるが、 せっかく .NET 5 がリリースされたところなので、 .NET Interactive を .NET 5 で動かしてみよう。</p> <p>12/8 現在、NuGet で公式にリリースされている .NET Interactive は、 9月にリリースされた <a target="_blank" rel="nofollow noopener" href="https://devblogs.microsoft.com/dotnet/net-interactive-preview-3-vs-code-insiders-and-polyglot-notebooks/">Preview 3</a> に少し更新が加えられた、 <a target="_blank" rel="nofollow noopener" href="https://www.nuget.org/packages/Microsoft.dotnet-interactive/1.0.155302">1.0.155302</a> だ。<br /> これは、 .NET Core 3.1 上に構築されている。</p> <p>一方で 11/27 頃のビルド (<a target="_blank" rel="nofollow noopener" href="https://github.com/dotnet/interactive/commit/61d231529ce8657172c65b389e3524ae72cd30b7">dotnet/interactive@61d2315</a>) あたりでは、既に .NET 5 対応が済まされている。</p> <p>更に、 何故か <a target="_blank" rel="nofollow noopener" href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode&ssr=false#version-history">Visual Studio Code の .NET Interactive Notebooks 拡張では、 .NET 5 に対応した 1.0.160204</a> がリリースされている。</p> <p>このため、 現時点で .NET Interactive で .NET 5 を扱う主な方法は、以下の通り。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://mybinder.org/v2/gh/dotnet/interactive/main?urlpath=lab"><img src="https://static.mybinder.org/badge_logo.svg" alt="launch binder" /></a> main ブランチの binder コンテナにアクセス</li> <li>Azure DevOps の CI ビルドの NuGet feed (<a target="_blank" rel="nofollow noopener" href="https://dev.azure.com/dnceng/public/_packaging?_a=feed&feed=dotnet-tools">dotnet-tools</a>) から、 <a target="_blank" rel="nofollow noopener" href="https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-tools&package=Microsoft.dotnet-interactive&protocolType=NuGet&version=1.0.160204&view=overview">Glogal Tool</a> を DL <ul> <li>実行例:<br /> <code>powershell dotnet tool install -g Microsoft.dotnet-interactive --version 1.0.160204 --add-source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json</code></li> </ul></li> <li>VS Code Insider を起動し、 <a target="_blank" rel="nofollow noopener" href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.dotnet-interactive-vscode&ssr=false#version-history">.NET Interactive Notebooks 拡張の Preview</a> をインストール</li> </ul> <p>残念ながら、 .NET Interactive インストール済み Jupyter の docker イメージのようなものは 公式では用意されておらず、 コンテナを使いたかったら自分でビルドするしかない。<br /> (そのせいで、 上記 binder の起動は遅い)</p> <p>vscode 拡張だと、 コード補完が ignore case で効くのでとても書きやすい。<br /> 以下、 vscode の .NET Interactive Notebooks 拡張の バージョン 1.0.160204 での実行を前提とするが、 他の環境でも同様に動作するはずだ。</p> <p>なお、 起動した Notebook やコンソールの .NET CLR のバージョンを知りたければ、 System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription を実行すれば良い。<br /> .NET 5.x.x と表示されれば、 .NET 5 で起動していることが確認できる。</p> <p><a href="https://crieit.now.sh/upload_images/601ee4e8bdda70c90dbb844c3f41b00a5fcfb8394c961.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/601ee4e8bdda70c90dbb844c3f41b00a5fcfb8394c961.png?mw=700" alt="dotnet-interactive-variable-sharing-00.png" /></a></p> <h2 id="Variable sharing とは"><a href="#Variable+sharing+%E3%81%A8%E3%81%AF">Variable sharing とは</a></h2> <p>さて、ようやく本題。</p> <p>.NET Interactive が面白いのは、 ひとつの Notebook 内で、 C#, PowerShell, F# の言語間の変数を共有できる点だ。<br /> 悪いなあ、 <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/dotnet/visual-basic/">VB.NET</a>。 このツールは3人用なんだ。</p> <p>この変数を共有できる機能を、 variable sharing という。</p> <p><a href="https://crieit.now.sh/upload_images/6c0880bb18fa55b7ca72b70edf5ea8c45fcfb85010ba9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6c0880bb18fa55b7ca72b70edf5ea8c45fcfb85010ba9.png?mw=700" alt="dotnet-interactive-variable-sharing-01.png" /></a></p> <p>使い方はとても簡単で、 <code>#!share --from</code> マジックコマンドで、 参照する .NET カーネルと変数名を指定するだけだ。</p> <p>但し、 読み込まれている型の空間は共有されない点には注意だ。<br /> 例えば、 C# で定義したクラスのインスタンスを PowerShell で読み込もうとしたり、<br /> PowerShell でロードされているモジュールで定義された型のインスタンスを C# で読もうとすると、エラーになってしまう。<br /> 詳しくは、 <a target="_blank" rel="nofollow noopener" href="https://github.com/dotnet/interactive/blob/main/docs/variable-sharing.md">interactive/variable-sharing.md · dotnet/interactive</a> のドキュメントを参照。</p> <p><a href="https://crieit.now.sh/upload_images/d2e56ff085416a06d06b9561ffd485035fcfb859aa4d5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d2e56ff085416a06d06b9561ffd485035fcfb859aa4d5.png?mw=700" alt="dotnet-interactive-variable-sharing-02.png" /></a></p> <p>但し、 PowerShell でよく使われる <code>PSCustomObject</code> 型については特別対応が入っているらしく、いい感じに <code>Dictionary<string, object></code> に変換されて C# でも扱える。<br /> なにそれ。 PowerShell 内部でも欲しい機能なんだけど。</p> <h2 id="Variable sharing の使いどころ"><a href="#Variable+sharing+%E3%81%AE%E4%BD%BF%E3%81%84%E3%81%A9%E3%81%93%E3%82%8D">Variable sharing の使いどころ</a></h2> <p>例えば…<br /> 例えば……<br /> ………</p> <p>うーん、よい例が思いつかない…</p> <p>そもそも、 C# でできることはだいたい PowerShell でできるし、 その逆もまた然りなんだよな。<br /> 加えて PowerShell では、 <code>Add-Type</code> で手軽に C# のコードを埋め込めるし…</p> <p>強いて挙げるなら、 PowerShell は、付属のコマンドレットや追加モジュールによって、 I/O 操作やリソースの読み込みにが強い一方で、 パイプを交えたデータの処理はだいぶ遅いところだろうか。<br /> 例えば、 PowerShell で ファイルの読み込みなどを行いつつ、 大量のデータの処理は C# で行うといったような使い方はアリかもしれない。</p> <pre><code class="powershell">#!pwsh $data1 = Get-ChildItem *.json -Recurse | Get-Content -Raw | ConvertFrom-Json; $data2 = Get-Clipboard; </code></pre> <pre><code class="csharp">#!csharp #!share --from pwsh data1, data2 data1.Where(kv => kv.Key == "tools") </code></pre> <pre><code class="csharp">#!csharp data2.First() </code></pre> <p>この程度のデータ処理なら PowerShell で全く問題ないレベルだが、 処理するデータの数が増えてくれば C# で実行するメリットが出てくるだろう。</p> advanceboy tag:crieit.net,2005:PublicArticle/14681 2018-12-22T00:27:33+09:00 2018-12-24T15:29:58+09:00 https://crieit.net/posts/1ce4e541fb35fa1b2fda13fc31b54a6a ランニングと1年の振り返り <p>この記事は、<a href="https://crieit.net/advent-calendars/2018/crieit">Crieitのアドベントカレンダー Advent Calendar 2018</a> 22日目の記事になります。</p> <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p>私にとってこの一年はフリーランスを始めた年であり、<br /> 「年で合計400㌔走る!」という目標を掲げた年でもありました。</p> <p>結果としては21日時点で402㌔。無事達成できました!</p> <p>せっかくなのでデータを見つつ、今年を振り返ってみます。</p> <h2 id="ランニング開始の背景"><a href="#%E3%83%A9%E3%83%B3%E3%83%8B%E3%83%B3%E3%82%B0%E9%96%8B%E5%A7%8B%E3%81%AE%E8%83%8C%E6%99%AF">ランニング開始の背景</a></h2> <p>妻に脇腹をつねられ「あれ?なんか付いてる。。!」という発言から。<br /> とりあえず目標を建てないと続かないと思い、<br /> 週の半分で2キロ走ることができたら、400㌔いけるなという概算で設定。</p> <h2 id="データの計測について"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">データの計測について</a></h2> <p>runtasticというスマホのアプリを利用していました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.runtastic.com/ja/">https://www.runtastic.com/ja/</a></p> <p>GPSを有効にしてアプリを起動して走ると、時間や走行距離を計測してくれます。<br /> 1キロ毎に走行時間をアナウンスをしてくれるのでペースを維持するのに良かったです。</p> <p>アプリのサイトに行くと、データがエクスポートできるのでそこからダウンロードしました。</p> <p><a href="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d04f925bb1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d04f925bb1.png?mw=700" alt="image.png" /></a></p> <h2 id="利用したデータ"><a href="#%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF">利用したデータ</a></h2> <p>経緯度だけマスキングしてこちらにあります。良かったら利用してみてください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/u110/my_runtastic_data">https://github.com/u110/my_runtastic_data</a></p> <p>※ 目標達成する前にダウンロードしたデータなので、400㌔届いておらず。</p> <p>この後コード片を載せますが、分析に用いたコードもリポジトリにあります。</p> <h2 id="データ構成"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E6%88%90">データ構成</a></h2> <p>1回のランニングあたりの<br /> - 経緯度<br /> - 開始時刻<br /> - 走行距離</p> <p>があったので今回はそれのみ。</p> <p>他にも毎分あたりの経緯度やペースなども見れるようです。<br /> コードの一部</p> <pre><code class="python">dat = preprocess(df) # 前処理を行ったDataFrameを返す関数を用意 dat.head() </code></pre> <p>出力結果<br /> <a href="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d057191471.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d057191471.png?mw=700" alt="image.png" /></a></p> <h2 id="ヒストグラム"><a href="#%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0">ヒストグラム</a></h2> <p>まずは1変数のヒストグラムを見ましょう。<br /> データのプロットはpythonで書いています(全コードはgithubリポジトリにあります)</p> <pre><code class="python"># 走行距離分布(単位:メートル) # 3, 4キロあたりが多い。 dat.distance.hist() </code></pre> <p><a href="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d05e13c935.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d05e13c935.png?mw=700" alt="image.png" /></a></p> <pre><code class="python"># ランニング開始時間 基本的に6-7時台 dat.shour.hist() </code></pre> <p><a href="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d05fbaba15.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d05fbaba15.png?mw=700" alt="image.png" /></a></p> <h2 id="swarmplot"><a href="#swarmplot">swarmplot</a></h2> <p>日本語だと蜂群図(bee swarm plot)というらしいです。<br /> データの個数やばらつぎ具合が把握できるので便利です。<br /> (データ増えると描画に時間かかるので注意)</p> <pre><code class="python"># 1回あたりの走行距離の分布 sns.swarmplot(x="smonth", y="distance", data=dat) </code></pre> <p><a href="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d060d922a1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7a00187d544d7eab14e9365c5a73e1ff5c1d060d922a1.png?mw=700" alt="image.png" /></a></p> <h2 id="データを見た気づき"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%A6%8B%E3%81%9F%E6%B0%97%E3%81%A5%E3%81%8D">データを見た気づき</a></h2> <ul> <li><p>時系列でみると、1回に走る距離が伸びている</p> <ul> <li>見るまでもなく実感はあった。</li> <li>年の始めは2キロでへばっていたが、夏場は帰省先(長野県)が快適だったのもあり結構走れていた。</li> </ul></li> <li><p>4, 7, 11, 12月で走る回数が減っている</p> <ul> <li>そういえば、4月は仕事でもやもやしていた時期でしたw</li> <li>7月は息子爆誕。パパ業が開始した月でした。</li> <li>冬は寒い。。朝布団から出られないw</li> </ul></li> <li><p>5月、9月で持ち返している</p> <ul> <li>5月で産休の妻と実家に帰省。仕事もセーブしていたので暇だったw</li> <li>9月はDevelopers JPに参加。slackの筋トレチャンネルで報告を始めたのが良かったのかも</li> <li>Djpの人めっちゃ褒めてくれるので頑張れる。</li> </ul></li> </ul> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <ul> <li>走れている月は仕事やプライベートの調子も良かった。</li> <li>応援もらえるの嬉しい。</li> <li>データ溜まっていくと分析しがいがありそう。</li> </ul> <p>他の情報についてはまだ見れていないので<br /> 時間見つけて触ってみたいです。pull requestくれても良いですよ!?</p> <p>簡単ですが、以上になります。お読みいただきありがとうございました!</p> <p>次のエントリをお楽しみに!!</p> <h2 id="余談: あれ?makeの話は?"><a href="#%E4%BD%99%E8%AB%87%3A+%E3%81%82%E3%82%8C%EF%BC%9Fmake%E3%81%AE%E8%A9%B1%E3%81%AF%EF%BC%9F">余談: あれ?makeの話は?</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/u110/my_runtastic_data/blob/master/Makefile">https://github.com/u110/my_runtastic_data/blob/master/Makefile</a></p> <p>経緯度の情報をマスキングする処理だけ書きましたが、<br /> 物足りなかったのでデータ分析にしましたw</p> u110