D-7 <altijd in beweging>

Day to day life of a Perl/Go/C/C++/whatever hacker. May include anything from tech, food, and family.

2006年02月


今日最近引っ越してきたらしい隣人が引っ越しの挨拶に来た。クッキー一箱もらったー。いやー、初めてこういうのもらったわ。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


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をよく見てみると



http://www.ruby-lang.org/ja/man/?cmd=view;name=FAQ%3A%3ARuby%A4%CE%BD%E8%CD%FD%B7%CF%A4%CB%A4%C4%A4%A4%A4%C6#a11.2e5.20.a5.cd.a5.a4.a5.c6.a5.a3.a5.d6.a5.b9.a5.ec.a5.c3.a5.c9.a4.f2.bb.c8.a4.c3.a4.bf.20Ruby.20.a4.cf.a4.ca.a4.a4.a1.a9



がーん。というわけで結局Cで書くしかなさそうだ。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


今日は某サーバーの入れ替えのためこれから作業ー。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr



http://d.hatena.ne.jp/naoya/20060217/1140153832



す、すんません、テレビ見まくりです。家にいると作業してるときだろうがなんだろうがテレビついてます・・・


↑トラックバックみたら、なんかすげー真面目に怒ってる人がいた。・・・あほか。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


ちょっと大きめの業界会社に行ってきた。プレゼン自体は失敗だったなぁ、という感じだけど、(話した内容に面白い事なんてなにもなかったのだけど)正直ちょっとおもしろかった。話している様を見ていると人間関係が垣間見える。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


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;
}


    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


ほうほう!



http://search.cpan.org/~jesse/Jifty-0.60213/



デフォルトのテンプレートエンジンはHTML::Mason使ってますか!さすがJesseが書いているだけありますね。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


Javascriptでカレンダー書こうと思って、prototype.js使ったりなんだりでやってたのだけど、Safariだとなんにも表示されない。Operaではドメイン全体のクッキーが正しく認識されない。クロスブラウザーってなんでこんなに難しいんだ。


バグはあってもいいのよ、バグは。でもこれらの問題って結局規格が違う、ってことなんだよねぇ・・・頼むから規格通りに作ってくれ。あーあ、一日分の労働が・・・。


(追記)わかった。HTMLマークアップのクラス指定に"class"という変数を使っていたのだが、これがリザーブワードだった。FireFoxの連想配列はかなりPerlライクな形で



var hash = {
class: foo,
};

みたいにあった場合最後のカンマは見逃してくれたり、:の左側の文字列は例えそれがリザーブワードであっても定数文字列として扱ってくれたりするわけだが、Safariとかではそうもいかんらしい。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


昨日、刺身の切り落とし部分が安く売ってたので買ってきてたのだが、食べる暇がなかった。というわけでちょっと早いお昼にヅケ丼。おいしい~~部位を使ってのヅケはもちろんうまいが、逆にこういう半端物をおいしく食べるにはヅケは素晴らしい。ヅケのタレ自体はちゃんとみりん、酒、醤油、砂糖に昆布で作った。


た~~~っぷり刺身が入って700円くらい。うまうま。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


ただ俺が知らなかっただけだと思うんだけど、FireFoxで「/」とうつとページ内検索ができる。Vim大好きッ子の俺としてはこれはすばらしい使いやすさだ。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr



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();
});
}


    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


相棒ちゃんと初山頭火。最初の一口がうまい!サービスのお握りととても合う!チャーシューうま!


でも中盤から結構だれるので最後のほうは胡椒や一味唐辛子で味を変えつつ。結果的には胡椒が1番合う。


普通にうまいけど恋い焦がれる味ではないなー



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr



http://www.ceres.dti.ne.jp/~jun-h/042kandaramenwaizu.html



id:nekokakさんから。っていうかプログラマー関係からこういうレコメンドもらったの初めてかも!w


神田にはとてもとてもとてもとてもいい小料理屋がありまして、そこによくいってたのですが活動拠点が渋谷/新宿になってからあまりいかなくなってしまった。昼ラーメン、夜小料理屋というコースに是非いってみたい今日このごろ。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


うま!うますぎ。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr



http://www.alistapart.com/articles/hybrid



まったく、絵画能力?がある上にプログラミング的な能力もある人ってすごいよなぁ。ちなみに英文を読みたくない人はこちらに完成品が。クロスブラウザーだそうだ。



http://www.alistapart.com/d/hybrid/hybrid-4.html




    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr



src/hoge.h
pkg/lib/Hoge.pm
pkg/lib/Hoge.xs
Build.PL

# Module::Build->() でc_sourceを指定

という状態で.xsファイルで#include <hoge.h>しても動かない。ところがExtUtils::ParseXS入れておくとなんとか動くっぽい。


あ、やっぱり動かない。なんだこれ。(追記)あ、ごめん、超嘘だった。どっちでもちゃんと動きます。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


8時閉店のスーパーに7時過ぎに行った所、あるわあるわ、値引き商品。値引き商品ってなんだか知らんが買うとものすごい満足感でいっぱいになるなー。というわけで100円引きになった寿司盛り合わせ500円と半額お惣菜200円。あとはところてん。うまうま。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


体が欲しているのだろう、野菜をたっぷりたっぷりたっぷり食べたい欲求に今週はかられているいるので今日もたっぷり白菜の・・・なんだろ、これ。なんか作った。白菜、豚バラ肉、しめじを重ねて敷き詰めて、塩胡椒、味噌、酒、みりん(水分は本当に少し)で味付けして、基本的に白菜の水分で煮る。


全体的に薄味だけど、甘い、甘い!うまーい。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


どうもイマイチ洋楽/ハリウッド映画に食指が反応しない。英語にあまり感動しない。ひとつには俺がわりと郷に入りては郷に従えという信条でなるたけ同化することを心がけているというのあもあるとは思うんだが、なんかやっぱりアメリカに飽きてたのかなぁ、さらに思うのです。


日本に帰ってきてからそろそろ2年、最初の興奮冷めてきて「摂取」する情報も落ち着いてきた。日本は本当に情報が溢れているよなぁ。



    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

このページのトップヘ