2019/09/29に、「tokyo.ex #13 elixir本体ソースコードもくもくリード会」に参加してきました。
今回は、fukuoka.ex さんとのオンライン接続によるコラボ開催(笑)です。
そのイベントで、独自のコードを含めてElixirをコンパイルしてきたので、簡単に記録しておきます。
もくもく前の事前準備
ハヤブサさん@hayabusa333、おーはら@ohrdevさん、piacere@piacere_exさんがそれぞれ、各コミュニティの説明やソースコードリードに関係する内容についての説明をしてくださいました。
公開されている資料を載せておきます。
特に、おーはらさんの資料は、makeについても詳細に触れられていました。
最近ではmakeについて話を聞くことは少ないので、非常に貴重な内容であったと感じています。
また、piacereさんのお話を聴いていて、Elixirについては西日本側が勢いあるなぁ、と感じました。
もくもく
事前のインプットを終えたら、あとはひたすら黙々です。
手順としては、Erlangの用意も含めて以下の4点です。
- 事前準備:Erlangをインストールしておく。(コンパイルElixirのバージョンに合わせたErlangのバージョンが必要)
- GitHubに上がっているElixir本体のソースコードをcloneする。
- 本体コードを修正する。
- makeコマンドを実行する。
cloneするElixr本体のソースコードはこちらになります。
cloneした後で、elixirディレクトリに移動しておきます。
このディレクトリ直下にはMakefileがありますので、原則はこのディレクトリ上で、makeコマンドを実行していきます。
$ git clone https://github.com/elixir-lang/elixir.git $ cd elixir
makeコマンドについては、特にオプションをつけずに実行して問題ありません。
ただし、一度makeコマンドを実行した後では、再びmakeする前にmake cleanを実施しておくのが良いです。これは、以前にコンパイルしていたファイルが悪さをする可能性があるためです。
やり忘れを防ぐためにも、セットで実行しておくのが良いでしょう。
$ make clean && make
コンパイルされた結果出来上がったElixirの実行コマンド(elixirやiex、mixなど)は、elixrディレクトリ配下のbinディレクトリ直下に配置されています。
まずは、コンパイルしたbin配下のelixirコマンドを発行してみましょう。
$bin/elixir --version Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] Elixir 1.10.0-dev (b23b94e) (compiled with Erlang/OTP 22)
これが確認できれば成功です。
それにしても、makeコマンドがこんな簡単に済むなんて、すごく久方ぶりな気がしています。
だいたい、何かしらのライブラリが足りないって怒られることが多かったのでw。
コードを修正してみる(出力されるバージョンを変える)
まずは既存のコードを修正してみます。
バージョンの内容は「VERSION」というファイル中に記載されています。
今回は、これを
1.10.0-dev
以下のように変更します。
1.10.0-dev-HHacking
その後、makeコマンドを実行し再コンパイルをします。
コンパイルが成功した後で、「 bin/elixir 」を実行してみます。
$bin/elixir --version Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] Elixir 1.10.0-dev-HHacking (b23b94e) (compiled with Erlang/OTP 22)
バージョンの表記が変わりました。
モジュールを追加してみる
続いて、独自のモジュールを追加してみます。
モジュールの追加手順は以下の2点です。
今回は、「 lib/elixir/lib/uramasu.ex 」というファイルでUramasuモジュールを用意してみます。
ElixirのコードはElixirで書かれています。Golangを思い起こさせますね。
defmodule Uramasu do @moduledoc ~S""" Uramasu module ! - hello(yourname): output greeting message. """ def hello(:usamaru), do: IO.puts "Pieeee!!!" def hello(:usako), do: IO.puts "Love!!!" def hello(:hiyoko), do: IO.puts "Piyo piyo" def hello(:kuma), do: IO.puts "..." def hello(x) do IO.puts "Hello. #{x}!!" end end
続いて、このファイルをコンパイルさせるために、「 lib/elixir/src/elixir_compiler.erl 」ファイルを修正します。
具体的には、前述の「 uramasu.ex 」をコンパイル対象に追記します。
「bootstrap_main() ->」という箇所があるので、以下のように「 <<"lib/elixir/lib/uramasu.ex">>, 」を追記してください。
〜(略)〜 bootstrap_main() -> [<<"lib/elixir/lib/kernel.ex">>, <<"lib/elixir/lib/uramasu.ex">>, <<"lib/elixir/lib/macro/env.ex">>, <<"lib/elixir/lib/keyword.ex">>, 〜(略)〜
その後、makeコマンドでコンパイルを実行します。
コンパイルが成功したら、iexを起動してみます。
$bin/iex Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] Interactive Elixir (1.10.0-dev-HHacking) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> h Uramasu Uramasu Uramasu module ! • hello(yourname): output greeting message. iex(2)> Uramasu.hello(:usamaru) Pieeee!!! :ok iex(3)> Uramasu.hello(:usako) Love!!! :ok iex(4)> Uramasu.hello(:hiyoko) Piyo piyo :ok iex(5)> Uramasu.hello(:kuma) ... :ok iex(6)> Uramasu.hello(:mzryuka) Hello. mzryuka!! :ok iex(7)>
独自モジュールが実行されました。
余談:懇親会
もくもく作業も終わり懇親会に突入です。
Fukuoka.exとは、懇親会中もオンラインでつながっていました。
Elixir系のイベントいうことで、先日の技術書典7で頒布したElixir本(=えりいざ本)も持参していきました。
Twitterにも書いていますが、強強の人に認識してもらいたくて。
先週の #技術書典 7でElixir本を頒布しました。懇親会で持ち歩いてるので、内容が気になる方がおられましたらお声がけください。(強強な方達の感想をお聞きしてみたい)
— みずりゅ(技術書典7せ27D:しがないラジオsp65出演しました。) (@MzRyuKa) September 29, 2019
#tokyoex pic.twitter.com/L7FuPgIgXi
そして、懇親会の場で同じテーブルになった主催のおーはらさんに、軽く読んでいただきました。
その際に「初心者には向いている本だと思います」というコメントをいただけました。
というわけで、Elixirの初心者にオススメする一冊としていかがですか?
「とらのあな」さんで物理本を委託販売していますので、気になる方はどうぞ。
ec.toranoana.shop
コホン。話を戻します。
また、懇親会の場では、技術書典7で「えりいざ本」を数冊購入された、myasu@etcinitd さんにもお会いすることができました。(加えて、お名前を聞きそびれたのですが、同じく技術書典7で本を購入してくださった方ともお話できました。)
先週の技術書典で入手した、Elixir本の筆者さんにお会い出来たよ! pic.twitter.com/d3O59fzuay
— myasu🍊10/5 ClariS Live, 6 ALGYAN京都 (@etcinitd) September 29, 2019
myasuさんは西日本に在住されているとのことですが、今日はたまたま用事があって関東の方に出てきてこのイベントに参加されたとのこと。技術書典7の際には運悪く入れ違いになったのですが、すぐに直接お会いする機会に恵まれたのは幸運でした。
myasuさんは、西日本側のElixirコミュニティでも活動されているということでした。加えて、Nerves+IoTを色々と普及させようと奮闘されているとのこと。
ですので、また別の機会にもお会いすることができそうです。直近では、11月30日にNervesを使ってイベント(「IoTをつくるよ2」)に参加されるとか。要チェック。
「IoTをつくるよ2」の参加についてはこちらから。
また、myasuさんのご好意で、Fukuoka.exの方々とオンラインで簡単にお話させていただくこともできました。「えりいざ本」の執筆者として、自分の書いた本がElixir普及の一端を担えれば嬉しいな、と思いました。