DBIC::UTF8Columns

書いた

Template::Stash::ForceUTF8 インスパイア。

by typester / at 2006-03-02T18:54:00 / perl · dbic / Comment

CPANPLUS

Hatena::Diary::Neko::kak 500 Internal Server Error - Plaggerはいらない!

CPANPLUS.pmで入れようとしたら設定がまずいのか

タイムアウトしたりなんだかんだで入らない!!

これ多分設定悪いんじゃねーかなぁ。一番最初に試したときになんかそうなってぜんぜんうまくうごかねーCPANPLUSうんこ!とかなった記憶。

とりあえず最近新しいPCにCPANPLUS入れたのでそのときの作業を思い出しつつ書いておいて見る。

  1. $ sudo cpan
  2. cpan> install Bundle::CPANPLUS
  3. ここではてけとうに設定
  4. cpan シェル終了
  5. $ chown -R typester:typester ~/.cpanplus
  6. $ export PERL5_CPANPLUS_CONFIG=$HOME/.cpanplus/config とrcスクリプトにそれ追加
  7. $ cpanp
  8. CPAN Terminal> s reconfigure で再設定。ここでちゃんと設定する

設定時の注意は設定ファイルを ~/.cpanplus/config になるようにするのとインストール時に sudo を使うようにするくらい。

あと Storeble を有効にすると環境によってはすげー遅くなる場合があるかもしれないのでその場合は切る。

by typester / at 2006-03-01T00:50:00 / perl / Comment

Plagger::Plugin::Store::DBIC

作ってみたけどびみょーー。Schema をこっちの指定通りに作ってないとだめなんだよな。せっかく外部におけるのに。

package Plagger::Plugin::Store::DBIC;
use strict;
use warnings;
use base qw/Plagger::Plugin Class::Accessor::Fast/;

use UNIVERSAL::require;

our $VERSION = '0.01';

__PACKAGE__->mk_accessors(qw/schema/);

