場合によってはCache-Control: no-cacheとPragma: no-cache入れておかないとびっくりするぞ!あと、CRUDなインターフェースで、POSTの結果をちゃんとリダイレクトしないと泣くよ!
場合によってはCache-Control: no-cacheとPragma: no-cache入れておかないとびっくりするぞ!あと、CRUDなインターフェースで、POSTの結果をちゃんとリダイレクトしないと泣くよ!
Catalystでバックエンドに1回アクセスしてキャッシュ、Catalystはそのままにしておいて、バックエンドのmemcachedを停止→再起動、そしてもう一度同じURLにアクセスしてcache->getすると
[ERROR@1180489486.348914] mcm_buf_read():361: read(2) failed: server unexpectedly closed connection
となってプロセスが落ちる。おっとーーー・・・次のサーバーにfailoverしろよぅ。
WiiのリモコンのイベントをJavascriptっぽく扱わせてくれるライブラリ。いいんだけど、setupHandlers()って呼ぶとデフォルトで使えるスクロールとかが全部効かなくなる。勘弁してくれ。というわけで、その部分だけ書き直してみた。
wii.setupHandlers = function() {
var o_onkeypress = document.onkeypress;
document.onkeypress = function(e) {
var keyCode = e.which;
var controllers = wii.controllers_;
var returnValue = true;
for (var i = 0, len = controllers.length; i < len; ++i) {
var controller = controllers[i];
if (!controller.handleKeyPress(keyCode)) {
returnValue = false;
}
}
if (! returnValue) {
return o_onkeypress(e);
}
return returnValue;
}var o_onclick = document.onclick;
document.onclick = function(e) {
if (e.which != 1) {
// not the left mouse button
return;
}
var returnValue = true;
var controllers = wii.controllers_;
for (var i = 0, len = controllers.length; i < len; ++i) {
var controller = controllers[i];
if (!controller.handleMouseClick()) {
returnValue = false;
}
}
if (! returnValue) {
return o_onclick(e);
}
return returnValue;
}
}
pcreを入れ、glibcを入れ、pkg-configを入れ・・・色々やってみて、fastcgiも動かしはじめたところ、1リクエストで落ちた。
http://trac.lighttpd.net/trac/ticket/1137
あああぁぁぁぁ・・・・・・
今までずっとLoaderで動的にスキーマを読み込んでた。スキーマ変更をちょくちょくしてたのもあったし。でも最近開発が急ピッチで進んでるところで皆同時にDBIC::Schema::Loader->connection()とかやり始めるとすごい遅くなるから、皆が大好きmake_schema_atを試してみてるんだけど、これがうまく動かない。特にrelationship系のところがメタメタ。search_related()とかやると、"can't call select() on an undefined value" とか言われる始末。なんでやねん。これがコマンドラインからだと動くんだけど、なんかCatalystからだと動かないというのがさらにいけない。あと、別ディレクトリに自分の拡張を入れて行くのはいいんだけど、これを入れてmake_schema_atする時に他の自分のモジュール(例:lib/MyApp/Util.pm)を使おうとするとlibをパスに入れなくてはならず、そこでlib/MyApp/Schemaを認識させないために妙な事をしなくちゃならんし・・・・
俺がなんか変な事してるのかなぁ。なんとなく、MyAppとは別にMyApp::Schemaを編集/管理するべきな気がしてきたよ!
private IPに関してのフィックス、03_liveがこけてた件を直した。なんかそろそろAPIを固定してもいいのかと思い始めてきた。
あー、超久しぶりにバグ直した。0.05うp
今日は麻婆茄子。ニンニクとネギをごま油で炒めて、そこに豚肉を投入して一緒に炒める。ちょっと酒も。香りがたってきたら一口大に切った茄子を入れて炒めて、後は水に溶かした味噌、酒、極々少量の醤油と砂糖、それと豆板醤で味を調整。一番最後に香り付けのための胡麻油をたらしてできあがり。
付け合わせはレタスの中華風スープ。中華スープの元をベースに味を付けて、ベーコンの細切り少々、タマネギ少々。とき卵を落として、最後にレタスを投入。食べるちょっと前にこれも少し胡麻油を。
いつもの鍋炊きご飯もおいしくできた。うまうま。
とうとうこらえきれずに小笹寿司に行ってきた。ここに引っ越してきたくらいから「実はすごい近くに住んでるんじゃねーか?」とずっと思っていて、先週は店の前まで行ったのに、休日でしまってやがったので、やっと行けた、という感じ。今日はとにかく湯引きされた鯛がすっっっっっっごいうまかった。あとアナゴがたまらん。しかも想定していた値段より6000円も安かった。またいくぞー。
POE::Component::Client::HTTPでHTTP::Response::OnDiskを使おうと思ったら何個かメソッドが抜けてた。この中でもcontent_refとdecoded_contentはキツい。というわけでただいまdecoded_contentがちゃんと動きつつもメモリフットプリントが最小限に抑えられる方法はないか模索中。
追記:模索した。HTTP::Responseの中で使われているCompress::*系のモジュールはとかく効率が悪いのでIO::Uncompress::Gunzipとか、IO::Uncompress::Bunzip2とかに置き換えて、テストテスト。とりあえずPOE::Component::Client::HTTPにパッチを当ててHTTP::Response::OnDiskで動かしたらエラーは出なくなった。このバージョンはHTTP::Response::OnDisk 0.02としてアップロードした。
POE::Component::Client::HTTPに関してはHTTP::Responseオブジェクトもさることながら、$request->[REQ_BUFFER]に対するメモリの書き出しを制御せにゃならんので、POE::Component::Client::HTTP::RequestFactoryへのパッチと同時にしないとな。
http://d.hatena.ne.jp/kdaiba/20070523
こういう感じ、いいと思います。Gunghoはアプリケーションロジックをgungho本体から完全に分けれるようにしたかったので、providerとhandlerの部分は正直かなり薄いレイヤーでFacadeを使って、アプリケーション特有のロジックにさっさとコントロールを渡すのがいいと思います。
ちなみに地震っていつも起こってるんですねぇ。
ドキュメントに何がどうほかのモジュールと違うのか書いた。
実際にWebサーバーにアクセスしてHTTP::Responseを作る、というアプリケーションを書く時にいっつも気になるのがこのHTTP::Responseのcontentの部分って全部メモリに乗っかるということ。one linerでサクッと一個ファイルをダウンロードするくらいならいいけど、クローラーとかで永続的にプロセスが生きている場合はこのメモリがどんどんかさばってくる。というわけで、HTTP::Response::OnDisk書きました。
API的にHTTP::Responseと互換性のあるようにしたので、使う時は今まで
use HTTP::Response;my $res = HTTP::Response->new(200, "OK");
$res->add_content(...);
とかしてたところを
use HTTP::Response::OnDisk;my $res = HTTP::Response::OnDisk->new(200, "OK");
$res->add_content(...);
とするだけ。これでHTTP::Responseの中身は一時ファイルに全部格納される。先ほどCPANにアップロード。
HTML::TagClouder っての書いた。いまさらTagCloud、しかもおれおれバージョン。でも後から色々足せるように書いたつもりだから、よければ使ってみてくださいな
http://twitter.com/miyagawa/statuses/74509652
リンク先の情報を見る限り俺も全然問題があるとは思わないけれども、このアレルギー反応の出かたにはそういったethnic jokeに対するアメリカの歴史がすでにあって、それから来てるんだろうな、と思う。元々アメリカ人はethnic jokeに関しては相当うるさいしな。
Abercrombie & FitchのTwo Wongs Can Make It Whiteはまだ記憶に新しい。一応説明しておくと、これは架空の中国人のクリーニング屋のプリントがしてあるのだが、典型的な中国人の英語の発音に癖があり、それをネタにしてる。"Two Wrongs Can't Make It Right" (すでに何か間違い/問題があって、それに対する解決策がよくないような場合に「二つの間違いを重ねても問題は直らない」)という言い回しがあり、これが中国人アクセントだとWrong→Wong (ウォンさん)、Right→Whiteで「ウォンさん二人なら(あなたの服を)白くできます」というPR文句として使われているわけだ。これを発売しはじめた直後、東海岸、西海岸の都市部で在米アジア人を中心に「発売中止にしろ」「謝罪しろ」と世論が炎上した。
Abercrombieのヤツは正直割とセンスのいいだじゃれだと思うんだけど、ポイントは「典型的な中国人の発音が悪い」という立場の元に作られたデザインである、ということだ。アメリカでは「典型」を「全体」に当てはめる事を極端に嫌う傾向がある。例えば日本では逆に典型からジョークに発展させるのは(もちろんやりかたによるけど)ちょっと小粋に見られたりするわけなのでこの温度差が現れてるんだろうな。
ちなみに上記リンクサイトの人は正直支離滅裂だと思う。
これについてはまぁ他にも色々あるんだが、とりあえずちょこっと感想。
FreeBSD, gcc 3.4.1でText::MeCabがどうしてもウマくコンパイルできない・・・う~~~む
以前書いた、FormFuで動的な値を扱う話をちゃんとパッケージしてCatalyst::Model::FormFuとして作ってみた。HTML::FormFuがまだ正式リリースされてないのでCPANにはあげないけど、この辺りに晒しておきます。
基本線がOKなら、それを使ってGunghoとかで使えるようにファイルにレスポンスの中身を書き出すPoCoを書く。
きれーーーーーいに煮こごりができてた。おいしくいただきました。
今俺の中で空前の寿司ブーム。金曜に立ち食いの「魚河岸日本一」の渋谷店(センター街にあるので他店舗よりちょっとだけおされ)、日曜に「沼津港」に行ったのにまだ満たされない。これは多分ちゃんとした寿司を食えば治まると思って日曜は小笹寿司(初挑戦)に行こうと思ったのに、言ってたらしまってやがった。ちぃぃぃぃ。
ちなみに昨日の夜も実はまた立ち食いに行こうと思ったんだけど、相棒ちゃんが「帰ったら」みたいな一言を言ってたので思い直して昨日書いてた手羽を作ったのであった。
http://search.cpan.org/src/HERRERA/JavaScript-Minifier-0.02/lib/JavaScript/Minifier.pm
え、なんでPerlで文字ベースのパーサー書くの・・・?
手羽先を煮たものを作った。基本的にしずーかに水から煮だす感じで、エリンギ、しいたけ、ネギを加えて、塩、胡椒、酒、それに隠し味程度の醤油を入れただけ。きれいな、良い上湯のような感じでいい出汁ができた。
とりあえずソースをダウンロード。opt_src-R11B-4.tar.gzってネーミングですでに萎え気味。erlangって言葉がはいってないお・・・これじゃ後で見た時わからない・・・。というわけでファイルも、解凍後の中身もリネーム。こういうとこうぜぇなぁ・・・。
あとはドキュメントもよまずにとりあえず
./configure
make
ここで延々と待ちます。perl5.8.8でもサクッとコンパイルできたMacBookちゃんなのに・・・なにこの重さ。コード一行も書いてないのにもうめげてきた。続く(かも)
うちの近くにブックオフがあるのでついつい寄って行ってしまう。まずいことにさらに5分足を伸ばすとさらにでかいブックオフがある。で、色々買ってしまうわけだが、この間めぞん一刻のドラマをやっててめぞん一刻を再読したくなってしまっているところに全巻揃ってるのを発見!ついさくっと買ってしまった。そして何回読んでもプロポーズ場面と最後のお墓参りの場面で涙してしまうのである。恥ずかしいので読む時は一人の時に限定。
頼まれたのでswfTagWriter.jsの書き出しに必要な部分だけをパクりつつ、リファクターしてみたよ。使うのはこんな感じ:
var f = Flash.TagWriter({
filename: '/path/to/flash.swf',
attributes: { some_html_attribute: 'hoge' },
flashvars: { var1: 'value' },
parameters: { param1: 'param1' },
width: 720,
height: 50,
id: 'my_id',
loop: false,
quality: 'high'
});
document.write(f);
使えそうだったらどうぞー。
if (typeof Class == 'undefined') { Class = { create: function() { return function() { this.initialize.apply(this, arguments) }; } }; } var Flash = {};(function() {
Flash.Detector = Class.create();
Flash.TagWriter = Class.create();Flash.Util = {};
Flash.Util.htmlEscape = function(string) {
string = '' + string; /* force stringification */
return string.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
}Flash.Detector.prototype = {
initialize: function() {
},
isAvailable: function() {
if (navigator.plugins && navigator.mimeTypes.length > 0 && navigator.plugins["Shockwave Flash"]) {
return true;
}var ret = false;
if (window.ActiveXObject) { /* Oh, the gory */
/*@cc_on
@if(@_jscript_version >= 5.0)
try {
var player = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
ret = true;
} catch(e) {}
@end @*/
}
return ret;
}
};Flash.TagWriter.prototype = {
initialize: function(opts) {
if (opts == null) opts = {};
var member = {
attributes: {},
flashvars: {},
parameters: {},
filename: '',
width: '',
height: '',
id: '',
loop: false,
quality: 'high'
};
for(var key in member) {
this[key] = opts[key] || member[key];
}var detector = new Flash.Detector();
this.html =
detector.isAvailable() ?
( this.isMSIE() ? this.htmlForMSIE : this.htmlForSaneBrowsers ) :
this.htmlForNonFlash
;
},
isMSIE: function() {
var agent = navigator.userAgent.toLowerCase();
return (
agent.indexOf('msie') >= 0 &&
agent.indexOf('win') >= 0 &&
agent.indexOf('opera') == -1
) ;
},
htmlForMSIE: function() {
var html = '';
html +=
'<object ' +
'classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ' +
'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#' + '" '
'width="' + this.width + '" ' +
'height="' + this.height + '" ' +
'id="' + this.id + '" '
;
html += ">\n";
html += this.htmlForParams();
html += this.htmlForFlashVars();
html += "</object>\n";
return html;
},
htmlForSaneBrowsers: function() {
var html = '';html +=
'<object ' +
'type="application/x-shockwave-flash" ' +
'data="' + this.filename + '" ' +
'width="' + this.width + '" ' +
'height="' + this.height + '" ' +
'id="' + this.id + '" '
;
html += ">\n";
html += this.htmlForParams();
html += this.htmlForFlashVars();
html += "</object>\n";
return html;
},
htmlForNonFlash: function() {
return '<p>You have to <a href="http://www.macromedia.com/jp/shockwave/download/?P1_Prod_Version=ShockwaveFlash&Lang=Japanese">install or update Flash Player</a> in order to display the content.</p>';
},
htmlForParams: function() {
var html = '';
var params = {};
for(var key in this.parameters) {
params[key] = this.parameters[key];
}
params.movie = this.filename;
params.loop = this.loop;
params.quality = this.quality;for(var key in params) {
html += '<param name="' + key + '" value="' + Flash.Util.htmlEscape(params[key]) + "\" />\n";
}
return html;
},
htmlForFlashVars: function() {
var varlist = [];
for(var key in this.flashvars) {
varlist.push(
key + '=' + Flash.Util.htmlEscape(this.flashvars[key])
);
}return (varlist.length > 0) ?
'<param name="flashvars" value="' + varlist.join('&') + "\" />\n" :
''
;
},
htmlForAttributes: function() {
var html = '';
for (var key in this.attributes) {
var value = "" + this.attributes[key];
html += key + '="' + Flash.Util.htmlEscape(value) + '" ';
}
return html;
}
};
})();
一昨日は午後4時から飲んでおり、昨日も結局一晩中飲んでて、今朝になっても普通に酔っぱらってた。昨日はO賀が泊まって行ったので朝7時前に起きて、ご飯を炊いて味噌汁を作って、納豆をかいて、さらに味噌漬けの肉を焼いて朝飯。O賀を駅まで送っていって、俺は自転車ですいーっと。最近ほぼ毎日自転車通勤。なんかまだ微妙に酒が残っていたのだが、タリーズでコーヒー飲みながらGunghoのドキュメンテーションとか書いて10時過ぎには復活。
ところでタリーズに長袖シャツ一枚で、下はパンツ(見せパンなのか?)だけって格好のおねーちゃんが来てた。ちゃんと髪もセットされてたし、ヒールもはいてたからああいうファッションなんだろうが・・・夜のクラブとかならまだわかるんだが、朝からあれはなぁ・・・
Gungho::Component::RobotRules作った。あとは以前に書いた通りのプライベートIPとかもろもろ。
自分の作った製品を開発者が使う事を"Eat Your Own Dog Food"と言いかたをします。ってそれはどうでもいいんだけど。で、昨日今日はまさにそれで、Gunghoを使ってあちこちクロールしながらスパムなページは登録しない、という仕組みをずっと書いてました。
今思い出したけど、そういえばrobots.txtをチェックする仕組みってまだ書いてなかったわ。やるか。
リクエストがあったので、プライベートなIPアドレスがDNSから帰ってきた場合に無視するようにしてみた。これに伴い、コードもちょこちょこリファクター。
あと先週Gungho::Inlineを使ってクローラーを書いてて、どうにも違和感があったのでGungho::Inline->run()とhandler, provider それぞれの引数の順番を変えた。これで普通のGungho::Provider, Gungho::Handlerと同じ引数になった。
タイフェスティバル行ってきた。今年からタイ「フード」フェスティバルじゃないんだそうだ。今年はデザート類が全然なかったなぁ。カレーやらなんやら。そして帰り道には当然のごとく「andonando」へ。ここのドーナッツはたしかにうまい。
ここのところずっと両手とも軽く腱鞘炎になりそうな感じなので週末はほとんどPCに触らず。
ランチ後渋谷の町を歩いていたら、阿藤快が!阿藤快だ!阿藤快だ!・・・なんで俺はこんなに盛り上がってるんだろう・・・
でも彼の出てる時の「ぶらり途中下車の旅」は大好きです。
ぐるなびWebサービス、さっそくモジュール化しました。先ほどうp。こんな事できちゃいます:
use strict;
use WebService::Gnavi;
use YAML;my $gnavi = WebService::Gnavi->new(access_key => ...);
my $res = $gnavi->search({
category_l => 'CTG200', # 洋食
pref => 'PREF13', # 東京
});
print Dump $res->list;
これで東京の洋食が検索できます。検索結果に付随するカテゴリーのパースが面倒くさくてとりあえず後回しにしちゃった。誰かやってくれるなら大歓迎
「有限会社」って入れると文字化けする。
http://d.hatena.ne.jp/tokuhirom/20070509/1178672405
AddOtherFdsじゃなくても、
Danga::Socket->AddOtherFds(
fileno($ssock) => sub {
....
}
);
Danga::Socket::Callbackをここでも使い回すという手もあります。
Danga::Socket::Callback->new(
handle => $ssock,
on_read_ready => sub {
...
}
);
まぁどっちでもいいんですが、なんか細かい差とかありそうで怖いなぁw (そこまでちゃんとDanga::Socketを使いこなしてません)
"MyApp"というアプリケーションを作りたい場合、Catalystのドキュメントにもそう書いてあるから皆ついついこう始める:
catalyst.pl MyApp
libディレクトリ内で作成されるモジュール類はこんな感じ:
lib/MyApp.pm
lib/MyApp/Controller/Root.pm
lib/MyApp/Model
lib/MyApp/View
でもいくらWebアプリといってもバッチが走ったり、他のシステムとWeb以外のところで結合したりしてほぼ100% Webだけでは完結しない。そういう時にlib/MyApp直下にWeb用のモジュールを入れてしまうと段々おかしくなってきます。
例えばWebから入ってきたなんらかしらのデータをvalidateするコードを入れたいとして、lib/MyApp/Validate.pmに入れるとこれはWeb用なのかそれ以外用なのかがわからない。かといって例えばDBIx::Class経由でデータベースを使うプロジェクトの場合、Webコンポーネント以外のスクリプト等も当然のごとく同じデータベースコードを使うのでそういうのは共通の場所に置いておきたい。
こういう事を踏まえて、Catalystのコンポーネントは最初からMyApp::Webに格納するのが後々便利。
catalyst.pl MyApp::Web
こうするとMyApp::Webの名前空間以下にCatalystコンポーネントが作られる
lib/MyApp/Web.pm
lib/MyApp/Web/Controller/Root.pm
lib/MyApp/Web/Model
lib/MyApp/Web/View
これで共通コンポーネントであるBIx::Classスキーマを足す場合は
lib/MyApp/Schema.pm
に置けるし、先ほどのWeb専用のValidate.pmを置くのであれば
lib/MyApp/Web/Validate.pm
とできる。さらに、CLIインターフェースがあるようなアプリの場合は
lib/MyApp/CLI/Validate.pm
ともできるので便利便利。
# と、偉そうに書いているが、某プロジェクトでは今朝ようやくこう変えた。
また勢いだけで・・・
手が痛い。酷使してるからか。昨日今日と微妙に握力がないので今日は早めに8時くらいには帰宅。帰りにスーパーに寄ったら豚ロースが半額ですよ、奥さん。嬉しくてついついいっぱい買って、味噌漬けにしておいた。ニンニクと鷹の爪を一杯いれておいたぜ。むふふ。
本日5回目のアップロード。Danga::Socket:Callbackを使ってDanga::Socketエンジンにも非同期DNSを足したのでそこまでをリリース。
勢いで書いてCPANうp。Gunghoで使う予定。
って事でrev86で非同期DNSを足した。やっぱり他のエンジンを二つばかり作ってた今の時点でやってよかった。大分簡単かつキレイにできたと思う。
追記:rev87でIO::Asyncエンジンも非同期DNS追加。Danga::Socketは面倒くさいので後回し。Danga::Socket::Callback作ろうかなぁ・・・
はてブで言及されてたので。非同期DNSは(特にPOEに於いては)すでに何回か書いているので実はやり方は簡単なんだけど、なんで今までやってなかったかというと、コードがこんがらがるから。ステートダイアグラムにすると一回ループが入る事が分かるとおもう:
1. Send Request
2. Check DNS
2.1 If DNS resolution required, go to 3
2.2 else, go to 4
3. Resolve DNS
3.1 if DNS resolved, go back to 1
3.2 if DNS resolution failed, go to error
4. Send request through socket...
....
で、Gunghoはまず仕組みをキレイに作りたかったのでこの辺りはとりあえずpuntしておいたわけです。でもそろそろ作ってもいいかなぁ。
しじみ汁が飲みたくてチャリで魚力まで行ったのに、10日まで休みだとー。しょうがないのでとってかえして八角へ。今日は縞ホッケ。魚はうまいのは当たり前だが、ここは副菜がとても充実していてよい。魚力ももちろんうまいんだけど、あそこの副菜はいつも一緒だからな。まぁそういうところで使い分けてます。両店とも大好きだ。
Gungho 0.06でIO::Asyncベースのエンジンを足したみました。Danga::Socketより幾分かインターフェースはましかなぁ・・・でもところどころまだ疑問点があるモジュールかも。とりあえず動くよ!
一点ちょっと注意:
cpan[1]> install IO::Async
ではインストールされない。パッケージにAsync.podしか存在しないのでCPANにインデックスされてないから。あとchildmanager-spawn.tがこけてた。とりあえず強制インストールしたけど。
Wikiをちょっと書いた。
http://code.google.com/p/gungho-crawler/wiki/Index
あとはHandlerでシンプルなFileWriter::Simpleってのを書いた。これはほとんどデモ用。
z2h()とh2z()を実装した。
「くりぃむナントカ」を見てたらナントカ・ホーテに伊東美咲と今度「めぞん一刻」で五代君を演じる中林大樹が出演してた。
この人・・・物知らないなぁ・・・めぞん一刻、大丈夫なのかなぁ・・・
daisuke@beefcake Gungho$ svk diff -r 71
Unknown target: gungho.
daisuke@beefcake Gungho$
あ、あれ・・・。svnだと大丈夫。
http://search.cpan.org/src/HMBRAND/Text-CSV_XS-0.25/ChangeLog
6年ぶりのリリースw UNAUTHORIZED RELEASEって書いてあるけど、これは大丈夫だな。
書き直しバージョンがsubversionで眠ってたので、Module::Installにしてリリース。
リリースした。POEの問題を今度こそ解決。あと->new()ではなく、->run()で。
しこたま日本酒を飲んだ。なんか知らんけど、消費しようとがぶがぶ飲んでたら急に酔いが回ってきて、落ちそうになったので切り上げて帰ってきてしまいましたわ。申し訳ない。ごちそうさまでした!
QH.IZ。ブランチで先ほどつくってしまいました。鶏肉とタコのパスタ。ホールトマトのカンヅメ、茄子、エリンギ、タマネギ。鶏肉は唐揚げ用のヤツを。タコは蒸し蛸。
ここ最近の食べ物系の写真を見てると、なんとなく盛りつけとかそういうのがうまくなってきたような気がするんだが、どうですかね(ってそんな昔からの写真見てる人ももう少ないと思われ)。でもちなみにこれはそんなに気をつけて盛りつけてないので欠点だらけです。
便利。今まで動的にコンテンツ作成→ローカルファイルに書き出し+Apache で-f $REQUEST["URL"]とかで確かめてからrewrite、というのがなくなった。
今度はSVKを入れる。subversionも持って来れなかったようなので、apr、apr-util、neon、subversionをインストール。本当はopensslも入れようかと思ったんだけど、Macで手動インストールは微妙に面倒くさいらしいのでパス。
SVKが速い。速すぎる。svk update -sが一瞬でおわるお。
マックを購入すると前持っていたマックからFireWire経由でデータを移せるのだが、依然のはPowerBook G4、今度のはMacBookなのでCPUアーキテクチャが違うため当然一部のバイナリファイルの互換性が失われる。・・・Perlモジュールも。
インストールしてまず
perl -eshell -MCPAN
cpan[1]> install Bundle::CPAN
ってやったらインストールに失敗するわするわ。まずXCodeがコピーされてないのでアップルからダウンロード。面倒くさいからCPAN/Config.pmを削除してもう一度perl -eshell -MCPANでConfig.pmを初期化。その後色々やってみたのだが、結構YAML::SyckやらなにやらCベースのモジュールがあってこの先謎のエラーが色々ありそう・・・なのでもう/usr/localに入れちゃう事に。
tar -xvzf perl-5.8.8.tar.gz
cd perl-5.8.8
./Configure -d
make
make install
なんかSyslogのテストが落ちたけど、まぁ無視。あとはもうinstall Bundle::CPANから色々。しっかし速いなぁ。
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)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><