HPCメモ

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

ラズパイ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で他の会議参加者に出力とかもできるはず

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

前回、sshでラズパイにログインできるようにしましたが、Xを飛ばせるともっと便利そうです。

とはいえXサーバ(PC側)はうちの環境では元々XQuartzが入っているので、ssh -Xでログインすればラズパイで起動したアプリがPC側に表示されるはずです。さっそく試してみましょう。 (便宜上ここからはPCのコマンドプロンプト>で、ラズパイのコマンドプロンプト$で表します)

> ssh -X pi@{ラズパイのIPアドレス}
$ xeyes
-bash: /usr/bin/xeyes: そのようなファイルやディレクトリはありません

あら、デフォルトではxeyesは入ってないんですね。rasbianだとx11-appsの中に含まれるようなので、インストールしてテストします。

$ sudo apt-get install x11-apps
$ xeyes

こんな感じでキュートな目が表示されればOKです。

f:id:n_so5:20210324222225p:plain

続けてカメラを繋いでみましょう。

私が買ったのは、こちらのHQカメラとamazonで売ってた適当なCマウントレンズ(リンクを貼ろうと思ったら在庫切れでした)です。

www.switch-science.com

私の場合はレンズはテスト用で、本命はこちらの1.25"アダプタ経由での天体望遠鏡接続(どの程度見えるかどうかは後のお楽しみ)なので、とにかく安いレンズにしました。

Cマウントは大昔のシネレンズに使われていたものらしいので、オールドレンズを漁れば深い沼が待ってると思いますが、現行製品でもTAMRONから発売されてるようです。

www.tamron.biz

個人向けに販売してるかどうかは分かりませんが、中古でも良ければたぶん売ってるとこはあるでしょう。

閑話休題、もろもろ接続するとこんな感じになります。

f:id:n_so5:20210324210605j:plain

こちらのドキュメントにあるように、静止画ならraspistill -o test.jpg動画ならraspivid -o test.h264とすると撮影できます。

projects.raspberrypi.org

ところが、これらの画像はラズパイに繋いだディスプレイには表示されますが、XクライアントではないのでPC側には表示されません。

軽くぐぐってみたところ、一発で絶望的な情報が見つかりました。

www.raspberrypi.org

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

とりあえずX飛ばしときゃディスプレイ無しでもなんとかなると思ってたけど甘かったようです・・・orz

ラズパイ4のセットアップ

ちょっと前にラズパイのアップデートで軽く炎上してましたね。

www.reddit.com

要するに

あ…ありのまま 今 起こった事を話すぜ!

「おれは、OSのアップデートをしたと思っていたら MSのリポジトリがadd-apt-repositoryされていた」

な… 何を言っているのか わからねーと思うが 

おれも 何をされたのか わからなかった…

頭がどうにかなりそうだった… 催眠術だとか超スピードだとか

そんなチャチなもんじゃあ 断じてねえ

もっと恐ろしいものの片鱗を 味わったぜ…

てことのようです。

MSのリポを追加したこと自体は、VS codeを公式イメージの配布物に含めるっていう方針のようなので 新規に配布されるイメージには勝手にやってくれりゃ良いだろうと思うんですが、 アップデートの時にこっそりやるのはマズいですね。

ところで、こんなこともあろうかと思って昨年末にRaspberry Pi ImagerからOSイメージを書き込んだ後、放置してたSDカードが手元ににあります。 今日は、ラズパイ4にこのカードを挿してセットアップした後、例のアップデートがどういうように行なわれるのかを見てみようと思います。

SDカードにOSを書き込むところまではこちらの記事を参考にしました。

deviceplus.jp

手順は簡単なんですが、私の環境ではいくつかトラブルがありました。

1つめは、ダウンロードしたRasberry Pi Imagerが壊れていたというもので、インストールしようとすると次のエラーが出ました。*1

f:id:n_so5:20201217000311p:plain

これは、単純に再ダウンロードすれば解決しました。

もう1つは、OSイメージのダウンロードに時間がかかりすぎてタイムアウトするというものですorz

OSイメージを取得するのに、ミラーサイトを使わずに本家まで取りに行っていたようで、だいたい2〜3時間かかってました。 最初はノートPCで作業をしていたので、気付いたらスリープして接続が切れてエラーになってました。

今は改善されているようですが、当時はImager(10数MB)のダウンロードにも10分以上かかってたので、配布サーバに問題があったんでしょうね。

さて、無事にSDカードが用意できたということにして、ラズパイのセットアップを進めていきます。

まずは、キーボードとディスプレイ、電源のみを繋いだ状態で(SDカードは挿さずに)起動してみます。

f:id:n_so5:20210324120037j:plain

起動途中で止まって次の画面*2が表示されていれば、とりあえずOKです。

f:id:n_so5:20210324120053j:plain

改めて、SDカードを挿入して起動します。*3

f:id:n_so5:20210324120218j:plain

起動すると、デスクトップが表示されて、「(セットアップが)もうちょっとだけ続くんじゃよ」と表示されたダイアログが出ます。

f:id:n_so5:20210324120513j:plain

この後、次の順に設定画面が表示されます。

  • locale, キーボードの確認
  • piユーザのパスワード変更*4
  • ディスプレイの設定
  • wifiの設定

最後に、次のようなダイアログでアップデートする?と聞かれるので[Next]をクリックすると特に何も表示されずにアップデートが始まります。

f:id:n_so5:20210324121006j:plain

アップデートが始まってから慌ててaptのリポジトリ関係の状態を調べたところ、アップデート前の状態ではMSのリポジトリは入っていませんでした。

f:id:n_so5:20210324121408j:plain

アップデート終了後、この時点でも特に内容は表示されずに単にアップデートできたよとだけ言われます。なお、この後[OK]をクリックすると再起動されました(そこはダイアログに書いといてほしいw)

f:id:n_so5:20210324122432j:plain

