現在地

perl

masuda_twのOAuth対応に苦労したって話

作成者:mattz 作成日:火, 06/15/2010 - 11:55

増田ぶらうざとか増田viewerっつーのを作ったついでに@masuda_twという自動投稿するbotを動かしてたんだけど、OAuth対応しなきゃなぁ、ということでここ数日色々やってたんだけど、やっと解決したっぽいのでまとめ。

これまでは、Net::Twitterの2系を適当なディレクトリに展開してシンボリックリンクとか駆使してuse libしたりしてかなり無理矢理動かしてたんですが、そろそろもうちょっとちゃんとした環境にしようと思って、まずはローカルにCPANをインストールできるようにすんべと、otsune's FreeBSD memo :: ユーザー領域にCPANをインストールする方法とかさくらインターネットでCPAN - Charsbar::Noteとかを参考に色々やってどうにかCPANが使えるようになったので、Net::Twitterの3.13003をインストール。
次に実用! PerlでコマンドラインからTwitter投稿(OAuth対応) - perl-mongers.orgとかTwitterのbotをOAuthに対応させる - しばそんノートを参考に元のスクリプトを作り替える。

ここまでは特に問題はなかったのだが、何故かpostできない。いや、できるのだが日本語が通らない。というか日本語が通らないのだと言うことに気づくまで結構な時間がかかり、気づいてちょっと検索してみたらNet::Twitter-3.13003 と Net::OAuth-0.24 の組み合わせで日本語がpost出来ない - FloralCompany.logなどというページを見つけ、Net::OAuthモジュールの該当箇所を書き換えるという、ちょっと強引な手段でとりあえず対処。

ついでなのでこれまでURL->エントリ内容の順だったpostの文言をエントリ内容->bit.lyで短縮したURLの順に変更してみた。

phpしか知らないプログラマってさ

作成者:mattz 作成日:水, 05/28/2008 - 17:16

以前にとあるperlスクリプトをphpで書き直すってのをやってもらった訳です。ちょっとそのまんま転載するのは憚られるので、少し変えて掲載します。

if( $str =~ /ABC/ ){
  $flag = 1;
}elsif( $str =~ /DEF/ ){
  $flag = 2;
}elsif( $str =~ /GHI/ ){
  $flag = 3;
}else{
  $flag = 1;
}

要するに、変数$strに"ABC"を含んでたら$flagに1、変数$strに"DEF"を含んでたら$flagに2、変数$strに"GHI"を含んでたら$flagに3、どれでもなかった場合も$flagに1を代入しろ、っつーことです。これをphpに翻訳したA君(仮名)はこういうコードを書いた。

if( strpos( $str, "ABC" )){
  $flag = 1;
}elsif( strpos( $str, "DEF" )){
  $flag = 2;
}elsif( strpos( $str, "GHI" )){
  $flag = 3;
}else{
  $flag = 1;
}

んで、その書き直された方のphpの方のどれでもなかった場合に$flagに代入する値を1じゃなくて0にするねっていう改修を僕がやったんですが、このphpのコードの問題点に気付いてなくてへへぇ簡単簡単とかいって単純にこうやっちゃったもんですから、

}else{
  $flag = 0;
}

バグ作っちゃいましてね。死ね。俺。ちなみに改修前のソースでなぜ問題が起きなかったかというと、$strには"DEF"や"GHI"で始まる文字列が入ってく ることはないんですね。故に、"ABC"で始まる文字列が入ってきたとしてもelseブロックに処理が流れるもんですから結果として$flagには期待通りに1が入 っていたという。

てゆーかなんでpreg_match使わない訳?

てゆーかstrposのオンラインマニュアルにも

警告

この関数は論理値 FALSE を返す可能性がありますが、FALSE として評価される 0 や "" といった値を返す可能性もあります。 詳細については 論理値 の セクションを参照してください。この関数の返り値を調べるには ===演算子 を 使用してください。

て書いてあんだろうがよ、気付けよ、馬鹿。

てゆーかstrposなんか使ったことねーよ。使うなよ。