Hatena::Diary

Yet Another Hackadelic

2010-01-29 小池あっつん♡

生 DBI ユーザーのための DBI Cookbook (4)

さてと、モバゲーオープンプラットフォームが先日やっと始まりました^^

みなさん是非遊んで下さいです。

d:id:ZIGOROu:20091125:1259163476 のさらに続編です。

ShowErrorStatement でエラー時に発行されていたクエリを表示する

#!/usr/bin/perl

use Carp;
use DBI;

my $dbh;

eval {
  $dbh = DBI->connect("dbi:mysql:db=test;host=localhost", "root", "", +{
      RaiseError => 1, AutoCommit => 0,
      ShowErrorStatement => 1, PrintWarn => 0,
      PrintError => 0,
  }) or croak($DBI::errstr);
  $dbh->selectall_arrayref("SELECT id, name, town FROM hidek WHERE id = ? AND name = ?", undef, "over", "reaction") or croak($dbh->errstr);
};
if ($@) {
    confess($@);
}

ってやると、

DBD::mysql::db selectall_arrayref failed: Unknown column 'town' in 'field list' [for Statement "SELECT id, name, town FROM hidek WHERE id = ? AND name = ?"] at - line 14.
 at - line 17

こんな感じのエラーになります。PrintError => 0, PrintWarn => 0 とかになってないと STDERR にメッセージが出ちゃうのでそれは消しておきました。

ちなみに $dbh->{Statement}, $sth->{Statement} で直近のクエリ自体を取得する事が出来ます。

SEE ALSO

2010-01-13

q4m を rpm 化する with checkinstall

作業メモです。

src.rpm の取得

# cd /usr/src/redhat/SRPMS
# wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-community-5.1.42-0.rhel5.src.rpm/from/http://ftp.iij.ad.jp/pub/db/mysql/

rpmbuild --recompile

ビルド時のソースツリーが必要なので recompile

# rpmbuild --recompile --define 'community 1' /usr/src/redhat/SRPMS/MySQL-community-5.1.42-0.rhel5.src.rpm

checkinstall で rpm 化

make 時に MYSQL_LIBDIR をつけてるのは libmysqlclient.so のパスの解決の為。

# cd /usr/local/src
# wget http://q4m.31tools.com/dist/q4m-0.9.tar.gz
# tar xfz q4m-0.9.tar.gz
# cd q4m-0.9
# ./configure --prefix=/usr --with-mysql=/usr/src/redhat/BUILD/mysql-5.1.42 
# checkinstall -R --pkgname q4m --pkgversion 0.9 \
  --pkgrelease 0.glibc23 --pkggroup Applications/Databases \
  --maintainer zigorou@cpan.org \
  make MYSQL_LIBDIR=/usr/lib install

必要なら rpmbuild --rebuild もして置いた方が良いかも。

2010-01-06

あけましておめでとうございます

だいぶ出遅れてしまいましたが皆さんあけましておめでとうございます。本年もどうぞよろしくお願いいたします。

今年の活動ですが、Webアプリ関連の話は続けるとして OpenSocial とモバゲーオープンプラットフォームの話題をどんどん出して行こうかなと思ってます。

また id:TAKESAKO さんのご好意により、デブサミ2010 で mixi のよういちろうさんとお話させて頂く事となりました。

近年OpenSocialに対応したSNSやプラットフォームが増え外部の開発者が自由にソーシャルアプリを作って公開出来るようになってきました。 mixiアプリモバイル、モバゲーオープンプラットフォームの登場によりモバイルで動作するソーシャルアプリが続々と登場してきています。そこでモバイル向けソーシャルアプリの仕組みと現在の対応状況、今後の展開について2大プラットフォームであるmixi,モバゲータウンの両担当者からお聞きし、新しいモバイル向けソーシャルプラットフォームの可能性を探って行きます。 【19-E-1】OpenSocial ケータイ Game 戦国時代

ってな感じのセッションです。皆様ふるってご来場下さい。

