2008年10月アーカイブ

DBIx::Class::ResultSetManager - scheduled for deletion in 09000 - search.cpan.org
DBIx::Class::ResultSetManager never left experimental status and has now been DEPRECATED. This module will be deleted in 09000 so please migrate any and all code using it to explicit resultset classes using either __PACKAGE__->resultset_class(...) calls or by switching from using DBIx::Class::Schema->load_classes() to load_namespaces() and creating appropriate My::Schema::ResultSet::* classes for it to pick up.";

以前にも書きましたが、何かと問題ありつつもResultSetに簡単にメソッドをはやせるので便利だったDBIx::Class::ResultSetManagerです。
が、このたび0.09000からは削除されることになりました。

なので、その代替案が必要なのですが、基本的には以下のようにするのがよろしいようです。

use strict;
use warnings;

{
    package My::ResultSet::Users;
    use base qw/DBIx::Class::ResultSet/;

    sub search_ordered_desc {
        my $self = shift;
        return $self->search( {}, { 'order_by' => 'username DESC' } );
    }

    package My::Schema::Users;
    use base 'DBIx::Class';

    __PACKAGE__->load_components(";Core";);
    __PACKAGE__->table(";users";);
    __PACKAGE__->add_columns(qw/id username/);
    __PACKAGE__->set_primary_key(";id";);
    __PACKAGE__->resultset_class('My::ResultSet::Users');

    package My::Schema;
    use base qw/DBIx::Class::Schema/;

    __PACKAGE__->load_classes(qw/Users/);
}

my $schema = My::Schema->connect('dbi:SQLite:db.db');
my $rs = $schema->resultset('Users');
$rs->create( { username => ";user$_"; } ) for ( 1 .. 9 );

{
    my $users = $rs->search( {} );
    while ( my $user = $users->next ) {
        print $user->username, ";\n";;
    }
}

{
    my $users = $rs->search_ordered_desc;
    while ( my $user = $users->next ) {
        print $user->username, ";\n";;
    }
}

つまり、DBIx::Class::ResultSetを継承したクラスを用意してresultset_class()でロードしてやる感じです。

追記: タイトルがResultManagerになってました。もちろんResultSetManagerの間違いです。

メガホン

今シーズンも阪神は優勝できなかったよ。
80勝しても優勝できなかったよ。
14ゲーム差つけてたのに優勝できなかったよ。

もうね、たくさん言いたいことはあるんだけど、とりあえず来シーズンまで機嫌悪いと思うので

僕の前で野球の話は絶対にしないでください

重要なお知らせでした。

CentOS 5.2を使ってるわけですが、勢いあまってperl-5.8.8-15.el5_2.1パッケージをインストールしてしまいました。

ちっ…とおもいつつ、SRPMSを取り寄せてperl.specを見てみると

* Thu Aug 28 2008 Marcela Maslanova <mmaslano@redhat.com> - 4:5.8.8-15.el5.1
- add upstream fix for bless/overload problem (changes 31996,32018,32019,
    32025) and perl-5.8.8-bug24254.patch. Without this patch had bless
    poor performance.
- Resolves: rhbz#460308

と、あります。

事実Yappoさんの書いた検証コードを走らせて見ると

Benchmark: timing 100000 iterations of not overload, overload...
not overload:  0 wallclock secs ( 0.34 usr +  0.00 sys =  0.34 CPU) @ 294117.65/s (n=100000)
            (warning: too few iterations for a reliable count)
  overload:  1 wallclock secs ( 0.33 usr +  0.00 sys =  0.33 CPU) @ 303030.30/s (n=100000)
            (warning: too few iterations for a reliable count)

とペナルティがなくなってます。

しかもPatch27509, Patch27512は当たったままなので当然overloadのバグが解消されてます。
試しに以下のコードを実行してみると

use strict;
use warnings;
package Foo;
use overload '""' => sub { 1 };

