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 みたいなもの
## "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
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