モバゲータウンや mixi アプリモバイルなどでも提供されてて、現在 TVCM でやっている怪盗ロワイヤルだとか、その他諸々ソーシャルゲームを提供してたりしていて、ある種現在の典型的なモバイル向けのブラウザゲームの作り方なんかも話したりするかもしれません。

このデブサミに来るまでに是非一度触って遊んで見て下さい。モバゲーの怪盗ロワイヤルは下記の QRCode から登録出来ます。

f:id:ZIGOROu:20100107020409j:image

登録してくれるともれなく僕に 1000 モバコインが入ります(ぉぃ

携帯電話から見ている奇特な方はこちらから登録できます。

それでは本年もよろしくお願いいたします。

2009-12-09

探索パスにあるコンポーネントを読まないようにする

訂正 (2009-12-09T12:55:19+09:00)

id:charsbar さんに教えて貰ったんですが依存してる Module::Pluggable::Object の except, only とかを使えば普通に出来た罠。

__PACKAGE__->config(
  setup_components => ['MyApp::Web::Model::Damepo',]
);

とかで同様の事が出来ます。

詳しくは Module::Pluggable の Advanced Usage に書いてあります。

以下、元のエントリ

以下は、上の奴で出来るから要らない知識です!!!

d:id:ZIGOROu:20061105:1162755013 に昔書いた通り、Catalyst の setup_components は config で探索パスを追加する事は出来ます。これは現在のバージョンでも変わってなくて、MyApp::Web だとすると、

__PACKAGE__->config(
  setup_components => +{
    search_extra => [
      '/path/to/dir'
    ],
  }
);

みたいに追加すればいい。ドキュメントにも書いてある。

が、ちょっと自己都合で外したいみたいのは出来ないみたい。setup_components で対象となるモジュールのロードは load_components に依存してるみたいなので、とりあえずやっつけでこんな風にしといた。

sub locate_components {
    my $class = shift;
    my @comps = $class->next::method(shift);

    my $config = $class->config->{locate_components};
    my %ignore_comp_map;
    my $ignore_comp_regex = '';

    if ( ref $config ) {
        if ( exists $config->{ignore_components} ) {
            %ignore_comp_map =
              map { ( $_ => undef ) } @{ $config->{ignore_components} };
        }

        if ( exists $config->{ignore_components_regex} ) {
            $ignore_comp_regex = $config->{ignore_components_regex};
        }
    }

    $ignore_comp_regex = qr|$ignore_comp_regex| if ($ignore_comp_regex);

    if ($ignore_comp_regex) {
        @comps =
          grep { $_ !~ m/$ignore_comp_regex/; }
          grep { not exists $ignore_comp_map{$_} } @comps;
    }
    else {
        @comps =
          grep { not exists $ignore_comp_map{$_} } @comps;
    }

    return @comps;
}

としておくと、

__PACKAGE__->config(
  load_components => +{
    ignore_components => [
      'MyApp::Web::Model::Damepo',
    ],
    ignore_components_regex => [
      'Foo|Bar'
    ],
  }
);

みたいな感じ。

同じソースツリーだけどデプロイ先をクラスタ化して、読み込むコンポーネントを変えてメモリ消費量がホゲホゲとか考えるなんてシーンも無きにしもあらずって気がするんだけど*1、そういう場合こういう枠組みがあると良いなと思うんですが、実は既にあったりするんですかね。

とりあえず next 嫌いです。

*1:ちなみに今回はそういうニーズではなく必要になった

2009-11-26

SQL_CALC_FOUND_ROWS を毎回忘れるのでメモっておく件

LIMIT 〜 OFFSET なんか使う SELECT 文をページ送りとかしたい場合、全体の件数が必要だったりして、

SELECT * FROM people LIMIT 50 OFFSET 0;
SELECT COUNT(guid) FROM people;

みたいな感じの事やりたい訳だけど MySQL の場合だと、そういう枠組みがあるんですよね。

さっきのクエリはこんな風になる、

SELECT SQL_CALC_FOUND_ROWS * FROM people;
SELECT FOUND_ROWS();

これ、使いたいなと思った時に毎回忘れてググってたので備忘録として書いた。