hatebrankというものを作った。

これはなんですか

はてなブックマークの各idをページ、お気に入りを他のidへのリンクと見てPageRankを計算し、まとめた諸々の情報を表示するもの。

つかいかた

ださいことにcgiが三つに分かれている。

  • index.cgi: idを入れると下記の五つが表示される
  • scoretop.cgi: ある数字kを入れるとスコア降順でソートした結果、上位k位以内の情報が表示される
  • favedtop.cgi: ある数字kを入れるとお気に入られ数降順でソートした結果、上位k位以内の情報が表示される

ちゅうい

まだ 50661 idの情報しか取得できていないため、情報が不完全。

こんごのよてい

ソースその他はそのうち公開します。

昨日の昼くらいから首のつけねが痛いなあと思っていたら、今日になって首がほとんど動かせないくらい痛いという状況に。可動範囲が左右30度くらいずつ、上下10度くらいずつしかないという。なんだか怖くなってきたので色々と検索してみたら想像以上のおそろしい体験談ばかりでガタガタ震える。もうだめだ。

「〜な画像まとめ」みたいなページで、いちいちクリックしてどうこうするのがダルいのでVimperatorのプラグインを書いてどうにかした。

まず、並べられているサムネイルあるいはURL文字列をクリックすると元の画像が表示されるタイプのページに対応するべく、いま表示しているタブ中のリンクのうち、<a href=***>の***の部分かリンク文字列が正規表現にマッチするもの全てを新規タブで開くプラグインを書いた。

(function(){
  liberator.commands.addUserCommand(['lo'], 'link open',
    function(arg){
      var urls = [];
      var as = window.content.document.getElementsByTagName('a');
      for(var i = 0; i < as.length; i++){
        if(as[i].href.match(arg) || as[i].innerHTML.match(arg)){
          urls.push(as[i].href);
        }
      }
      liberator.open(urls, liberator.NEW_BACKGROUND_TAB);
    },
    {
      completer: function(arg){
        var suggestions = [];
        var as = window.content.document.getElementsByTagName('a');
        for(var i = 0; i < as.length; i++){
          if(as[i].href.match(arg) || as[i].innerHTML.match(arg)){
            suggestions.push([as[i].href, as[i].innerHTML]);
          }
        }
        return [0, suggestions];
      }
    }
  );
})();

これでおもむろに :lo .*(gif|jpg|png)$ とかやるといま表示しているタブ中の画像っぽいものへのリンク全てが新規タブで開かれる。

次に、単純に画像そのものが並べて表示してあるタイプのページに対応するべく、いま表示しているタブ中の画像のうち、<img src=***>の***の部分が正規表現にマッチするもの全てを新規タブで開くプラグインを書いた。

(function(){
  liberator.commands.addUserCommand(['io'], 'image open',
    function(arg){
      var urls = [];
      var imgs = window.content.document.getElementsByTagName('img');
      for(var i = 0; i < imgs.length; i++){
        if(imgs[i].src.match(arg)){
          urls.push(imgs[i].src);
        }
      }
      liberator.open(urls, liberator.NEW_BACKGROUND_TAB);
    },
    {
      completer: function(arg){
        var suggestions = [];
        var imgs = window.content.document.getElementsByTagName('img');
        for(var i = 0; i < imgs.length; i++){
          if(imgs[i].src.match(arg)){
            suggestions.push([imgs[i].src, '']);
          }
        }
        return [0, suggestions];
      }
    }
  );
})();

これでおもむろに :io .*(gif|jpg|png)$ とかやるといま表示しているタブ中の画像っぽいもの全てが新規タブで開かれる。

さらに .vimperatorrc

map s :dialog savepage<CR>d

を追加することで、キーボード操作だけでいま見ている画像を保存できるようにした。これで猫画像を効率的に集められる。大量のタブを一気に開こうとするとブラウザが固まるので危険。

http://d.hatena.ne.jp/nulll/20080729#p1 だと :so .vimperatorrc とかやると日付表示とバッテリ残量表示が重複して追加されてしまうので修正した。あと、曜日も表示してみた。

日付を表示する。

:javascript << EOF
(function(){
  var status_bar = document.getElementById('status-bar');
  var insert_pos = document.getElementById('security-button');

  var date_interval_sec = 60;
  var date_id = 'my-date';
  var date = document.getElementById(date_id);
  if(date){
    status_bar.removeChild(date);
  }

  date = document.createElement('statusbarpanel');
  date.setAttribute('id',date_id);
  status_bar.insertBefore(date, insert_pos);
  setTimeout(function(){
    var d = new Date();
    var de = [d.getMonth()+1,
              d.getDate(),
              d.getHours(),
              d.getMinutes()].map(function(e){return e < 10 ? '0'+e : e});

    var dd = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    var str = de[0]+'/'+de[1]+' '+de[2]+':'+de[3]+' '+dd[d.getDay()];

    date.setAttribute('label', str);
    setTimeout(arguments.callee, date_interval_sec * 1000);
  }, 1000);
})();
EOF

バッテリ残量を表示する。

