基本線がOKなら、それを使ってGunghoとかで使えるようにファイルにレスポンスの中身を書き出すPoCoを書く。
2007年05月
DateTime::Format::Pg 0.16
手羽先その後
きれーーーーーいに煮こごりができてた。おいしくいただきました。
寿司
今俺の中で空前の寿司ブーム。金曜に立ち食いの「魚河岸日本一」の渋谷店(センター街にあるので他店舗よりちょっとだけおされ)、日曜に「沼津港」に行ったのにまだ満たされない。これは多分ちゃんとした寿司を食えば治まると思って日曜は小笹寿司(初挑戦)に行こうと思ったのに、言ってたらしまってやがった。ちぃぃぃぃ。
ちなみに昨日の夜も実はまた立ち食いに行こうと思ったんだけど、相棒ちゃんが「帰ったら」みたいな一言を言ってたので思い直して昨日書いてた手羽を作ったのであった。
JSmin
http://search.cpan.org/src/HERRERA/JavaScript-Minifier-0.02/lib/JavaScript/Minifier.pm
え、なんでPerlで文字ベースのパーサー書くの・・・?
手羽先
手羽先を煮たものを作った。基本的にしずーかに水から煮だす感じで、エリンギ、しいたけ、ネギを加えて、塩、胡椒、酒、それに隠し味程度の醤油を入れただけ。きれいな、良い上湯のような感じでいい出汁ができた。
Erlangをコンパイルしてみたよ!
とりあえずソースをダウンロード。opt_src-R11B-4.tar.gzってネーミングですでに萎え気味。erlangって言葉がはいってないお・・・これじゃ後で見た時わからない・・・。というわけでファイルも、解凍後の中身もリネーム。こういうとこうぜぇなぁ・・・。
あとはドキュメントもよまずにとりあえず
./configure
make
ここで延々と待ちます。perl5.8.8でもサクッとコンパイルできたMacBookちゃんなのに・・・なにこの重さ。コード一行も書いてないのにもうめげてきた。続く(かも)
メモ
nowaアカウント
Twitter APIがばぐってるらしい
エキセントリック少年ボーイ
ふと思い立って
Baiduがうざい
めぞん一刻
うちの近くにブックオフがあるのでついつい寄って行ってしまう。まずいことにさらに5分足を伸ばすとさらにでかいブックオフがある。で、色々買ってしまうわけだが、この間めぞん一刻のドラマをやっててめぞん一刻を再読したくなってしまっているところに全巻揃ってるのを発見!ついさくっと買ってしまった。そして何回読んでもプロポーズ場面と最後のお墓参りの場面で涙してしまうのである。恥ずかしいので読む時は一人の時に限定。
SWFタグライター
頼まれたので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 0.08
Gungho::Component::RobotRules作った。あとは以前に書いた通りのプライベートIPとかもろもろ。
Eating My Own Dog Food
自分の作った製品を開発者が使う事を"Eat Your Own Dog Food"と言いかたをします。ってそれはどうでもいいんだけど。で、昨日今日はまさにそれで、Gunghoを使ってあちこちクロールしながらスパムなページは登録しない、という仕組みをずっと書いてました。
今思い出したけど、そういえばrobots.txtをチェックする仕組みってまだ書いてなかったわ。やるか。
Gungho - Private IP addresses and Gungho::Inline
リクエストがあったので、プライベートなIPアドレスがDNSから帰ってきた場合に無視するようにしてみた。これに伴い、コードもちょこちょこリファクター。
あと先週Gungho::Inlineを使ってクローラーを書いてて、どうにも違和感があったのでGungho::Inline->run()とhandler, provider それぞれの引数の順番を変えた。これで普通のGungho::Provider, Gungho::Handlerと同じ引数になった。
タイフェスティバル
タイフェスティバル行ってきた。今年からタイ「フード」フェスティバルじゃないんだそうだ。今年はデザート類が全然なかったなぁ。カレーやらなんやら。そして帰り道には当然のごとく「andonando」へ。ここのドーナッツはたしかにうまい。
ここのところずっと両手とも軽く腱鞘炎になりそうな感じなので週末はほとんどPCに触らず。