November 2005

November 22, 2005

このエントリーをはてなブックマークに追加
#!shebang.jp 見てて知ったんですが、こんなセミナーがあるっぽいです。

ライブドア|次世代テクノロジーセミナーシリーズ
17:30〜18:00 受付開始
18:00〜18:30 第1部「ポータルサイト<livedoor>の裏側」
ネットワーク事業部 執行役員 伊勢 幸一
18:30〜19:00 第2部「コストパフォーマンス抜群のWEBアプリケーション構築」
ネットサービス事業部 テクニカルディレクター 谷口 公一
19:00〜19:30 第3部「大規模システムを構築する秘訣」
ネットサービス事業部 テクニカルマネージャー 池邉 智洋
19:30〜20:00 セミナーまとめ 質疑応答
ネットサービス事業部 マネージャー 森本 敏弘
無料みたいだし、なんかちょっと面白そうなので申し込んでみました。
ぷぷぷー


nipotan at 12:05 | Comments(2) | TrackBack(0)
このエントリーをはてなブックマークに追加

November 16, 2005

このエントリーをはてなブックマークに追加
最近、SQL で WHERE 句に入らず、ORDER BY やら GROUP BY もされず、かつ MAX() だとか MIN() だとかを求められる必要もない、言うなれば「取るに足らない値」とかを、個別のカラムに持たず、そういうのを一気にまとめて text 型のカラムに入れたりすることがあったりする。
例えば、住所録を作ろうなんつって、テーブルを組みたいわけだが、そもそも WHERE 句に入る要素なんて名前ぐらいしかないなぁ…という場合は
CREATE table address (
  id int unsigned NOT NULL auto_increment,
  name varchar(255) NOT NULL default '',
  props text,
  PRIMARY KEY (id),
  KEY (name)
);
こんなようなテーブルを一個作っておいたりして。
要するに、name 以外の値は「取るに足らない値」で、props というカラムが一個あるだけ。
んで、この propsに郵便番号だ、住所だ、電話番号をつっこむわけです。
mysql> INSERT INTO address (name)
VALUES ('YAMADA'), ('SUZUKI'), ('TANAKA');
こんなんだったとすると、Class::DBI で扱う場合、いつものようにこのテーブルのクラスを作るわけですが、props のカラムを扱うのが難しい。
よく Data::Dumper とかで、文字列化した値を入れておいて、それを eval() して取り出したりするんですが、その手続きが意外に面倒臭かったり。
なんとか楽に出来んかなーっていっつも思ってたりしたんですが、今日いつものように CPAN あたりを徘徊していたら、Class::DBI::Plugin::PseudoColumns とかいう、何やらそれにうってつけなモジュールがあった。
package MyData::Address;

use strict;
use base qw(MyData::Base);
use Class::DBI::Plugin::PseudoColumns;
__PACKAGE__->table('address');
__PACKAGE__->columns(Primary => qw(id));
__PACKAGE__->columns(All => qw(id name props));
__PACKAGE__->pseudo_columns(props => qw(zipcode address sex phone cellphone));

1;
とりあえず、今んとこ
mysql> SELECT * FROM address;
+----+--------+-------+
| id | name   | props |
+----+--------+-------+
|  1 | YAMADA | NULL  |
|  2 | SUZUKI | NULL  |
|  3 | TANAKA | NULL  |
+----+--------+-------+
3 rows in set (0.00 sec)
こんなんなってますが「そういや、YAMADA も SUZUKI も TANAKA も男だったなー」とかいう時
use strict;
use MyData::Address;

my $iter = MyData::Address->retrieve_all;
while (my $row = $iter->next) {
    $row->sex('M');
    $row->update;
}
こんなカンジで、いつものように、普通のカラムを扱うようにいじってみると、
mysql> SELECT * FROM address;
+----+--------+----------------+
| id | name   | props          |
+----+--------+----------------+
|  1 | YAMADA | {'sex' => 'M'} |
|  2 | SUZUKI | {'sex' => 'M'} |
|  3 | TANAKA | {'sex' => 'M'} |
+----+--------+----------------+
3 rows in set (0.00 sec)
こんな風になります。
取り出す時もいつも通り、
use strict;
use MyData::Address;

my $yamada = MyData::Address->retrieve(1);
print $yamada->sex, "\n";
お手軽に利用出来たりします。
携帯番号でも登録しようかなーって時に「あー、そういや TANAKA は携帯電話を 2 個持ってたなー」とか思い出す。でもそんな取るに足らないデータなのに「一対多だから」という理由で正規化するのもアホくさい。
use strict;
use MyData::Address;

my $tanaka = MyData::Address->retrieve(3);
$tanaka->cellphone([qw(090-1234-56xx 090-2345-67xx)]);
$tanaka->update;
こうしておけば、
use strict;
use Data::Dumper;
use MyData::Address;

my $tanaka = MyData::Address->retrieve(3);
my $cellphones = $tanaka->cellphone;
print Dumper $cellphones;
こうした時に
$VAR1 = [
          '090-1234-56xx',
          '090-2345-67xx'
        ];
こう取り出せたりする。
いやー、なかなか素敵。

てことで、お手軽に擬似的カラムを扱える、Class::DBI::Plugin::PseudoColumns は、軽くオススメです。

nipotan at 14:55 | Comments(3) | TrackBack(4) | 技術 
このエントリーをはてなブックマークに追加

November 08, 2005