で、再起動後のリポジトリ設定は次のとおりで、ファイルは追加されているけどコメントしか残ってませんでした。

f:id:n_so5:20210324122736j:plain

というわけで、確かに特に確認する間もなくアップデートされますが、現在はVS code用のリポは追加されないようになっているようですね。*5

引き続きセットアップを続けていきましょう。

設定アプリっぽいものを立ち上げて

  1. piユーザのパスワード変更
  2. sshの有効化
  3. カメラの有効化(必要な人だけ)

と変更した後、求められるままに再起動します。

再起動したらコマンドプロンプトからip addressしてIPアドレス(この例では192.168.0.22)を確認して、 PCからssh pi@{IPアドレス} でログインできるか確認しましょう。

% ssh pi@192.168.0.22
The authenticity of host '192.168.0.22 (192.168.0.22)' can't be established.
ECDSA key fingerprint is SHA256:QyiNjok1ZCVBPTCVTeSV4nBFu1B5U1eh2fmdyktPLMc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.22' (ECDSA) to the list of known hosts.
pi@192.168.0.22's password: 
Linux raspberrypi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Mar 24 12:29:23 2021

こんな感じでパスワードでログインできるのを確認したら、公開鍵認証に切り替えましょう。

まずは、ログインした先でauthorized_keysファイルを編集し、コピペでPCの公開鍵を登録します。

> mkdir .ssh
> vi .ssh/authorized_keys
> chmod go-r .ssh/authorized_keys

ここまできたら、PCで別のターミナル画面を開いて公開鍵認証でログインできるか確かめます。

先程と同じようにssh pi@{IPアドレス}して、パスワードを聞かれずにログインできれば大丈夫です。

続けて、パスワードログインを無効化するために、/etc/ssh/sshd_configを編集してPasswordAuthenticationをnoにし、sshdを再起動ます。

> sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
> sudo systemctl restart sshd

最後に、パスワード認証が無効になっているか確認するために、公開鍵認証を無効にしてログインを試してみます。

% ssh -oPubkeyAuthentication=no  pi@192.168.0.22
pi@192.168.0.22: Permission denied (publickey).

無事にログインできませんでした。

長くなってきたので、一旦この辺で終了します。

*1:こういう事故に対応するためにも、ハッシュ値は置いといて欲しいものです・・・

*2:右上に表示されているQRコードはrasberypi.orgへのリンクなんですが、これは何かトラブってたらスマホで調べてねってことでしょうかね。便利な世の中になったもんだ・・・

*3:SDカードスロットだけ裏面なんだけど、一瞬カードスロットが無い!ってパニックになってましたwww

*4:ここで変えたはずなんだけど、後でsshでログインした時にデフォルトパスワードのままだぞって怒られた気がする

*5:なんか騒動の最中に「この挙動は変えないよん」って公式のコメントを見た記憶があったんだけど気のせいだろうか・・・

lctagsでcall graphを書きたかった・・・

最近知ったんですが、lctagsというclangを使ったソースコードタグシステムがあるそうです。

github.com

ソースコードタグシステムというのは、変数名や関数名から定義を参照したり、関数の定義部から呼び出し元へ飛ぶような複数のファイルを跨いで内容を飛びまわるようなものを言います。メジャーどころだと、ctags, etags, GNU Globalあたりが昔から使われています。これらの昔から存在するツールは、ソースコードを読み込んで解析するパーサを自前で持っていますが、この部分を真面目に開発していくと、最終的にはコンパイラを作る羽目になることが広く知られています。*1

じゃ、実際にコンパイラを使えばいいじゃんというわけで、ClangのフロントエンドがパースしたAST木を使っているのがこちらのシステムです。

インストール方法は apt が使えるOSならmake一発でインストールしてくれるそうです。

