ござるのブログ

覚え書きいろいろ

M1 MacでDocker Desktopに頼らずにx86_64のlRubyを使うまで(追記2)(未解決)→(解決)

はじめに

M1 Macで、limaを使ってx86_64のIRubyを使ためにいろいろやりましたが、この前のように、

$ docker build --platform linux/amd64 -t iruby .

とすると

/bin/bash: pipefail: No such file or directory

と出てbuildに失敗するようになりました。どうしたものかと調べていると、そもそもlima公式に「Fast mode: Intel containers on ARM VM on ARM Host / ARM containers on Intel VM on Intel Host」という記載がありました。

セットアップ

ここに記載されているとおりにやるだけ。

$ limactl start
$ lima sudo systemctl start containerd
$ lima sudo nerdctl run --privileged --rm tonistiigi/binfmt --install all

以下のようなDockerfileを用意。 (IRubyにcztopは不要になったみたいですね。)

FROM jupyter/base-notebook:latest
USER root
RUN apt-get update \
  && apt-get install --no-install-recommends -y \
  libczmq-dev \
  libtool \
  make \
  ruby-dev \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
RUN gem install --no-document \
  iruby
USER $NB_USER
RUN iruby register --force

Dockerfileを置いたディレクトリで以下を実行。

$ nerdctl.lima build --platform linux/amd64 -t iruby .

無事完了したら、以下のコマンドでIRubyを起動。

$ mkdir /tmp/lima
$ nerdctl.lima run --platform linux/amd64 -it --rm -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -v /tmp/lima:/home/jovyan/work iruby

これでオーケーと思ったのですが、以下のメッセージを出力してIRubyが終了してしまいます。

Writing notebook-signing key to /home/jovyan/.local/share/jupyter/notebook_secret
Operation not permitted (src/thread.cpp:309)

build時とrun時に--platformを付けないで(linux/arm64で)動作させると、落ちないんですが…

おわりに

結局、未解決。

ここにあるように、Docker Desktop for macでも同様の現象が起きているようです。

追記

これっぽい。

解決

ここによると「For now, simply using old version (tonistiigi/binfmt:qemu-v6.0.0-12) can resolve the jupyter crash」とのことなので

$ limactl start
$ lima sudo systemctl start containerd
$ lima sudo nerdctl run --privileged --rm tonistiigi/binfmt:qemu-v6.0.0-12 --install all

とすると、大丈夫でした!

M1 MacでGeant4を使う

はじめに

M1 MacGeant4GEANT4_USE_QT=ONコンパイルしようとしたらハマりました。

Qtのインストール

Geant4は様々なvisualization driverがありますが、この資料によると「The most recent : Qt + OpenGL」とのことなので、以下のようにQtHomebrewでインストールしました。

$ brew install qt

インストールされたのはQt 6でした。今思えば、これをこのままにしておいたことが間違い。Geant4がサポートするのはQt 5なので、さらに、

$ brew install qt@5

としました。Qt 5はkeg-onlyなので、/opt/homebrew/include等にシンボリックリンクが作成されませんでした。

Geant4のコンパイル

ソースはGithubからもってきました。

$ git clone https://github.com/Geant4/geant4.git
$ mkdir build
$ cd build
$ cmake \
-DGEANT4_BUILD_MULTITHREADED=ON \
-DGEANT4_INSTALL_DATA=ON \
-DGEANT4_USE_QT=ON \
-DGEANT4_USE_OPENGL_X11=ON \
-DGEANT4_USE_GDML=ON \
-DGEANT4_USE_XM=ON \
-DGEANT4_USE_SYSTEM_CLHEP=ON \
-DGEANT4_USE_SYSTEM_EXPAT=ON \
-DGEANT4_USE_SYSTEM_ZLIB=ON \
-DCMAKE_INSTALL_PREFIX=/opt/homebrew/Cellar/geant4/11.0.0.beta \
../geant4

とすると、

Could not find a package configuration file provided by "Qt5Core" with any
of the following names:

  Qt5CoreConfig.cmake
  qt5core-config.cmake

Add the installation prefix of "Qt5Core" to CMAKE_PREFIX_PATH or set
"Qt5Core_DIR" to a directory containing one of the above files.  If
"Qt5Core" provides a separate development package or SDK, be sure it has
been installed.

と表示されたので、Qt 5を認識させるためにCMAKE_PREFIX_PATHを加えました。

$ rm CMakeCache.txt
$ cmake \
-DGEANT4_BUILD_MULTITHREADED=ON \
-DGEANT4_INSTALL_DATA=ON \
-DGEANT4_USE_QT=ON \
-DGEANT4_USE_OPENGL_X11=ON \
-DGEANT4_USE_GDML=ON \
-DGEANT4_USE_XM=ON \
-DGEANT4_USE_SYSTEM_CLHEP=ON \
-DGEANT4_USE_SYSTEM_EXPAT=ON \
-DGEANT4_USE_SYSTEM_ZLIB=ON \
-DCMAKE_INSTALL_PREFIX=/opt/homebrew/Cellar/geant4/11.0.0.beta \
-DCMAKE_PREFIX_PATH=/opt/homebrew/opt/qt5 \
../geant4