package main;
my %args;
my $a = \%args;
my $b = \%args;

bless $a, 'Foo';

warn $a;
warn $b;

こんな感じになります。

1 at hoge.pl line 14.
1 at hoge.pl line 15.

パフォーマンスペナルティもなくバグも直ってひゃっほー
…と思ったら落とし穴が orz

そう。あの鬱陶しいDBICのチェックwarningsです。
前にも書きましたが、DBIx::ClassでuseしているDBIx::Class::StartupCheckでは

BEGIN {

    { package TestRHBug; use overload bool => sub { 0 } }

    sub _has_bug_34925 {
	my %thing;
	my $r1 = \%thing;
	my $r2 = \%thing;
	bless $r1 => 'TestRHBug';
	return !!$r2;
    }

    sub _possibly_has_bad_overload_performance {
	return $] < 5.008009 && ! _has_bug_34925();
    }

    unless ($ENV{DBIC_NO_WARN_BAD_PERL}) {
	if (_possibly_has_bad_overload_performance()) {
...snip...

と、こんなことをしてるわけです。
つまり、warnningを止めたければ、環境変数を設定するか、5.8.8でoverloadのバグが存在したままである必要があるわけです。
うーーーーーん。

なので、結論としては
  • DBICを使わない人はそのまま。
  • DBICは使うけど、warningsは環境変数で設定する or 気にしない人もそのまま。
  • DBICは使うけど、warnigsは鬱陶しいしoverloadのバグなんかどーでもいい人はSPECファイルから
    Patch27509
    Patch27512
    に加えて
    Patch31996
    Patch32018
    Patch32019
    Patch32025
    をはずしてrpmbuildする。

といった感じでしょうか。
あ、perlパッケージをアップグレードした時はErrnoとScalar::Utilのforce installも忘れずにね。

ちなみに僕はDBIx::Class.pmから use DBIx::Class::StartupCheck;をはずしました。(ぇ

Open Up and Say...Ahh!
Open Up and Say...Ahh!
posted with amazlet at 08.10.02
Poison
Capitol (2006-06-14)
売り上げランキング: 153133

昨日、天下一品祭りで調子に乗って食べ過ぎて腹を壊したボクです。
いかがお過ごしですか?

最近若い頃を懐かしむかのように空前のLAメタルマイブームが来ています。
LAメタルというかジャパメタ含めて80年代に聴いていたハードロックブームですな。

で、LAメタルといえば恥ずかしいくらいのど派手なファッション。
ど派手なファッションと言えば、このバンドでしょってことでPoison。

なんたって見た目がこれですよ。

poison

けばい。

で、Posion絶頂の時にリリースされたのがこれ。
彼らの2ndアルバムで売れに売れたアルバム。
M9. Your Mama Don't Danceとかちょっと恥ずかしいRock n' Rollもあるけど、M7. Fallen Angelなんか普通にかっこいい 。
っていうか、このバンドを聴く時点で恥ずかしさは忘れないとダメですね。

あと、この頃のバンドにありがちなバラードが名曲ってことで、M8. Every Rose Has Its Thorn は超名曲。
何気に全米年間チャート1位を取ってたりするんですねー。

そーいえば、武道館にライブ見に行ったことあるけど、CCが超下手くそで死ぬほど長いギターソロの間に弦を切って苦笑いとかわけわかんなかったの覚えてます。

I Want ActionとかTalk Dirty To Meとか1stの曲も聴きたかったらベストがお勧めです。

The Best of Poison: 20 Years of Rock
Poison
EMI (2006-02-27)
売り上げランキング: 118152

ニュース一覧 | 天下一品

当日、ラーメン一杯につき無料券一枚進呈致します。

本日の夕飯が決定しました。
勤務先付近には天下一品ないのが悲しい。

プロフィール

このアーカイブについて

このページには、2008年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年8月です。

次のアーカイブは2008年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。