2007/11/29

はてな
今まで誰にも見せた事無かったですが...
出しちゃいます。

/dotfiles/vim/mattn-vimrc - CodeRepos::Share - Trac
/dotfiles/vim/mattn-gvimrc - CodeRepos::Share - Trac
正直デカイです。

もう随分昔からあるvimrcなので使ってない機能もあれば、忘れてしまったノウハウもいっぱい...
あまり参考にならないかもしれませんが、どうぞ。

mattn the vimmer!

追記
マルチプラットフォーム用です。

2007/11/28

はてな
タレントスケジュールなんてサイトを見つけたので、さっそくスクレイピング。
ドキュメントに同じid属性が複数あるという、なんともダイナミックなHTMLにもめげず作り上げたのが以下
#!/usr/bin/perl

use encoding 'utf-8';
use strict;
use warnings;
use Encode qw(from_to);
use URI;
use URI::Escape qw(uri_escape_utf8);
use Web::Scraper;
use YAML;

if ($^O eq 'MSWin32') {
    binmode(STDERR, ':encoding(shift_jis)');
    Encode::from_to($ARGV[0], 'cp932', 'utf-8');
}
my $talent = shift || '小島よしお';

my $talent_schedule = scraper {
    process '//div[@class="find_bl"]/following-sibling::*[1]//td', day => 'TEXT';
    process '//div[@class="find_bl"]/following-sibling::*[1]//td/div',
        'schedule[]' => scraper {
            process 'div', media => sub { my $m = $_->attr('class'); $m =~ s/^icon_//g; $m };
            process '/div/a', url => '@href';
            process '/div/a', title => 'TEXT';
            process '/div/node()[1]', timespan => sub {
                my $s = $_->string_value;
                $s =~ s/ //;
                $s =~ s/(^|[^\d])(\d):(\d\d)/0$2:$3/g;
                my @span = split(/[^\d:]/, $s);
                \@span;
            };
        };
    result qw/day schedule/;
};
my $uri = URI->new('http://talent-schedule.jp/'.uri_escape_utf8($talent));
my $oppappi_schedule = $talent_schedule->scrape($uri);
warn Dump $oppappi_schedule;
ちょっと日付まわりで苦労してますが...

小島よしおって、結構番組出てますねぇ。

でもそんなの関係ry)

2007/11/27

はてな
はてなTIPS - アドレスから「id naoya」でダイアリーに
こんなの使えないかなぁ...
javascript:alert(%s);void 0
これを「js」てキーでレジストリ登録しておけば今まで
javascript:alert(document.getElementById('banner'));void 0
ってやってたオブジェクトの存在確認が
js document.getElementById('banner')
って感じに少し楽になる。
単に評価式を返すので
js document.getElementById('banner').innerHTML = 'ばなー';
ってな感じにも使えますね。

あと、もうすこし凝ってダイナミックローダ作ってamachangのjavascript-xpath.js使って
xpath //div[@id='foo']//span
なんて事も出来るのかも。もちろんIEなのでtoJSONなんかを実装した方がalertで確認し易いけど...。


2007/11/24

はてな
もう眠くなってきたら
:shutdown
ソースは
// ==UserScript==
// @name           Minibuffer Shutdown Command
// @namespace      Minibuffer.Shutdown.Command
// @include        http://*
// ==/UserScript==


(function(){
  var mes = [
    'System is going down for system shutdown now.......',
    'Starting local stop scripts.                       ',
    'Exiting Syslogd!                                   ',
    'Syncing all filesystems:                       [OK]',
    'Unmounting all filesystems:                    [OK]',
    'The system is going down NOW !!                    ',
    'Sending SIGTERM to all processes.                  ',
    'The system is halted. Press Reset or turn off power',
    'flushing ide devices:                          [OK]',
    'System halted.                                     ',
  ];
  function shutdown( stdin ) {
    GM_addStyle(<><![CDATA[
      #gm_minibuffer_flash_status * {
      font-family: 'terminal', 'monospace';
      font-weight: bold;
      }
      ]]></>);
    var n = 0;
    var timer = setInterval(function(){
      window.Minibuffer.status('shutdown'+n, mes[n], 50000);
      if (n++ >= mes.length) {
        clearInterval(timer);
        document.open();
        document.close();
        document.body.style.backgroundColor='black';
      }
    }, 1000);
    return stdin;
  }

  if (typeof window.Minibuffer != 'undefined') {
    window.Minibuffer.addCommand({
      name: "shutdown",
      command: shutdown,
    });
  }
})();
こんな感じ。
インストール:minibuffer.shutdown.user.js
てか実用的な物つくれ!俺

はてな
MinibufferBookmarkCommand - 3.14

適当ですが...
はてなブックマークと違いdel.icio.usの場合は、クローラでタイトルを補完してくれませんので、XHRで自前で取得しています。その際、responseTextが文字化けを起こしている可能性がありますので要注意。
--- minibufferbookmarkcomman.user.js.orig   Sat Nov 24 14:53:01 2007
+++ minibufferbookmarkcomman.user.js    Sat Nov 24 14:51:57 2007
@@ -140,6 +140,90 @@
        postToHatenaB(nodes, urls);
    }
    