こうすると、Qt5Core_DIR等が/opt/homebrew/opt/qt5/lib/cmake/Qt53DCoreなどと設定されたので、Qt 6が入ったままでも問題ないだろうと思っていました。

しかし、

$ make -j4

とすると、

/***/geant4/src/main/source/interfaces/basic/include/G4UIQt.hh:55:7: error: definition of type 'QStringList' conflicts with type alias of the same name
class QStringList;
      ^
/opt/homebrew/include/QtCore/qcontainerfwd.h:64:7: note: 'QStringList' declared here
using QStringList = QList<QString>;

とのエラーが。ここで(ちゃんと書いてあるのに)/opt/homebrew/include/QtCoreを参照していることに気づかず、かなり時間をロスしました…

エラーの原因は/opt/homebrew/include以下にあるQt 6のファイル(シンボリックリンク)なので、/opt/homebrew/includeを参照することになりそうな-DGEANT4_USE_SYSTEM_*等を省いてcmakeを実行しました。

$ rm CMakeCache.txt
$ cmake \
-DGEANT4_BUILD_MULTITHREADED=ON \
-DGEANT4_INSTALL_DATA=ON \
-DGEANT4_USE_QT=ON \
-DGEANT4_USE_GDML=ON \
-DCMAKE_INSTALL_PREFIX=/opt/homebrew/Cellar/geant4/11.0.0.beta \
-DCMAKE_PREFIX_PATH=/opt/homebrew/opt/qt5 \
../geant4

makeします。

$ make -j4
…
[100%] Built target G4physicslists

コンパイルできたのでインストール。

$ make install

examples/basic/B1をコンパイル&実行してみた

$ pushd /opt/homebrew/Cellar/geant4/11.0.0.beta/bin && \
source geant4.sh && \
popd
$ mkdir ../build_example
$ cd ../build_example
$ cmake ../geant4/examples/basic/B1
$ make
$ ./exampleB1

f:id:gzalt:20211031110221p:plain
exampleB1実行の様子

できました🎉

おわりに

$ brew unlink qt

とした方がいいかも。

M1 MacでDocker Desktopに頼らずにx86_64のlRubyを使うまで(追記)

はじめに

前回limaでM1 MacでDocker Desktopに頼らずにx86_64のIRubyを使うまでを記載しましたが、こちらで紹介されているとおりにlima + Docker CLIにした上で、--platform linux/amd64で buildした方がいい感じ。

構築

こちらで説明されているとおりに環境を構築します。ただしパッチを当てたQEMUのインストールは今は不要だと思います。

qiita.com

あとは、前回同様以下のようなDockerfileを用意。

FROM jupyter/base-notebook:latest
USER root
RUN apt-get update \
  && apt-get install --no-install-recommends -y \
  libczmq-dev \
  libtool \
  make \
  ruby-dev \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
RUN gem install --no-document \
  cztop \
  iruby
USER $NB_USER
RUN iruby register --force

Dockerfileを置いたディレクトリで以下を実行。

$ docker build --platform linux/amd64 -t iruby .

無事完了したら、以下のコマンドでIRubyを起動。

$ mkdir /tmp/lima
$ docker run -it --rm -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -v /tmp/lima:/home/jovyan/work iruby

表示されるhttp://127.0.0.1:8888/lab?token=…にブラウザでアクセスすると、x86_64のlRubyが使えました。

おわりに

aarch64では使えないneilslater/convolverも動きました。

f:id:gzalt:20211002120602p:plain
IRubyの画面

すばらしい。

M1 MacでDocker Desktopに頼らずにx86_64のlRubyを使うまで

はじめに

Docker Desktopと同様に、limaでも、M1 Macx86_64のIRubyが動作します。以下、その手順です。

limaを使えるようにする

前回の記事qemu-virglをインストールするところまで実施します。

5zalt.hatenablog.com

x86_64のlimaを起動

$ limactl start amd64

amd64の部分は何でもよいです。

以下のように表示されるので、矢印キーでOpen an editor to override the configurationを選択してreturn。

? Creating an instance "amd64"  [Use arrows to move, type to filter]
  Proceed with the default configuration
> Open an editor to override the configuration
  Exit

エディタが起動するので、以下のように書き換えて保存し終了。

@@ -4,7 +4,7 @@

 # Arch: "default", "x86_64", "aarch64".
 # "default" corresponds to the host architecture.
-arch: "default"
+arch: "x86_64"

 # An image must support systemd and cloud-init.
 # Ubuntu and Fedora are known to work.
@@ -49,7 +49,7 @@
   # A localhost port of the host. Forwarded to port 22 of the guest.
   # Currently, this port number has to be specified manually.
   # Default: none
-  localPort: 60022
+  localPort: 61022
   # Load ~/.ssh/*.pub in addition to $LIMA_HOME/_config/user.pub .
   # This option is useful when you want to use other SSH-based
   # applications such as rsync with the Lima instance.

x86_64のLinuxイメージのダウンロードと環境構築が始まります。結構時間がかかります。

