2009年6月アーカイブ

タイトル未定
タイトル未定
posted with amazlet at 09.06.24
Floor on the Intelligence
AMC (2009-07-08)
売り上げランキング: 38957


最近買ったピアノハウスがことごとく当たりでちょっとホクホクです。

そんな中の一つがNew World Recordsからリリースされた田中隼人の別プロジェクト、Floor on the IntelligenceのUntouchable。

とにかくさびの日本人のわびさびをくすぐる泣きのフレーズがたまりません。久々にぐっときました。

ピアノハウスというにはちょっと控えめだけど、全編にわたってしずくのように流れるピアノフレーズと盛り上がるピアノソロが気持ちいいです。

すでにiTunesで配信されてるので是非。

で、そんなUntouchableを収録した1stアルバムが7月8日に発売されるそうです。amazonではまだタイトル未定になってますが、この辺見てるとタイトルはROMAHOLICで11曲入りになりそうです。

あ、本人のmyspaceでも聴けるので是非。

RIMG0327.JPG


そろそろ書いておくかってことで。

Internet DJって単語があるかどうかわかりませんけど、要は家でDJしてそれをインターネットで中継してる人たちで、最近のPCDJの普及によるデバイスコストの低下、ファイルによるメディアの入手し易さ、そしてUstreamなどのインフラの整備で最近増えてきました。

ネットでのDJ中継は日本で2000年前後にYahoo! チャットではやってたのが僕にとっては最初の出会いでした。当時のYahoo! チャットは音声の双方向通信ではなくトランシーバーのように発言ボタンみたいのを押すと音を流し続けられるという特徴を生かして(押しっぱなしツールなんてのもありました)持ち回りでDJをするという一種のコミュニティができあがっていて、音楽カテゴリでは様々なジャンルに分かれていて、平日でも多い部屋だとリスナー50人とか結構ありました。当時デバイスはPCDJなどなかったのでターンテーブルかCDJでした。

で、クラブ仲間と平日は夜な夜なネットでDJごっこして週末はクラブで回すみたいなことをしてたのですが、仕事が忙しくなったのとクラブから足が遠のいたのをきっかけにしばらく趣味としてもDJから離れていました。

しばらくして、また趣味でDJを始めるわけですが、もうクラブに足げく通う元気はなくなっているので、ネットで中継しようと考えました。けど、Yahoo! チャットの困った点が人間関係が鬱陶しいのと音が猛烈に悪い(たぶん22KHzとかそんなもん)ので自分でサーバーを立てて身内だけに配信することを始めました。SHOUTCastやWindows Media ServerやRed5なんかを試しましたが、自宅配信の場合のネックはネットワークの帯域を猛烈に食う点で、当時はADSLだったので公称上り1Mbpsではせっかく音質を上げてもせいぜい5人とかしかさばけないし、光になっても動画をつけたら20人とかが精一杯でした。インフラの壁ってやつです。

2006年、そこに登場したのがStickam! Japanで、このサービスのおかげで必要な帯域はサーバーに配信する分だけで済むようになりました。このころからまたネットでDJをやる頻度があがりました。また、StickamでもたくさんのDJがプレイするようになりました。

そして2007年にはUstreamが広まり、それと同時にPCDJが普及を始めて最近の盛り上りに拍車をかけている感じです。最近ではniteatustのような面白い試みもあったりして楽しみな感じです。

まー、ぶっちゃけいくらPromo Useのものを選ぼうと著作権などグレーなところがあるのでまだまだアングラなカルチャーなのでこれからも見守っていきたいと思います。

というわけでUstreamやStickamでたまに回してるのでよかったら聴きにきてちょ。

まつもとゆきひろ コードの世界‾スーパー・プログラマになる14の思考法
まつもとゆきひろ
日経BP出版センター
売り上げランキング: 169


最近全然本を読んでないです。最近買った本といえばジョジョのストーンオーシャンの文庫本という体たらくぶりです。まぁ、あれだけ飲み歩いていたらこうなりますよね。

というわけで、本書を買ったのも某飲み会の行きがけにネタ半分で買って行ったのがきっかけです。ご覧の通り、某二代目リーダーの写真にも負けないダンディな表紙なので軽いつかみになりました。ありがとうございます。

で、肝心の中身は、さすがに説明の多くがRubyで言及されているので、Rubyをあまり知らない自分にとってはRubyの言語思想を学べて勉強になりました。が、むしろRubyを学ぶというよりは若いエンジニアの方がプログラミング言語の基礎、歴史など勉強するのにオススメです。範囲がオブジェクト指向からAJAX、関数型言語と幅広いのですが、非常に説明が丁寧ですし、わかりやすい文体なので読みやすいです。