+   // delicious bookmark
+   var delicious = function(nodes, urls, tags, comment){
+       if(!urls.length) return;
+       var total = urls.length;
+       var time = new Date().getTime();
+       var getParam = function(node, url, fn, afterPost){
+           if(!url) return;
+           var callback = function(res){
+               var html = res.responseText.createHTML();
+               var form = window.Minibuffer.$X('//form[@id="delForm"]', html)[0];
+               var inputs = window.Minibuffer.$X('//form[@id="delForm"]//input', html);
+               var res = {};
+               inputs.forEach(function(node){
+                   res[node.getAttribute('name')] = node.getAttribute('value');
+               });
+               if(keys(res).length == 1){
+                   // already bookmarked
+                   var text = url;
+                   if(window.LDRize){
+                       var siteinfo = window.LDRize.getSiteinfo();
+                       if(siteinfo && siteinfo.view){
+                           var view = window.Minibuffer.$X(siteinfo.view, node)[0];
+                           if(view) text = view.textContent;
+                       }
+                   }
+                   window.Minibuffer.message('<small>'+text+'</small><br/> has already bookmarked.', 2000);
+                   afterPost();
+               }else{
+                   res.action = 'http://del.icio.us/' + form.action.replace(/^https?:\/\/[^\/]+\//, '');
+                   // not yet bookmarked
+                   fn(res, afterPost);
+               }
+           }
+           GM_xmlhttpRequest({
+             method: 'GET',
+             url: "http://del.icio.us/post?v=4&url="+encodeURIComponent(url),
+             onload: callback,
+             onerror: function(res){log('onerror',res.responseText, '\n',res.responseHeaders)},
+           });
+       }
+       var post = function(opt, afterPost){
+           if (!opt.description) {
+               var x = new XMLHttpRequest();
+               x.open('GET', opt.url, false);
+               x.send(null);
+               if (x.readyState == 4 && x.status == 200) {
+                   try {
+                       var html = x.responseText.createHTML();
+                       opt.description = window.Minibuffer.$X('//title', html)[0].text;
+                   } catch(e) {}
+               }
+           }
+           var request = [
+               "url=", encodeURIComponent(opt.url),
+               "&oldurl=", encodeURIComponent(opt.url),
+               "&private=", opt.private,
+               "&description=", encodeURIComponent(opt.description),
+               "&notes=", encodeURIComponent(comment),
+               "&tags=", encodeURIComponent(opt.tags),
+               "&v=", opt.v,
+               "&key=", opt.key,
+               ].join('');
+           GM_xmlhttpRequest({
+             method: 'POST',
+             url: opt.action,
+             headers: {
+                 'Content-Type': 'application/x-www-form-urlencoded'
+               },
+             onload: afterPost,
+             onerror: function(res){log('onerror',res.responseText, '\n',res.responseHeaders)},
+             data: request
+           });
+       }
+       var postToDelicious = function(nodes, urls){
+           if(!urls.length){
+               window.Minibuffer.status('bookmark'+time,'Bookmark 100 %', 1000)
+               return;
+           }
+           window.Minibuffer.status('bookmark'+time,'Bookmark ' + Math.floor((total-urls.length) / total * 100) + '%');
+           getParam(nodes.shift(), urls.shift(), post, function(){postToDelicious(nodes, urls)});
+       }
+       postToDelicious(nodes, urls);
+   };
+
 // var delicious = function(urls, tags){
 //     log('delicious: urls:tags',urls, tags);
 // }
@@ -147,7 +231,7 @@
 //     log('livedoor: urls:tags',urls, tags);
 // }
    addBookmark('hatena',    'h', hatenab);
-// addBookmark('delicious', 'd', delicious);
+   addBookmark('delicious', 'd', delicious);
 // addBookmark('livedoor',  'l', livedoorclip);
    
    window.Minibuffer.addCommand({

2007/11/23

はてな
んー。
// ==UserScript==
// @name           Speedtest Ikasama
// @namespace      Speedtest.Ikasama
// @include        http://speedtest.10-fast-fingers.com/
// ==/UserScript==

var w=document.getElementById('eingabe');
var v=document.getElementById('vorgabe');
var s = 0;
var z = unsafeWindow.pruefstring;
var f1 = unsafeWindow.welchedown;
var f2 = unsafeWindow.welcheup;
unsafeWindow.wort = (z+z+z+z+z).split(' ');
(function go() {
    clearTimeout(s);
    var t = v.innerHTML.replace(/<[^>]+>/g, '');
    if (t){
        var i=0;
        while(true){
            t = v.innerHTML.replace(/<[^>]+>/g, '');
            var e = document.createEvent('KeyboardEvent');
            e.initKeyEvent('keypress', true, true, window, false, false, false, false, 0, t.charCodeAt(i));
            w.dispatchEvent(e);
            f1(e);f2(e);
            if (++i >= t.length) break;
        }
    }
    s = setTimeout(go, 0);
})();
こんなの使っても
typing-fast
8位って事は、1位の人もHackingやん!www
こんな速度、人間じゃありえん!
speedtest.ikasama.user.js
# 10-fast-fingers.com - Speedtest


ちなみにこのスクリプト、なんでこんな変な事しているかといいますと...
まずど頭で、「z+z+z+ ...」ってやってる部分は、あまりにタイプスピードが速すぎて、内部の配列がオーバーフローしてしまっているのでキャパを取り直しています。次にループ内で再度「t」を取り直しているのは、このSpeedtestがイカサマ防止の為にタイプ中にワードを増やす処理が入っており、それをハンドリングする為に入っています。

2007/11/22

はてな
amachangがやってたので私も
typing-test
まぁ、徹夜明けで一睡もしてないしこんなもんか...orz

2007/11/21

はてな
Firefoxをshellの様に扱えるグリモン「Minibuffer ? Userscripts.org」で使える、Fuck!コマンド「fuck」書いた。 使い方は、はてなブックマークコマンドとほぼ同じ。
目障りな記事を見つけたら
:fuck
とすれば良い。 もしくはpinを付けて
:pinned-link | fuck
とすればpinを付けたリンクが全部「Fuck!」になる。
なお
:pinned-node | fuck
とすれば、pinが指すノード自体が削除される。
例えばtwitterなんかで
minibuffer-fuck1
followerの発言をpinしてfuckしようもんなら
minibuffer-fuck2
こんなんになっちゃう!
※followerの皆様ごめんなさい。

ソースはこんな感じ
// ==UserScript==
// @name           Minibuffer Fuck Command
// @namespace      Minibuffer.Fuck.Command
// @description    add fuck command to Minibuffer.
// @include        http://*
// @include        https://*
// ==/UserScript==

window.Minibuffer.addCommand({
  name: 'fuck',
  command: function(stdin){
    if (stdin.length == 0) {
      document.open();
      document.write('<h1>Fuck!</h1>');
      document.close();
    } else {
      stdin.forEach(function(obj){
        if (("" + obj).match(/^https?:.*/)) {
          var links = document.getElementsByTagName('a');
          for(var n = 0; n < links.length; n++) {
            if (links[n].href == obj) {
              links[n].href = 'javascript:void(0);';
              links[n].addEventListener('click', function() {alert(this.innerHTML)}, false);
              links[n].innerHTML = 'Fuck!';
            }
          }
        } else if (typeof obj == 'object') {
          try {
            obj.parentNode.removeChild(obj);
          } catch(e) { }
        }
      });
    }
    return stdin;
  }
});

インストール:minibuffer.fuck.user.js

てか使い道なくね?

はてな
結構前から自分用に作ってて今まで公開してませんでしたが、CodeReposもある事だし思い切って上げてみました。
/lang/c/sonydb - CodeRepos::Share - Trac
SONY製WalkmanをSonicStage無しに転送するソフトです。

ベースはml_sonyというwinampプラグインで、Linux/Windows用のコマンドラインツールとして移植してあります。
GTKのフロントエンド版としてコンパイルする事もでき、ここあたりから、「Gtk+ Development Environment for Windows」をインストールすれば、Windowsでもコンパイル出来ます。
コマンドラインの場合は
# sonydb songs
で曲一覧
# sonydb songsadd /path/to/mp3/music.mp3
で曲転送
# sonydb songsdel 40
で、songsで一覧される際に表示される番号の曲を削除します。

GUI版は、ドラッグアンドドロップでファイルを追加でき、編集画面で曲情報を変更出来ます。
sonydb-gui
「Apply」ボタンを押すと転送開始です。GUI版はまだまだといった所です。私はどっちかっていうと
# find /home/mattn/Music/XXX -name "*.mp3" | xargs -n 1 sonydb songsadd
的な使い方しかしてません。

なお、SonicStageで転送したファイルは同じマシンからしか転送出来なくなりますので、既存で既にSonicStageで転送した曲が入っている場合にはこのツールで転送出来ません。
一度、リセットする必要があります。

コンパイルにはid3libが必要で、GUI版のみGTKが必要になります。
Windowsの場合はドライブレターを舐める処理になってますが、Linux版のデバイス自動認識機能はありません。
/media/usbdisk
/media/usbdisk1
をベタで見に行く様になっています。ソースを触れる方は適当に弄って下さい。この辺は今後どうにかする予定です。
またNetMDには対応していません。

幾分Hacking Softwareですので、バイナリを配布する予定はありません。メリットとしては小さいので持ち運べます。Walkmanはメモリディスクとして使えますので、実はマンドライン版をその中に仕込ませておけば、どこでもSonicStage無しに転送出来たりします。

なお、フリーソフトウェアですのでこのツールで発生した如何なる問題も作者は責任を取る事が出来ません。
また動作報告等頂けると、頑張っちゃう方の人です。

よかったらどうぞ。
Posted at 16:58 in ソフトウェア::linux | WriteBacks (6)
Tagged as: sony, walkman
Bookmarks: add to hatena add to hatena | add to del.icio.us add to del.icio.us | add to livedoor.clip add to livedoor.clip | add to buzzurl