アップしておいたっす。
アップしておいたっす。
明日は日記才人のバグフィックスをしよう。
自分で書いておいてなんだが、Xangoは難しいのか難しくないのかよくわからん。今回PlaggerのXangoプラグインを書いたわけだが、これがよくみるとこれだけの行数でかけるならエレガントだなぁ、とか自画自賛してしまったわけだ。
やっぱドキュメントかな・・・
今日はちょっとバグを探せる感じの日じゃないので、明日やろう、というメモ。(でも実はもう出来上がってるような気がする)
おいらの状態をみかねた人たちが俺を無理矢理病院に拉致ることに。すまんねぇ。で、もらって以来一回も使ってないどころか一回もまともにみたことないの保険証を探す。あった。あったが、去年の9月で切れている・・・えー、そのあとなにももらってないと思うんだけどなぁ・・・。ついでに現金発見・・・ドルだけど。でもこんなにあったのか、という量。銀行にさえいければ多少の金が入るわ。
ありえないくらいの寒気でガクガクブルブル。・・・つら・・・
午前2時ごろに気がつく。いつのまにか眠っていたらしい。恐ろしい発汗。だらだらと汗がでてくる。水でも浴びたかのような感じ。
これから常時ハイキング仲間募集モードに入ろうかと思っております。
「駅からハイキング」に行きたいのですが、絶対に一人で行きたくない。さらに言えばバリバリ本気でハイキングじゃなくてゆるーーーーい気持ちでハイキングに行きたいのです。土曜日に日帰りみたいな感じで、10km~15kmくらい歩きたいのですよ。
行きたい人がいたらおしえてー。
わからんわー。
「Xangoがデフォルトの状態でrobots.txtをハンドルできるといいのにー」って結構聞く。俺もその期待には応えたいとは思うのだけどこれが実はなかなか難しい。なんでかというと、robots.txtの処理は意外と難しいから(笑)
というのも、パースしたりなんだりはいいのだけど、大量のrobots.txtデータを保存しつつ、高速で適用するというのが結構知恵がいる上にアプリケーションのコンテキストによって大分処理が違うのですな。某サービスの場合は実はrobots.txtの処理は全てデータベース上で行っている。Perlでやってるとメモリ食うし、遅いんだもん。
でもじゃあそれを一般化できるかというと、少なくとも俺のやってるやりかたではできない。っていうか、PostgreSQLのストアドプロシージャをガリガリガリガリ使っているからなんだなー。同じロジックをSQLiteでやれと言われてもできん・・・
ちなみにLWPに入ってるWWW::RobotRulesはとても参考になるが、あれはメモリを食いまくる。WWW::RobotRules::AnyDBM_Fileはメモリを食わないが、どちらにしろ取得してきたrobots.txtをリニアースキャンするので使えない。100万件あったら、それをリニアースキャンするんですよ、奥さん!
ってことで難しい。何か一般化できるいいアイデアはないもんかね。
いやー、自分で書いてて思ったけど、Xangoって難しいな(笑)もっと簡単にするよ・・・
自転車出勤→区役所→社会保険庁→事務所。事務所にようやくついたと思ったら携帯電話がつかない。この間から変だったんだけど、今日はもううんともすんとも言わない。しょうがないのでまたDoCoMoに行って修理。でも同じ症状で持って行くの2回目だったから今度は機体を交換してくれた。その足で赤坂で打ち合わせ。現在財政が辛いのでこの仕事はゲッツ。
事務所に戻ろうかと思ったのだけど、充電器を家に忘れてたので今日は自宅作業に決定。さ、コード書くぞ。
この間入札したPower PC、無事落札。その間、そんなに必要なわけでもなかったんだけどPower Bookまで落札してしまった・・・やべ。絶対に誰か俺より高額で入札すると思ったのに。
wafu宛てのメールが全然届かない。管理人の方にも何回も電話をかけてみたが音信不通・・・メールは多分俺へのメールが届かないのと同じ理由で届いてないだろうし。
というわけで皆さん、今wafuアドレスは全然使えてません。他の方法で連絡をくだされば他のメールアドレスをおしえまーす。
(追記:復活しました!)
さすがbrian、PDF初心者って自分で言ってるのにPDF::API2を使いこなしてる。俺はちなみに挫折しました。
http://www.perlmonks.org/index.pl?node_id=531667
PDFを簡単に作れるようになるといいよねぇ。
日本語の読みを一瞬で抽出:
use Mecab;
my $string = "....";
my $m = Mecab::Tagger->new;
for (my $n = $m->parseToNode($string); $n; $n = $n->{next}) {
next unless $n->{surface};
my $y = (split(/,/, $n->{feature}))[7];
$yomi .= $y ? $y : $n->{surface};
}
print $yomi, "\n";
しかも速っ!惜しむらくはインターフェース的にIteratorにしてくれるといいなぁ、という感じ。
「とくダネ!」に出てた民主党議員の「X-Senderがでてないのは堀江さんがいつも使っているサーバーを使ってなかったからじゃないの?」という言い訳なんですが。個人的にどういう条件下でX-Senderがつくのはわからないのだけど、「Eudoraが・・・」とパッケージを出してきてるところで「サーバー」「サーバー」と繰り返す事によってさらに無知をさらけ出してる。
永田議員というのもどうも折り紙付きの人らしいけど、それにしてもあの無知さよ。この国を動かしている人達は今の世界を動かしている技術にとことん無知なんだなぁ。まともな事業じゃなくて電子詐欺師でも目指すか?
事務所用のコンピューターをオークションで手に入れようと思ってたら競り負けた・・・
というわけでシャンパン一杯ずつとケーキでお祝い。どこのセレブだ。
スタバの女性店員ナンパ現場目撃。名刺渡してた。
今日最近引っ越してきたらしい隣人が引っ越しの挨拶に来た。クッキー一箱もらったー。いやー、初めてこういうのもらったわ。
1時間くらいしかやってないのでひょっとしたら全然ミスってるかもしれないのですが、RubyのThreadはインターフェースはJavaっぽくて分かりやすい感じなのだけど、実際はつかえねーだす。今日やりたかったのはデータベースへのアクセスを並列化する事なんだけど・・・
result = 0
threads = []
hosts = [ ... ]
hosts.each { |h|
threads.push (
Thread.start {
s = Mysql::connect(h);
res = s.query("SELECT COUNT(*) FROM ...")
result += res.fetch_row[0].to_i
}
)
}
threads.each { |t| t.join }
ってコードで、当たり前だけどMutexをこれにつけないといけない。スレッドで共有しているのはresultなので、これを守ってやればいいのかな、と
m = Mutex.new
result = 0
threads = []
hosts = [ ... ]
hosts.each { |h|
threads.push (
Thread.start {
s = Mysql::connect(h);
res = s.query("SELECT COUNT(*) FROM ...")
m.synchronize {
result += res.fetch_row[0].to_i
}
}
)
}
threads.each { |t| t.join }
ところがこれがうまくいかない。resultの値がめちゃくちゃですよ。色々やってみたのだけど、結局うまく行くのは、Threadの中身全体をm.synchronizeしたときだけ・・・ってこれじゃあ結局順番に行うだけだから意味ないじゃん!
FAQをよく見てみると
がーん。というわけで結局Cで書くしかなさそうだ。
今日は某サーバーの入れ替えのためこれから作業ー。
http://d.hatena.ne.jp/naoya/20060217/1140153832
す、すんません、テレビ見まくりです。家にいると作業してるときだろうがなんだろうがテレビついてます・・・
↑トラックバックみたら、なんかすげー真面目に怒ってる人がいた。・・・あほか。
ちょっと大きめの業界会社に行ってきた。プレゼン自体は失敗だったなぁ、という感じだけど、(話した内容に面白い事なんてなにもなかったのだけど)正直ちょっとおもしろかった。話している様を見ていると人間関係が垣間見える。
Jemplate、とりあえず使ってみた。
俺がMasonを使うのは俺がプログラマーだからなんだなぁ、というのがまず最初の感想。なんでかというと、Jemplateがでてきた時、まず真っ先にTTへの反動があり、Mason使いたい!と思って、実装をMasonに変えてみれないかと考えてたからである。
ところがところが。Masonはとてもよくできたコードなのだけどロジックとプレゼンテーションの分離というとちょっと目指すものが違っており、TTのようにスムーズなパーサーがないし、Perlコードが結構そのまま入るのでそれをJavascriptに変換するというのも無理があった。
俺はどうも
sub action {
my %data = ...;
$template->process(%data);
}
みたいなパターンが嫌いで、どうせならロジックはページそのものに埋め込みたい。Masonで言う所の<init>ブロックがとても気に入ってるのはそのせい。どうもひとつの動作を具現化するのに二つのファイルをいじるという事に納得できないのだなぁ。
まぁなにはともあれ。
そういう事を踏まえて、そうか、これは表示側を作成する人のためのツールなんだ、と理解できた瞬間にJemplateはすっと納得できた。これはこれでいいんじゃなかろうか。TTを使えるコーダーの人に渡したら便利そうだよなぁ。
ちなみに試したみたのはこれだけなんだけどね。妙にこのエレガントさに納得してしまった:
test.tt:
my name is [% poop %]jemplate -c test.tt
(snip)Jemplate.templateMap['test.tt'] = function(context) {
if (! context) throw('Jemplate function called without context\n');
var stash = context.stash;
var output = '';try {
output += 'my name is ';
//line 1 "test.tt"
output += stash.get('a');
}
catch(e) {
var error = context.set_error(e, output);
throw(error);
}return output;
}
ほうほう!
http://search.cpan.org/~jesse/Jifty-0.60213/
デフォルトのテンプレートエンジンはHTML::Mason使ってますか!さすがJesseが書いているだけありますね。
Javascriptでカレンダー書こうと思って、prototype.js使ったりなんだりでやってたのだけど、Safariだとなんにも表示されない。Operaではドメイン全体のクッキーが正しく認識されない。クロスブラウザーってなんでこんなに難しいんだ。
バグはあってもいいのよ、バグは。でもこれらの問題って結局規格が違う、ってことなんだよねぇ・・・頼むから規格通りに作ってくれ。あーあ、一日分の労働が・・・。
(追記)わかった。HTMLマークアップのクラス指定に"class"という変数を使っていたのだが、これがリザーブワードだった。FireFoxの連想配列はかなりPerlライクな形で
var hash = {
class: foo,
};
みたいにあった場合最後のカンマは見逃してくれたり、:の左側の文字列は例えそれがリザーブワードであっても定数文字列として扱ってくれたりするわけだが、Safariとかではそうもいかんらしい。
昨日、刺身の切り落とし部分が安く売ってたので買ってきてたのだが、食べる暇がなかった。というわけでちょっと早いお昼にヅケ丼。おいしい~~部位を使ってのヅケはもちろんうまいが、逆にこういう半端物をおいしく食べるにはヅケは素晴らしい。ヅケのタレ自体はちゃんとみりん、酒、醤油、砂糖に昆布で作った。
た~~~っぷり刺身が入って700円くらい。うまうま。
ただ俺が知らなかっただけだと思うんだけど、FireFoxで「/」とうつとページ内検索ができる。Vim大好きッ子の俺としてはこれはすばらしい使いやすさだ。
var data = { foo: 0 };
var str = "foo -> #{foo}";
var t = new Template(str);
t.evaluate(data);
と言うコードでt.evaluate()は
foo -> 0
と返ってきて欲しいのだけど、実際には
foo ->
としか返ってこない。どうもよくある「0を使うと負として扱われる」バグのような気がするのでコードを見てみるとこんな感じで直せそう:
evaluate: function(object) {
return this.template.gsub(this.pattern, function(match) {
var before = match[1];
if (before == '\\') return match[2];
return before + (object[ match[3] ] + '').toString();
});
}
相棒ちゃんと初山頭火。最初の一口がうまい!サービスのお握りととても合う!チャーシューうま!
でも中盤から結構だれるので最後のほうは胡椒や一味唐辛子で味を変えつつ。結果的には胡椒が1番合う。
普通にうまいけど恋い焦がれる味ではないなー
http://www.ceres.dti.ne.jp/~jun-h/042kandaramenwaizu.html
id:nekokakさんから。っていうかプログラマー関係からこういうレコメンドもらったの初めてかも!w
神田にはとてもとてもとてもとてもいい小料理屋がありまして、そこによくいってたのですが活動拠点が渋谷/新宿になってからあまりいかなくなってしまった。昼ラーメン、夜小料理屋というコースに是非いってみたい今日このごろ。
うま!うますぎ。
http://www.alistapart.com/articles/hybrid
まったく、絵画能力?がある上にプログラミング的な能力もある人ってすごいよなぁ。ちなみに英文を読みたくない人はこちらに完成品が。クロスブラウザーだそうだ。
http://www.alistapart.com/d/hybrid/hybrid-4.html
src/hoge.h
pkg/lib/Hoge.pm
pkg/lib/Hoge.xs
Build.PL# Module::Build->() でc_sourceを指定
という状態で.xsファイルで#include <hoge.h>しても動かない。ところがExtUtils::ParseXS入れておくとなんとか動くっぽい。
あ、やっぱり動かない。なんだこれ。(追記)あ、ごめん、超嘘だった。どっちでもちゃんと動きます。
8時閉店のスーパーに7時過ぎに行った所、あるわあるわ、値引き商品。値引き商品ってなんだか知らんが買うとものすごい満足感でいっぱいになるなー。というわけで100円引きになった寿司盛り合わせ500円と半額お惣菜200円。あとはところてん。うまうま。
体が欲しているのだろう、野菜をたっぷりたっぷりたっぷり食べたい欲求に今週はかられているいるので今日もたっぷり白菜の・・・なんだろ、これ。なんか作った。白菜、豚バラ肉、しめじを重ねて敷き詰めて、塩胡椒、味噌、酒、みりん(水分は本当に少し)で味付けして、基本的に白菜の水分で煮る。
全体的に薄味だけど、甘い、甘い!うまーい。
どうもイマイチ洋楽/ハリウッド映画に食指が反応しない。英語にあまり感動しない。ひとつには俺がわりと郷に入りては郷に従えという信条でなるたけ同化することを心がけているというのあもあるとは思うんだが、なんかやっぱりアメリカに飽きてたのかなぁ、さらに思うのです。
日本に帰ってきてからそろそろ2年、最初の興奮冷めてきて「摂取」する情報も落ち着いてきた。日本は本当に情報が溢れているよなぁ。
検索はpg_sennaインストールしわすれてた・・・orz。しかしログから見るに10日ぶりか。うはー。
http://www.collylogic.com/?/comments/redesign-notes-1-width-based-layout/
コロンブスの卵だね。どうもJavascriptコード自体はもっと洗練される余地はあるような気がするが、これは確かに使えそう。Windowに対してのイベントって正直俺はよく知らないけど、調べてみたら結構色々でてきそうだ。
某ヨーロッパに行く話ですが、金がかさむかネットがない状態に陥るかになりそうだったので結局中止になりました。そんなわけで来週も日本にいまーす。
ここ数日間若干効率が落ちてるような気がする。そう、それはちょうど某N案件の事で俺がぶち切れた日あたりから。なんか馬鹿らしくなっちゃってな。お金がもらえないなら楽しい仕事したいし、無理をするとか、アホなヤツと付き合うとかを考えるとお金もらわなきゃやってられないし。
ともかく、金の話はちゃんとしたんだから余計になにか頼む前にそこを片付けてほしいと思う今日この頃。
渋谷Dexee Cafeでグリルチキンとサラダを食べた。結構うまかった。
敢えて言おう、「ChangesファイルがないCPANモジュールはクソである」と!何が変わったのかわからずにインストールできるかー!
久しぶりに実家に行ったら、妹ちゃんが鍋鍋とわめいているのでニラと豚肉の鍋。タレがフードプロセッサで細かくしたニラに麺つゆを足したもの。これがかなりうまい。また今度やろうっと。
夜はロールキャベツ作ってもらった。うま。
・・・と、ブレーカーが落ちました。洗濯機が乾燥途中で止まりました。ネットワーク接続がぶちきれました。
ああ、ぶち切れました。作業中のデータが消えた。ざっくり。がっくり・・・
もう結構キツいブラックオーラまとってます。アホと仕事すると本当にやる気無くすな。
300万、300万と普通に言う物の、現金にしてみると実際すげぇ厚みだ。っていうわけで出資金振込してきました。
前日のチゲに引き続き、風邪を治すようなものを食べようと言う事で鍋をすべく久しぶり(3ヶ月??)に買物。ヒラメのアラが150円だったのでそれをダシにしようと決意して、ネギ、豆腐、エリンギを購入。うまそうだったのでついでにホタルイカも購入。
鍋はすこぶるうまかった。ネギもぷりっぷりでうまー。これだけネギ食ったら風邪治るだろう、みたいな。
ホタルイカは結構残ったので店のおっちゃんが言っていた通り醤油、砂糖、酒で甘辛く煮ておいたらうまうま。すっげーいいつまみができてしまったなー。
継承ではPKチェックを行ってくれないよう。そのかわり、TRIGGERを使うとそれっぽいことができそう:
まず、継承関係を作成。この際、小テーブルでもちゃんとPKを明示的に指定しておかないといけない(インデックスはテーブル毎の指定であって、継承はされない)
CREATE TABLE item_200602 (PRIMARY KEY(id)) INHERITS (item);
CREATE TABLE item_200603 (PRIMARY KEY(id)) INHERITS (item);
このままだとitem_200602とitem_200603に同一キーが存在していても問題なしなので、SELECT * FROM item WHERE id = 1; とかした時に複数の行が返ってくる事がある。なので、ここでトリガーを作成:
CREATE OR REPLACE FUNCTION CheckItemPK ()
RETURNS TRIGGER AS
$func$
BEGIN
IF (EXISTS(SELECT 1 FROM item WHERE id = NEW.id)) THEN
RAISE EXCEPTION 'item with primary key % already exists', NEW.id;
END IF;
RETURN NEW;
END;
$func$
LANGUAGE 'plpgsql';CREATE TRIGGER CheckItemPKTrigger BEFORE INSERT OR UPDATE ON item_200603
FOR EACH ROW EXECUTE PROCEDURE CheckItemPK();
CREATE TRIGGER CheckItemPKTrigger BEFORE INSERT OR UPDATE ON item_200602
FOR EACH ROW EXECUTE PROCEDURE CheckItemPK();
これで、item_200603とitem_200602はitemのPKにいちいちチェックしないとINSERT/UPDATEができない事になるし、同じsequenceを使うので基本的にSERIAL PRIMARY KEYを持ってるのと一緒になるですよ。
これまだ試してないんだけど、いわゆる世代別にわけたテーブルを使ってるとして
item_200602
item_200601
item_200512
item_200511
...
これら全てに通しで使えるSERIAL PRIMARY KEYを貼りたいのね。この場合、テーブルを作る時にこんな感じでいいのかな
CREATE SEQUENCE item_global_id_seq;
CREATE TABLE item_200602 (
id INTEGER NOT NULL DEFAULT nextval('item_global_id_seq') PRIMARY KEY,
...
);
CREATE TABLE item_200601 (
id INTEGER NOT NULL DEFAULT nextval('item_global_id_seq') PRIMARY KEY,
...
);
で、これでINSERTするとitem_200602とitem_200601とでかぶるIDはなくなる(はず)でいいのかな。っていうか、違うな。なんかこの場合は継承を使わないとユニークキーにならないような気がする。こっちか?
CREATE TABLE item (
id SERIAL PRIMARY KEY
...
);
CREATE TABLE item_200612 () INHERITS item;
これだと確かPKはitemの中で保存されるよーな。
チゲ!チゲ!風邪を治すにはチゲだ!とわめいていたら結局いけた、韓国料理店。でもまず海鮮パジョン。でか!うま!その後チゲを頼んだら馬鹿うま。絶対また行く。
エラーがあるといわれるが、それだけでエラーログも何もない。何が問題だったの?と聞くとdiffの結果みたいなアホ臭い表示が15行分程返ってくる。エラーログはないの?というとエラーログが返ってきた。3通目でようやく問題がどうもむこうで使っているバリデーターとこっちに渡されているハンドブックの中身が違うような気がするのでそこを確認してくれと言うと後は電話じゃないと駄目と突っぱねられる。
アホか。もうこの仕事はやりたくない。エラーの内容を知るためだけに2時間以上も費やしてさ。泥舟だよ。
昨日は歌丸の一門会150回記念で楽太郎も来てたのでがんばって行ったですよ。
楽太郎が出るからか、場内は微妙にいつもと客層が違ったような。ただ、いつもいるやたらとご祝儀をあげたがるおばちゃんとかはご健在。歌丸一門は花丸以外総出で、うらら、歌若、歌蔵、歌春、歌助、歌丸と。楽太郎は歌春と歌助の間、中入り前に。わりと動きの少ないタイプの噺家さんだった。結構おもしろかったなぁ。技術ってのもあるんだろうけど、やっぱり場数踏んでるんだろうなぁという安心感が。
しかし俺はやっぱり歌丸門下では歌春が一番好きだなぁ。
今度日記の整理をしようと思う。ここは技術と日常がまざりすぎた。というわけで技術コンテンツはそのうち移動するかもですー。
この日記へのリンクを辿って行ったらid:nipotanあたりのブックマークとかに辿り着いたりして。ブックマークのタグがアレだったんでちょっとびっくりしたけど(「いじめ」ってあったんだもの!)俺がいじめてるんじゃなくて、俺が書いたいじめないでね、の事に関してだったのような。ちょっと安心。
しかし本当、一緒にするなって気持ちはよくわかる・・・>nipotan
Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)
#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar
翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><