👨

Rustでojichatを作ってみた

2021/01/01に公開

あけましておめでとうございます。そしてはじめましてzenn。

書き初め的な記事として今日はRustなおじさんの話をしようと思います。

ojichat

皆さんはojichatというものをご存知でしょうか。

一時期シェル芸界隈で騒がれた狂気恐怖のコマンドなのですが、実際に見ていただいたほうが早いと思います。

はい、なんとなく分かりましたでしょうか。大体こんなノリのコマンドです。

ところでこのojichatコマンド、Goで書かれてるんですよね。

Goのウリといえばシングルバイナリ。そういえばもう1つシングルバイナリで高速実行がウリのナウでヤングな言語があったような……。

はい、Rustですね。

Rustなおじさん、爆誕

という訳で、Rustでojichatを作ってみました。(タイトル回収)

https://github.com/gamoutatsumi/ojichat_rs

https://github.com/gamoutatsumi/ojichat_rs_cli

実際に動いている所をご覧ください。

見事なおじさんっぷりですね。

今回はこのおじさんをどうやって作ったかの話をしたいと思います。

必要なライブラリの選定

まず、本家のGoなojichatがどのようにして書かれているかを調べました。

実を言うとGoはHello, Worldすらした事がないので完全に初めてのGoです。Go処女をおじさんに奪われました。

その結果、とりあえず以下のようなライブラリがあればおじさんを実装できる事が分かりました。

  • 形態素解析器
  • 人名の自動生成
  • 乱数生成器

乱数はない筈がない(実際あった)ので問題なかったのですが、形態素解析と人名の生成が怪しい所でした。

結果としてあったのでおじさんが誕生した訳なのですが、最終的に選択したライブラリがこちらです。

形態素解析器

linderaというcrateを使いました。GitHub見たら色んな言語の形態素解析器の人がいてびっくりしたのですが、心の中で土下座しながら使わせて頂きました。

https://qiita.com/mosuka/items/0fdaaf91f5530d427dc7

https://github.com/lindera-morphology/lindera

本当にごめんなさい。

人名の自動生成

gimeiというそのままなcrateがあったので使わせて頂きました。

https://github.com/rejasupotaro/gimei-rust

乱数生成器

randというcrateを使いました。

https://docs.rs/rand/0.8.0/rand/

これで必要なものは揃いました。

ONARA (Ojisan NArikiri Randomized Algorithm)

ojichatのメインとなるアルゴリズムです。

名前の通り、おじさんになりきる為のアルゴリズムなのですが、ぶっちゃけGoで書かれたものをRustに書き写しただけなのであまりよく分かってません。

一応ざっくりした説明をすると、おじさんの感情を列挙してそれに合わせた文言のテンプレートをランダムで選択し、ランダムで選択した絵文字や人名と組み合わせてる感じです。

ぶっちゃけコードが長いしおぞましいのでここでは説明したくないです。

完成

そんなこんなでRustなおじさんが完成しました。

一応雑にベンチを取ってみた所、いくつか端折ったアルゴリズムはあるものの圧倒的な実行速度の差を見せつけてくれました。(ちゃんとしたベンチの取り方は知らないので悪しからず)

なおバイナリサイズはクソデカなのでクソデカおじさんです。

https://twitter.com/gamoutatsumi/status/1344082294227648513

謝罪

本当にすみませんでした。

Discussion