HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

jupyter lab appを使ってみた

jupyter labのスタンドアローン版というのが最近リリースされたらしいです。

forest.watch.impress.co.jp

そういや昔ちょろっと聞いたような気がするなーと思ってたんですが、リリース履歴を見ると3年ほど放置されてたようですね。

github.com

私がjupyter labを使う時は、

  1. google colabで使う
  2. dockerからjupyter/scipy-notebook を起動して使う

のどちらかでやってたんですが、どちらの場合も起動した後で必要なファイルが不足してた時に取りに行くのが面倒 というビミョーな問題がありました。

colabの場合は、小さめのファイルなら都度アップロードすれば良いのですが、しばらく放置してるとインスタンスを落とされるという制限があります(課金すれば回避できるけど)。また、毎回アップロードするのを避けるために、必要なファイルをgoogle driveに置いて、notebookの最初の方でマウントするという運用もできるんですが、これをやると数GB単位のファイルを扱うようなコードを書いているとgoogle drive側が破綻します(こっちも課金で回避はできるけど・・・)

一方dockerの方は

docker run --rm -p8888:8888 -v${PWD}:/home/jovyan/work jupyter/scipy-notebook'

という感じで、カレントディレクトリをworkにマウントして使っているので、起動してから「しまったマウントポイントより上の階層に置いてあるファイルが必要だったorz」なんてことが稀に良くあります。

こちらも、jupyterlabの機能を使ってアップロードするなり、docker cpで送り込むという手はあるんですが、ローカルのストレージ内にあるファイルをわざわざコピーしないと使えないというのもちょっとフラストレーションが溜まります。

というわけで、どちらも一応問題無く使えてるんだけど、微妙に使い勝手が悪いのでで、問題無いようならこの機に乗り換えてみようと思います。*1

インストール

今のところhomebrewからは入れられないようなので、githubのリリースページからpkgをダウンロードしてインストールします。

Releases · jupyterlab/jupyterlab_app · GitHub

インストールは通常のmac用のアプリと同じです。 窓の杜の記事だと、インストール時に何か聞かれてるようですが、mac版では特にインストール中にいじれる設定はありませんでした。

正常にインストールできたら、こんな感じのアイコンがlaunchpadに表示されるので、これをクリックして起動します。

f:id:n_so5:20211004213200p:plain

初回起動時なのに、以前native環境にインストールしたjupyterlabを使っていた時のものと思われるnotebookがいきなり開いた状態で起動したので、一瞬パニックになりましたが一旦全部のタブを閉じてアプリを終了してから再度起動すると、こんな感じのlauncher画面になります。

f:id:n_so5:20211004233502j:plain

窓の杜の記事をざっと見たところ、jupyter lab app専用にcondaでpythonもパッケージも入れてくれているという話だったので、まずはその辺を確認しましょう。

terminalタブを開いて、バージョンを確認します。

MBA:so5 so5$ python --version
Python 2.7.16
MBA:so5 so5$ python3 --version
Python 3.8.9

続いてterminal appを起動してpythonのバージョンを確認します。

so5@MBA ~ % python --version
Python 2.7.16
so5@MBA ~ % python3 --version
Python 3.9.7

確かにpython3のバージョンが違うものが使われてますね。

入っているパッケージも一応比較してみましょう。