:javascript << EOF
(function(){
  var status_bar = document.getElementById('status-bar');
  var insert_pos = document.getElementById('security-button');

  var bat_interval_sec = 180;
  var bat_file = '/sys/devices/platform/smapi/BAT0/remaining_percent';
  var bat_id = 'bat-status';
  var bat_status = document.getElementById(bat_id);
  if(bat_status){
    status_bar.removeChild(bat_status);
  }

  bat_status = document.createElement('statusbarpanel');
  bat_status.setAttribute('id',bat_id);
  status_bar.insertBefore(bat_status, insert_pos);
  setTimeout(function(){
    var str = '[' + liberator.io.readFile(bat_file) + '%]';
    bat_status.setAttribute('label', str);
    setTimeout(arguments.callee, bat_interval_sec * 1000);
  }, 1000);
})();
EOF

曜日の表示やら日付の表示を変えたい場合は

    var dd = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    var str = de[0]+'/'+de[1]+' '+de[2]+':'+de[3]+' '+dd[d.getDay()];

    var dd = ['日', '月', '火', '水', '木', '金', '土'];
    var str = de[0]+'月'+de[1]+'日 '+de[2]+'時'+de[3]+'分 '+dd[d.getDay()];

みたいな感じで適当にいじればいいんじゃないでしょうか。日本語を使う場合は文字コードUTF-8じゃないとたぶんだめ。

先週くらいから電車の中で親子連れをよく見るようになったのはポケモンスタンプラリー2008のせいだった!!!!111111 ……というのは子供の多くが例の黄色いネズミを模した紙の帽子をかぶっていることでわかっていたんだけど。スタンプがあるのは山手線一周+総武線の数駅でだいたい30駅くらいかなー、などと一週間の観察結果から適当に推測していたら、今日調べて驚いた(↓pdf注意)。

http://www.jreast.co.jp/pokemon-rally/pdf/area_map.pdf

駅多すぎ! 95駅て。これ全部まわりたいなんて子供が言ったら……。付き添いのお母さんの半分以上がキレ気味なのも納得だわ。付き添いのお父さん(おじいちゃん)のほとんどは子供と一緒に楽しんでるぜ!って感じなんだけどな。やっぱ元男の子は気持ちがわかるんだな。おばあちゃんが付き添っているのはあんまり見ない。つうか親子連れを見て親側の気持ちを考えるようになっているというおっさんっぷりに驚愕。もうだめだ。

ゆの in Vimperator(参考: ゆの in Language)。

(function(){
  liberator.commands.addUserCommand(['X'], 'ゆの in Vimperator',
    function(arg){
      liberator.echo('ひだまりスケッチ×365 ' + arg.substring(arg.indexOf('<')+2, arg.length));
    },
    { 
      completer: function(){
        return [0, [['/ _ / X < 来週も見てくださいね!', '']]];
      }
    }
  );
})();

ものすごいいまさら感……!

.vimperatorrcをいじってステータスバーにバッテリ残量と日付を表示するようにした(Vimperatorバージョン 1.1 on Firefox 3.0.1 on Linux)。バッテリの方はLinux限定。

参考


バッテリの残量はsmapiというものが入っているなら /sys/devices/platform/smapi/BAT0/remaining_percent をcatすればわかる(ディストリビューションによって違うかもしれないけど)。Vimperatorではliberator.io.readFileすればよいらしい。というわけで以下を.vimperatorrcに追加した。

:javascript << EOF
(function(){
  var battery_interval_sec = 180;
  var battery_status = document.createElement('statusbarpanel');
  battery_status.setAttribute('id','battery-status');
  document.getElementById('status-bar').insertBefore(battery_status, document.getElementById('security-button'));
  setTimeout(function(){
    battery_status.setAttribute('label', '[' + liberator.io.readFile('/sys/devices/platform/smapi/BAT0/remaining_percent') + '%]');
    setTimeout(arguments.callee, battery_interval_sec * 1000);
  }, 1000);
})();
EOF

battery_interval_secは表示を更新する間隔(秒)で、上だと180秒、つまり三分に一回表示が更新される。

なんだかうまくいったので調子にのって日付も表示してみた。いままでFoxClocksというやつを入れて日付を表示していんだけど、自前でやれるならそっちの方がいいかな、と。というわけで以下を.vimperatorrcに追加した。

:javascript << EOF
(function(){
  var date_interval_sec = 60;
  var my_date = document.createElement('statusbarpanel');
  my_date.setAttribute('id','my_date');
  document.getElementById('status-bar').insertBefore(my_date, document.getElementById('security-button'));
  setTimeout(function(){
    d = new Date();
    de = [d.getMonth()+1, d.getDate(), d.getHours(), d.getMinutes()].map(function(e){return e < 10 ? '0'+e : e});
    my_date.setAttribute('label', de[0]+'/'+de[1]+' '+de[2]+':'+de[3]);
    setTimeout(arguments.callee, date_interval_sec * 1000);
  }, 1000);
})();
EOF

date_interval_secは日付を更新する間隔(秒)で、上だと60秒、つまり一分に一回表示が更新される。date_interval_secを1にして

    d = new Date();
    de = [d.getMonth()+1, d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds()].map(function(e){return e < 10 ? '0'+e : e});
    my_date.setAttribute('label', de[0]+'/'+de[1]+' '+de[2]+':'+de[3]+':'+de[4]);

とかすると秒も表示されて毎秒更新される。しかしなんだか無駄な気がしたので分までの表示にしておいた。