Zennにも投稿したので、好きな方でお読みいただければと思います。
はじめに
みなさま「青いベンチ」という曲はご存知でしょうか。
「この声が枯れるくらいに 君を好きと言えばよかった」からはじまるサビは聞いてて心地いいですね。
さて、私がこの曲を知ったのは青いベンチ診断というものです。
これがまた面白くて、1/157464の確率で「青いベンチ/サスケ」という文字列が揃うものになります。
確率からしてだいたい外れるんですが、以下のような診断結果が出力されてクスってきてしまいます。
揃わなかった文字列を言い合うみたいなtogetterもありました。
2021年の終わりになぜか「ひたすらこの診断結果を投稿するBotを作りたい」と強く思ってしまったために作ることにしました。
ただ、診断メーカーにはAPIが無いようで、結果が日替わりという制約があったのでロジックを再現して投稿する仕組みを作ります。
大きく以下の流れで進めました。
- step1 ロジック解析
- step2 ローカルで青いベンチ診断ができるようになる
- step3 twitterアカウントを開設し、青いベンチ診断の結果を投稿できるようになる
- step4 1時間に1回定期実行できるようになる
step1 ロジック解析
以下3つからロジックを推測しました。
- 診断メーカーの作成画面
- 結果パターンの組み合わせ数
- 青いベンチ診断の検索結果
まず、診断メーカーの作成方法ですが、
[LIST1][LIST2]
のように変数を設定し、LIST1
がとりうる値を一覧でもっておきランダムで判定するというものでした。
例えば、
[LIST1]と[LIST2]
という出力結果で、
[LIST1]
の候補がa
とb
、
[LIST2]
の候補がc
とd
であれば、
出力結果は以下4通りになります。
aとc
aとd
bとc
bとd
次に、結果パターンの組み合わせ数です。
以下の画像からも分かる通り157464通りです。
素因数分解すると$157464=2^3 × 3^9$です。
あとは診断結果からロジックを矛盾なく組み立てていきます。(これがめちゃくちゃ大変でした)
ロジックは以下で間違いないと思います。
[LIST1][LIST1]/[LIST1]
- LIST1 (候補54個)
スプレッドシートに転記してにらめっこしながら解明しました。
てっきり6×6×6×9×9×9なのかなと思ってたのですが、おそろしいほどマニュアルでした・・・
/
の後の「サスケ」の部分が「サ」と「スケ」に分かれると思っていたのですが、50回ほど診断してみたら違和感に気づきました。
- 「スベ」からはじまるのは全て「スベスベ」「スベチン」のいづれかとなり不自然
- 「ケンサ」「チンベス」などどう分割してもきれいにならないワードがある
というので気づきました。54種類も考えた作者の狂気を感じる・・・
その後、「青いベンチ」になるであろう文字列の部分も見てみると、見慣れた文字列があって、ロジックが解明できました・・・!!!たしかに「青い」も「ベンチ」もふくまれている!
あとは診断をやりまくって54個の候補を確定させました。(3時間くらいかかった)
✅ Step1 完了!
step2 ローカルで青いベンチ診断ができるようになる
実装するだけなので特に書くことはないですが、以下のようにローカルで手軽に実行できるようになりました。
ロジックはわかってしまえば単純なので、基本的にさっきのスプレッドシートをテキストエディタでいい感じにコードになるように置換してちょっと書いたくらいです。
goの環境がある方は、
go install github.com/okaponta/bluebench-cli@latest
でインストールでき、bluebench-cli
と打つだけで実行できます。ぜひ実行してみてください。
また、goの環境が無い方向けにバイナリも配布しているので、
リリースページからダウンロードして使ってください。
また、homebrewでも使えるようになってます(やり方わからずM1Mac限定です・・・優しい人教えて・・・)
brew tap okaponta/bluebench-cli
brew install okaponta/bluebench-cli/bluebench-cli
✅ Step2 完了!
step3 twitterアカウントを開設し、青いベンチ診断の結果を投稿できるようになる
まずはメールアドレスを用意し、twitterアカウントを作成します。
https://twitter.com/blue__bench
その後、Developer PlatformからAppを追加して、Read & Write権限のTokenを発行します。
https://developer.twitter.com/en/portal/dashboard
Token発行まわりでだいぶ手間取ってしまいましたが(最近UI変わった・・・?)、以前自分で作ったサンプル実装を参考にしながら無事投稿できました。
ここまでで8時間かかってます。冬休みに何やってるんだ・・・
✅ Step3 完了!
step4 1時間に1回定期実行できるようになる
ローカルでcronを動かすのも嫌なので、以下を参考にEventBridgeからLambdaをキックするように作ってみたいと思います。
仕事ではAWS使っているのですが、今回このためだけに個人アカウントを作成しました。
step3で作ったmain.go
を以下コマンドで固めて、S3にアップロードします。(なぜかzipをアップロードボタンをクリックしてもFinderが起動しなかった・・・)
GOOS=linux go build -o main
zip main.zip ./main
ランタイム設定のハンドラの部分をmain
に書き換えて保存します。
ここで、M1 Macの落とし穴があって、lambda
でgoを実行する際、arm64をサポートしてないみたいで、GOARCH=amd64
オプションを加えて再度ビルドしてアップロードしました。
GOARCH=amd64 GOOS=linux go build -o main
zip main.zip ./main
そして、Lambdaのテスト投稿から無事出力されました・・・!!!
あとは、定期的に実行させればいいので、EventBridgeからルールを登録します。
イベントスケジュールにcronで以下を指定して、1時間おきに実行するようにしました。
0 * * * ? *
ターゲットを先ほど作成したLambdaに向けてあげれば完成です・・・・!!!
やったぁぁぁぁぁあああああ!!!!!
この声が枯れるくらいに〜〜〜君を好きと言えばよかった〜〜〜!!!!!!
✅ Step4 完了!
感想
結構軽い気持ちで手をつけたのですが、いろんなことに詰まりつつ気づいたら11時間も格闘してました。。。
大きくは以下で時間をめちゃ使いました。
- 謎のロジック解明(とても楽しかった)
- twitterの認証(Read & Writeトークンの付与に苦戦した)
- lambdaからgoを実行するようにする部分
- homebrew-tapで
bluebench-cli
をインストールさせるようにした部分
結構一人ではじめてのことやるとそれなりに詰まるなぁという印象だったので会社のチームメイトのありがたさを改めて実感しました笑。
あと、ふと冷静になると今日1日何をやっていたんだという虚無感がすごいです。
気が向いたら(はやくて半年後になりそう)アップデートしようかな。。
よければフォローしてあげてください。🙇
https://twitter.com/blue__bench
最後まで読んでいただきありがとうございました!!!