MBA:so5 so5$ conda list
# packages in environment at /Applications/JupyterLab.app/Contents/Resources/jlab_server:
#
# Name                    Version                   Build  Channel
anyio                     3.3.2            py38h50d1736_0    conda-forge
appnope                   0.1.2            py38h50d1736_1    conda-forge
argon2-cffi               20.1.0           py38h96a0964_2    conda-forge
async_generator           1.10                       py_0    conda-forge
attrs                     21.2.0             pyhd8ed1ab_0    conda-forge
babel                     2.9.1              pyh44b312d_0    conda-forge
backcall                  0.2.0              pyh9f0ad1d_0    conda-forge
backports                 1.0                        py_2    conda-forge
backports.functools_lru_cache 1.6.4              pyhd8ed1ab_0    conda-forge
bleach                    4.1.0              pyhd8ed1ab_0    conda-forge
brotlipy                  0.7.0           py38h96a0964_1001    conda-forge
ca-certificates           2021.5.30            h033912b_0    conda-forge
certifi                   2021.5.30        py38h50d1736_0    conda-forge
cffi                      1.14.6           py38h1a44b6c_1    conda-forge
chardet                   4.0.0            py38h50d1736_1    conda-forge
charset-normalizer        2.0.0              pyhd8ed1ab_0    conda-forge
colorama                  0.4.4              pyh9f0ad1d_0    conda-forge
conda                     4.10.3           py38h50d1736_2    conda-forge
conda-package-handling    1.7.3            py38h96a0964_0    conda-forge
cryptography              3.4.7            py38h1fa4640_0    conda-forge
cycler                    0.10.0                     py_2    conda-forge
debugpy                   1.4.1            py38ha048514_0    conda-forge
decorator                 5.1.0              pyhd8ed1ab_0    conda-forge
defusedxml                0.7.1              pyhd8ed1ab_0    conda-forge
entrypoints               0.3             pyhd8ed1ab_1003    conda-forge
freetype                  2.10.4               h4cff582_1    conda-forge
idna                      3.1                pyhd3deb0d_0    conda-forge
importlib-metadata        4.8.1            py38h50d1736_0    conda-forge
ipykernel                 6.4.1            py38h5fd9f69_0    conda-forge
ipython                   7.28.0           py38h5fd9f69_0    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
ipywidgets                7.6.5              pyhd8ed1ab_0    conda-forge
jbig                      2.1               h0d85af4_2003    conda-forge
jedi                      0.18.0           py38h50d1736_2    conda-forge
jinja2                    3.0.1              pyhd8ed1ab_0    conda-forge
jpeg                      9d                   hbcb3906_0    conda-forge
json5                     0.9.5              pyh9f0ad1d_0    conda-forge
jsonschema                3.2.0              pyhd8ed1ab_3    conda-forge
jupyter_client            7.0.3              pyhd8ed1ab_0    conda-forge
jupyter_core              4.8.1            py38h50d1736_0    conda-forge
jupyter_server            1.11.0             pyhd8ed1ab_0    conda-forge
jupyterlab                3.1.13             pyhd8ed1ab_0    conda-forge
jupyterlab_pygments       0.1.2              pyh9f0ad1d_0    conda-forge
jupyterlab_server         2.8.2              pyhd8ed1ab_0    conda-forge
jupyterlab_widgets        1.0.2              pyhd8ed1ab_0    conda-forge
kiwisolver                1.3.2            py38h12bbefe_0    conda-forge
lcms2                     2.12                 h577c468_0    conda-forge
lerc                      2.2.1                h046ec9c_0    conda-forge
libblas                   3.9.0           11_osx64_openblas    conda-forge
libcblas                  3.9.0           11_osx64_openblas    conda-forge
libcxx                    12.0.1               habf9029_0    conda-forge
libdeflate                1.7                  h35c211d_5    conda-forge
libffi                    3.4.2                he49afe7_4    conda-forge
libgfortran               5.0.0           9_3_0_h6c81a4c_23    conda-forge
libgfortran5              9.3.0               h6c81a4c_23    conda-forge
liblapack                 3.9.0           11_osx64_openblas    conda-forge
libopenblas               0.3.17          openmp_h3351f45_1    conda-forge
libpng                    1.6.37               h7cec526_2    conda-forge
libsodium                 1.0.18               hbcb3906_1    conda-forge
libtiff                   4.3.0                h1167814_1    conda-forge
libwebp-base              1.2.1                h0d85af4_0    conda-forge
llvm-openmp               12.0.1               hda6cdc1_1    conda-forge
lz4-c                     1.9.3                he49afe7_1    conda-forge
markupsafe                2.0.1            py38h96a0964_0    conda-forge
matplotlib-base           3.4.3            py38hc7d2367_1    conda-forge
matplotlib-inline         0.1.3              pyhd8ed1ab_0    conda-forge
mistune                   0.8.4           py38h96a0964_1004    conda-forge
nbclassic                 0.3.2              pyhd8ed1ab_0    conda-forge
nbclient                  0.5.4              pyhd8ed1ab_0    conda-forge
nbconvert                 6.2.0            py38h50d1736_0    conda-forge
nbformat                  5.1.3              pyhd8ed1ab_0    conda-forge
ncurses                   6.2                  h2e338ed_4    conda-forge
nest-asyncio              1.5.1              pyhd8ed1ab_0    conda-forge
notebook                  6.4.4              pyha770c72_0    conda-forge
numpy                     1.21.2           py38h49b9922_0    conda-forge
olefile                   0.46               pyh9f0ad1d_1    conda-forge
openjpeg                  2.4.0                h6e7aa92_1    conda-forge
openssl                   1.1.1l               h0d85af4_0    conda-forge
packaging                 21.0               pyhd8ed1ab_0    conda-forge
pandas                    1.3.3            py38ha53d530_0    conda-forge
pandoc                    2.14.2               h0d85af4_0    conda-forge
pandocfilters             1.5.0              pyhd8ed1ab_0    conda-forge
parso                     0.8.2              pyhd8ed1ab_0    conda-forge
patsy                     0.5.2              pyhd8ed1ab_0    conda-forge
pexpect                   4.8.0              pyh9f0ad1d_2    conda-forge
pickleshare               0.7.5                   py_1003    conda-forge
pillow                    8.3.2            py38hee640a0_0    conda-forge
pip                       21.2.4             pyhd8ed1ab_0    conda-forge
prometheus_client         0.11.0             pyhd8ed1ab_0    conda-forge
prompt-toolkit            3.0.20             pyha770c72_0    conda-forge
ptyprocess                0.7.0              pyhd3deb0d_0    conda-forge
pycosat                   0.6.3           py38h96a0964_1006    conda-forge
pycparser                 2.20               pyh9f0ad1d_2    conda-forge
pygments                  2.10.0             pyhd8ed1ab_0    conda-forge
pyopenssl                 20.0.1             pyhd8ed1ab_0    conda-forge
pyparsing                 2.4.7              pyh9f0ad1d_0    conda-forge
pyrsistent                0.17.3           py38h96a0964_2    conda-forge
pysocks                   1.7.1            py38h50d1736_3    conda-forge
python                    3.8.12          h17280f6_0_cpython    conda-forge
python-dateutil           2.8.2              pyhd8ed1ab_0    conda-forge
python_abi                3.8                      2_cp38    conda-forge
pytz                      2021.1             pyhd8ed1ab_0    conda-forge
pyzmq                     22.3.0           py38hd3b92b6_0    conda-forge
readline                  8.1                  h05e3726_0    conda-forge
requests                  2.26.0             pyhd8ed1ab_0    conda-forge
requests-unixsocket       0.2.0                      py_0    conda-forge
ruamel_yaml               0.15.80         py38h96a0964_1004    conda-forge
scipy                     1.7.1            py38hd329d04_0    conda-forge
seaborn                   0.11.2               hd8ed1ab_0    conda-forge
seaborn-base              0.11.2             pyhd8ed1ab_0    conda-forge
send2trash                1.8.0              pyhd8ed1ab_0    conda-forge
setuptools                58.0.4           py38h50d1736_2    conda-forge
six                       1.16.0             pyh6c4a22f_0    conda-forge
sniffio                   1.2.0            py38h50d1736_1    conda-forge
sqlite                    3.36.0               h23a322b_2    conda-forge
statsmodels               0.12.2           py38hbe852b5_0    conda-forge
terminado                 0.12.1           py38h50d1736_0    conda-forge
testpath                  0.5.0              pyhd8ed1ab_0    conda-forge
tk                        8.6.11               h5dbffcc_1    conda-forge
tornado                   6.1              py38h96a0964_1    conda-forge
tqdm                      4.62.3             pyhd8ed1ab_0    conda-forge
traitlets                 5.1.0              pyhd8ed1ab_0    conda-forge
urllib3                   1.26.7             pyhd8ed1ab_0    conda-forge
wcwidth                   0.2.5              pyh9f0ad1d_2    conda-forge
webencodings              0.5.1                      py_1    conda-forge
websocket-client          0.57.0           py38h50d1736_4    conda-forge
wheel                     0.37.0             pyhd8ed1ab_1    conda-forge
widgetsnbextension        3.5.1            py38h50d1736_4    conda-forge
xz                        5.2.5                haf1e3a3_1    conda-forge
yaml                      0.2.5                haf1e3a3_0    conda-forge
zeromq                    4.3.4                he49afe7_1    conda-forge
zipp                      3.5.0              pyhd8ed1ab_0    conda-forge
zlib                      1.2.11            h7795811_1010    conda-forge
zstd                      1.5.0                h582d3a0_0    conda-forge

