ojichatのPerl版を作ってみました


こちらはPerl Advent Calendar 2019の22日目の記事になります。昨日は、Morichanさんによる、PerlだけでWebサイトを作る でした。

はじめに

今年もPerl Advent Calendarに勢いだけでエントリーしてしまったのですが、何かCUIネタ的なものを書きたいと思ってネタを考えてみたものの、前日まで良いアイデアが浮かばず困り果てて慌ててこちらのojichatネタにしてみました。
ネタの性質的にもし気分を害された方などいらっしゃいましたら一旦アドベントカレンダーからエントリを分けさせていただきます🙇‍♂️

なぜ今ojichatなのか?

約半年前にトレンドになったojichatですが、なぜ今こちらを選んだのかと言いますと数日ほど前に久々におじさんの姫版である himechat-cli が界隈で盛り上がっており、
またPerlの移植版は見たところまだ出ていなかったのでせっかくなのでこの機会にネタにしてみようと選んでみました。

移植の流れ

自分はGo言語については仕事で使っておらず、これまでまともに読んだ事が無かったのでオリジナルのコードを追いながら処理の流れ・クラス構成などを把握していきました。

まず目につくのが

Onara ... Ojisan NArikiri Randomized Algorithm: おじさんなりきり乱択アルゴリズム

というもので、おじさんの会話パターンのアルゴリズムがある事がわかりました。

と、それ以降の説明を書いて行こうと思ったんですがこのあたりの詳細は同時に参考にさせていただいた、ojichatのJS版、
Goで実装されたojichatのJS版、ojichat.jsを作りました
を読んで頂くとその処理の流れが掴めるかと思います。

Perl化にあたって

まずは一本のperlスクリプトで雑に書いていって、そこから無理やりクラスっぽい感じにロジックを移動させていきました。

  • オリジナルのojichatの構成になるべく合わせる
  • 標準モジュールしか使わないようにする
    • …と思ったんですが、今後拡張出来るようにCartonだけは入れておくように変更
  • gimeiのPerl実装が無かったので、さきほどの記事を参考にランダムに100個をお借りしました
  • 句読点を挟む処理ですが、形態素解析を使うまでの体力が持たなかったので、おじさんの後ほどの課題とさせていただいております😜😘😆(^_^;

…という感じでひたすら写経しながら書いていきました。

本当は自分なりの何かをしたかったのですが、アドベントカレンダー的に時間切れなので、一旦ここまでとさせていただいただきます💕😃✋😋

成果物

悲惨なデモ

$ for x in $(seq 10) ;do ./ojichat.pl ; done;
藤佳チャン、ヤッホー😘😆😊😃☀ 何してるのかい✋❓❓( ̄ー ̄?)⁉藤佳チャンも今日も2時までお仕事かな✋❓❓( ̄ー ̄?)⁉ゆっくり、身体休めてね😘😆😊😃☀ オヤスミナサイ😙😒🛌😎
しえちゃん、オハヨウ〜💗😊(笑)😍今日はもう寝ちゃったのかな😪💤(^^;;✋月曜日、会社がお休みになったよ💗😊(笑)😍しえちゃんは都合どうかな( ̄ー ̄?)🤔❗❓😜⁉️ドライブ🚗どう💗😊(笑)😍なんてね💗😊(笑)😍
透心ちゃん、そっちも台風🌀なのかな⁉( ̄ー ̄?)❗❓✋❓出張で沖縄に行ってきたよ😃☀ 😋(^з<)😃✋観光でも、行きたいなぁ😃☀ 😋(^з<)😃✋モチロン、透心ちゃんとね
律楽チャンは、スタイルがいいね😘😃♥ (^_^)😆ホント可愛すぎだよ〜😘😃♥ (^_^)😆マッタクもう😘😃♥ (^_^)😆
るあちゃん、髪の毛、切ったのかな🤔❗❓( ̄ー ̄?)✋❓似合いすぎだよ😍😃♥ 😚😃☀ こんなに可愛く😍😃♥ 😚😃☀ なっちゃったら天使みたいで小生困っちゃうよ😓^^;💦(-_-;)
ゆっくり、身体休めてね(笑)😘(^o^)😁オヤスミナサイ🛌😙😌( ̄▽ ̄)俺は留亜チャン一筋だよ🛌😙😌( ̄▽ ̄)
りなちゃん、愛しいなぁもう😂😚😍(^з<)可愛すぎてボクお仕事に集中できなくなっちゃいそうだよ(・_・;(◎ _◎;)😥(-_-;)どうしてくれるんだ😂😚😍(^з<)
よしえちゃん、会社をサボるなんて、悪い子だなぁ😋(^з<)🎵😊今日は楽しい時間をありがとうね😋(^з<)🎵😊すごく、楽しかったよ😋(^з<)🎵😊
ヤッホー(^з<)😚💗❗はやねチャン、元気かな✋❓😜⁉️🤔❓今日は楽しい時間をありがとうね(^з<)😚💗❗すごく、楽しかったよ(^з<)😚💗❗
奈南チャンは、スタイルがいいね💕😄(^_^)(^o^)こんなに可愛く💕😄(^_^)(^o^)なっちゃったらお姫様みたいでおじさん困っちゃうよ(◎ _◎;)😰😖💔

うーん、これは地獄ですね…👴

感想

Go言語の処理をはじめてまともに読んでみる良い機会になりました。文字列操作とかの練習としてはちょうど良い題材だなぁ、と。
自分は普段Perlばかりしか見てないのですが、やはり全然文化が違っていてそれぞれの良さがあるんだなぁ、と。でも個人的にはやっぱりPerlで書きたいですねぇ。
ついでに先ほどの記事の @kaibadash さんの ojichat.js のコードも参考にさせていただいて、TypeScriptのコードも初めて読んで雰囲気を味わうことができました。

あと、この年末の押し迫った時期の休日にひとり孤独におじさんの会話を読んで、いろいろとやるせない気持ちになったりしました。休憩の合間の究極エビルプリースト氏だけが心の支えとなりました…
でもまぁこれもまた良い経験になりました…!ナンチャッテ😍(^з<)😚

明日は、mp0liiuさんによる、Perlのスタックトレースを見やすく扱う方法です!