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.

2007年05月


基本線がOKなら、それを使ってGunghoとかで使えるようにファイルにレスポンスの中身を書き出すPoCoを書く。



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



http://rt.cpan.org/Ticket/Display.html?id=27222



fixed. 0.16をアップした。


追記:0.16001をもう一度アップした。



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


きれーーーーーいに煮こごりができてた。おいしくいただきました。



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


今俺の中で空前の寿司ブーム。金曜に立ち食いの「魚河岸日本一」の渋谷店(センター街にあるので他店舗よりちょっとだけおされ)、日曜に「沼津港」に行ったのにまだ満たされない。これは多分ちゃんとした寿司を食えば治まると思って日曜は小笹寿司(初挑戦)に行こうと思ったのに、言ってたらしまってやがった。ちぃぃぃぃ。


ちなみに昨日の夜も実はまた立ち食いに行こうと思ったんだけど、相棒ちゃんが「帰ったら」みたいな一言を言ってたので思い直して昨日書いてた手羽を作ったのであった。



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



http://search.cpan.org/src/HERRERA/JavaScript-Minifier-0.02/lib/JavaScript/Minifier.pm



え、なんでPerlで文字ベースのパーサー書くの・・・?



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


手羽先を煮たものを作った。基本的にしずーかに水から煮だす感じで、エリンギ、しいたけ、ネギを加えて、塩、胡椒、酒、それに隠し味程度の醤油を入れただけ。きれいな、良い上湯のような感じでいい出汁ができた。



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


とりあえずソースをダウンロード。opt_src-R11B-4.tar.gzってネーミングですでに萎え気味。erlangって言葉がはいってないお・・・これじゃ後で見た時わからない・・・。というわけでファイルも、解凍後の中身もリネーム。こういうとこうぜぇなぁ・・・。


あとはドキュメントもよまずにとりあえず



./configure
make


ここで延々と待ちます。perl5.8.8でもサクッとコンパイルできたMacBookちゃんなのに・・・なにこの重さ。コード一行も書いてないのにもうめげてきた。続く(かも)



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


nowaアカウント欲しい人手あげてぇ。



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


超久しぶりにつな八でランチ。コースに筍をプラスしてもらった。基本的に午後5時以前に酒は飲まないんだが、さすがに天ぷらには・・・ということでビールを瓶で一本だけ。うまー。



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


うちの近くにブックオフがあるのでついつい寄って行ってしまう。まずいことにさらに5分足を伸ばすとさらにでかいブックオフがある。で、色々買ってしまうわけだが、この間めぞん一刻のドラマをやっててめぞん一刻を再読したくなってしまっているところに全巻揃ってるのを発見!ついさくっと買ってしまった。そして何回読んでもプロポーズ場面と最後のお墓参りの場面で涙してしまうのである。恥ずかしいので読む時は一人の時に限定。



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

頼まれたので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, '&#38;').replace(/</g, '&#60;').replace(/>/g, '&#62;');
    }

    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&#38;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;
      }
    };
  })();
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr


一昨日は午後4時から飲んでおり、昨日も結局一晩中飲んでて、今朝になっても普通に酔っぱらってた。昨日はO賀が泊まって行ったので朝7時前に起きて、ご飯を炊いて味噌汁を作って、納豆をかいて、さらに味噌漬けの肉を焼いて朝飯。O賀を駅まで送っていって、俺は自転車ですいーっと。最近ほぼ毎日自転車通勤。なんかまだ微妙に酒が残っていたのだが、タリーズでコーヒー飲みながらGunghoのドキュメンテーションとか書いて10時過ぎには復活。


ところでタリーズに長袖シャツ一枚で、下はパンツ(見せパンなのか?)だけって格好のおねーちゃんが来てた。ちゃんと髪もセットされてたし、ヒールもはいてたからああいうファッションなんだろうが・・・夜のクラブとかならまだわかるんだが、朝からあれはなぁ・・・



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


Gungho::Component::RobotRules作った。あとは以前に書いた通りのプライベートIPとかもろもろ。



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


自分の作った製品を開発者が使う事を"Eat Your Own Dog Food"と言いかたをします。ってそれはどうでもいいんだけど。で、昨日今日はまさにそれで、Gunghoを使ってあちこちクロールしながらスパムなページは登録しない、という仕組みをずっと書いてました。


今思い出したけど、そういえばrobots.txtをチェックする仕組みってまだ書いてなかったわ。やるか。



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


リクエストがあったので、プライベートなIPアドレスがDNSから帰ってきた場合に無視するようにしてみた。これに伴い、コードもちょこちょこリファクター。


あと先週Gungho::Inlineを使ってクローラーを書いてて、どうにも違和感があったのでGungho::Inline->run()とhandler, provider それぞれの引数の順番を変えた。これで普通のGungho::Provider, Gungho::Handlerと同じ引数になった。



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


タイフェスティバル行ってきた。今年からタイ「フード」フェスティバルじゃないんだそうだ。今年はデザート類が全然なかったなぁ。カレーやらなんやら。そして帰り道には当然のごとく「andonando」へ。ここのドーナッツはたしかにうまい。


ここのところずっと両手とも軽く腱鞘炎になりそうな感じなので週末はほとんどPCに触らず。



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

このページのトップヘ