listの中にseabornが入っていますが、実はこれ初期状態でリストを取るのを忘れてて、私が後から入れてしまったパッケージなので、デフォルトでは入ってません。 しかし、pandas, matplotlib, numpy, scipyあたりは入ってるので*2この辺を使いたい人は特に追加で入れなくてもひととおり揃った環境と言えそうです。

terminal appではそもそもcondaにパスが通っていないので、違うところを見てるのは間違いないのですが 一応pip3で確認すると、これだけしかパッケージは入ってませんでした。

so5@MBA ~ % pip3 list
Package    Version
---------- -------
labelImg   1.8.5
lxml       4.6.3
pip        21.2.4
PyQt5      5.15.4
PyQt5-sip  12.8.1
setuptools 57.4.0
wheel      0.37.0

というわけで、こちらの環境をどんなにいじったところで、デフォルトのpython環境には影響しないようです。

私みたいにjupyter labをpytonの開発環境として使ってると、jupyter labで開発してファイルに保存したpythonスクリプトをterminaから起動しようとして依存パッケージが足りないなんていうトラブルが起きそうな気もしますが、そんときゃそん時でなんとかしましょう :p

使い方

使い方は通常のjupyterlabやgoogle colabなんかと概ね同じ感じです。

colabとjupyterlabでショートカットキーとか色々と違うだろうという意見もあるかと思いますが、正直に言うとどちらもそんなに使い込んでないので、私にはレビューのしようがありませんo...rz

とりあえず、先週末にインストールして3日ほど使った感じでは、特に違和感無く使えています。

また、webアプリとして使っていた時と違って、CTRL+TABで簡単に切り替えられるので、ブラウザのタブを大量に開いて調べながらコードを書いてる時なんかは、すぐに戻ってこれるのが地味に便利ですw

まとめ

まとめるほどの内容もないんですが、最後にひとことだけ書いとくと

「jupyter lab appはいいぞ」

*1:といっても、colabはガチャで良いの引けばGPUが使えるなど、ローカルPCには無い魅力もあるので、使い続けるとは思いますが

*2:って良く考えたらanacondaのデフォルトで入るんでしたっけ?

docker imageのベースに何を使うのが良いか?

docker imageを作る時のベースイメージとして、なるべくサイズを抑えたい層向けにはalpine linuxがよく使われていると思いますが、あれだとソースからビルド何かビルドしようとすると、ちょくちょくトラブるんですよね。

特にalpine linuxベースでいろいろと依存ライブラリやらソフトのビルド設定を追加してすくすくと育てていったDockerfileに、最後にインストールしようとしたソフトがビルドできなかった時とか辛いですよね。

こんなに、悲しいのなら苦しいのなら・・・・愛などいらぬ!!

というわけで、alpine以外のメジャーなディストロのイメージサイズを調べてみました。

% docker images
REPOSITORY               TAG       IMAGE ID       CREATED             SIZE
centos                   latest    e6a0117ec169   6 days ago          272MB
opensuse/leap            latest    37f8370bfe62   12 days ago    126MB
opensuse/tumbleweed      latest    91ce1acd49a8   2 weeks ago    120MB
debian                   latest    d04e7939dfd8   2 weeks ago         118MB
ubuntu                   latest    54ab604fab8d   3 weeks ago         65.6MB
alpine                   latest    bb3de5531c18   3 weeks ago         5.34MB
fedora                   latest    2f61b50da868   2 months ago        208MB
archlinux                latest    1d6f90387c13   3 weeks ago    381MB

なお、arch linuxはM1 mac用が無いようなので、amd64のイメージ。他は全てlinux/arm64/v8のイメージサイズです。

改めて並べてみるとalpine linuxのサイズ(5.34MB)が飛び抜けて小さいですね。

でも、この後に起こるトラブルを回避すると考えると、ubuntuの65MBは十分許容範囲と言えそうです。 ま、色々とパッケージを追加したらサイズは膨れあがってくんですけどね orz

ラズパイで天体望遠鏡を動かそうその2

前回の続きで、いくつか残っている問題について調査していきます。

hpcmemo.hatenablog.com

現状で問題になってるのは次の3点なんですが、とりあえずカメラのことは置いときます(単にモニターに出力するだけならraspividのpreview画面で見れるので、月とか惑星を見るくらいなら支障は無いですし)

  1. ゲームパッド十字キーの左右と望遠鏡の向きの左右が反転してる
  2. 十字キーを数回チョイ押しして微調整してると動き出したまま止まらなくなることが多々ある
  3. ラズパイHQカメラドライバが動かない

1、2はどうせゲームパッドを変えれば解決するだろうと思って、最初に使っていたbuffaloのスーファミコントローラ風のものをやめて、ジャンク品置き場に放り込んであった、PS風のとか、ニンテンドーswitchのプロコン風のとか色々試してみましたが、どれも同じ症状。 Indiのforumにもざっくりと書いてみたものの無反応だったので、こりゃひょっとしてAZ-GTiとAZ-GTeで微妙に挙動が違うとかなのかと半ば諦めてたんですが、こちらにめっちゃ重要な情報が書いてありました。

na-o-s.hateblo.jp

経緯台モードで使用する場合のドライバは Skywatcher Alt-Az です。 紛らわしいですが AZ-GTi ドライバは EQMod ドライバをベースにしたもので、赤道儀モード専用です。

うちの、AZ-GTeは経緯台モード。で、ドライバはどれを使っていたかというと

f:id:n_so5:20210829163252p:plain

AZ-GTiドライバですね o...rz

ドライバを入れ替えただけで無事に1、2、ともに解決しました。

あと残った問題は、ラズパイHQカメラのドライバが動かない問題なんですが、これはINDIをソースからビルドすればOKという話をちらっとみかけたので時間のある時にやってみようと思います。

ラズパイで天体望遠鏡を動かそう!

1年ほど前に生まれて初めて天体望遠鏡を買いました。

当時小4の子供の夏休みの宿題で「月の写真を撮ってくること」というのがあって、子供と一緒に一眼レフ+望遠レンズで写真を撮ってました。

その時の機材は、オリンパスのE620に50-200という構成でしたが、フルサイズ換算で400mmではイマイチ迫力に欠けるので、cannonの800mmのレンズにマウントアダプターつけて付けれないかなーとか、ニコンのP1000はどうかなーとか色々考えていたところにこの商品を見つけて5万円切ってるなんて激安じゃないか!*1という錯覚から衝動買いしてしまったのです :p

