タグ

ブックマーク / blog.64p.org (97)

  • DBIx::Inspector - introspection for DBI - tokuhirom's blog

    use DBIx::Inspector; my $dbh = DBI->connect(...) or die; my $inspector = DBIx::Inspector->new(dbh => $dbh); my @tables = $inspector->tables; for my $table (@tables) { print " pk:\n"; for my $pk ($table->primary_key) { print " ", $pk->name, "\n"; } print " columns:\n"; for my $column ($table->columns) { print " ", $column->name, "\n"; } }DBI supports introspection, but it is a too generic and funct

    kazuhooku
    kazuhooku 2010/11/29
  • Q4M + Parallel::Prefork + Signal handling + Log::Minimal - tokuhirom's blog

    conditions precedent: use daemontools & multilogPoints: make DB connection after forkdo not trap SIGTERM while calling queue_wait(), so that the process can be shut down while waiting for the response from q4mremove $time and add $PID for log. Because I'm using multilog. It prints the tai64n automatically(and, tai64n is better).package OreOre::Worker::Base; use strict; use warnings; use parent qw/

    kazuhooku
    kazuhooku 2010/11/16
    Q4Mワーカーのベストプラクティス
  • Perl5 で半角カタカナにマッチする正規表現を簡単にかく方法について - tokuhirom's blog

    にしても、こちらのサイトでも言われていますが、なぜ半角カナ専用のUnicodeブロックがないのかと小一時間(ry http://blog.livedoor.jp/sasata299/archives/51194035.html http://d.hatena.ne.jp/pasela/20081003/ll_unicode ということで、 sub InHankakuKatakana { "FF65\tFF9F" }という一行をはっつけると、つかえるようになりますね。 #!/usr/bin/perl use strict; use warnings; use utf8; use Test::More; sub InHankakuKatakana { "FF65\tFF9F" } ok("\x{FF65}" =~ qr/\p{InHankakuKatakana}/); ok("abc" !~

    kazuhooku
    kazuhooku 2010/11/10
    モジュールになってる方が楽だなー
  • HTTP/1.1 における Keep-Alive と HEAD の関係性について - tokuhirom's blog

    HTTP/1.1 においては、HEAD リクエストの場合には Message Body を送信してはならないということにはなっているのですが、現実的には、Message Body をおくりかえしてくるアホなサーバーがおおい。たとえば Plack では Plack::Middleware::Head を明示的に使用していない場合、普通にやると HEAD でも message body をかえしてしまうだろう。 というわけで、HEAD で Message Body をかえしてくれるサーバーがおおいのだが、Message Body をかえされてしまうと、Keep-Alive しているときにこまる。次のリクエストとまじる。 この問題にたいするよい解決策はないので、HEAD リクエストを送信した後には connection を close してしまうのが、現実的な解決策だとおもった。 現実的には、現

    kazuhooku
    kazuhooku 2010/10/25
    同意。どうしてもコンテンツがいらなくて keep-alive したい場合は If-None-Match: * とかでうまくいくかも(サーバによっては)
  • .pl な config ファイルのコンパイルがとおるかチェックしてみる - tokuhirom's blog

    こんなかんじか。 use strict; use warnings; use Test::More; use Path::Class; use IPC::Open3; use POSIX; for my $file (grep /\.pl$/, dir('config')->children) { my($wtr, $rdr, $err); my @cmd = ($^X, (map { "-I$_" } grep { !ref $_ } @INC), '-c', $file); my $pid = open3($wtr, $rdr, $err, @cmd); waitpid($pid, 0); ok((POSIX::WIFEXITED($?) && POSIX::WEXITSTATUS($?) == 0), $file); } done_testing;

    kazuhooku
    kazuhooku 2010/08/13
    IPC::Open3 の stdout と stderr は '>& /dev/null' とかしとかないとデッドロックする可能性が理論上あると思う (linux だと約4KBの出力でだっけ)
  • モダンな Perl の開発環境の構築方法 - tokuhirom's blog

    一般的な OSX 環境および Linux 環境における、モダンな Perl 開発環境の構築方法についてまとめてみたよ。 perlbrew のインストールperlbrew をつかうことにより、簡単に最新版の Perl5 を利用することができるようになる。 perlbrew をいれる。% curl -L http://xrl.us/perlbrew | perl - install % ~/perl5/perlbrew/bin/perlbrew init ~/.bashrc (または ~/.zshrc)に source ~/perl5/perlbrew/etc/bashrc を追記。あたらしいシェルをたちあげる。最新版の perl をインストールする。% perlbrew install perl-5.12.1 % perlbrew switch perl-5.12.1 ここまできたら、she

  • gearman の worker process にスコアボードをつけてみる - tokuhirom's blog

    http://d.hatena.ne.jp/tokuhirom/20100201/1264989237 ↑でつくったスクリプトに score board 機能をつけてみた。 で、これかいてからきづいたんだけど、Parallel::Prefork には Parallel::Prefork::SpareWorkers ってのがあるんですね。で、これつかうと score board とかもつかえる。じゃあ、なにがちがうのかなーと。 で、いろいろきいてみたところ 「Parallel::Scoreboard のメリット」は 任意の長さのデータを書ける監視プロセスとワーカープロセスに親子関係がなくても使える任意のマネージャーと組み合わせることができる毎秒1回ポリングとかにはむかない(モニタリングの方は遅いため) ステータスの書き込みは seek & write だから速い「Parallel::Pref

    kazuhooku
    kazuhooku 2010/07/06
  • cronolog と plackup の連携 - tokuhirom's blog

    multilog に access logerror log をまぜてだすと、エラーでてんのかどうかよくわからなくなっちゃうので、まあわけた方がよろしい。 multilog でパターンマッチで適当に分割するという手もあるけれど、アクセスログは集計などにもつかうので、日ごとにファイルがわかれていた方が便利でしょう。 というわけで、こんな風にしてみた。 use Plack::Builder; builder { open my $fh, "| /usr/bin/cronolog /var/log/plackup/%Y/%m/myapp-%Y%m%d.l og" or die "cannot load log file: $!"; select $fh; $|++; select STDOUT; enable 'Plack::Middleware::AccessLog', logger =

    kazuhooku
    kazuhooku 2010/05/09
    Server::Starter を使ってる場合も、これでOK (cronolog や rotatelogs は O_APPEND でファイルを開くので)
  • perl5 でファンクションプロトタイプをつかっちゃいけない理由と使われる理由。 - tokuhirom's blog

    Damian Conway の Perl Best Practice は関数プロトタイプを非推奨扱いにしているが、一方で巷の Perl Hackers はこれを使いまくっている。このような状況が初心者を混乱させているのではないかと思い、解説することにした。 function prototype を Damian Conway の Perl Best Practice が非推奨扱いにしている理由は以下のような点だ。 Prototypes do not work on methods. Prototypes do not work on function references. Calling a function with a leading & (&foo) disables prototypes. But you shouldn't be calling functions like t

    kazuhooku
    kazuhooku 2010/03/26
    これはよいまとめ
  • hbstudy で puppet の話をきいてきたことについて - tokuhirom's blog

    puppet は「俗人的な要素を排除する」という点がやはりおおきいのかな、とおもった。 いっぽうで、以下のような点を感想として得た。 新規にインストールするシステム以外には適用しづらい最初の一回の設定ファイルを構築するのがむずかしいソフトウェアを rpm 等で管理していないと管理できない「シェルスクリプトで構築すればこれ簡単なのに!」みたいな場合に、いちいち puppet rule 書くのダルくね?puppetd を常時あがってるのがキモチワルイ自由度を制限して、俗人性を排除するというアプローチはアリだとおもう。 ただ、puppetd はやっぱいらないとおもう。sshd で代用できたらいいのに。 【追記】 snmpd でやっちゃうのがいいという意見がある様子。

    kazuhooku
    kazuhooku 2010/02/28
  • OSS とテスティングと CPAN Testers の話 - tokuhirom's blog

    http://blogs.itmedia.co.jp/hozawa/2010/01/post-b5e0.html URL とあんま関係ないかんじのチラ裏ですけど。 実際、オープンソースのプロダクトって、作者の環境とちがう環境だとうまくうごかないみたいなことはあって、memcached は Solaris だと変な挙動をしてたし、Q4M は i386 固有の問題があったとか、まあそういうのは色々ありますわな。 で、どうするかというと、みんながつかってる構成をつかえばいいじゃーん、という。memcached を linux 2.6.x でつかってるユーザはたくさんいるので、その環境におけるバグはすくないはずだから、linux 2.6 でつかうのが一番安全だろう。とかそういうこと。 OSS はつかうユーザがおおいほど、バグにあたる可能性は低くなるはず。 Solaris でうごかないのは残念だとお

    kazuhooku
    kazuhooku 2010/02/02
    作者と違う環境だと速度が出ない、とかいうのもよくあるし
  • How to manage Gearman worker processes. - tokuhirom's blog

    http://www.pqpq.de/mt/2010/01/gearmandriver.html ^^ I don't like this approach. Gearman のワーカーの管理はこういう風にするのが個人的にはおすすめ。 make workers as prefork model by Parallel::PreforkMaxRequetsPerChild(such as same name configuration in Apache) is requireduse daemontools for your lazinessGearman::Driver is too heavy framwork for me. (and, workers should save the memory, but Gearman::Driver itself uses too much m

  • xtrabackup を使ってみた - tokuhirom's blog

    xtrabackup とか前からつかってみたかったのでつかってみた。データセットが 500 MB ぐらいなので、サクサクいける。500MB のうちほとんどはクローラちゃんがとってきたデータ。500MBぐらいのデータとるとこんなかんじ。 xtrabackup --backup 4.31s user 2.44s system 20% cpu 33.174 totalバイナリをここからとってきてみる。俺は ubuntu つかってるので dpkg -i でさっくりいれる。 http://www.percona.com/mysql/xtrabackup/ あとはこんなかんじで。 0 4 * * * cd /var/lib/mysql/ && rm -rf /var/lib/mysql/xtrabackup_backupfiles && xtrabackup --backup && scp -r ./

  • それでも私が Perl5 を使いつづける理由または、Why I still use Perl5? 的な。 - tokuhirom's blog

    Fast Enoughもっとはやいといいな、とおもうときはあるけど、他の LL とくらべても速い部類。 Reference Counter であるXS かくときとかにはめんどくさいけど、RAII っぽく書けるとか、開放のタイミングがわかりやすいとか、利点もおおい。 スコープぬけたときに開放されることが保証されてるので、メモリ使用量とかが読みやすいのもいいなーと。

    kazuhooku
    kazuhooku 2010/01/20
  • Data::Recursive::Encode を書いた話 - tokuhirom's blog

    Data::Visitor::Encode というモジュールがあって、複雑なデータ構造の中にはいっているデータを操作するには大変便利です。 私は mobirc という IRC2HTTP gateway を開発しているのですが、こちらはユーザの環境にインストールしてつかっていただくソフトウェアであるという関係上、XS に依存したくありません。 しかし、やたらと依存モジュールが多く、得に XS が必須であり、かつまたメモリを大く消費してしまうのが難点です。また、ソースコードが複雑で、なにかあったときに読む気がしないというのも難点です。これらの欠点は、質的には Data::Visitor の問題点であって、Data::Visitor::Encode の問題ではないのですが、依存している以上、どうしようもないことです。また、Data::Visitor は内部実装がコロコロかわることでも有名であり

    kazuhooku
    kazuhooku 2010/01/20
  • Perl Monger は Test::More の subtest が便利すぎるので頭にいれておくべきだと主張したい俺がいる件 - tokuhirom's blog

    Test::More の 0.94以後(2009-09-02)では subtest という機能が導入されており、これが非常に便利なのだが意外と利用されていないようなので、ちょっと宣伝させてもらいますね。 以下は Data::Recursive::Encode のテストケースなのだが、似たようなケースが頻出するわりに、抽象化するのが面倒だし、わけわからなくなること必至であり、かつまた、こんなものを複数のファイルにわけていてはメンテナンスが面倒なことは考えるまでもない。 チミチミと似たような数行のテストをかいたファイルを複数つくるぐらいならば、このように subtest の利用を考えるべきだとおもう。 ただし、これも他のツール同様、なんにでも適用すればいいというものではなく、使い方をまちがえれば、関係ないものがゴッチャリはいった .t ができあがるので注意するべきだろう。 use strict

    kazuhooku
    kazuhooku 2010/01/18
  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

    kazuhooku
    kazuhooku 2009/12/26
    tokuhirom++
  • ファイルに変更があったら再起動してくれるコマンド - TokuLog 改めB日記

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

    kazuhooku
    kazuhooku 2009/12/14
    すばらしす。CPANize plz!
  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

    kazuhooku
    kazuhooku 2009/12/01
    Filter::Simpleよりよっぽどマトモなので早く使いたい
  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

    kazuhooku
    kazuhooku 2009/11/24
    tokuhirom++ ループが使えないなんて ><