Chidori Adachi, dashing on each thing

足立千鳥があちこちぶちあたりながら学んでいく記録です。

WSL (Windows Subsystem for Linux) に Ubuntu20.04 を入れて Raku (Perl6) の Math::Libgsl::Matrix を使う

こんにちは世界。

内容

タイトルの通りです。

  1. Windows10 で Linux の shell が使える WSL (Windows Subsystem for Linux) の機能を使えるようにする。
  2. WSL で Ubuntu20.04 を使えるようにする。
  3. WSL の Ubuntu20.04 に Raku (以前は Perl6 と呼ばれていた) というプログラミング言語の環境を入れる。
  4. 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 の機能の有効化または無効化」の「LinuxWindows サブシステム」にチェックを付けて再起動します。Windows10 以前の Windows には WSL はありません。

f:id:chidori-adachi:20200816070753p:plain
checkbox of WSL

WSL で Ubuntu20.04 を使う

Microsoft Store」から「Ubuntu 20.04 LTS」を「入手」します。2020年8月の感覚では安定していて情報もたくさん転がっている Ubuntu18.04 にするか新しい Ubuntu 20.04 にするかちょっと迷うところですがせっかくなので新しい方を入れます。

f:id:chidori-adachi:20200816090002p:plain
Microsoft Store

f:id:chidori-adachi:20200816074220p:plain
Ubuntu 20.04 LTS in Microsoft Store

Ubuntu 20.04 LTS」を起動します。

f:id:chidori-adachi:20200816074427p:plain
start Ubuntu 20.04 LTS

最初にユーザーネームとパスワードを登録します。パスワードはセキュリティのためにタイプしても画面には表示されないことと、確認のために2回入力する必要があることに注意します。

f:id:chidori-adachi:20200816084137p:plain
register your username and password

次にインストール直後の 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) する、という意味です。先ほど入力したパスワードを入れて自分がただのゲストユーザではないことを証明する必要があります。

f:id:chidori-adachi:20200816084343p:plain
update

アップデートします。

sudo apt update
sudo apt upgrade

途中、「こういうパッケージをインストールして容量これだけ使うけど続けていい?」ということを尋ねてくるので Yes の意で「Y」と打ちます。

f:id:chidori-adachi:20200816084712p:plain
upgrade

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" でも同じことになります。

f:id:chidori-adachi:20200816162831p:plain
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 を起動し

f:id:chidori-adachi:20200816222037p:plain
start vim
適当にベクトルの足し算をするプログラムでも書いてみましょう。
f:id:chidori-adachi:20200816222137p:plain
test vector computation
rakudo test-vec.raku で実行します。
f:id:chidori-adachi:20200816222320p:plain
a result of the vector computation test
実行できているようです。良かったです。

WSL のプラスアルファ

ファイルの移動

ファイルエクスプローラのパスのところに \\wsl$ と入れると Ubuntu が見えるので通常通りの方法でファイルを移動できます。

f:id:chidori-adachi:20200816223232p:plain
the location of Ubuntu in WSL

もしも WSL の Ubuntu をリセットしたくなったら

なにか取り返しのつかないミスをしていて「最初からやりなおしたい」と思ったら、「設定」->「アプリ」->「アプリと機能」->「Ubuntu 20.04 LTS」->「詳細オプション」から、

f:id:chidori-adachi:20200816223806p:plain
option of Ubuntu 20.04 LTS
「リセット」をクリックします。
f:id:chidori-adachi:20200816223953p:plain
reset Ubuntu 20.04 LTS
次回 Ubuntu 20.04 LTS を起動するとさらの状態から始められます。パーティション区切ってデュアルブートにして……みたいな方法に比べるとリセットしてやりなおすのは非常に楽ですね。

今日の学び

エラーメッセージを読む

環境構築やコンパイル等々、だいたい一発でうまくいきません。大切なのはエラーメッセージを読んで次何を試してみるかのアタリをつけることです。例えば今回の zef install Math::Libgsl::Matrix をやってみたときに、結果が下の図のようになったとします。

f:id:chidori-adachi:20200816225538p:plain
building FAIL
Building [FAIL] と出ています。公式ドキュメントや参考にしたページに書かれている通りにやったはずなのになんなんだよ、と怒りたくなるのもわかりますが、「ああ、通らなかったのね」と気を落ち着けて書かれていることを読みます。「英語だから読めねえ」は大声で堂々と言うことではありません。「英語は苦手なので頑張って読みますが少し時間がかかると思います……」と恥ずかしそうに言いましょう。
根気強く読んでいくと「make: not found」と書かれています。「そういえばまだ make を install してなかった」と気づいたら sudo apt install make を実行します。

見つかった問題を片づけたら再度 zef install Math::Libgsl::Matrix を実行してみます。

f:id:chidori-adachi:20200816230310p:plain
cannot find
「Aborting due to test failure」、テストに失敗したので中断します、また失敗しましたね。「一発でうまくいかない」は「二回目なら通る」を意味しません。でもメッセージが変わったのは何か進展があったということでしょう。また根気強くエラーメッセージを読んでいくと、「cannot find -lffi」「cannot find -ltommath」などの「ライブラリが見つかりません」というエラーが出ているらしいことがわかります。

ではライブラリを入れましょう。それっぽい名前のパッケージを探します。apt search tommath と実行すると、

f:id:chidori-adachi:20200816230843p:plain
apt search
このように名前に tommath の入っているパッケージが見つかります。ここまで来てこんなことを言うのは心苦しいのですが最後は勘を頼りにすることもあります。一番それっぽいパッケージを入れてみるとか。sudo apt install libtommath-dev を実行してまた zef install Math::Libgsl::Matrix を実行します。さっきの「cannot find -ltommath」が消えていたら一つ問題を潰したことになります。

と、このような感じで地道に問題を解決していけば最後には輝かしい未来が待っていることでしょう。

所感

「モジュール入れずに配列でやったらダメなの?」「Perl なら数値計算よりテキスト処理では?」「行列計算したいなら Python の numpy を使えば?」等々色々な意見がある気もしますがとりあえず今回はこれで。それではまた。

References

Raku について

WSL について

エラーメッセージについて

どうもありがとうございました。