この機種はAZ-GTeという自動導入ができる架台がセットになっているもので、スマホアプリから操作できますというのがウリなんですが、買ってしばらく使っているうちに重大な欠点に気付きました。




  画面を見ずにタッチパネルを操作するのは人類には早すぎる


この機種、自動導入の仕組みがついていて、アプリから目当ての星を選ぶと望遠鏡をそっちに向けてくれるんですが、この機能を使うためには最初にアライメントという操作をする必要があります。

この時、天体望遠鏡を覗きながらアプリの画面に表示された上下左右のカーソルで微調整をして、選んだ星が視野の中心にくるように微調整する必要があるんですが、天体望遠鏡を覗きながらアプリの画面も見るのは至難の技。かといって画面を見ずにタッチパネルでカーソル操作も不可能というわけで、手探りで上下左右に動したいと思っていました。

有線接続用のポートがあるので、そこにwiiのヌンチャクを繋ぐというのが定石のようなのですが(たぶん誤解)そもそもwiiのヌンチャクを手に入れるところから結構な難易度です。

az-nunchuk.fun

幸いなことに、USBのジョイパッドとラズパイが余ってたので、こちらを使う方向で検討していました。

ラズパイでジョイパッドの入力を受け取るのは pygame https://www.pygame.org でできるし、AZ-GTeの操作自体はUDPで通信するだけで良いらしいので、これはもう楽勝でしょう。

と思って、昨年末くらいからパーツを買い集めたり情報収集したりして「おれ、このプロジェクトが終わったらラズパイで天体望遠鏡をいじって遊ぶんだ」みたいなフラグを立てたりもしてたんですが、その途中でこちらのソフトの存在を知りました。

www.indilib.org

これのdriverのところを見ていくと、AZ-GTi(AZ-GTeの上位機種、ソフト的には同じものらしいけど、ロータリーエンコーダが入ってて、モータを使わずに動かしても向きを認識してくれる)も使えるし、ジョイパッドも対応しているようです。

「巨人の肩の上には積極的に乗っていく」が信条の私としてはこりゃ使わざるを得ない、というわけで「indi libraryをインストールしたラズパイを使って、ジョイパッドでAZ-GTeを操作する」という方針に変更してようやく使えるようになったので、セットアップ方法についてメモを残しておきます(ここまで前置き)

インストール

ラズパイは、この辺でラズパイ4にインストールしてたSDカードを、その辺に転がってたラズパイ zero WHに挿して使います。

hpcmemo.hatenablog.com hpcmemo.hatenablog.com hpcmemo.hatenablog.com

まず、indilib本体のインストールですが、公式の説明どおりに進めます。

www.indilib.org

ラズパイ側は機器の制御しかしない予定なので、"To install only INDI Library with basic drivers"の部分に書かれているパッケージだけ入れます。

