upicoで日本語ファイル名の画像がアップロード出来ない不具合を修正しました。

表題そのままです。ファイル名にマルチバイト文字が入っていた場合自動的に”_”に変換されていたのですが、何かの拍子に変換されなくなったのでファイルオープンの時に問題が起こっていました。現在は解消しています。それにしても、日本語ファイル名でアップロードする方が結構多いことにびっくりしました。
ちなみにファイル名が何の拍子に変換されなくなったのかがよくわからないです。Mojoliciousをアップデートした時か何かだと思うのですが、頑張って追いかけようと思うほど気になりもしないし、ファイル名そのままで保存してくれたほうがこちらとしてはありがたいので、まぁいいやと思いました。

Mojolicious::Liteでレスポンスヘッダを追加する。

Mojolicious::Liteでお好みのレスポンスヘッダをつけてrenderしたい場合の書き方。完全に忘れていたのでメモからひっぱりだしました。

get '/' => sub {
  my $self = shift;
  $self->res->code(200); #レスポンスのステータスコード
  $self->res->headers->header("Nyanco-Header" => "nyanconyan"); #Nyanco-Headerの値にnyanconyanを設定
  return $self->render(json =>{"a" => "b"});
}

ちなみにnginxでリバースプロキシしている場合、レスポンスヘッダのサイズが大きすぎると「upstream sent too big header while reading response header from upstream」を返してきます。大きなレスポンスを返す予定の場合、proxy_buffer_sizeあたりの設定を見なおしたほうがいいかもしれませんね。

以下Mojoliciousのドキュメント。
Mojo::Message::Response – HTTP response

TimeLine Copierで処理結果をMongoDBに持たせるようにしました。

TimeLine Copier – Twitterでフォローしてる人をリストにコピーするツール
今までjsonに処理結果を出力して、ユーザが見る前に削除するという方法をとっていたのですが、それだと429(API切れ)を起こしたユーザがそれに気づかないまま何度もリクエストを送り続けてバグる、という状況になってしまうため、処理結果をMongoDBに持たせるようにしました。前回404と429で終了した人が再度リクエストを送信すると警告画面に飛ぶようになっています。
処理内容についてはGithubを御覧ください。

大量にリストを作ってリストを公開し、リストに追加した人のアクティビティに通知がいくことを利用して遊んでる方がいるようなのですが、そういう目的で作っているツールではないので、なるべく節度を守って使用してほしいなと思います。(あまりにひどいと予告なしで使用不可にします。)
道具の使い方なんて人それぞれだと思うのでとやかく言う筋合いはないのはわかるのですが、自分の作ったツールがそういう使い方をされているのは見ていてあまり気持ちのいいものではないです。

Mojoliciousでforkしたけどやっぱり上手くいかなかった。

TimeLine CopierでMojoliciousでforkしたけどやっぱり上手くいかなかったので(処理途中でブラウザを閉じると処理は続行するがハートビートが消失したりする)、処理を別途スクリプトに書いて、systemコマンドでプロセスをキックするというクソみたいな処理に落ち着きました。

やりたいことは下記の内容に近いのですが、ブラウザからコネクションが切られても処理を続行したいのでプロセスキックが一番お手軽かなと思いました。全然モダンじゃないですね。
Perl – Mojolicious で非同期にファイル収集プログラムを起動する – Qiita

こんなのもありましたが、思っていたのと違いました。
Running a non-blocking command in Mojolicious | Brian Medley [blogs.perl.org]

明らかに挙動おかしかったのがまともに動くようになったのでもうこれでいいやってなりました。

それと、思うことがあったのでlistのBSDライセンスをなしにしたり、メール通知機能を廃止したりしました。
retrorocket/list · GitHub

JSON::PP::Booleanを含むオブジェクトはMojoliciousでjsonにrenderできない。

例えば、こんなスクリプトがあったとすると、

use JSON;
use Data::Dumper;

my $str ='{"boolean_value":true}';
my $hash_data = from_json( $str );
my $str_data = encode_json( $hash_data );
print Dumper $hash_data;
print $str_data;

実行結果はこうなります。

$VAR1 = {
          'boolean_value' => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' )
        };
{"boolean_value":true}

Mojoliciousで$self->render( json => $hash_data );を実行すると真偽値がそのまま出力されそうな気がしますが、残念ながら{“boolean_value”:”1″}が返却されてしまいます。
真偽値がJSON::XS::Booleanだったときは大丈夫だったのでそのまま行けると思っていたのですがだめでした。
無理して使わない理由もないので、Mojo::JSONを使用するように修正しました。