「tinyshell.user.js」更新 & hitori-gotoコマンド

Greasemonkey: tinyshell.user.js - mayokara note

仕様変更しまくりました。

  • 標準入力をコマンド関数の引数に
    • 変数名もそれっぽく変更
    • STDINは文字列
    • ARGVは引数の配列
      • \s+で区切られるので無視したいときはjoinする
      • クオート考慮してない……考慮するように修正済
    • STDOUTは返り値、自動的に文字列にされる
    • throw "error message"で文字列をSTDERRに出力して終了
  • window.TinyShell.printlnを追加
    • 遅延して文字列を出力できるように
  • その他cosmetic changes

hitori-gotoコマンド

こんな感じで拡張できます、という例。

// ==UserScript==
// @name           TinyShell extends
// @namespace      http://mayokara.info/
// @description    add some commands to TinyShell
// @include        http://*
// ==/UserScript==

(function(){

var Shell = window.TinyShell;
if (!Shell) return;

Shell.addCommand("hitori-goto", function(STDIN, ARGV, $0){
    var showStatus = function(response){
        Shell.println($0 + ": " + response.status + " " + response.statusText);
    };
    if (ARGV.length > 0) {
        GM_xmlhttpRequest({
            method: "POST",
            url: "http://hitori-goto.appspot.com/say",
            data: "comment=" + encodeURIComponent(ARGV.join(" ")),
            headers: { "Content-type": "application/x-www-form-urlencoded" },
            onload: showStatus,
            onerror: showStatus,
        });
    } else {
        GM_xmlhttpRequest({
            method: "GET",
            url: "http://hitori-goto.appspot.com/rss2",
            onload: function(response){
                showStatus(response);
                var rss = new XML(response.responseText.replace(/^<\?xml\s.*?\?>/, "")), ary = [];
                for each (var title in rss.channel.item.title) {
                    ary.push(title);
                }
                Shell.println(ary.slice(0,15).join("\n"));
            },
            onerror: showStatus,
        });
    }
    Shell.println($0 + ": waiting for response...");
});

})();
$ hitori-goto test
hitori-goto: waiting for response...
hitori-goto: 200 OK

Greasemonkey: tinyshell.user.js

標準出力を表示の図

tinyshell.user.jsGreasemonkey: tish.user.js - mayokara note

標準出力を書き出せるMinibuffer的な以下略。

Minibufferとの差異

  • 標準出力を表示できる
  • 付属コマンドが違う
  • 補完機能がしょぼい
    • 一応TABを押せば全コマンドから絞り込みをかけた結果が出ます
  • コマンドの返り値が配列ではなく文字列

使用例

中身を読めばわかります。

任意のユーザのはてなダイアリーからはてなブックマークへ移動

$ pwd|sed s/d./b./|go

ページ内検索

$ grep JavaScript

簡易電卓

$ calc sin(1)*cos(1)

searchやhashやサブドメインを削ったりしてくれるParent Directory

$ up

cd

$ cd /note/view/1

URLを指定して新しいタブを開く

$ echo http://hitori-goto.appspot.com/|open

参考にしたもの

Minibuffer – Userscripts.org

追記

イマイチだったところをいろいろ修正。

「hitori-goto」を作った

http://hitori-goto.appspot.com/

Google App Engineで掲示板を作った。

特徴

  • コメントしかいらない
  • 24時間で消える
    • データベースには残るけど、これは犯罪予告とかが億が一あったときのための保険
  • 1min=10px換算でコメントとコメントの間に隙間が空く
    • 元ネタ:blog.8-p.info
    • 最新のコメントがどれくらい前のものなのか、コメントとコメントの間にどれくらいの時間的隔たりがあるのかわかる
  • どうせ誰も書いてくれないだろうから、Twitter代わりにでも使う予定
    • please write anything to this

Python触った感想

  • 正規表現使うだけでimport reとかありえん

SOUL EATER - ソウルイーター - #7~#12

はろはろっ


兄が妖刀。

原作未読の身にはちょっと説明不足気味で盛り上がりはいまひとつ。

ほそい、でかいでおなじみ椿ちゃんのソウルイーティング(名詞形)はなし。

