Test::mysqldを永続化しつつメモリ上で動かす

Test::mysqld を別ウィンドウで立ち上げたら開発時の prove が快適過ぎる件 - Craftworks Tech Blog - Branch OSX で tmpfs 的なことをする方法 - unknownplace.org OSX で tmpfs 的なことを試してみる - すぎゃーんメモ を参考に、Test::mysqldを使い回しつつメモリ上のディスクで読み書きするようにしてみた。 メモリ上に仮想ディスクをつくってマウント man 8 hdid に書いてあるものをほぼそのまま利用。 hdimount #!/bin/sh NUMSECTORS=128000 mydev=`hdid -nomount ram://$NUMSECTORS` newfs_hfs $mydev mkdir /tmp/mnt mount -t hfs $mydev /tmp/mnt ~/bin に置いて $ hdimountでマウントできるようにしておく。 Test::mysqldの起動 これも参考記事のものをそのまま利用。 テスト本体の方ではrunnerでつくったTest::mysqldインスタンスを使うようにしておく(上記の参考記事参照)。 mysqld_runner.pl #!/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/../lib"; use File::Spec; use JSON; use Koshien::Test; my $tempfile = File::Spec->catfile(File::Spec->tmpdir, 'test_mysqld. »

Ark::Plugin::Session::State::URIは携帯以外で無効になる

Arkのプラグイン、Session::State::URI。 ark-perl/lib/Ark/Plugin/Session/State/URI.pm at master · typester/ark-perl · GitHub Session IDをURIにのっけて管理するためのものだけど、これはPC(携帯以外)でアクセスすると勝手に無効になるので注意。 60〜67行目あたりを抜粋。 if ($self->uri_rewrite_mobile_only) { my $agent = $self->context->can('mobile_agent') or $self->log( debug => q[Require MobileAgent plugin for this feature] ); if ($agent && $self->context->mobile_agent->is_non_mobile) { $self->uri_session_disabled(1); return; } } uri_rewrite_mobile_onlyが真の時のみ、携帯以外のAgentで無効になるようにはなっているものの、uri_rewrite_mobile_onlyは常に真になるようなのであまり意味ない。 21〜28行目。 has uri_rewrite_mobile_only => ( is => 'rw', lazy => 1, default =>sub{ my $self = shift; $self->class_config->{mobile_only} || 1; }, ); 携帯サイトをPCからプレビューしてて、「あるぇ、URLにSession IDが入んないぞ???」ときれいにハマった結果でした。携帯サイトつくるならおとなしくFireMobileSimulator使っときましょう。 追記: っていうのをTwitterでつぶやいたら id:sfujiwara さんが Sessionが無効になる場合にwarningを吐くようにしてくれました。感謝。 »

Teng で on_connect_do したい場合

Tengをnewするときには、接続に必要な情報のほかに、オプションをいくつか渡すことができる。 で、そのオプションの中に on_connect_do というのがあって、その名のとおり、データベースに接続した際に実行するSQLを指定することができる。 on_connect_do の処理は Teng::connect() の中で行なわれているのだが、 new で dbh を渡すと Teng::connect() が呼ばれない(その時点で既に接続されているので)。 connect() が呼ばれないので on_connect_doで指定した処理は実行されない。 # これだとon_connect_doは実行されない my $teng = Admin::DB->new( dbh => DBI->connect( 'DBI:mysql:database=hoge;host=localhost;', 'username', 'password', ), [ on_connect_do => [ 'set names utf8' ] ] ); dbh ではなく conenct_info を渡すようにすれば Teng::connect が呼ばれるので、 on_connect_do も実行される。 # これならon_connect_doが実行される my $teng = Admin::DB->new( connect_info => [ 'DBI:mysql:database=hoge;host=localhost;', 'username', 'password', ], [ on_connect_do => [ 'set names utf8' ] ] ); サンプルのとおり、DB内のマルチバイト文字が化けるのをなんとかしたいというのが目的だったのだけれど、 set names utf8 は使わないほうがいいらしい・・・。 »

