Blend day's Note

思い立ったことをメモする

【nphantom鯖】foltia Anime Lockerでの録画完了通知Botを作った報告(裏話)

私一人の単独作業のはずが、共同管理者の人がどんどん先に進んでしまって、終いには私はクビになっていましたが…結局最終調整は私がやってましたという謎のプロジェクト。ざっくりとその内容をメモしておきます。と、思ったが、結局裏話的な立ち位置に。*1中身のコードとかはまた別の枠で。


事の発端は、共同管理・運営・出資している人からの一言。

他の人がやっているような、番組の録画が完了したらつぶやいてくれるようなTwitter Botが欲しい

まあ、難易度的にはそんなに難しい要求ではなさそうだと、この時はまだ思っていました。
この当時は、foltia Anime Locker (以下:FAL)の設定ページにあるログ表示のログを眺めつつ、SSHで接続して、/var/log/messagesとか access.logとかを眺めながらうへへしていました。
このログに、各種変換のログが記録されていたので、これを元々のソースコードから探れば行けるでしょと、当時は楽観的に捉えていました。そう、この時は知らなかった。
ソースコードperl で書かれているなんて。

ソースコードの解析(?)

この辺りから、botの初期段階までは共同管理者の人が全部やってくれましたので、あらかたのメモだけ。ちなみに、当方利権関係が今ひとつわかってないので、ソースコード乗せるとかしません。*2てか加筆方法が汚すぎて載せられませんのでご了承を。

今回は、変換の状況を知らせるbotの作成をするとのことなので、変換を統括しているperlプログラム、"ipodtranscode.pl"ソースコードを当たることに。既にログファイル(/var/log/messages)にログが記述されているところにツイートを引っ掛けるという組み込みをしようと考えていました。

ipodtranscode.plのログ書き出しは &write(~)というもので行われていることがソースを見て判明しました(Perlわかんないっす)。それと合わせて、ログでのメッセージ文をソースから検索すると、あっさりとビンゴしました。
とりあえず目印のフラグを建てるということで、同様にログファイルでの書き出し(⇒&write("test tweet") )を行っていました。

ipodtranscode.plは基本的にはcrontab*3に登録されているschedulecheck.plを通じて実行*4されていますが、手動での実行*5も可能でしたので、今回は手動で実行させて確認しました。*6

どんでん返しのBot作成と事の顛末

共同管理者が色々といじっている時に、Slack*7にて、

Twitterへのツイート処理は Ruby でいいっすか?

と。間髪を入れずにOKと返事しました。なんでかって?
ごめんなさい。今からPerlやる余裕ないっす
というわけで、コマンドを実行する関数を利用することでRubyでツイート処理をさせることに。

しばらくしたら、完成したとの連絡を受け取ったのでワクワクしながら一晩待ちました*8

翌朝、FALの録画リストを確認すると、

変換がされていないじゃありませんか。

何事かと思ってログを確認したら、変換系のコマンドが一切動いてないじゃないですか…
結論的には、コマンドがすべて

exec(ruby ....)

となっていました。で、調べてみると…

Perlの組み込み関数 exec の翻訳 - perldoc.jp
これを読むと、面白い記述が。

exec 関数は、システムのコマンドを実行し、戻ってはきません; 戻って欲しい場合には、execではなく system 関数を使ってください。

と、いう訳で、ipodtranscode.plの起動時につぶやこうと策略しているrubyプログラム*9は、実行されたらされっぱなしで、ipodtranscode.plには一切戻ってこないという罠が発生。これにはさすがに頭を抱えました。

さすがにやばいと感じ、ここからは私のターン。何とかしなければ。

botの修正

細かい話はまた別枠でということで、ハマった点だけ。
まず、execをsystemに書き換えて、無事にすべてが通るように変更し、確認しました。*10
しかし、変更したら今度は内容がツイートされないという謎に直面。これには解決に時間がかかりました。
結果的には、相対パスでファイル位置を指定していたのが大問題。まあ、言われてみれば納得ですが、テスト用に作成されていたperlからrubyを動かしたら実行される*11んですから、分かるもんもわからなくなりますわ。
と、いう訳で無事にbotの修正は完了しました。が、私の中ではさらなる改善が欲しかった。

変換中の番組名欲しい

botの改善

というわけで、番組名をなんとか取得するようにしました。
いつの間にか番組名が出力されるようなフラグが建設されていました*12ので、うまく活用させていただくことに。単純にファイル書き出ししたのですが、盛大に文字化けを起こしていました。これには思わず白目。しかしめげずに次のサービスを使わせて頂きました。

文字化け解読ツール「もじばけらった」

すると、ISO-8859-1 → UFT-8への変換がうまくいきました。やったね。しかし、書きだされたメッセージにはだけ綺麗にUTF-8で書き出されており、再び頭を抱える自体に。
逆転の発想で、この2文字をISO8859-1に変換したものを書き出すメッセージの該当部分に置き換えればいいのではと。
するとこれが見事にヒット。Rubyで扱うときは自動的に文字コードを変換してくれるらしく、テキストデータ的には何の問題もなく扱えるように。
その後、別ファイルのツイートプログラムをRubyで構築(コピペのオンパレード)して、組み込んでみると何とか成功しました。



そんなこんなでここ一週間はFALのBot調整してました。他の進捗は最悪です。
最後に、なんで裏話が先行して投稿されてるかって?
そりゃあなた、花粉症で頭に酸素行ってなくて頭回ってないからだよ。今年はマジで対策が遅かった…

*1:更に悪いことに、こっちが記事的に先行しているというところ。一体何が書きたかったんだ?

*2:今後この手のネタでは。

*3:ユーザー:foltiaSSHログインした後、crontab -eで確認。ちなみにこの後 -rで全削除してしまったことは内緒

*4:これもソース見ました。

*5:普通に perl ipodtranscode.pl 実行。実行方法を調べるときに -cオプションで構文チェックができることがわかったので、実行前に構文チェックをしてから実行することにしました。地味に便利

*6:なんでこのパートは主体的なのかって?そりゃーこの後に書いてあるとおり、自分で弄ってるからですよ。

*7:こんな立派なもん我々が使っていいのかと言いつつ使ってます。便利です

*8:この時は、PerlもDBも弄っていません。完全にお任せ状態でした。

*9:更にはツイートされていないという事案も発生していました。これの解消にはさすがに時間がかかった。

*10:確認でperlを実行したら、変換プログラム:ffmpegが動き始めてしまい、止めるに止められず、CPUが火の車に。番組数が20近くあったので止まらない終わらないのオンパレード

*11:このテストファイルは共同管理者さんが作ってくれました。その後も結構活用

*12:これには当方も驚き。