上半身の半分が胸(主観的印象


アニメで何度も口癖を繰り返されるとクドい、なんて思いながら見てたら、#12で福圓美里声のカエル魔女登場。

良い感じのイジられキャラで萌える。

「はっもしかして……」とか勝手に言い出すキャラ良いなあ。

ツンデレの反応を見るブームの次は、「ちこくちこくー」系ハイテンション少女ブームが来るんではなかろうか。

終盤に入って正しい選択肢を選ぶと急に口数が減って虚勢を張ってみたりする感じの。

……ないか。

Firefox Add-on: Yet Another Bookmarks 1.15

yetanotherbookmarks-1.15-fx.xpi

  • 前エントリのfrom関数を使うようにした
  • 新しくブックマークしたときのアクセス日時をUNIX TIME 0から現在日時に変更
    • アクセス日時降順にソートしたとき、新しくブックマークしたものも上に来るように

JavaScript: 継承(attach、from)

JavaScript: Sub.prototype = Super.prototype; が駄目な理由 - mayokara note

以前書いたattach関数が何度もSuperClassって書かなきゃいけなくて微妙だったので手直し。

var attach = function(b,p){
    var F = function(){};
    F.prototype = b;
    var o = new F();
    for (var i in p) {
        var g = p.__lookupGetter__(i), s = p.__lookupSetter__(i);
        if (g || s) {
            if (g) o.__defineGetter__(i, g);
            if (s) o.__defineSetter__(i, s);
        } else {
            o[i] = p[i];
        }
    }
    return o;
};

var from = function(b,c,p){
    c.prototype = attach(b.prototype, p);
    c.prototype.__super__ = b;
    return c;
};
var Animal = function(){
    console.log("Animal: called");
};
Animal.prototype = {
    bark: function(){
        console.log("Animal#bark: ...");
    },
};

var Dog = from(Animal, function(){
    this.__super__.apply(this, arguments);
    console.log("Dog: called");
}, {
    bark: function(){
        console.log("Dog#bark: bowwow");
    },
});
var animal = new Animal();
// -> Animal: called
animal.bark();
// -> Animal#bark: ...

var dog = new Dog();
// -> Animal: called
// -> Dog: called
dog.bark();
// -> Dog#bark: bowwow
dog instanceof Dog // -> true
dog instanceof Animal // -> true
animal instanceof Dog // -> false
dog.__proto__ === Dog.prototype // -> true
dog.__proto__.__proto__ === Animal.prototype // -> true
dog.__proto__.__proto__.__proto__ === Object.prototype // -> true
dog.__proto__.__proto__.__proto__.__proto__ === null // -> true

単に引数増やしてthis.__super__を用意しただけ。

まあ、this.__super__潰さなくてもAnimalって直接呼べばいいんだけど、毎回書き方変わるの気持ち悪いな、ってことで。

this.__super__.prototype.barkで親クラスのbarkが呼べたりとか、そんな感じ。

追記

致命的な欠陥があったので修正。

「headsliding.user.js」更新

Greasemonkey: headsliding.user.js - mayokara note

  • hAtom、xFolkにおけるrel-bookmarkおよびtaggedlinkに対応
  • paragraph推定ルーチンの改良
    • 並列型に対する処理を追加した
    • Wikipediaのように見出しが兄弟ノードとして並んでいるケース(の一部)がうまく動くようになった
    • W3Cの仕様書やMDCでも動く
  • TABLE_MIN_ROWCOUNT_THRESHOLDのデフォルト値を15から元の10に戻した
  • 無駄にスペーサーを追加しないようにした
  • 非表示要素を除外するようにした

現在のparagraph推定ルーチン

  1. microformats
  2. 並列型(兄弟ノードとしてhn要素が指定数以上存在する)
  3. テーブル型(指定行数以上のtable要素)
  4. コンテナ型(最初の子ノードがhn要素なdivコンテナ)
  5. hn要素全部

RD 潜脳調査室 #10 & 乃木坂春香の秘密 #2 見た

ズレてなかった。

CMは頭1分半で、半々に割ってもちゃんと録れそう。

うーん……

RD 潜脳調査室 #10 至高の話手

リアリティ。

「ソウルイーター」の椿ちゃんの栄養状態が気になる感じだ。

乃木坂春香の秘密 #2 初めてなんです…

先週何やったのかクイズが開催。難。

「何でコイツ(主人公)が」感全開。目がえろいが新規性に欠ける。

お嬢様属性はあるんだけど、これどっちかというとお姫様属性だよなあ……

まあ「狂乱家族日記」同様、乳で釣らないあたりは好感がもてないでもない。


日テレアニメ恒例3次元美女見せた直後に能登麻美子漬けという流れがウケる。

ダメ人間にする気か。

Greasemonkey: headsliding.user.js

headsliding.user.js

SITEINFOなしで動くLDRize的な何か。

paragraphの推定

  1. microformatsから
  2. 指定行数以上のtableの各列
  3. firstChildがh1~h6要素のdivコンテナの中から最も見出しレベルの低い群
  4. h1~h6要素全部

これらをy座標昇順でソートして使う。

追記

「headsliding.user.js」更新 - mayokara note

改良したのでこちらも参照。

linkの推定

microformatsで指定されたa要素、なければparagraph内最初のa要素。

focusの推定

ドキュメント内最初のinput[@type="text"]

microformats

hAtom、xFolkに対応してるけど、rel-bookmarkとかtaggedlinkとかみないので対応できてないも同然。みるようにした。

そのうち何とかしたいけど、放置するかも。

LDRizeとの差異

  • ピンなし
  • ストライプなし
  • iframe絡みの機能なし
  • Minibuffer連携なし
  • 精度悪い
  • マイコミジャーナルで気持ち悪い動きをする
  • livedoor Reader(or Fastladder)が使えなくなる
    • とりあえずGreasemonkey側でhttp://reader.livedoor.com/reader/を適用対象から外してください

参考にしたもの

LDRize – Userscripts.org

追記

  • paragraphが見つからなかったときもカーソルとスペーサーを追加してしまうミスを修正
  • DOM_VK_RETURNを潰していたミスを修正
  • Firefox3でスクロールが詰まってしまうミスを修正
    • elem.getBoundingClientRect()の各プロパティが小数値を返すのを忘れていた

追追記

  • TABLE_MIN_ROWCOUNT_THRESHOLDのデフォルト値を10から15に修正

「continue_reading.user.js」更新 その9

Greasemonkey: continue_reading.user.js - mayokara note

  • pageElement推定の第2フェーズにDOM Level 2 Traversal: TreeWalkerを使うようにした
    • 246行目から
    • 気休め程度には速くなるはず
    • NodeFilter定数使えないのでベタ打ち

多分これでおしまい。

追記

  • 誤検出を補正するため、第2フェーズ開始時に一旦親を調べてから降下するようにした