IRubyの構築と起動

以下のようなDockerfileを用意。

FROM jupyter/base-notebook:latest
USER root
RUN apt-get update \
  && apt-get install --no-install-recommends -y \
  libczmq-dev \
  libtool \
  make \
  ruby-dev \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*
RUN gem install --no-document \
  cztop \
  iruby
USER $NB_USER
RUN iruby register --force

Dockerfileを置いたディレクトリで以下を実行。

$ limactl shell amd64 nerdctl build -t iruby .

とても時間がかかります。私の環境では30分以上かかりました。コーヒーを飲みながら待ちます☕

無事完了したら、以下のコマンドでIRubyを起動。

$ mkdir /tmp/lima
$ limactl shell amd64 nerdctl run -it --rm -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -v /tmp/lima:/home/jovyan/work iruby

ブラウザでアクセス

表示されるhttp://127.0.0.1:8888/lab?token=…にブラウザでアクセス

f:id:gzalt:20210920141345p:plain
IRubyの画面

すばらしい。

おわりに

なぜこんなことをしているかというと、手元のIRuby notebookで使っている neilslater/convolverがaarch64では使えないから。

icm7216/narray-convolveを使えばいいのでは? まぁ、そうですね…

M1 MacでDocker Desktopに頼らずにJupyter Labを使う(たぶん)最短の手順

はじめに

Jupyter Labをたまに使いたい私にはlimaはとてもありがたいツール。limaの開発はとても活発で頭が下がる思いです。

github.com

以下はJupyter Labを使えるようにするまでの手順メモです。

Homebrewをインストール

Homebrewをインストール。詳細は割愛。

limaをインストール

$ brew install lima

依存関係で入るqemuをunlinkしてqemu-virglをインストール

hvfパッチが当たったqemuでないと動かないらしいので、依存関係で入るqemuをunlinkしてqemu-virglをインストール

依存関係で入るqemuがアップデートされてqemu-virglを入れる必要がなくなりました。

limaを起動

$ limactl start

以下のように表示されるのでそのままreturn

? Creating an instance "default"  [Use arrows to move, type to filter]
> Proceed with the default configuration
  Open an editor to override the configuration
  Exit

Jupyter Labの構築と起動

$ mkdir /tmp/lima
$ lima nerdctl run -it --rm -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -v /tmp/lima:/home/jovyan/work jupyter/base-notebook

ブラウザでアクセス

表示されるhttp://127.0.0.1:8888/lab?token=…にブラウザでアクセス

f:id:gzalt:20210917103334p:plain
Jupyter Labの画面

すばらしい。

おわりに

実は

$ brew install jupyterlab

が最短? いや

blog.jupyter.org

が、最短です。

参考

zenn.dev

qiita.com

MacBook Air(M1, 2020)上でRuby/Tkを使ってPlotchart

久しぶりの更新。

はじめに

MacBook Air(M1, 2020)を手に入れたので、Ruby/Tkを使ってPlotchartできるようにします。

Homebrewのインストール

なにはともあれHomebrewをインストールします。詳細は割愛します。

Rubyのインストール

$ brew install ruby

tcl-tkのインストール

$ brew install tcl-tk

tklibのインストール

ここからtklibのソースをダウンロードします。現時点でtklib-0.6.tar.bz2から7年ぶり2020年2月にリリースされた tklib-0.7.tar.bz2が最新のようです(ここのブログも5年ぶりの更新ですが)。

ともかく、展開してインストールします。

$ tar xvf tklib-0.7.tar.bz2
$ cd tklib-0.7
$ PATH="$(brew --prefix tcl-tk)/bin:$PATH" \
 ./configure --prefix=$(brew --prefix tcl-tk)
$ make install

gemのインストール

Ruby本体から分離されてgemになっているRuby/Tkをインストールします。

$ PATH="$(brew --prefix tcl-tk)/bin:$PATH" \
gem install tk

動作確認

以前の記事に掲載したRubyスクリプトを動作させてみます。

f:id:gzalt:20210629114534p:plain
M1上Ruby/TkでPlotchart動作の様子

問題なく動作しました。

MDArrayを試してみました

はじめに

NArrayっぽいやつをいろいろ試しました - ござるのブログ」に続いて、JRubyのMDArrayも試してみました。

実行環境は以下の通りです。

MDArray 0.6.1.2

MDArray は、JRuby用の多次元配列です。NumPy旧NArray にinspireされたものだそうです。

require 'mdarray'
require 'benchmark'

SIZE = 16384

Benchmark.bmbm do |x|
  x.report do
    r = Random.new
    a = MDArray.fromfunction('double', [SIZE, SIZE]) { r.rand }
    b = MDArray.fromfunction('double', [SIZE, SIZE]) { r.rand }
    c = a * b
  end
end

実行結果

 Error: Your application used more memory than the safety cap of 500M.

メモリが足りないと言われました。-J-Xmx12Gというオプションを付けて再実行します。

       user     system      total        real
  71.180000   3.840000  75.020000 ( 73.881698)

おわりに

やはり乱数を生成してセットするところが遅いようです。