Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

Ruby gem の Elixir 版を作って Elixir コミュニティのオフラインイベントで登壇しました

こんにちは クラウド経費開発チームクラウド債務支払開発チーム の 宮村(みやむー) @miyamura.koyo です。

今回は所属しているエンジニアコミュニティが主催するオフラインイベントに登壇し、15分の発表をしてきた話を書いてみます。

君は Elixir を知っているか

私は Elixir という言語のコミュニティである fukuoka.ex に所属しています。 昨年は Elixir 生誕10周年を迎え、世界的には次世代プログラミング言語としての地位を確立している状況です。

国内でも昨年は WEB+DB PRESS Vol.131 に特集が組まれるなど盛り上がってきています!

ちなみに昨年の Elixir アドベントカレンダーでは 12 月だけで 400 記事近く生成されました(笑)。

qiita.com

Elixir x Ruby エンジニアとして

私も Elixir エンジニアとして、コミュニティ活動しつつ Elixir (Phoenix + LiveView) でのシステム開発の経験が1年以上あるのですが、プロダクションでも十分に通用するなと実感しています。

とはいえ普段の業務では Elixir ではなく Ruby で開発しており、この状況をうまく利用して Elixir コミュニティに貢献できないかな...と思っていたところちょうど 3/11 にコミュニティの方で久々のオフラインイベント 【オフライン開催!】fukuoka.ex#53 Elixir Lightning Talks!! が開催される!とのことで、発表してきました。

fukuokaex.connpass.com

なおその際に Ruby で公開されている gem を Elixir で書き換えて OSS も作成して公開しました!

github.com

登壇準備と苦労話

登壇準備として Ruby で公開されている gem を Elixir で書き換えて OSS にしました。 選定理由としては以前使ったことがあって、実装を知っていたことと、実装がコンパクトなので簡単かなと思ったからです。 (簡単というのは間違いだったというのが後で明らかになるのですが...笑)

今回作成した Elixir ライブラリは macrow_ex という名前です。 macrow という Ruby gem を基にしました。

github.com

Ruby の macrow というライブラリは文字列置換のルールを一括管理するクラスを生成するライブラリとなります。以下のようなインターフェースです。

class HogeMacro < Macrow
  rules do
    # '${something}' -> 'trouble'
    rule 'something' do
      'trouble'
    end

    # you can access an object
    rule 'length' do |object|
      object.length
    end
  end
end

macro = HogeMacro.new

macro.apply("${something} happened")
# => "trouble happened"

macro.apply("object length is ${length}", [1, 2])
# => "object length is 2"

これの Elixir バージョンである macrow_ex を作ったのですが、インターフェースはこんな感じになります。言語間の差異を考慮して、これを実現しないといけない...!

defmodule MyMacrowEx do
  use MacrowEx

  rules "hoge", fn ->
    "ほげ"
  end

  rules "len", fn array ->
    length(array) |> Integer.to_string()
  end
end

MyMacrowEx.apply("${hoge} is ${len}", [1,1,1])
"ほげ is 3"

しかも何となくお察しの通りかと思うのですが、このライブラリはメタプログラミングが必要となります。 実は Ruby と Elixir のメタプログラミングは考え方が大きく違います。

Ruby のメタプログラミングは動的に関数や属性を定義することで行います。割と柔軟にいろいろできて、これが Ruby の強みの一つですよね。 一方で Elixir はコンパイル時に関数を生成するので、実行時に決まる値は使うことができません。またコンパイル時に確定する値かどうかを区別する必要があったりします。なのである程度 Elixir のコンパイルの流れを理解しつつ制約条件下で行う必要があります。

...という苦労を乗り越えて作った OSS がこちらになります!

github.com

細かくは記事に書いたので気になる方はみてみてください。

qiita.com

発表当日

当日は福岡市と地元エンジニアで運営している「エンジニアカフェ」でイベントが開催されました。

engineercafe.jp

私は先ほどお話しした OSS を作成した話をまとめた記事を使って「Ruby gem を Elixir で書き直してみよう」というタイトルで発表しました。

qiita.com

登壇動画は Youtube で公開されているのでぜひ見てみてください! マネーフォワードの紹介も冒頭で行っています👍

やってみて

久しぶりのオフライン LT でしたが、好評のうちに終わることができました。

コミュニティの仲間は普段は全国に散らばっているのですが、今回は久しぶりのオフラインイベントということで全国から集結してくれました。 やはり普段オンラインでコミュニケーションしているとはいえ、オフラインだと今後につながる話がたくさん出たりと広がっていく感覚があり、オフラインイベントってやっぱりいいですね。 マネーフォワード福岡拠点でもオフラインイベントをしていきたいなと再認識しました!

また「Elixir で OSS 作りたいなぁ」「Elixir と Ruby をやっているというバックグラウンドを活かして何かやりたいなぁ」と思っていたので、それが実現できたのもよかったです。 発表駆動開発、大事ですね!

みなさんもオフラインイベント、そして Elixir やっていきましょう!!


マネーフォワード福岡拠点では、エンジニアを募集しています!

オフラインイベントを楽しめるところで働きたい!そんな方はぜひ応募してみてください!

hrmos.co

福岡開発拠点のサイトもあるのでぜひみてください!

fukuoka.moneyforward.com