$ make build_for_ubuntu [PROXY=http://proxy.hoge:port/]
$ sudo make install

でもってmakefile(src/makefile)を確認するとbuild_for_ubntuはありませんでしたが、build_for_aptがあったのでそっちを見てみると

  1. libclang3.8-devのインストール
  2. liblua5.3-devのインストール
  3. libssl-devのインストール
  4. swig3.0のインストール
  5. gtagsのインストール
  6. luasqlite3のインストール
  7. lctagsのビルド

と進んでいくようです。

動作を確認しているのは debian 9.1, ubuntu 17.04 の 64bit だけです。

とのことでしたが、とりあえずubuntu20で試してみましょう。

> docker run -it --rm ubuntu /bin/bash
# apt update
# apt install git make python sudo curl unzip
# git clone https://github.com/ifritJP/lctags.git
# cd lctags
# make build_for_apt
(cd src; make build_for_apt)
make[1]: Entering directory '/lctags/src'
/bin/sh: 1: lua5.3: not found
check clang-dev ...
sudo apt-get -o Acquire::http::proxy="" install libclang-3.8-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package libclang-3.8-dev
E: Couldn't find any package by glob 'libclang-3.8-dev'
E: Couldn't find any package by regex 'libclang-3.8-dev'
make[1]: *** [makefile:637: build_for_apt] Error 100
make[1]: Leaving directory '/lctags/src'
make: *** [makefile:2: all] Error 2

というわけで、libclang-3.8-dev なんてパッケージは無いと言われて止まります。

試しにapt searchしてみたらversion10なんてのが見つかりました。

# apt search libclang-dev
Sorting... Done
Full Text Search... Done
libclang-dev/focal 1:10.0-50~exp1 arm64
  clang library - Development package

もうちょっと古いのは無いかなということで探してみると

# apt search libclang |grep dev     

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

libclang-10-dev/focal 1:10.0.0-4ubuntu1 arm64
libclang-11-dev/focal-updates 1:11.0.0-2~ubuntu20.04.1 arm64
libclang-6.0-dev/focal 1:6.0.1-14 arm64
libclang-7-dev/focal 1:7.0.1-12 arm64
libclang-8-dev/focal 1:8.0.1-9 arm64
libclang-9-dev/focal 1:9.0.1-12 arm64
libclang-common-10-dev/focal 1:10.0.0-4ubuntu1 arm64
  Clang library - Common development package
libclang-common-11-dev/focal-updates 1:11.0.0-2~ubuntu20.04.1 arm64
  Clang library - Common development package
libclang-common-6.0-dev/focal 1:6.0.1-14 arm64
  clang library - Common development package
libclang-common-7-dev/focal 1:7.0.1-12 arm64
  Clang library - Common development package
libclang-common-8-dev/focal 1:8.0.1-9 arm64
  Clang library - Common development package
libclang-common-9-dev/focal 1:9.0.1-12 arm64
  Clang library - Common development package
libclang-cpp10-dev/focal 1:10.0.0-4ubuntu1 arm64
libclang-cpp11-dev/focal-updates 1:11.0.0-2~ubuntu20.04.1 arm64
libclang-dev/focal 1:10.0-50~exp1 arm64
librust-clang-sys+clang-3-7-dev/focal 0.28.1-6 arm64
librust-clang-sys+clang-3-8-dev/focal 0.28.1-6 arm64
librust-clang-sys+clang-3-9-dev/focal 0.28.1-6 arm64
librust-clang-sys+clang-4-0-dev/focal 0.28.1-6 arm64
librust-clang-sys+clang-5-0-dev/focal 0.28.1-6 arm64
librust-clang-sys+clang-6-0-dev/focal 0.28.1-6 arm64
librust-clang-sys+clang-7-0-dev/focal 0.28.1-6 arm64
librust-clang-sys+clang-8-0-dev/focal 0.28.1-6 arm64
librust-clang-sys+libloading-dev/focal 0.28.1-6 arm64
librust-clang-sys-dev/focal 0.28.1-6 arm64

あら、rustバインディングは3.8が残ってますね。

じゃ、こいつの依存パッケージは何かしらというと

# apt depends  librust-clang-sys+clang-3-8-dev/focal
librust-clang-sys+clang-3-8-dev
  Depends: librust-clang-sys-dev (= 0.28.1-6)
  Depends: <librust-clang-sys+gte-clang-3-6-dev> (= 0.28.1-6)
    librust-clang-sys-dev
  Depends: <librust-clang-sys+gte-clang-3-7-dev> (= 0.28.1-6)
    librust-clang-sys-dev
  Depends: <librust-clang-sys+gte-clang-3-8-dev> (= 0.28.1-6)
    librust-clang-sys-dev
root@e0f6d7d7f2c9:/lctags# apt depends librust-clang-sys-dev
librust-clang-sys-dev
  Depends: <librust-glob-0.3+default-dev>
    librust-glob-dev
  Depends: <librust-libc-0.2-dev> (>= 0.2.39-~~)
    librust-libc-dev
  Depends: libclang-dev
  Depends: llvm
  Depends: clang
  Suggests: librust-clang-sys+clang-3-7-dev (= 0.28.1-6)
  Suggests: librust-clang-sys+clang-3-8-dev (= 0.28.1-6)
  Suggests: librust-clang-sys+clang-3-9-dev (= 0.28.1-6)
  Suggests: librust-clang-sys+clang-4-0-dev (= 0.28.1-6)
  Suggests: librust-clang-sys+clang-5-0-dev (= 0.28.1-6)
  Suggests: librust-clang-sys+clang-6-0-dev (= 0.28.1-6)
  Suggests: librust-clang-sys+clang-7-0-dev (= 0.28.1-6)
  Suggests: librust-clang-sys+clang-8-0-dev (= 0.28.1-6)
  Suggests: librust-clang-sys+libloading-dev (= 0.28.1-6)

なぜかlibclangには依存していない・・・

面倒なんで、新しいのを入れて自力でビルドしましょう。

もう一度、READMEファイルに戻ってみると

必要なライブラリ等
    swig (3.0)
    lua, lua-dev(5.2 or 5.3)
    libclang-dev (r380 or r390)
    luasqlite3 (0.9.4)
    openssl

だそうなので、この辺をlibclang-devのバージョンだけ無視してインストールします。 ただし、luasqlite3はパッケージが無いようなので、lctagsのmakefileを使ってインストールします。

# apt-get install swig3.0 lua5.3 liblua5.3-dev libclang-dev  openssl
# make download_luasqlite3
(cd src; make download_luasqlite3)
make[1]: Entering directory '/lctags/src'
check luasqlite3 ...
install
mkdir -p ../external/luasqlite3
curl --proxy "" "http://lua.sqlite.org/index.cgi/zip/lsqlite3_fsl09x.zip?uuid=fsl_9x" -o ../external/luasqlite3/lsqlite3_fsl09x.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1947k  100 1947k    0     0  1399k      0  0:00:01  0:00:01 --:--:-- 1398k
(cd ../external/luasqlite3; unzip -o lsqlite3_fsl09x.zip)
Archive:  lsqlite3_fsl09x.zip
   creating: lsqlite3_fsl09x/
  inflating: lsqlite3_fsl09x/HISTORY  
  inflating: lsqlite3_fsl09x/Makefile  
  inflating: lsqlite3_fsl09x/README  
   creating: lsqlite3_fsl09x/doc/
  inflating: lsqlite3_fsl09x/doc/lsqlite3.wiki  
   creating: lsqlite3_fsl09x/examples/
  inflating: lsqlite3_fsl09x/examples/aggregate.lua  
  inflating: lsqlite3_fsl09x/examples/function.lua  
  inflating: lsqlite3_fsl09x/examples/hooks_advanced.lua  
  inflating: lsqlite3_fsl09x/examples/order.lua  
  inflating: lsqlite3_fsl09x/examples/simple.lua  
  inflating: lsqlite3_fsl09x/examples/smart.lua  
  inflating: lsqlite3_fsl09x/examples/statement.lua  
  inflating: lsqlite3_fsl09x/examples/tracing.lua  
  inflating: lsqlite3_fsl09x/examples/update_hook.lua  
   creating: lsqlite3_fsl09x/extras/
  inflating: lsqlite3_fsl09x/extras/Makefile  
  inflating: lsqlite3_fsl09x/extras/extension-functions.c  
  inflating: lsqlite3_fsl09x/extras/installpath.lua  
  inflating: lsqlite3_fsl09x/lsqlite3-0.9.4-2.rockspec  
  inflating: lsqlite3_fsl09x/lsqlite3.c  
  inflating: lsqlite3_fsl09x/lsqlite3complete-0.9.4-2.rockspec  
  inflating: lsqlite3_fsl09x/sqlite3.c  
  inflating: lsqlite3_fsl09x/sqlite3.h  
   creating: lsqlite3_fsl09x/test/
  inflating: lsqlite3_fsl09x/test/test-dyld.lua  
  inflating: lsqlite3_fsl09x/test/test.lua  
  inflating: lsqlite3_fsl09x/test/tests-sqlite3.lua  
make[1]: Leaving directory '/lctags/src'

でもって最後にmake buildすると

# make build
(cd src; make build)
make[1]: Entering directory '/lctags/src'
swig -I/usr/lib/llvm-3.8/include -o swig/libClangLuaBase_wrap.c -lua swig/libClangLuaBase.i
make[1]: swig: Command not found
make[1]: *** [makefile:162: swig/libClangLuaBase_wrap.c] Error 127
make[1]: Leaving directory '/lctags/src'
make: *** [makefile:2: all] Error 2

vi が無いので、sedmakefileを書き換えます。

# sed -i -e '/SWIG=swig/s/swig/swig3.0/' -e '/CLANG_VER=3.8/s/3.8/10/' src/makefile 
# make build
(cd src; make build)
make[1]: Entering directory '/lctags/src'
swig3.0 -I/usr/lib/llvm-10/include -o swig/libClangLuaBase_wrap.c -lua swig/libClangLuaBase.i
/usr/lib/llvm-10/include/clang-c/Platform.h:45: Error: Syntax error - possibly a missing semicolon.
make[1]: *** [makefile:162: swig/libClangLuaBase_wrap.c] Error 1
make[1]: Leaving directory '/lctags/src'
make: *** [makefile:2: all] Error 2

ぐぬぬぬ。とりあえず一番古いlibclangを入れて再トライ

# apt install libclang-6.0-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libclang-common-6.0-dev libclang1-6.0 libllvm6.0
The following NEW packages will be installed:
  libclang-6.0-dev libclang-common-6.0-dev libclang1-6.0 libllvm6.0
0 upgraded, 4 newly installed, 0 to remove and 5 not upgraded.
Need to get 42.9 MB of archives.
After this operation, 437 MB of additional disk space will be used.
・
・
・
# sed -i -e '/CLANG_VER=10/s/10/6.0/' src/makefile 
# make build
・
・
・
gcc Helper.c -std=c99 -DHELPER_STAND_ALONE -o Helper  -I/usr/include/lua5.3 -llua5.3 -lcrypto -lm -lpthread -lrt
Helper.c:4:10: fatal error: openssl/evp.h: No such file or directory
    4 | #include <openssl/evp.h>
      |          ^~~~~~~~~~~~~~~
compilation terminated.

わーい進んだ。 でも今度はopensslのヘッダが無いとか言われてます。

よくよくこの記事を遡ってみると、opensslは入れてるけど、libssl-devは入れてませんね。 追加でインストールして再ビルドしてみると

#apt install   libssl-dev
# make build
(cd src; make build)
make[1]: Entering directory '/lctags/src'
make -C lctags LUA_COMMAND=lua5.3 LUA_INC=/usr/include/lua5.3 LUA_LIB= LUA_CFLAGS="-I/usr/include/lua5.3" LUA_LDFLAGS=-llua5.3 SO=so
make[2]: Entering directory '/lctags/src/lctags'
gcc Helper.c -std=c99 -DHELPER_STAND_ALONE -o Helper  -I/usr/include/lua5.3 -llua5.3 -lcrypto -lm -lpthread -lrt
Helper.c: In function 'helper_msleep':
Helper.c:322:5: warning: implicit declaration of function 'usleep'; did you mean 'sleep'? [-Wimplicit-function-declaration]
  322 |     usleep( ( msec % 1000 ) * 1000 );
      |     ^~~~~~
      |     sleep
gcc Helper.c -std=c99 -fPIC -shared -DHELPER_STAND_ALONE -o Helper.so   -I/usr/include/lua5.3 -llua5.3 -lcrypto -lm -lpthread -lrt
Helper.c: In function 'helper_msleep':
Helper.c:322:5: warning: implicit declaration of function 'usleep'; did you mean 'sleep'? [-Wimplicit-function-declaration]
  322 |     usleep( ( msec % 1000 ) * 1000 );
      |     ^~~~~~
      |     sleep
make[2]: Leaving directory '/lctags/src/lctags'
make[1]: Leaving directory '/lctags/src'
# make install
(cd src; make install)
make[1]: Entering directory '/lctags/src'
make -C lctags LUA_COMMAND=lua5.3 LUA_INC=/usr/include/lua5.3 LUA_LIB= LUA_CFLAGS="-I/usr/include/lua5.3" LUA_LDFLAGS=-llua5.3 SO=so
make[2]: Entering directory '/lctags/src/lctags'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/lctags/src/lctags'
make install-lib
make[2]: Entering directory '/lctags/src'
mkdir -p /usr/local/lib/lua/5.3
mkdir -p /usr/local/lib/lua/5.3/libclanglua
mkdir -p /usr/local/lib/lua/5.3/lctags
mkdir -p /usr/local/share/lua/5.3
mkdir -p /usr/local/share/lua/5.3/libclanglua
mkdir -p /usr/local/share/lua/5.3/lctags
/usr/bin/install -c libclanglua/core.so /usr/local/lib/lua/5.3/libclanglua
/usr/bin/install -c libclanglua/if.lua libclanglua/ifc.lua /usr/local/share/lua/5.3/libclanglua
if [ -f lsqlite3.so  ]; then /usr/bin/install -c lsqlite3.so /usr/local/lib/lua/5.3; fi
mkdir -p /usr/local/share/lua/5.3/lctags
/usr/bin/install -c lctags/_lctags.conf /usr/local/share/lua/5.3/lctags
/usr/bin/install -c lctags/*.lua /usr/local/share/lua/5.3/lctags
sed "s@.*-- replase by install@  self.clangIncPath = \"/usr/lib/llvm-6.0/lib/clang/6.0.1\"@g" lctags/config.lua > /tmp/config.lua
/usr/bin/install -c /tmp/config.lua /usr/local/share/lua/5.3/lctags
rm /tmp/config.lua
/usr/bin/install -c lctags/*.so /usr/local/lib/lua/5.3/lctags
make[2]: Leaving directory '/lctags/src'
make -C lctags install INST_DIR=/usr/local/bin \
    LUA_COMMAND=lua5.3 LUA_MOD_DIR=/usr/local/share/lua/5.3
make[2]: Entering directory '/lctags/src/lctags'
sed "s@lua5.3@lua5.3@g" lctags | \
    sed 's@${DIR}@'"/usr/local/share/lua/5.3/lctags@g" > /usr/local/bin/lctags
chmod +x /usr/local/bin/lctags
make[2]: Leaving directory '/lctags/src/lctags'
make[1]: Leaving directory '/lctags/src'

じゃ、テストしてみましょう。

#make test
(cd src; make test)
make[1]: Entering directory '/lctags/src'
make -C lctags LUA_COMMAND=lua5.3 LUA_INC=/usr/include/lua5.3 LUA_LIB= LUA_CFLAGS="-I/usr/include/lua5.3" LUA_LDFLAGS=-llua5.3 SO=so
make[2]: Entering directory '/lctags/src/lctags'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/lctags/src/lctags'
lua5.3 lctags/lctags.lua init .   
/usr/include/stdio.h:33:10: fatal error: 'stddef.h' file not found
please set clang inc-path at getClangIncPath() in /lctags/src/lctags.conf, and retry init.
make[1]: *** [makefile:210: test] Error 1
make[1]: Leaving directory '/lctags/src'
make: *** [makefile:2: all] Error 2

なんでやねん。 このissueを見てると、build-essential入れとけって話のようなので、素直に入れときましょう。

github.com

でもって、再トライ

# make test
(cd src; make test)
make[1]: Entering directory '/lctags/src'
make -C lctags LUA_COMMAND=lua5.3 LUA_INC=/usr/include/lua5.3 LUA_LIB= LUA_CFLAGS="-I/usr/include/lua5.3" LUA_LDFLAGS=-llua5.3 SO=so
make[2]: Entering directory '/lctags/src/lctags'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/lctags/src/lctags'
lua5.3 lctags/lctags.lua init .   
/usr/include/stdio.h:33:10: fatal error: 'stddef.h' file not found
please set clang inc-path at getClangIncPath() in /lctags/src/lctags.conf, and retry init.
make[1]: *** [makefile:210: test] Error 1
make[1]: Leaving directory '/lctags/src'
make: *** [makefile:2: all] Error 2

うーむ駄目か。

いさぎよく、build_for_aptの説明のところで動作確認したと言われている、debian9.1で再トライしてみます。 途中、何度かDo you want to continue? [Y/n]と聞かれるので、yes | make build_for_aptしといた方が無難ですね。

>docker run -it --rm debian:9.1 /bin/bash
# apt update
# apt install git make python sudo curl unzip
# git clone https://github.com/ifritJP/lctags.git
# cd lctags
# make build_for_apt
・
・
・
gcc Helper.c -std=c99 -fPIC -shared -DHELPER_STAND_ALONE -o Helper.so   -I/usr/include/lua5.3 -llua5.3 -lcrypto -lm -lpthread -lrt
Helper.c: In function 'helper_msleep':
Helper.c:322:5: warning: implicit declaration of function 'usleep' [-Wimplicit-function-declaration]
     usleep( ( msec % 1000 ) * 1000 );
     ^~~~~~
make[3]: Leaving directory '/lctags/src/lctags'
make[2]: Leaving directory '/lctags/src'
make[1]: Leaving directory '/lctags/src'

無事にインストールできました・・・orz

さっそくテストしてみましょう。

# make test
(cd src; make test)
make[1]: Entering directory '/lctags/src'
make -C lctags LUA_COMMAND=lua5.3 LUA_INC=/usr/include/lua5.3 LUA_LIB= LUA_CFLAGS="-I/usr/include/lua5.3" LUA_LDFLAGS=-llua5.3 SO=so
make[2]: Entering directory '/lctags/src/lctags'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/lctags/src/lctags'
lua5.3 lctags/lctags.lua init .   
sync
rm -f 
emacs -batch -q -eval "(progn (add-to-list 'load-path \"lisp\") (load \"lctags-test.el\"))"
/bin/sh: 1: emacs: not found
makefile:210: recipe for target 'test' failed
make[1]: *** [test] Error 127
make[1]: Leaving directory '/lctags/src'
makefile:2: recipe for target 'all' failed
make: *** [all] Error 2

emacsを入れてもう一度テストすると

# apt install -y emacs
# make test
・
・
・
--- 3669,3673 ----
  make test-chg-proj
  /usr/bin/lua lctags/lctags.lua --lctags-form json set-projDir . test@test2 > /dev/null
  /usr/bin/lua lctags/lctags.lua --lctags-form json dump file | grep test/ > /dev/null && (echo ==== NG set-projDir ====; exit 1)
! makefile:476: recipe for target 'test-chg-proj' failed
  /usr/bin/lua lctags/lctags.lua --lctags-form json set-projDir . test2@test > /dev/null
makefile:210: recipe for target 'test' failed
make[1]: [test] Error 1 (ignored)
make[1]: Leaving directory '/lctags/src'

うむ。駄目っぽいです・・・o....rz

この後make cleanしてmake testすると、stddefが無いエラーが再発しました。 とりあえずlctagsコマンド自体はビルドできてるっぽいので、インストールして初期化してみると

#make install
# lctags init .
/usr/include/stdio.h:33:11: fatal error: 'stddef.h' file not found
please set clang inc-path at getClangIncPath() in /lctags/lctags.conf, and retry init.

dockerイメージだと、インストーラから入れたものと比べると大幅にパッケージが減らされているんで、たぶん何かしら不足してるパッケージがあるんだと思いますが、これ以上追求していくのも大変そうなので、今回は諦めます。

これが使えると、いろいろとはかどりそうだったんで期待してたんですが、残念です。

ifritjp.github.io

*1:たしか、GNU Globalの作者の人がGlobalの本かウェブページで書いてた記憶が・・・

intel版home brewでインストールしたパッケージの削除

ちょっとはまったのでメモ

> export PATH=/usr/local/bin:${PATH}
> brew uninstall $(brew list)

brewコマンドを絶対パスで、/usr/local/bin/brewとして呼び出しても、arm版(/opt/homebrew以下)のパッケージが削除されるので注意

前回の記事でインストールしたdockerのプレビュー版が十分安定して使えているので、ansible,awscli,macvim,jq,watchと依存パッケージ以外は全部docker runで対応できそうですね。pdftkとかgccとか

hpcmemo.hatenablog.com

デーモン系のプログラムを立ち上げる分にはdockerで全然問題無いんだけど、この手の単発コマンドをdocker runで実行しようと思うと オプション指定無しでカレントディレクトリを同じパスでマウントするくらいの芸は欲しところですね。

そういう需要はsingularityが担うんでしょうけど、あれはググラビリティが低いからなぁ・・・

M1 macでdocker

最近知ったんですが、M1 macでdockerのプレビュー版が動作するらしいです。

docs.docker.com

は?

たかがコンテナごときがなんでCPUアーキテクチャの違いを乗り越えて仮想化されてんだ?

と思ったんですが、良く考えたら元々Mac版はホストのkernel使ってなかったし、Rosetta2がなんとかしてくれるんしょうかね。

Don't think. Use! というわけでとりあえずインストールしてみました。

dmgファイルは冒頭のドキュメントの中程にある"Download"というリンクから入手できます。でもってインストーラが起動すると、これでもかとPreview版であることを強調してきますw

f:id:n_so5:20210215234232p:plain

いつもどおりにdrag and dropでインストールして起動すると、権限くれと言われるので

f:id:n_so5:20210215234831p:plain

パスワードを入力すると、チュートリアルが表示されました!

f:id:n_so5:20210215234957p:plain

って、何コレ???

結構長い間docker on macは使ってるはずですが、初めて見た気がします。普段は、homebrewからインストールしてたから見たことなかっただけかもしれませんが・・・

チュートリアルの内容は

  1. docker runでgitコマンドを呼び出して、チュートリアル用のgitリポジトリをclone
  2. cloneしてきたリポジトリ内にあるDockerfileを使ってdocker build
  3. buildしたimageを使って docker run
  4. Docker Hub でimageをshare

と、だいたい一通りの流れを体験できるようになっています。

最後のステップで、自然な流れでdockerhubのアカウントを作れるのが秀逸ですね。*1

なんか、この流れ見たことある気がするな・・・

ちなみにこのチュートリアルで使ったコンテナのDockerfileはこちらのものなので

github.com

(alpine-linuxだけど)pythonとnodeは動くようですね。あと、ビルド時にデフォルトでbuildkitが使われるようになってたようです。

さて、最後にjupyter-notebookのコンテナが動くかどうか確認して終わりにしましょう。

% docker run jupyter/scipy-notebook
Unable to find image 'jupyter/scipy-notebook:latest' locally
latest: Pulling from jupyter/scipy-notebook
83ee3a23efb7: Pull complete 
db98fc6f11f0: Pull complete 
f611acd52c6c: Pull complete 
724e03a65ce0: Pull complete 
513e138b0e94: Pull complete 
48f0bd4aefb5: Pull complete 
4f4fb700ef54: Pull complete 
b4de871b77c8: Pull complete 
0b03df09b2e6: Pull complete 
fa78867bfcd3: Pull complete 
47cf22ed95c5: Pull complete 
9ecce3ab59b4: Pull complete 
5ec66779f1e5: Pull complete 
cd7851ccfb49: Pull complete 
e80214e887dd: Pull complete 
b96af1630e18: Pull complete 
bec9edeb94f8: Pull complete 
dbb61cd8d6ce: Pull complete 
f880f4d488be: Pull complete 
6b4097a5c485: Pull complete 
c5dd0250935f: Pull complete 
f9c371873f19: Pull complete 
Digest: sha256:6cb01b1d6653efada4841bcad3a1f8e168e21dccc38dbd6fac7095208872c96f
Status: Downloaded newer image for jupyter/scipy-notebook:latest
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
WARN: Jupyter Notebook deprecation notice https://github.com/jupyter/docker-stacks#jupyter-notebook-deprecation-notice.
Executing the command: jupyter notebook
[I 15:20:08.305 NotebookApp] Writing notebook server cookie secret to /home/jovyan/.local/share/jupyter/runtime/notebook_cookie_secret
[W 2021-02-15 15:20:15.102 LabApp] 'ip' has moved from NotebookApp to ServerApp. This config will be passed to ServerApp. Be sure to update your config before our next release.
[W 2021-02-15 15:20:15.102 LabApp] 'port' has moved from NotebookApp to ServerApp. This config will be passed to ServerApp. Be sure to update your config before our next release.
[W 2021-02-15 15:20:15.102 LabApp] 'port' has moved from NotebookApp to ServerApp. This config will be passed to ServerApp. Be sure to update your config before our next release.
[W 2021-02-15 15:20:15.102 LabApp] 'port' has moved from NotebookApp to ServerApp. This config will be passed to ServerApp. Be sure to update your config before our next release.
[I 2021-02-15 15:20:15.131 LabApp] JupyterLab extension loaded from /opt/conda/lib/python3.8/site-packages/jupyterlab
[I 2021-02-15 15:20:15.131 LabApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[I 15:20:15.146 NotebookApp] Serving notebooks from local directory: /home/jovyan
[I 15:20:15.146 NotebookApp] Jupyter Notebook 6.2.0 is running at:
[I 15:20:15.146 NotebookApp] http://229033e3a641:8888/?token=bee9c8c2b4937b43ac51edc40d12d39f75a28218708915be
[I 15:20:15.146 NotebookApp]  or http://127.0.0.1:8888/?token=bee9c8c2b4937b43ac51edc40d12d39f75a28218708915be
[I 15:20:15.147 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 15:20:15.161 NotebookApp] 
    
    To access the notebook, open this file in a browser:
        file:///home/jovyan/.local/share/jupyter/runtime/nbserver-9-open.html
    Or copy and paste one of these URLs:
        http://229033e3a641:8888/?token=bee9c8c2b4937b43ac51edc40d12d39f75a28218708915be
     or http://127.0.0.1:8888/?token=bee9c8c2b4937b43ac51edc40d12d39f75a28218708915be

最後に表示されてるURLにアクセスすると

f:id:n_so5:20210216002550p:plain

あ、ポートフォワード設定してないorz

-p 8888:8888 を追加して起動すると無事にjupyter-notebookの画面を拝むことができました。

f:id:n_so5:20210216003306p:plain

しょっちゅう起動/停止することを考えるとdocker-compose.ymlとか用意しといた方が良いんでしょうかね。

*1:既存ユーザは、メールアドレスではログインできない問題にはまりそうですがw

M1 macネイティブ対応版homebrewのインストール

M1ネイティブ対応のhomebrewがリリースされたので、さっそくインストールしてみました。

brew.sh

特に何も考えずに、公式のインストール方法のところに書かれているコマンドラインを実行します。*1

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Password:
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew
==> The following new directories will be created:
/opt/homebrew/bin
/opt/homebrew/etc
/opt/homebrew/include
/opt/homebrew/lib
/opt/homebrew/sbin
/opt/homebrew/share
/opt/homebrew/var
/opt/homebrew/opt
/opt/homebrew/share/zsh
/opt/homebrew/share/zsh/site-functions
/opt/homebrew/var/homebrew
/opt/homebrew/var/homebrew/linked
/opt/homebrew/Cellar
/opt/homebrew/Caskroom
/opt/homebrew/Frameworks
==> The Xcode Command Line Tools will be installed.

Press RETURN to continue or any other key to abort
・
・
・

インストール中に、sudoするためのパスワードを聞かれるので、油断しないで待っておきましょう :p

インストールが終わるとWarning: /opt/homebrew/bin is not in your PATH.とか出ていて、.zprofileになんか設定を書いてねと出てましたので、その通りに追加しときます。

% which brew
/usr/local/bin/brew
% echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> ${HOME}/.zprofile
% . ${HOME}/.zprofile
% which brew         
/opt/homebrew/bin/brew

無事にbrewのパスが更新されました。

さて、homebrewをインストールしたらまずやることと言ったら、rmtreeのインストールです(異論は認める)

github.com

% brew tap beeftornado/rmtree
==> Tapping beeftornado/rmtree
Cloning into '/opt/homebrew/Library/Taps/beeftornado/homebrew-rmtree'...
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 181 (delta 9), reused 15 (delta 6), pack-reused 156
Receiving objects: 100% (181/181), 47.98 KiB | 261.00 KiB/s, done.
Resolving deltas: 100% (84/84), done.
Tapped 1 command and 1 formula (31 files, 106KB).

あっさりとインストールできました。

とりあえず動作確認のために、適当なパッケージをインストールして削除してみましょう。

% brew install watch
==> Downloading https://homebrew.bintray.com/bottles/ncurses-6.2.arm64_big_sur.bottle.tar.gz
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/111ab64b5ffbe5aebe18096a2ff95e8e8f6426955799181db8338677e8f853e4?response
######################################################################## 100.0%
==> Downloading https://homebrew.bintray.com/bottles/watch-3.3.16.arm64_big_sur.bottle.tar.gz
######################################################################## 100.0%
==> Installing dependencies for watch: ncurses
==> Installing watch dependency: ncurses
==> Pouring ncurses-6.2.arm64_big_sur.bottle.tar.gz
==> Caveats
ncurses is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have ncurses first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/ncurses/bin:$PATH"' >> ~/.zshrc

For compilers to find ncurses you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/ncurses/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/ncurses/include"

==> Summary
🍺  /opt/homebrew/Cellar/ncurses/6.2: 3,913 files, 9.2MB
==> Installing watch
==> Pouring watch-3.3.16.arm64_big_sur.bottle.tar.gz
🍺  /opt/homebrew/Cellar/watch/3.3.16: 10 files, 153.3KB
==> Caveats
==> ncurses
ncurses is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have ncurses first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/ncurses/bin:$PATH"' >> ~/.zshrc

For compilers to find ncurses you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/ncurses/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/ncurses/include"

% brew deps --installed --tree
ncurses

watch
└── ncurses

% brew rmtree watch
==> Examining installed formulae required by watch...
 /

Can safely be removed
----------------------
watch
ncurses

Proceed?[y/N]: y   
==> Cleaning up packages safe to remove

Uninstalling /opt/homebrew/Cellar/watch/3.3.16... (10 files, 153.3KB)

Uninstalling /opt/homebrew/Cellar/ncurses/6.2... (3,913 files, 9.2MB)
% brew deps --installed --tree

問題無さそうですね。

続いて、/usr/localにインストールされたIntel版のパッケージと同じものをインストールしてみましょう。

最初にintel版のインストール済パッケージをダンプします。

% /usr/local/bin/brew bundle dump
% cat Brewfile 
tap "beeftornado/rmtree"
tap "homebrew/bundle"
tap "homebrew/cask"
tap "homebrew/core"
brew "ansible"
brew "awscli"
brew "bash"
brew "gcc"
brew "git-lfs"
brew "jq"
brew "ruby"
brew "macvim"
brew "watch"

手で入れ直しても問題無いくらいのかわいいもんですねorz

このうち、bashは以前書いたとおり、intel版のコマンドラインツールを簡単に切り替えて使うために入れたものなので、今回は入れ直す必要はありません。 あと、rubyも入れた覚えがないw

hpcmemo.hatenablog.com

というわけで、Brewfileからbashrubyの行を削除してからbrew bundleします。

% brew bundle 
==> Tapping homebrew/bundle
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-bundle'...
remote: Enumerating objects: 5704, done.
remote: Total 5704 (delta 0), reused 0 (delta 0), pack-reused 5704
Receiving objects: 100% (5704/5704), 1.29 MiB | 538.00 KiB/s, done.
Resolving deltas: 100% (3339/3339), done.
Tapped 1 command (108 files, 1.7MB).
Using beeftornado/rmtree
Using homebrew/bundle
Tapping homebrew/cask
Using homebrew/core
Installing ansible
Installing awscli
Installing gcc
Installing git-lfs
Installing jq
Installing macvim
Installing watch
Homebrew Bundle complete! 11 Brewfile dependencies now installed.

あ、rmtreeもわざわざ入れなくてもこれでインストールしてくれてますねorz

さて、これでM1ネイティブ版に無事移行できたわけですが、ちょっとgccpython*2を試してみましょう。

 % which gcc
/usr/bin/gcc
% file $(which gcc)
/usr/bin/gcc: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/usr/bin/gcc (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/gcc (for architecture arm64e): Mach-O 64-bit executable arm64e
% gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: arm64-apple-darwin20.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
% which python3
/usr/local/bin/python3
% file $(which python3)
/usr/local/bin/python3: Mach-O 64-bit executable x86_64

あれ???

% brew info python3
python@3.9: stable 3.9.1 (bottled)
Interpreted, interactive, object-oriented programming language
https://www.python.org/
/opt/homebrew/Cellar/python@3.9/3.9.1_8 (3,934 files, 66.6MB) *
  Poured from bottle on 2021-02-09 at 23:32:51
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/python@3.9.rb
License: Python-2.0
==> Dependencies
Build: pkg-config ✘
Required: gdbm ✔, openssl@1.1 ✔, readline ✔, sqlite ✔, tcl-tk ✔, xz ✔
==> Caveats
Python has been installed as
  /opt/homebrew/bin/python3

Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
  /opt/homebrew/opt/python@3.9/libexec/bin

You can install Python packages with
  pip3 install <package>
They will install into the site-package directory
  /opt/homebrew/lib/python3.9/site-packages

See: https://docs.brew.sh/Homebrew-and-Python
==> Analytics
install: 768,550 (30 days), 2,406,022 (90 days), 3,028,682 (365 days)
install-on-request: 248,516 (30 days), 718,071 (90 days), 810,290 (365 days)
build-error: 0 (30 days)

いや、やっぱりインストールされてますね。

とりあえず別のシェルを起動して実行してみると

% which gcc
/usr/bin/gcc
% file $(which gcc)
/usr/bin/gcc: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/usr/bin/gcc (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/gcc (for architecture arm64e): Mach-O 64-bit executable arm64e
% gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: arm64-apple-darwin20.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
 % which python3
/opt/homebrew/bin/python3
%  file $(which python3)
/opt/homebrew/bin/python3: Mach-O 64-bit executable arm64

gccは変わらないけど、python3はM1用のバイナリが呼ばれるようになりました。

gccは、単に名前の問題のようですね

~ % ls -l /opt/homebrew/bin/gcc-*
lrwxr-xr-x  1 sogo  admin  33  2  9 23:38 /opt/homebrew/bin/gcc-10 -> ../Cellar/gcc/10.2.0_3/bin/gcc-10
lrwxr-xr-x  1 sogo  admin  36  2  9 23:38 /opt/homebrew/bin/gcc-ar-10 -> ../Cellar/gcc/10.2.0_3/bin/gcc-ar-10
lrwxr-xr-x  1 sogo  admin  36  2  9 23:38 /opt/homebrew/bin/gcc-nm-10 -> ../Cellar/gcc/10.2.0_3/bin/gcc-nm-10
lrwxr-xr-x  1 sogo  admin  40  2  9 23:38 /opt/homebrew/bin/gcc-ranlib-10 -> ../Cellar/gcc/10.2.0_3/bin/gcc-ranlib-10
% gcc-10 --version
gcc-10 (Homebrew GCC 10.2.0) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

gccを呼ぶと、clangが呼ばれgcc-10を呼ぶとgccが呼ばれるという謎環境ですが、たぶんこのマシンでgccを使う機会はほとんど無いから大丈夫でしょうw

*1:いや、本当はURLが正しいパスになってるかとか、最低限のセキュリティリスクは考えてからやってますが・・・

*2:bundleには書いてませんが、ansibleとawscliが依存してるのでインストールされてます