このエントリーをはてなブックマークに追加
ワンクリック詐欺、容疑のネットジャーナリストら逮捕
 岩手県警は7日、東京都中野区のインターネットジャーナリスト森一矢容疑者(35)を詐欺の疑いで逮捕した。森容疑者は容疑を否認している。また、同渋谷区、会社役員大賀達雄容疑者(28)ら共犯の4人=盛岡地裁に起訴済み=を同日までに逮捕したと発表した。
はい、森一矢キタコレ。
「恋におちたら」のデジタルな見方(1)―PC操作に“こだわり”
(事件簿ネットhttp://www.jikenbo.net森一矢)
恋ヲチの演出家タイーポ。
久々にこのあたりのエントリでお楽しみくださいな。

沢山の笑いを与えてくれた森一矢氏は、やはり詐欺をやるにも、やはり



リアリティがなくてすぐバレた





んでしょうかね。。。

彼の「リアリティのなさ」はこのあたりをじっくりお読みくださいませ。

詐欺はいけませんよ。
詐欺は。

nipotan at 01:07 | Comments(3) | TrackBack(2) | 恋に落ちたら 
このエントリーをはてなブックマークに追加

November 07, 2005

このエントリーをはてなブックマークに追加
WWW::Mechanize の古いバージョンで動いていたのが、バージョンを上げてみたらどうやら動かなくなっていることに気付く。
どうもリダイレクトされる URL を get() した後の uri() の値がおかしいようだ。
Apache 側を
NameVirtualHost *:80
<VirtualHost *>
ServerName redirect
RewriteEngine On
RewriteRule ^/.* http://www.google.com/ [R,L]
</VirtualHost>
こんなんしておいて、
use strict;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
$mech->get('http://redirect/');
print $mech->uri, "\n"
こんなのを動かすと、version 1.05_04 以前の WWW::Mechanize では http://www.google.com/ が返るのに対し、version 1.06 以降では http://redirect/ が返る。
当然、以前書いたコードなので、ここでは http://www.google.com/ が返るのを意図しているので、下位互換性が失われた故に動作していなかったというわけです。
んで、これ、見る限り、どうもこの互換性が失なわれているのは作者の意図っぽくないんですよね…。
該当バージョン間の diff を見る限り、単純に request() の中に書かれていた一部を _update_page() というメソッドに分けただけっぽいんです。
でも、ここで _make_request() を呼ぶタイミングが怪しげで、LWP::UserAgent とかをざっと追ってみたんですが、どうも _update_page() が呼ばれる前に _make_request() の中から呼ばれる SUPER::request() 内部で再帰呼出があって、どうも _update_page() の時点で渡ってくるリクエストが逆順になってるからっぽいです。

ってことで、これを解消する patch を書いてみました。
WWW::Mechanize の version 1.16 用です。

WWW-Mechanize-1.16.patch

一応、作者の Andy Lester さんには patch を送っておきますた。

nipotan at 15:37 | Comments(0) | TrackBack(1) | 技術 
このエントリーをはてなブックマークに追加

November 04, 2005

このエントリーをはてなブックマークに追加
一応、先のエントリで、Sledge の API について詳細に解説し、末尾に書いたんですが、miyagawa さんに「最後まで読む奴 1%」とか身も蓋もないことを言われてしまい、まぁたしかにそんな気もするし、折角頑張って 10 分の壁に挑戦したのに注目されていないのも淋しいことこの上茄子だなーと思い、別エントリへ昇格させました。

ということで、Sledge API 解説に続く Sledge 実践編として、10 分で作る Rails アプリ for Windows やら、10 分で作る CakePHP アプリ for Windows あたりにインスパイアされ「10 分で作る Sledge アプリ」というテーマで、無謀にも挑戦してみました。

漢の挑戦をとくとご覧あれ

いや、ぶっちゃけ無理っす。
先に結果言いますけど、10 分なんて無理っす。
ちゃんとはかってないですけど、多分 13 分ぐらいかかってます。

あと、他の方が「for Windows」で、私も Wink 使うために Windows 環境でやってますけど、ずっと ssh で繋げて作業してるので、Windows じゃなくてもいい…ってかむしろ Windows じゃないほうが良かったりします。

とりあえず、遊べる Windows 環境が東芝 Libretto L5 しかなかったので、ものすごい小さく、不慣れなキーボードでやってます。。。
まぁ、慣れてる iBook でやったからって 10 分切れる気がしないですが。

結論: 「Sledge で短時間開発」をするにはもっと工夫が必要。

バリバリ工夫したら 5 分でイケるね。






ついでに余談ですが、
うちの会社の非プログラマーな方が、10 分で作るシリーズを見て、

「web プログラミングであんな GUI バリバリでテーブルいじったりしてるのってなんか違うなーって気がした」

って言ってました。
そういう正しい目を持った人うがった見方をする人にも、このムービーは満足いただけるんじゃないかなと思います。

だって全然見た目がおもしろくないもん。
いや、むしろ別の意味でおもしろいですが。

miyagawa さんが言ってました。
「すごいな。これでおれも!とはおもわんな。」

もうね、おっしゃる通りですよ。マーケティング的には大失敗ですね。でも、そういうリスクを負ってまでやってみたかった「ネタ」だったりします。
ウケればいいんすよ。ウケたもん勝ち。

nipotan at 18:56 | Comments(7) | TrackBack(4) | 技術 
このエントリーをはてなブックマークに追加
   next >>