WSL (Windows Subsystem for Linux) に Ubuntu20.04 を入れて Raku (Perl6) の Math::Libgsl::Matrix を使う
こんにちは世界。
内容
タイトルの通りです。
- Windows10 で Linux の shell が使える WSL (Windows Subsystem for Linux) の機能を使えるようにする。
- WSL で Ubuntu20.04 を使えるようにする。
- WSL の Ubuntu20.04 に Raku (以前は Perl6 と呼ばれていた) というプログラミング言語の環境を入れる。
- Raku の Math::Libgsl::Matrix というモジュールを使えるようにする。
要点
あまり情報が見つからなかったのは上の 3. と 4. です。これは WSL で Ubuntu20.04 が動いているのであればその端末で
sudo apt install rakudo perl6-zef
sudo apt install gcc make
sudo apt install libgsl-dev libgsl23 libgslcblas0 libffi-dev libtommath-dev libatomic-ops-dev libuv1-dev
zef install Math::Libgsl::Matrix
を実行することでできるようになります。
詳細
WSLの機能をオンにする
デスクトップ左下の Windows マークから「設定」->「アプリ」->「アプリと機能」->「プログラムと機能」->「Windows の機能の有効化または無効化」の「Linux 用 Windows サブシステム」にチェックを付けて再起動します。Windows10 以前の Windows には WSL はありません。
WSL で Ubuntu20.04 を使う
「Microsoft Store」から「Ubuntu 20.04 LTS」を「入手」します。2020年8月の感覚では安定していて情報もたくさん転がっている Ubuntu18.04 にするか新しい Ubuntu 20.04 にするかちょっと迷うところですがせっかくなので新しい方を入れます。
「Ubuntu 20.04 LTS」を起動します。
最初にユーザーネームとパスワードを登録します。パスワードはセキュリティのためにタイプしても画面には表示されないことと、確認のために2回入力する必要があることに注意します。
次にインストール直後の Ubuntu20.04 をアップデートします。まず Ubuntu のソフトウェアをインストールやアップデートするときにファイルをダウンロードしてくる元(リポジトリ)を自分の近くのサーバにしておくとダウンロードが速くなります。日本国内なら JAIST(北陸先端科学技術大学院大学)のミラーサーバにしておくと吉です。
sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list
下のような感じでコマンドを打っていきます。sudo は、管理者 (superuser) 権限で実行 (do) する、という意味です。先ほど入力したパスワードを入れて自分がただのゲストユーザではないことを証明する必要があります。
アップデートします。
sudo apt update
sudo apt upgrade
途中、「こういうパッケージをインストールして容量これだけ使うけど続けていい?」ということを尋ねてくるので Yes の意で「Y」と打ちます。
Rakuを使えるようにする
Raku のコンパイラである Rakudo とモジュールのインストーラである Zef をインストールします。Raku, Rakudo, Zef 等々が何かという話はここやここにあります。
sudo apt install rakudo perl6-zef
よくお勧めされているのは Rakudo Star という Rakudo, Zef, 各種モジュール がひとまとめになったバンドルをインストールするというものです。Windows に直に環境を入れるなら Rakudo Star Bandle のインストーラを使う方法 が一番楽だと思いますが、Ubuntu に入れるにはソースをダウンロードして自分で MoarVM, NQP, Rakudo を Configure していく作業が必要そうなのでここでは上の方法をとります。apt install rakudo するときに NQP と MoarVM は一緒にインストールされます。必要なモジュールはまた後で自分でインストールします。
ここまでで Raku は実行できるようになっています。端末に Rakudo
と打ち起動した REPL に "Hello, world".say
と打てば Hello, world が表示されます。 "Hello, world".say
はオブジェクト指向っぽい書き方ですが、エビバディセイイェー!みたいな感じで良いですよね。また say "Hello, world"
でも同じことになります。
exit
と打てば REPL が終了します。
Math::Libgsl::Matrix モジュールを入れる
ちょっと行列やベクトルの計算がしたいのでそのためのモジュールを入れます。Raku のモジュール の数学 (MATH) 関係のところに Math::Libgsl::Matrix というのがあるのでこれを使わせてもらいます。
Math::Libgsl::Matrix は Gnu Scientific Library (GSL) へのインターフェースとのことです。Raku のモジュールとかではなくて外にある(C言語の)ライブラリですので、この Ubuntu に GSL を入れる必要があります。Math::Libgsl::Matrix のページの Prerequisites のところに必要なライブラリ等が書いてあります。これを参考に必要なものを揃えます。
sudo apt install gcc make
sudo apt install libgsl-dev libgsl23 libgslcblas0 libffi-dev libtommath-dev libatomic-ops-dev libuv1-dev
sudo apt install gcc make
の部分は sudo apt install build-essential
でもいいような気はします。
ものが揃ったら Math::Libgsl::Matrix を入れます。
zef install Math::Libgsl::Matrix
これは結構時間がかかると思いますので気長に待ちましょう。
Math::Libgsl::Matrix が無事に入れられたらテストしてみます。プログラムを書く前に Raku のシンタックスハイライトができるように vim-raku というプラグインを入れます。
git clone https://github.com/Raku/vim-raku.git ~/.vim/pack/vim-raku-pack/start/vim-raku
test-vec.raku など適当な名前でプログラムを書きます。vim を起動し
適当にベクトルの足し算をするプログラムでも書いてみましょう。
rakudo test-vec.raku
で実行します。
実行できているようです。良かったです。
WSL のプラスアルファ
ファイルの移動
ファイルエクスプローラのパスのところに \\wsl$
と入れると Ubuntu が見えるので通常通りの方法でファイルを移動できます。
もしも WSL の Ubuntu をリセットしたくなったら
なにか取り返しのつかないミスをしていて「最初からやりなおしたい」と思ったら、「設定」->「アプリ」->「アプリと機能」->「Ubuntu 20.04 LTS」->「詳細オプション」から、 「リセット」をクリックします。 次回 Ubuntu 20.04 LTS を起動するとさらの状態から始められます。パーティション区切ってデュアルブートにして……みたいな方法に比べるとリセットしてやりなおすのは非常に楽ですね。
今日の学び
エラーメッセージを読む
環境構築やコンパイル等々、だいたい一発でうまくいきません。大切なのはエラーメッセージを読んで次何を試してみるかのアタリをつけることです。例えば今回の zef install Math::Libgsl::Matrix
をやってみたときに、結果が下の図のようになったとします。
Building [FAIL] と出ています。公式ドキュメントや参考にしたページに書かれている通りにやったはずなのになんなんだよ、と怒りたくなるのもわかりますが、「ああ、通らなかったのね」と気を落ち着けて書かれていることを読みます。「英語だから読めねえ」は大声で堂々と言うことではありません。「英語は苦手なので頑張って読みますが少し時間がかかると思います……」と恥ずかしそうに言いましょう。
根気強く読んでいくと「make: not found」と書かれています。「そういえばまだ make を install してなかった」と気づいたら sudo apt install make
を実行します。
見つかった問題を片づけたら再度 zef install Math::Libgsl::Matrix
を実行してみます。
「Aborting due to test failure」、テストに失敗したので中断します、また失敗しましたね。「一発でうまくいかない」は「二回目なら通る」を意味しません。でもメッセージが変わったのは何か進展があったということでしょう。また根気強くエラーメッセージを読んでいくと、「cannot find -lffi」「cannot find -ltommath」などの「ライブラリが見つかりません」というエラーが出ているらしいことがわかります。
ではライブラリを入れましょう。それっぽい名前のパッケージを探します。apt search tommath
と実行すると、
このように名前に tommath の入っているパッケージが見つかります。ここまで来てこんなことを言うのは心苦しいのですが最後は勘を頼りにすることもあります。一番それっぽいパッケージを入れてみるとか。sudo apt install libtommath-dev
を実行してまた zef install Math::Libgsl::Matrix
を実行します。さっきの「cannot find -ltommath」が消えていたら一つ問題を潰したことになります。
と、このような感じで地道に問題を解決していけば最後には輝かしい未来が待っていることでしょう。
所感
「モジュール入れずに配列でやったらダメなの?」「Perl なら数値計算よりテキスト処理では?」「行列計算したいなら Python の numpy を使えば?」等々色々な意見がある気もしますがとりあえず今回はこれで。それではまた。
References
Raku について
- らくらくPerl6入門 https://hackmd.io/@WNHcrD46SCuzq-ajxtf0lA/HJVfXZY9S
- Raku 入門 https://raku.guide/ja/
WSL について
- WSL(Windows Subsystem for Linux)の導入とUbuntuの初期設定 https://qiita.com/kerobot/items/b4f5472d71119506baaa
- WSLとwindows間のファイル連携 https://qiita.com/quzq/items/1096c638c0d86795be13
エラーメッセージについて
- makeで「/usr/bin/ld: cannot find」と表示されるときは https://www.atmarkit.co.jp/flinux/rensai/linuxtips/a115makeerror.html
どうもありがとうございました。