本当にただのメモ

なるべく Qiita に投稿しよう

Perl で標準モジュールだけで http request したいとき

  • なんと LWP::UserAgent は非 core module
  • HTTP::Tiny が core module なんだけど、SSL 通信をするには IO::Socket::SSL (非 core module )が必要なので、実質使えない
  • 仕方ないので Perl のスクリプト内で curl を呼んだ ...
use IPC::Cmd qw(run can_run);

sub exec_curl {
    my ($curl_cmd) = @_;

    unless (can_run('curl')) {
        croak 'curl is not installed';
    }
    my $cmd = qq|$curl_cmd -w "%{http_code}"|;

    my ($success, $error, $buffers) = run(command => $cmd, verbose => 0);
    my $buffer = join '', @$buffers;

    unless ($success) {
        croak "failed to exec curl. error: $error, buffer: $buffer";
    }

    $buffer =~ s/([0-9]+)$//;
    my $status_code = $1;
    if ($status_code !~ /^2/) {
        croak "failed to fetch. status code: $status_code, buffer: $buffer";
    }

    return $buffer;
}

show processlist; の結果が多すぎるときに、スロークエリの process id を特定する方法あれこれ

innotop を使う

$ innotop -u root -p xxxxxx

pager grep ...

  • mysql のコンソールで pager をカスタマイズすることができる
  • どういうことかというと、↓ みたいにすると、Sleep が除外された show processlist; の結果が出てくる。これは知らなかった
$ mysql -uroot -p
mysql> pager grep -v Sleep
mysql> show processlist;

mysql -e 'show processlist' | grep ...

$ mysql -e 'show processlist' | grep hoge

information_schema を使う

select * from information_schema.processlist order by time desc limit 3;

Mechanize で checkbox を操作するメモ

こういうチェックボックスのとき:

<input type="checkbox" name="foo" />
  • on にする: submit_form(fields => { foo => 'on' })
  • off にする: submit_form(fields => { foo => 'off' })


こういうチェックボックスのとき:

<input type="checkbox" name="foo" value="1" />
  • on にする: submit_form(fields => { foo => 1 })
  • off にする: submit_form(fields => { foo => 'off' })'
    • foo => 0 ではない


こういうとき使い方を間違ってもすぐ気づけるので、strict_forms => 1 は常につけたい。

WWW::Mechanize の strict_forms => 1 オプション便利

存在しないフィールドを指定すると例外を吐くようになる。
v1.82 から使える機能。 https://metacpan.org/pod/WWW::Mechanize#strict_forms

$mech->submit_form(
    fields => { ... },
    strict_forms => 1
);

みたいにして使う。


テスト書いてるときに、フィールド名の typo でハマったりすることが無くなって便利。

Xslate で未定義変数の事故を防ぐための Tips

ほぼ https://github.com/xslate/xslate.github.com/wiki/Text::Xslate::Manual::Debugging.ja に書いてあるとおりですが。

開発環境ではとりあえず verbose => 2 有効にしておく

undef に対する警告とか出してくれる。

my $xslate = Text::Xslate->new(verbose => 2);
$xalate->render($template, $vars);

さらに確実に、渡されていない変数を特定する

Text::Xslate::Util の hash_with_default() というのを使いと良い。
詳しくはこちら → http://d.hatena.ne.jp/gfx/20101030/1288420152

Plack::Request の body とか content の使い分け

いつも迷って調べるのでメモ。 https://metacpan.org/pod/Plack::Request

結論

フォームデータなら ->body_parameters

Returns a reference to a hash containing posted parameters in the request body (POST). As with query_parameters, the hash reference is a Hash::MultiValue object.

書いてあるとおり、Hash::MultiValue オブジェクトが返る。

my $foo = $req->body_parameters->{foo};

JSON API なら ->content ( もしくは ->raw_body )

raw_body は content のエイリアス。

my $foo = decode_json($req->content)->{foo}

ちなみに

->body は plack.input ハンドルというのが返る。

よっぽど巨大な content を扱う場合でなければあまり使うことなさそう。