> wget -O - https://www.astroberry.io/repo/key | sudo apt-key add -
--2021-08-29 13:27:22--  https://www.astroberry.io/repo/key
www.astroberry.io (www.astroberry.io) をDNSに問いあわせています... 87.98.235.184
www.astroberry.io (www.astroberry.io)|87.98.235.184|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 4365 (4.3K)
`STDOUT' に保存中

-                             100%[=================================================>]   4.26K  --.-KB/s 時間 0s       

2021-08-29 13:27:26 (29.9 MB/s) - stdout へ出力完了 [4365/4365]

OK
> sudo su -c "echo 'deb https://www.astroberry.io/repo/ buster main' > /etc/apt/sources.list.d/astroberry.list"
> sudo apt update
取得:1 http://archive.raspberrypi.org/debian buster InRelease [32.6 kB]                                                
・
・
・
アップグレードできるパッケージが 163 個あります。表示するには 'apt list --upgradable' を実行してください。

そういえば、半年近くアップデートしてなかったので、アップデート可能なパッケージがたまってたようです。 kernelとかまで含まれているので、一応全部最新版にして再起動しておきます。

その後に、次のコマンドでindi libとAZ-GTiドライバを順にインストールします。

> sudo apt install libindi1 indi-bin
> sudo apt-get install indi-eqmod

最後に、確認のため次のコマンドでindi serverを起動します。

>indiserver -v indi_eqmod_telescope indi_joystick
2021-08-29T05:14:01: startup: indiserver -v indi_eqmod_telescope indi_joystick 
2021-08-29T05:14:01: Driver indi_eqmod_telescope: pid=10730 rfd=3 wfd=6 efd=7
2021-08-29T05:14:01: Driver indi_joystick: pid=10731 rfd=4 wfd=9 efd=10
2021-08-29T05:14:01: listening to port 7624 on fd 5
2021-08-29T05:14:02: Driver indi_eqmod_telescope: snooping on GPS Simulator.GEOGRAPHIC_COORD
2021-08-29T05:14:02: Driver indi_eqmod_telescope: snooping on GPS Simulator.TIME_UTC
2021-08-29T05:14:02: Driver indi_eqmod_telescope: snooping on Dome Simulator.DOME_PARK
2021-08-29T05:14:02: Driver indi_eqmod_telescope: snooping on Dome Simulator.DOME_SHUTTER
2021-08-29T05:14:02: Driver indi_eqmod_telescope: Using prefix /usr/share/indi//indi_eqmod_sk.xml
2021-08-29T05:14:02: Driver indi_eqmod_telescope: Using prefix /usr/share/indi//indi_align_sk.xml
2021-08-29T05:14:02: Driver indi_eqmod_telescope: Using prefix /usr/share/indi//indi_eqmod_simulator_sk.xml
2021-08-29T05:14:02: Driver indi_eqmod_telescope: Using prefix /usr/share/indi//indi_eqmod_scope_limits_sk.xml
2021-08-29T05:14:02: Driver indi_eqmod_telescope: EnumeratePlugins - found plugin SVD Math Plugin

こんな感じの出力が見れたら大丈夫です。続いて、indi webmanagerをインストールします。

github.com

このソフトは、リモートからindiserverの起動をしたり止めたりするためのツールで、後で出てきますがPCからKstarsというソフトでセットアップやコントロールをする時に使うそうです。

> sudo pip install indiweb
> indi-web -v

別のPCでブラウザを開いて、次のURLへアクセスします。

http://raspberrypi.local:8624

次のような画面が表示されたら正常にインストールできています。

f:id:n_so5:20210829163107p:plain

一旦ブラウザを閉じてPCにKstarsをインストールします。

edu.kde.org

macだと署名の関係で初回は素直に起動できませんが、(Launchpadからではなく)FinderからKStarsを右クリックして ctrlを押しながら開くを選択すれば起動できます。

support.apple.com

初回起動時の設定を終えてメイン画面が表示されると、上の方にずらっとツールバーが並んでいます。 このうち赤枠で囲ったドームっぽいアイコンをクリックすると、EKOSというINDIの設定アプリが立ち上がるので、そちらで設定をします。

f:id:n_so5:20210829172234p:plain

設定内容は次のとおり。

  • Modeは "remote"
  • Host はラズパイのホスト名を入れる
  • "INDI Web Manager"にチェックを入れる
  • Mountを"AZ-GTi"に
  • Aux1を"Joystick"に

最後にSAVEしてこの画面での設定は終わりです。

続いて、こちらのstartボタンを押すと、"INDI Control Panel"というウィンドウがさらに立ち上がります。

f:id:n_so5:20210829172747p:plain

まずJoyStickタブの中のMonitorタブに移動して動作確認をします。 よくあるゲームパッドの設定画面とおなじで、パッドを押すとそれに応じて画面上のボタンにチェックがつきます。一応、全ボタンが反応するか確認しておきましょう。

f:id:n_so5:20210829173136p:plain

次にAZ-GTiタブに移動します。

画面の下の方にログが表示されているんですが、うちの場合は次のような感じで、延々と接続に失敗したというメッセージが出つづけてました。

2021-08-29T08:29:41: [INFO] AZ-GTi is offline. 
2021-08-29T08:29:41: [ERROR] Error: Communication failed -> tty read failed, check connection: Read Error: Resource temporarily unavailable 
2021-08-29T08:29:26: [INFO] Connecting to 192.168.4.1@11880 ... 

これは、INDIとしてはAZ-GTeのAPモードのつもりで接続しようとしているけど、ラズパイのwifiは家庭内LANに繋っているのでアクセスできないというのが原因でした。

VNCでラズパイに接続して、右上の方に常駐してるアプリからAZ-GTeのSSIDを選んで接続します。接続した瞬間にPCとラズパイの接続が切れるので、VNCの画面が固まりますがもう用済みなのでそのまま閉じておきます。

PCもAZ-GTeの無線LANに繋いで、kstarsやもろもろのアプリをもう一度起動すると、正常に接続できているはずです。 *2

このままだと再起動する度に元の無線LANに繋がります。こちらのページを参考にwpa_supplicant.confを編集してAZ-GTeの方のpriorityを大きくしておきましょう。

qiita.com

INDI Control Panelに戻ってAZ-GTiタブの中のOptionタブで、Joystickを"Enable"に設定すると、ジョイスティックでぐるぐる望遠鏡を動かすことができます。

f:id:n_so5:20210831233848p:plain

ひと通り動かして操作を堪能したら最後にあと2つほど設定をしておきます。

1つ目はキーアサインの変更です。なぜかデフォルト設定ではボタン1、2、3という押しやすいボタンにabort, park, unparkといううっかり押すとパニック必須の機能がアサインされているので、これを全部削除します。 といってもアサイン無しにはできないようなので、自分が使っているジョイスティックについていないボタン(私の場合はボタン10, 11,12)を設定しておきます。

この設定画面、残念ながら直感的な操作ができないUIなんですが、2列並んでいる入力欄っぽいもののうち左の列は現在の設定値を表示するだけ(編集できない)、右の列が新しい設定値を入力する欄となっています。 なので、右側の列に設定する値を入れてその右にある"set"ボタンを押すと設定できます。

f:id:n_so5:20210831235303p:plain

設定が終わったら、optionタブに移動してsaveボタンを押しておきましょう。これで次回起動した時は、ここで設定した値が使われます。

f:id:n_so5:20210831235559p:plain

もう1つの設定は、inidi-webの自動起動設定です。こちらの説明にあるようにsystemd経由でラズパイの起動時にindi-webが実行できるようにしましょう。

github.com

基本的には、ここの説明どおりなんですが、pipでインストールすると設定ファイル(indiwebmanager.service)はインストールされないようなので、githubからダウンロードして /etc/systemd/system/ に置きます。

https://raw.githubusercontent.com/knro/indiwebmanager/master/indiwebmanager.service

続けて次のコマンドを実行しましょう。

> sudo chmod 644 /etc/systemd/system/indiwebmanager.service
> sudo systemctl daemon-reload
> sudo systemctl enable indiwebmanager.service

再起動して、ps -ef |grep inidi-webしてindiwebmanagerが起動しているか確認したら設定は完了です。

いやー長かったですね。次回は今の時点で未解決の問題がいくつかあるので、その辺を書いていきたいと思います。

*1:この時はセールで47800円になってました

*2:ひょっとするとアプリは再起動すら不要だったかもしれないけど、VNCが固まった時に落としてしまったので検証できてません

ITAを使ってみよう(補足編)

前回の記事からずいぶん間が空いてしまいましたが、ITAの利用方法の補足をちょっと書きます。

traceする区間の設定

ITA *1 は、ありがたいことにMPI_Initすると自動的にinitializeされMPI_Finalize時に勝手にFinalizeしてくれます。つまり何もしなければプログラムの実行開始から終了までの全ての通信をtraceしてくれます。

中身が良く分からないプログラムの解析をする時は、一回全部取ってみるというのも良いのですが、traceで記録される通信が増えるとその分trace結果のファイルサイズが増えます。このような時にはVT_traceoff()とVT_traceon()というAPIを使ってtrace対象の区間を設定することができます。

software.intel.com

software.intel.com

最初に書いたように、MPI_Initするとtrace区間が始まってしまうので、MPI_Initした直後にVT_traceoff()して、traceを取りたい区間の直前でVT_traceon()、区間を抜けたら再度VT_traceoffという使い方です。

ざっくり書くとこんな感じになります。

#include <mpi.h>
#include <VT.h>

int main(int argc, char **argv){

MPI_Init();
VT_traceoff();

・
・
・

VT_traceon();
トレースを取りたい処理
VT_traceoff();
・
・
・
MPI_FInalize();
return
}

このAPIでtrace区間を絞り込む方法は、ある程度通信の様子を見たい場所が絞り込めている時なんかも有用です。

例えば姫野ベンチで、全体のtrace情報を取るとこんな感じで、大量に通信が発生してるなーとしか見えませんが

f:id:n_so5:20210701234059p:plain

iteration loop内で10反復目のみを取ると

f:id:n_so5:20210701234143p:plain

こういった形で綺麗に1iteration分の通信が見えます。

姫野ベンチの場合、外側のループは単に同じ処理を繰り返しているだけなのであんまり効果が分からないかもしれませんが iterationが経過するにつれて通信の状況が変わるようなプログラム(粒子法とかPIC法とかAMRとかも)では領域分割がうまく行っている部分を捨てて ある程度問題が発生しそうなところにフォーカスしてトレースを取るといった使い方ができます。

ま、トレース結果のファイルサイズさえ気にしないなら、一旦全部取っておいて後の方のiterationのあたりを狙って拡大表示するという使い方でも見れますが、 実アプリでしかも実運用の規模のデータでとなると、ちょっとハンドリングに苦労する規模になるのでお勧めはできません。

単体版のアプリ

こちらのURLから単体版のアプリをインストールすることもできます。

software.intel.com

ITAは(Vtuneとかとの連携機能はあるっぽいですが)基本的にはHPCtoolkitの他のアプリには依存していないので、 スパコンでトレース情報を取って、トレースファイルを手元のPCに持って帰ってきて見るような使い方であれば、単体版の方が良いかもしれません。

ちなみに、前回の記事で紹介したHPC toolkitのdockerコンテナは23GB、ITAのインストールサイズは(windows版の場合)だいたい80MBなので200倍以上容量の節約になります。(ま、mac版が無いんでdockerを使ったわけですが・・・)

*1:正確には、ITA用のtraceファイルを作るツールであるところの ITC(Intel Trace Collector)です

macで(docker版の)ITAを使ってみよう

Intel Trace Analyzer (以下ITA)という、MPIの通信プログラムのTrace情報を採取&表示してくれる便利ソフトがあります。*1

去年、VTuneとかAdviserとかの単体製品が無償になってて、小躍りしながらこちらの記事を書いた時には、相変わらず有償のみでしかも単体販売が無いからParallel Studio Cluster Editionを導入しないと使えないというものでした。

hpcmemo.hatenablog.com

これ、named user licenseが実質使えなくて、商用利用だと2ユーザのフローティングライセンス(ご新規だと100万円超)以上のライセンスを購入しないと使えないという高嶺の花だったんですが、なんとoneAPIに入ってます!!

*     +     巛 ヽ
            〒 !   +    。     +    。     *     。
      +    。  |  |
   *     +   / /   イヤッッホォォォオオォオウ!
       ∧_∧ / /
      (´∀` / / +    。     +    。   *     。
      ,-     f
      / ュヘ    | *     +    。     +   。 +
     〈_} )   |
        /    ! +    。     +    +     *
       ./  ,ヘ  |
 ガタン ||| j  / |  | |||