perltidyをPerl Best Practiceに即した形式にしてくれるパラメータ

perltidy、便利ですね。なにも考えなくても(見た目が)きれいなコードになおしてくれます。 で、最近読んでるPerlベストプラクティスに、こんな設定例が書いてありました。 <blockquote> <pre class="code" data-unlink>perltidy -q -l=78 # Max line width is 78 cols -i=4 # indent level is 4 cols -ci=4 # Continuation indent is 4 cols -vt=2 # Maximal vertical tightness -cti=0 # No extra indentation for closing brackets -pt=1 # Medium parenthesis tightness -bt=1 # Medium brace tightness -sbt=1 # Medium square brace tightness -bbt=1 # Medium block brace tightness -nsfs # No space for semicolons -nolq # Don't outdent long quoted strings -wbb="% + * / x ! »

sjisのファイルを直接grepしたかったから練習がてらperlで書いてみた

自分の要望として sjisのファイルをコマンドラインからgrepしたい 複数ファイルにまたがってgrepしたい 検索結果にファイル名と行番号を表示したい catでつないでnkf -wってすればできるけど、どのファイルかわからなくなる 練習のつもりでperlで書いてみたらすごい時間かかった。一行書くごとにググってた気がする。 ソース もとからあるコマンドを組合せればできるのかもだけど、きっとすぐ忘れるからperlでそんな処理を書いてみた。書きかたとしてあってるのかは知らない。 ~/bin/sgrep とかに実行権限付けて置いといて使ってる。 名前がgrepだけど、そんなだいそれた機能は無いです。 「検索っていったらgrepじゃない?」と思って安易に付けただけです。 使いかた? たとえば、 $ sgrep 'hoge' とすればhogeが含まれる行の一覧をカレントディレクトリ以下すべてのファイルを対象に正規表現で検索する。 第二引数にディレクトリ名を与えれば、そのディレクトリ以下のファイルを対象に検索する。 $ sgrep 'hoge' dirname キーワードをカンマでつなぐとAND検索される。 $ sgrep 'hoge,huga' # => hogeとhugaを含む行を表示 課題 コマンドのヘルプってどうやって書くの? エラー処理とかなくていいの? 処理速度とかどうなの? sjisじゃないファイルに使うときっと文字化けする 疑問 wantedの中でopenしたらうまくいかなかった。 サブルーチンにわけたらうまくいった。 なして? なんだか無駄そうなis_fileも同じ理由。 unlessのあとに直接-f $fileとしたら必ず偽になった。 なして? processの頭の@_と$_。 @_をprintするとカレントディレクトリからの相対パスが、 $_をprintするとファイル名のみが表示される。 @_の最初の要素が$_ってわけではない? やっぱりちゃんと基礎から勉強しないといけない気がする。 »

base64エンコードされた画像をデコードしてファイルに保存する

MIME::Base64 を使用。 perl v5.12.1 use MIME::Base64; my $image_base64 = ‘<base64エンコードした画像’>; # base64形式からデコード my $image_bin = decode_base64($image_base64); # ファイルを開く open $fh, ’+>‘, ’/path/to/file’ or die "Cannot open : $!"; # ファイルをバイナリモードに binmode $fh; # 書き込み print $fh $image_bin; # ファイルを閉じる close $fh; »

Perlの配列とハッシュと参照

さんざんこんがらがったのでメモ。 ()と[]と{}と\の使い方。 配列 my @var = ( 1, 2, 3 ); print @var[1]; # => 2 配列の参照 # 参照なのでスカラーで受ける my $var = [ 1, 2, 3 ]; # 参照なのでアローで読み出す print $var->[1]; # => 2 これはこの書き方と同じ # 配列を格納 my @var2 = ( 1, 2, 3 ); # 配列の参照を格納 my $var = \@var2; ハッシュ # 定義するときは"%" my %var = ( a => 1, b => 2, c => 3 ); # 読み出すときは"$"を使う print $var{b}; # => 2 ハッシュの参照 # 参照なのでスカラーで受ける my $var = { a => 1, b => 2, c => 3 }; # 参照なのでアローで読み出す print $var->{b}; # => 2 これはこの書き方と同じ »