sub register {
    my ( $self, $c ) = @_;

    unless ( $self->conf->{schema_class} and $self->conf->{connect_info} ) {
        $c->error('schema_class and connect_info are required');
    }

    $self->conf->{schema_class}->require
        or $c->error(
        qq/Can't load schema class "@{[ $self->conf->{schema_class} ]}", $!/);

    $self->schema( $self->conf->{schema_class}
            ->connect( @{ $self->conf->{connect_info} } ) );

    $c->register_hook( $self, 'publish.feed' => \&store, );
}

sub store {
    my ( $self, $c, $args ) = @_;

    # feed
    my $feed = $self->schema->resultset('Feed')
        ->find_or_new(
        { link => $args->{feed}->link, type => $args->{feed}->type } );

    $feed->$_( $args->{feed}->$_ )
        for (qw/url image description language author updated/);

    $feed->insert_or_update;

    # feed meta
    $feed->meta->delete_all;
    for my $k ( keys %{ $args->{feed}->meta } ) {
        $feed->add_to_meta( { key => $k, value => $args->{feed}->meta->{$k}, } );
    }

    # entry
    for my $feed_entry ( @{ $args->{feed}->entries } ) {
        my $entry = $self->schema->resultset('Entry')->find_or_new(
            {   feed => $feed->id,
                link => $feed_entry->link,
            }
        );
        $entry->$_( $feed_entry->$_ )
            for qw/title author date summary body rate icon/;
        $entry->insert_or_update;

        # meta
        $entry->meta->delete_all;
        for my $k ( keys %{ $feed_entry->meta } ) {
            $entry->add_to_meta( { key => $k, value => $feed_entry->meta->{$k}, } );
        }

        # tag
        $entry->tag_mappings->delete_all;
        for my $entry_tag ( @{ $feed_entry->tags } ) {
            my $tag = $self->schema->resultset('Tag')
                ->find_or_create( { name => $entry_tag } );
            $entry->add_to_tag_mappings(
                { entry => $entry->id, tag => $tag->id } );
        }
    }
}

1;

config.yaml は

 - module: Store::DBIC
   config:
     schema_class: 'Plaggerer::Schema'
     connect_info: [ 'dbi:SQLite:/home/murase/plaggerer/db/plaggerer.db' ]

Schema ファイルを置く場所もまた問題。

この場合はPlugin指定のSchemaしか扱えないから普通にこのプラグイン以下に置けばいいのかも知れんけどなぁ。

by typester / at 2006-02-27T23:35:00 / perl · plagger / Comment

MySQL の DATETIME 型

って、タイムゾーン情報ないから、deflate するとき set_time_zone してタイムゾーンそろえたほうがいいと思った。

あと、inflate 時も floating timezone で帰ってくるから、保存時のタイムゾーンをセットしてあげたほうが良い。

inflate => sub {
    DateTime::Format::MySQL->parse_datetime(shift)
        ->set_time_zone('local');
},
deflate => sub {
    DateTime::Format::MySQL->format_datetime(
        shift->set_time_zone('local') );
},

と思うんだけどどーなんだろ。

決めうちでしかつかわないならいいんかな。

by typester / at 2006-02-22T13:58:00 / perl · dbic / Comment

lighttpd+fastcgi時のメモリ共有

このサーバーで動いてるアプリはほとんど lighty+fastcgi で動いているけど、アクセス数的に余裕まくりなのですべて1プロセスで動かしていていままで意識していなかったのだけど、仕事で使うことになったので調べてみた。

まず、Catalyst 製アプリケーション MyApp をlighttpd.conf で以下のように設定。

fastcgi.server = (
    "" => (
        "myapp" => (
            "socket" => "/tmp/myapp.socket",
            "check-local" => "disable",
            "bin-path" => "/path/to/script/myapp_fastcgi.pl",
            "max-procs" => 5,
        ),
    ),
)

これは割りと一般的な方法。これでMyAppプロセスが5つ立ち上がる。うちもこんなようなのの max-procs を 1 にしたのを使っている。

でも lighttpd.conf で bin-path を指定すると lighty がプロセスを5つ立ち上げてる感じになり、メモリは共有されてないっぽい。pstree はこんな感じ。

|-lighttpd---5*[myapp_fastcgi.pl]

なんかテストしてるPCだとCatalystアプリを立ち上げるときにFile::Slurpのwarningがでまくりなんだけど、上記設定でlighttpd立ち上げるとプロセス数分warningが出ることからもuseまくってんだなぁということがわかる(適当だなオイ

これじゃー微妙なので、もう一つの方法を試す。

Catalyst の fastcgi.pl は FCGI::ProcManager での動作もサポートしていて、

./script/myapp_fastcgi.pl -l /tmp/myapp.socket -n 5

とすれば MyApp が FCGI::ProcManager 経由で fastcgi プロセスが 5 つ立ち上がる。これだと

|-myapp_fastcgi.pl---5*[myapp_fastcgi.pl]

こんな感じで賢い風味。File::Slurp の warning も1回しか出ない!(そこで判断かよ

これを lighty から使うにはさっきの設定から bin-path をはずせば OK。

fastcgi.server = (
    "" => (
        "myapp" => (
            "socket" => "/tmp/myapp.socket",
            "check-local" => "disable",
        ),
    ),
)

こんなんで。

で、結論としては複数プロセス立ち上げるときは FCGI::ProcManager 使わないと損ということですかね。

時間があるときに追試はしてみたい。

by typester / at 2006-02-20T14:30:00 / perl · lighttpd · fastcgi / Comment

盗聴

Term::ReadPasswordてのもある

by typester / at 2006-02-14T03:20:00 / life · perl / Comment

盗聴

Term::ReadKey

password とか入力するときに Linux のコマンドラインっぽく画面の出力を隠して入力文字列をとりたいときにいいモジュール

by typester / at 2006-02-13T20:05:00 / life · perl / Comment

refactored

sub fuzzyfind { my ( $self, $id ) = @_;

    $id and $id =~ /\D/
        ? ( $self->find( { uuid => $id } ), 1 )
        : $self->find($id);
}

こうか。

by typester / at 2006-02-12T17:46:00 / perl · dbic / Comment

fuzzyfind

sub fuzzyfind { my ( $self, $id ) = @_;

    my ( $exist, $uuid );
    $exist = $self->find( { uuid => $id } ) and $uuid++
        if $id and $id =~ /\w/;

    defined $exist ? ( $exist, $uuid ) : $self->find($id);
}

namingsence by 2ndlife.

* 16:46 コード修正

by typester / at 2006-02-12T16:27:00 / perl · dbic / Comment

Plugin::FillInForm

の finalize

sub finalize {
    my $c = shift;
    if ( $c->isa('Catalyst::Plugin::FormValidator') ) {
        $c->fillform
          if $c->form->has_missing
          || $c->form->has_invalid
          || $c->stash->{error};
    }
    return $c->NEXT::finalize(@_);
}

$c->stash->{error} があると問答無用で fillform る。あー何この余計なお世話機能。

小一時間はまったよ。。

by typester / at 2006-02-10T14:31:00 / perl · catalyst / Comment

20 21 22 23 24 25 26 27 28 29

(Page 24 of 30)