――――――――――――

思わず懐しいAAを探してきてしまうほど嬉しいので、M1 macからdocker版のITAを使ってみましょう。*2

セットアップ&起動

事前に、XQuartzをインストールしておきましょう。

インストール方法は、dmgをダウンロードしてインストーラの指示どおりに操作するだけなので省略します。 なお、インストール後一回macからログアウトしておかないと正常に使えない(少なくとも私が数年前にインストールした時は駄目でした)ので、インストール作業を行なったら一回ログアウトして再ログインしてから以降の作業を続けてください。

www.xquartz.org

続いて、intel oneAPIの HPC kitのコンテナを立ち上げて、中身を確認してみましょう。以降のこの記事内では%はホストOS側のコマンドプロンプト#はコンテナ内のコマンドプロンプトをあらわします。

ducker runにつけている --platform linux/amd64というオプションはintelアーキテクチャ用のコンテナを使うという指定です。 今回のone API HPC kitのように、intel用しか用意されていないコンテナをM1 macから起動する時は指定していないと、コンテナが無いと言われて起動できません。

% docker run -it  --rm --name test --platform linux/amd64 intel/oneapi-hpckit /bin/bash 

# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"
# ps -ef |grep sshd
root        39     1  0 09:16 pts/0    00:00:00 /usr/bin/qemu-x86_64 /bin/grep --color=auto sshd
# apt list --installed |grep ssh

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

さて、立ち上げてsshの状況を確認してみたところ、どうやらインストールすらされていないようです。

sshが無いことには始まらないのでインストールしてsshでログインできるようにしましょう。

# apt install ssh -y
# cd /etc/ssh
# sed -i '/PermitRootLogin/s/^.*$/PermitRootLogin yes/' sshd_config
# mkdir /root/.ssh
# mkdir /run/sshd
# chmod 0755 /run/sshd
# /usr/sbin/sshd -D

次に、別のターミナルを立ち上げて公開鍵をコンテナ内にコピーします。

testの部分は、docker runした時に--nameオプションで指定した名前です。

% docker cp ~/.ssh/id_rsa.pub test:/root/.ssh/authorized_keys
% docker exec test chown root:root /root/.ssh/authorized_keys

ここまで設定すると公開鍵認証でログインできるはずなので、ホストからログインできるか確認します。

% ssh root@localhost -p 10022
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.10.25-linuxkit x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.
Last login: Fri Apr  9 22:22:16 2021 from 172.17.0.1

続けて、X11の転送を行なうための設定をします。

コンテナ内でsshd_configを書き換えて、X11UseLocalhosts を no に設定します。

# sed -i '/X11UseLocalhost/s/^.*$/X11UseLocalhost no/' /etc/ssh/sshd_config

この後、sshdを一回終了して立ち上げ直し、-Xオプションを付けてsshでログインすればXアプリが使えます。 試しにx11-appsをインストールして、xeyesが動くか確かめてみましょう。

$ ssh -X root@localhost -p 10022
# apt install x11-apps -y
# xeyes&

f:id:n_so5:20210412224502p:plain

無事にXの転送もできるようになりました。

続けて、ITAを起動してみましょう。

# . /opt/intel/oneapi/setvars.sh 
 
:: initializing oneAPI environment ...
   bash: BASH_VERSION = 4.4.20(1)-release
:: advisor -- latest
:: ccl -- latest
:: clck -- latest
:: compiler -- latest
:: dal -- latest
:: debugger -- latest
:: dev-utilities -- latest
:: dnnl -- latest
:: dpl -- latest
:: inspector -- latest
:: intelpython -- latest
:: ipp -- latest
:: ippcp -- latest
:: itac -- latest
:: mkl -- latest
:: mpi -- latest
:: tbb -- latest
:: vpl -- latest
:: vtune -- latest
:: oneAPI environment initialized ::