Author image handlename on #perl,

Test::mysqldのインストールに詰まったら

cpanmでTest::mysqldのインストールをするときに詰まったのでメモ。 mysqldその他がみつからない macportsで入れたmysqlを使っていたが、これだとcpanmからTest::mysqldをインストールするときに(というかテストをするときに)必要なものがいろいろと見つけられない模様。 たとえばこんなエラーが出る。 FATAL ERROR: Could not find mysqld The following directories were searched: /opt/local/lib/mysql5/libexec /opt/local/lib/mysql5/sbin /opt/local/lib/mysql5/bin バイナリ版のmysqlを入れる macportsを使わずにmysqlをいれる。 ここからdmgをダウンロード http://dev.mysql.com/downloads/mirror.php?id=394788#mirrors その後 .zshrc にPATHを設定。 export PATH=/usr/local/mysql/bin:$PATH export PATH=/usr/local/mysql/scripts:$PATH これでTest::mysqldのインストールができる。 »

cpanmでarkをインストールするまで

まっさらな状態からcpanmでarkをインストールするまでの手順。本当になにも入っていない状態から入れたので、これだけやれば充分なはず。 ※ぼくはまともにperlを触ったことありません。なのでまっさらなのです :-p ※バージョンはこれを書いている時点のもの。 環境 Mac OSX 10.6.4 zsh 4.3.10 いれるもの perlbrew 0.10 perl 5.12.1 cpanm 1.0015 ark 0.10 手順 perlbrewのインストール $ curl -LO http://xrl.us/perlbrew $ chmod +x perlbrew $ ./perlbrew install $ ~/perl5/perlbrew/bin/perlbrew init その後~/.zshrcに以下を追記。 source ~/perl5/perlbrew/etc/bashrc cpanmのインストール $ wget --no-check-certificate http://cpanmin.us $ chmod +x cpanm $ ./cpanm --self-upgrade perlのインストール $ perlbrew install perl-5.12.1 --as=5.12.1 $ perlbrew switch 5.12.1 arkとそれに必要なモジュールのインストール $ cpanm Module::Install $ cpanm Test::Base $ cpanm Text::MicroTemplate::Extended $ cpanm Module::Install::AuthorTests $ cpanm Module::Install::Repository $ cpanm MouseX::Foreign $ cpanm Template $ cpanm http://github. »

Ark Advent Calendar : 2日目

2日目。今回もコードは書かないみたいです。 ユーザー 今回はJobeetが何をするかの確認ですね。 4つのユーザーについてのストーリーを確認していきます。 Jobeet は4種類のユーザーを持ちます: 理者(admin) Web サイトを所有し魔法の力を持つ ユーザー(user) 仕事を求めて Web サイトに訪問する 投稿者(poster) 求人情報を投稿するために Web サイトに訪問する アフィリエイト(affiliate) 自分の Web サイトにも求人情報を再投稿する ストーリー この4種類のユーザーについてのストーリーはFrontend(ユーザーサイドのストーリー)7つと, Backend(管理者サイドのストーリー)3つの,全部で10種類。 Frontend ホームページ上でユーザーは最新の有効な求人を見ることができる ユーザーはカテゴリに属するすべての求人情報をみることができる ユーザーはキーワードで求人一覧を絞り込める ユーザーは求人情報をクリックすると詳細な情報をみることができる ユーザーは求人情報をクリックすると詳細な情報をみることができる ユーザーがアフィリエイトの申し込みをする アフィリエイトをする人は現在有効な求人一覧を取得できる Backend 管理者は Web サイトを設定する 管理者は求人情報を管理します 管理者はアフィリエイトユーザーを管理する おわり ストーリーを確認したら今回は終了。 »