それにしても本は読まないとどんどん読む力が落ちて読み終わるのに時間がかかるようになりますね。ちょっとだけ反省してリハビリ開始したいと思います。

良くあるDBICのサンプルではDBIx::Class::Schema::load_classes()を使ってクラスのロードを行っています。

CD.pm
package CD;

use strict;
use warnings;

use base 'DBIx::Class::Schema';

__PACKAGE__->load_classes;
1;
load_classes()はクラスを指定しないと
CD
    Album
    Track

という構成において自動的にクラスをロードすることができます。

ここでResultSetの拡張をしたいと考えます。例えば

CD/ResultSet/Album.pm
package CD::ResultSet::Album;

use strict;
use warnings;

use base 'DBIx::Class::ResultSet';

sub search_order_title {
    my $self = shift;

    return $self->search({}, {'order_by' => 'title'});
}
1;

のようにDBIx::Class::ResultSetを継承したクラスを作ってCD::Album::resultset_class()でロードします。ここで問題になるのがこのクラスのネームスペースをどうするかという点です。

CD::ResultSet::*にしてしまうと、load_classes()でwarningが出る羽目になります。かといってload_classes(qw/Album Track/)などとクラスを指定するのもクラスが増えてきたときに大変そうです。またはResultSet::CD::AlbumのようにCDより上のネームスペー>スを使うのも、あんまりいけてない感じです。

そこでDBIC::Schemaにはもう一つクラスのロード手段としてload_namespaces()が用意されていているのこれを使います。

CD.pm
package CD;

use strict;
use warnings;

use base 'DBIx::Class::Schema';

__PACKAGE__->load_namespaces;
1;

load_namespaces()はデフォルトで

CD
    Result
        Album
        Track
    ResultSet
        Album

という構成をとります。

これのメリットはネームスペースがすっきりするだけではなく、ResutlSet::*にResutl::*と同じ名前のResutlSetクラスを作ると、Resultクラスでresutlset_class()で指定しなくても自動的にロードしてくれる点です。(ただ逆もまたしかりで、上の構成でResultSet::Hogeなどを作ると対応するResultクラスがないとwarningがでます。)

ちなみにDBIx::Class::Schema::Loaderを使ってデータベースからクラスを起こす場合は
perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at "CD", {use_namespaces => 1, debug => 1}, ["dbi:SQLite:cd.db","",""]'
のようにuse_namespacesオプションを指定するといいです。

今回のコード

CD.pm
package CD;

use strict;
use warnings;

use base 'DBIx::Class::Schema';

__PACKAGE__->load_namespaces;
1;
CD/Result/Album
package CD::Result::Album;

use strict;
use warnings;

use base 'DBIx::Class';
__PACKAGE__->load_components(qw/Core/);
__PACKAGE__->table('album');
__PACKAGE__->add_columns(
    id => {
        data_type         => 'INTEGER',
        size              => 11,
        is_nullable       => 0,
        is_auto_increment => 1,
    },
    title => {
        data_type   => 'VARCHAR',
        size        => '255',
        is_nullable => 0,
    },
);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->has_many(
    tracks => 'CD::Result::Track', 'album_id', {order_by => 'position'}
);
1;
CD/Result/Track.pm
package CD::Result::Track;

use strict;
use warnings;

use base 'DBIx::Class';
__PACKAGE__->load_components(qw/Core/);
__PACKAGE__->table('track');
__PACKAGE__->add_columns(
    id => {
        data_type         => 'INTEGER',
        size              => 11,
        is_nullable       => 0,
        is_auto_increment => 1,
    },
    album_id => {
        data_type   => 'INTEGER',
        size        => 11,
        is_nullable => 0,
    },
    position => {
        data_type   => 'TINYINT',
        size        => 1,
        is_nullable => 0,
    },
    title => {
        data_type   => 'VARCHAR',
        size        => '255',
        is_nullable => 0,
    },
);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->add_unique_constraint(
    track_uq_album_id_position => [qw/album_id position/]);
__PACKAGE__->belongs_to(album => 'CD::Result::Album', 'album_id');
1;
CD/ResultSet/Album
package CD::ResultSet::Album;

use strict;
use warnings;

use base 'DBIx::Class::ResultSet';

sub search_order_title {
    my $self = shift;

    return $self->search({}, {'order_by' => 'title'});
}
1;

プロフィール

このアーカイブについて

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

前のアーカイブは2009年5月です。

次のアーカイブは2009年8月です。

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