# traceanalyzer &

f:id:n_so5:20210413071218p:plain

おー無事に起動しました。

これで、インストール作業(?)は無事完了です。

ここまでの作業をまとめたDockerfileをこちらに置いておきます。

gistab9eef0de1d6021289b999367e06501b

ついでに、rootのログイン時に/opt/intel/oneapi/setvars.shを読み込むように設定しているので ログインしてそのままコマンドを実行すればtraceanalyzerが起動します。 *3

なお、動作確認用にインストールしたx11-appsですが、これのインストールを行なわないとtraceanalyzerが起動しなかったので、素のhpckitのコンテナは何か依存パッケージが欠けてるのかもしれません。

このDockerファイルを適当なディレクトリにダウンロードして、そのディレクトリ内で次のコマンドを実行するとセットアップできます。

> docker build -t oneapi .
> docker run  -d -p127.0.0.1:10022:22  -v${PWD}:${PWD} --rm --name oneapi oneapi 
> docker cp ~/.ssh/id_rsa.pub oneapi:/root/.ssh/authorized_keys
> docker exec oneapi chown root:root /root/.ssh/authorized_keys
> ssh -X root@localhost -p 10022
# traceanalyzer &

この例ではイメージ名もコンテナ名もoneapiとしてます。また、-v${PWD}:${PWD}オプションを指定することでホストのカレントディレクトリ以下に、同じ絶対パスでコンテナからアクセスできるようにしています。

ITAでのリモート性能情報の採取

Intel MPIライブラリをリンクした実行ファイルで、ITA用のトレースファイルを作成するには、-traceオプションを付けてmpirunを実行するだけです。 〜.stfという名前でずらーっとファイルが生成されますので、これをコンテナにマウントしたディレクトリ以下に置きましょう。

ITAで測定結果を表示

traceanalyzerを起動したあとで表示される初期画面で、[open file]ボタンを押して適当なSTFファイルを読み込むと次のようなサマリ画面が表示されます。

f:id:n_so5:20210418134454p:plain

Ratioのところに、Serial Code、OpenMP、MPI callsという円グラフが見えますが、これは全体の実行時間を次の3つに分類したものです。

  1. OpenMP化されていない部分の実行時間
  2. OpenMP並列化された部分の実行時間
  3. 通信時間

1が多い(&ハイブリッド並列のつもり)なら、OpenMP化できるところが無いかAdvisorで見てみましょう。

2が多いならOpenMP化に問題が無いか、VTuneで見てみましょう。

3が多いなら、Trace Analyzerで通信に問題が無いか見てみましょう。

という意図のようで、Trace AnalyzerからAdvisorやVTuneが起動できるそうです(使ったことないけど)*4

とりあえずTrace Analyzerを見たいので、右上の[Continue]をクリックしてください。

f:id:n_so5:20210418134258p:plain

これがデフォルトのビューですが、まるで何も分かりませんね。

まず、Chartメニューから"MessageProfile"を表示してみましょう。

f:id:n_so5:20210418135603p:plain

これは、あるRankから別のあるRankへの通信時間を行列形式で表わしたものです。

縦に並んでいる方のラベルが、送信Rank、横に並んでいる方のRankが受信Rankなので、この例ではRank1〜7がRank0へ 軽い送信をしているのと、Rank0-1, Rank2-3, Rank4-5, Rank6-7の各ペアでそれぞれ通信している様子が分かります。

このTrace fileは、Intel MPI Benchmarkで、PingPongとPingPingを実行した時のものなので、この図のように綺麗に分かれていますが、実アプリではインバランスがあったり、特定のRankに通信の負荷が集中していたりすることがあります。 そのような場合は(相対的に)重たい通信をしているペアが赤く表示されるので、そのRankを中心に改善できないか検討すれば良いということが分かります。

あと、Gather/Scatterみたいな1対Nの通信が多いと、特定の行または列のみ赤くなるので、こちらも要検討です。

もう一つtrace analyzerで重要な図がEvent Timelineです。こちらもChartメニューから選択すると表示できます。

f:id:n_so5:20210418141006p:plain

このメニューは、見るとなんとなく想像が付くと思いますが、Rank毎にMPI関数のcall(赤い領域)とその他の関数call(水色の領域)、それからRank間の通信(青または黒の線)が行なわれた様子を表したものです。

これだけだとちょっと分かり難いので、右クリックして表示されるメニューで"Ungroup Group MPI"を選んでください。

f:id:n_so5:20210418141310p:plain

この設定を行なうと、今までMPI関数は全部"MPI"としてまとめられていたものが、関数名毎の表示に切り替わります。

f:id:n_so5:20210418141723p:plain

説明の順番が前後しましたが、グラフ上でドラッグすれば表示領域をズームインできます。*5

f:id:n_so5:20210418141950p:plain

一番上にちょろっと全体マップが表示されているので、ズームアウトしたい時はこちらでドラッグしてください。

さて、このEvent Timelineですが、プロファイルで(accumulateされた)値を見てもよく分からんけど、特定のタイミングで通信が時々おかしいなんていうのを見つけるのにも使えますし、通信が意図したとおりに行なわれているかのチェックにも使えます。

たとえば、前の例ではペアになっているRankが同時にMPI_Isendを発行して、その後のMPI_Recvで受信する(Ping-Ping)の形になっていますが、こちらの例だと偶数Rankが送信して、奇数Rankが受信した後に返信する(Ping-Pong)の形になっています。

f:id:n_so5:20210418142741p:plain

時々意図しない順番で送受信していて、オーバーラップしたつもりができていなかったり、無駄に待ち時間が発生してたりすることがありますが、そういうトラブルも簡単に見つけることができます。

もっと詳しい使い方が知りたいという方は、こちらに公式のドキュメントがあるのでこちらをご覧ください。

software.intel.com

まだ書きたいことはあるんですが、ずいぶん長くなってきたので今回はこの辺で一旦終わりにします。

*1:正確には、採取する方はIntel Trace Collectorなんですが、パッケージは一緒なので・・・

*2:macネイティブ版は無いからXを飛ばして使うしか無いとはいえ、スパコンのフロントエンドからXを飛ばすのに比べれば格段に使い易いはず

*3:iccとかも使えますし、元々makeやcmakeも入っていたのでこのコンテナを使って起動時のオプションを渡してあげれば、ログインせずにビルドすることもできます。

*4:そもそも先にプロファイルを取って、なんか通信がボトルネックになってるぞって分かってからtraceとるので・・・

*5:ビデオとかオーディオ系のアプリでよくあるパターンですね

ラズパイ4のセットアップ(その3)

昨日積み残していた、画面周りの設定を追加します。

その前に、ひょっとしてlinux用のbonjourクライアントがあればラズパイに突っ込んでおけばいちいちIPアドレスを調べなくてもアクセスできるんじゃないか?と思い立って調べてみました。

結論から言うと

  • デフォルトで有効
  • raspberrypi.local でアクセス可能

ということでしたorz *1

Raspberry Piに Avahi Bonjourサービスを入れて、ホスト名で接続できる様にする方法 (ラズパイに Bonjourサービスを入れて IPアドレスが分からなくてもホスト名で簡単に接続する方法)

というわけで、これからは[raspberrypi.local]というマシンが出てきたら、ラズパイのことだと思ってくださいw *2

さて、昨日の時点で残っていた問題は、「カメラの映像がリモートマシンで見れない」ということでした。 正確には、picamera(やpicameraを使っているraspistillコマンドとか)が、Xクライアントじゃなくて、linuxfbに直で書き込んでいるのでsshの接続元に飛ばせないということです。

そもそも、なんでリモート側で画面を見たいかというと・・・机が狭いんでラズパイ用のディスプレイを片付けたいだけなんですw

しかも、ほとんどの作業はsshでログインしてCUIでやるので、本当に必要なのはカメラの映像を見る時くらいのもの。それもテスト用途なので特にパフォーマンスは求めていません。というわけで、一番お手軽なリモート画面転送ソリューションであるところのVNCでアクセスできるようにしましょう。

ラズパイのVNCサーバを有効にするには、sshでログインしてraspi-configを起動し [3 Interface Options ] -> [ P3 VNC ] -> 「はい」 と選択すれば OKです。最後に画面上にThe VNC Server is enabledと表示されればVNCサーバが有効になりさらに起動された状態になります。

続けて、macのfinderを立ち上げてメニューバーから[移動]->[サーバへ接続]と選びます。

f:id:n_so5:20210325094150p:plain

表示されたダイアログにvnc://pi@raspberrypi.localと入力して[接続]をクリックすると

f:id:n_so5:20210325094532p:plain

接続できませんo....rz

f:id:n_so5:20210325094333p:plain

どうやら、macのfinderから接続する時は、VNCのパスワードを設定する必要があるようです。

qiita.com

こちらの記事では、GUIVNCのパスワードを設定されていますが、CUIから作業してみましょう。

まず、sshでログインしてvncpasswdコマンドを使ってパスワードを生成します。

> ssh pi@raspberrypi.local
$ sudo vncpasswd  -service 

2回聞かれるので、同じパスワードを入力してください。

続いて、/root/.vnc/config.d/vncserver-x11AuthenticationVncAuthに変更します。*3 デフォルトではgawkはインストールされていないので、事前にapt-get install gawkしてから実行してください。*4

$ sudo gawk -i inplace '!/Authentication/{print $0} ENDFILE {print "Authentication=VncAuth"}' /root/.vnc/config.d/vncserver-x11
$ sudo systemctl restart vncserver-x11-serviced.service 

改めてfinderから接続すると、次のようにパスワードを聞かれるので、vncpasswdで設定したパスワードを入力します。

f:id:n_so5:20210325113835p:plain

これで無事にラズパイにVNCで接続することができました !!

f:id:n_so5:20210325114312p:plain

さて、当初の目的だったカメラの映像を出してみると・・・映りませんorz

ちょっと昨日の記事を確認してみましょう。

hpcmemo.hatenablog.com

(意訳)picameraはframe bufferに直で書いてるんで、X11で飛ばすん無理

VNCサーバのサービス名を良く見てみましょう。

vncserver-x11-serviced.service

ええ、VNCは内部的にはXorg呼んでますね。o.......rz

というわけで、ソフトウェア的な解決は諦めて、amazonで昔買った激安HDMIキャプチャデバイスを使うことにします。

私が買った時は700円でしたが、今は780円のようです(どっちにしろ激安)

これをPCに挿して、ラズパイのHDMI出力とつなぎ、Quick time playerの新規ムービー収録から、USB videoを選ぶとこんな感じで見えます。*5

せっかくなので、ラズパイでカメラを起動してVNCからは見えず、HDMIキャプチャでは見えているという状態のスクショを最後に貼っておきますw

f:id:n_so5:20210325115530p:plain

まとめ

いつも以上にぐだぐだだったので、今回分かったことをまとめておきます。

  1. 最近の(2015年以降?)ラズパイはデフォルトでbonjourが有効なので、macからならpi@raspberrypi.localとしてアクセスできる。
  2. ラズパイOSにインストールされているawkはmawk。inplcae処理がしたければgawkを別途インストールすること
  3. macのfinderからVNCでラズパイに接続する時はラズパイ側でVNCのパスワードを有効にする必要がある
  4. ラズパイカメラの出力をリモートマシンから見る簡単な方法は今のところ無い。ラズパイのHDMI出力をキャプチャするのが手っ取り早い

カメラ出力の件は、見るだけならmjpg-streamerを使ってストリーミング配信するというのが定番のようですが、これだとカメラ出力を加工して見たりする時にかえって難しくなりそうなので、今のところ避けてます。

github.com

ともかく、これでラズパイで開発する準備が整いました。

*1:それも2015年の時点でw

*2:複数台のラズパイが同一ネットワーク内に居る時ってどうなるんでしょうね。前述のページには/etc/hostnameに書いてる名前+.localが使われると書かれてるけど後で実験してみます。

*3:次のコマンド例でやっているのは、正確にはVncAuthの行が存在したら削除した上で、最終行にAuthentication=VncAuthを追記という操作ですが、設定ファイルにデフォルト値とかコメントとか入っていないシンプルなものなので、後から見て混乱することも無いでしょう(^^;

*4:最初はsed -iでなんとかしようとしてたんですが、上手い方法が思いつかず、もうawkでやってしまえーと思ってawkに乗り換えたらラズパイOSにインストールされてるawkgawkではなくmawkでinplace処理ができずと、この修正をワンライナーでやるためだけに1時間くらいかかりましたorz

*5:このキャプチャ自体はただのUSB video deviceなのでQuick time player以外でも対応しているソフトなら何でも使えます。zoomで他の会議参加者に出力とかもできるはず