2008/04/24

はてな
クァーってサービスが出来たみたいです。
Qaa(クァー):Twitterで簡単アンケート!(まだまだ開発中)
Qaa

Qaa(クァー)は、Twitterを利用して簡単にアンケートをとることができるサービスです。

Qaa(クァー)を通じて投稿されたアンケートはYes or No形式で回答する事ができ、その結果はアンケート毎に用意されるページでパイチャートで確認する事ができます。


http://qaa.orig.jp/h#about
twitterを使ったソーシャルアンケートサービスですね。
でもいちいちtwitterやIMから「@qaa qid14 YES」とか入力するの面倒臭いのでMinibufferコマンド作ってみました。
アンケートエントリページに行って、「q y」もしくは「q n」で「YES」もしくは「NO」の回答をtwitter経由で投稿します。
qaa_yes_or_no.user.js
よろしければどうぞ。
※一応、firefox3/greasemonkeyからBasic認証のダイアログが出ない件は対応してあります。

2008/04/03

はてな
tumblrは閲覧一方な私ですが、うざったく感じていたのが画像を大きくして見たい場合や動画を再生したい場合に、いちいちマウスに手を伸ばさなきゃいけない事。
minibuffer入れてる人なんかはキーボードだけで操作したい派のはず。イライラの種ですね。

そんなめんどくさがりやさんの貴方にお勧めしたいのがコレ!
ENTERキーだけで画像を拡大縮小出来ます。また動画の再生停止も行えます。
音声の再生停止は出来ません!!!!><
動作にはminibufferが必要です。
j,kで移動してENTERで見る!って感じです。
ソースは汚いので見てはいけません。

動かなかったら「pray on tumblr」って事で...
playontumblr.user.js

2008/02/28

はてな
結構難しかった...
オリジナル作者はLDRizeやMinibufferを作られたsnj14さん。
初めてminibufferbookmarkcommandを使った時は「スゲー」と感動しました。その後ソースがCodeReposで管理される用になりプラガブルな仕組みに修正させて頂き、gooブックマークや、niftyクリップ、pookmark等のプラグインも動くようになりました。
ただFirefoxでは動くけど、Operaでは動かなかった。
Firefoxだけでしか使えないってのが擬かしい程、使い勝手はめちゃめちゃ良くて
「minibufferBookmarkcommandのボタン一発ブックマークが気軽すぎてタグ付けとかしなくなる」
とおっしゃる方もいる位。ポップアップも出ないし別画面に飛ばされる訳でもないから、記事を読んでる最中に「ぶくま!」と思ったら「b」一発。
タグやコメントが打ちたくなったら「B」。常用しだすと手放せなくなります。
で、この快感をOperaユーザにも伝えたい。そう思いました。
Operaでは通常の作りをしていてはドメインを越えた通信(JSON以外)は出来ないのですが、postMessageというAPIを使うことでコンテンツ間のメッセージングが行えるようになります。
これを使用して、GM_xmlhttpRequestもどきを実装しています。ただし困ったのがこのpostMessageに送り出す文字列(HTML)を取得する為にはオブジェクトをメインコンテンツに追加する必要がありかつ追加するという事はGET限定、つまりPOSTを実行させる為にはドメインを越えられる別のPOST実装が必要になるって事に。
で、結局やったのが動的にiframeを生成して、その中にformを作りポストするという方法。
いろいろやっている内に、DOM追加で動くGET版とiframeを使うPOST版を纏めたGM_xmlhttpRequestみたいな物がなんとなく出来上がりました。
(完全ではありません)

これで行ける!と思ったのですが今度はdel.icio.usのタグを取得する方法で困った。このpostMessageに送り出すにはDOMContentLoadedをフックするのだけれど、del.icio.usのAPIからXML形式のタグ一覧を読み込んだ時にはDOMContentLoadedが走らない。
悩んだ挙句、一度「http://del.icio.us/」にアクセスし、ユーザ名称を見つけ、「http://feeds.delicious.com/feeds/json/tags/XXXX」にアクセスし、JSONを取得するという方法で実装しました。
ようやく
が使えるminibufferbookmarkcommandが出来上がりました。ふぅ
Operaユーザの方で、SBMをお使いの方は一度試して見て下さい。
minibufferbookmarkcommand.js
なお作成にあたっては、Opera版のLDR Full Feedを作成されたos0xさんのコードをふんだんに参考にさせて頂いております。感謝。

2008/01/16

はてな
以前、個人的なブームでPlaggerのPublish::XXXプラグインを作ってた頃の知識を再利用。

Minibufferには、ソーシャルブックマークへ登録するコマンド「bookmark」があります。
minibufferbookmarkcommand.user.js
ちょっと前これを色んなSBMに対応出来る様にプラガブルに修正したのですが、ノウハウを生かして以下2本のbookmarkプラグインを作成しました。

GooBookmarkプラグイン
minibufferbookmarkcommand.goobookmark.user.js
NiftyClipプラグイン
minibufferbookmarkcommand.niftyclip.user.js
それぞれ
:bookmark -g
:bookmark -n
で実行出来る様になっています。
Publish::XXXの時と同様に利用している人は皆無かと思いますが、よかったらどうぞ。

2008/01/15

はてな
追記1
タイトルがうまく取れていないっぽい。
あとリンクも見付けれてない...orz
時間見つけて直します。
一応、現在見ているページならポスト出来るみたい。

追記2
直した。

Tomblooが良く出来てて素晴らしい。
Tomblooは現在のコンテンツに合わせてポストする形式を集約し、コンテキストメニューから集約したアイテムをポスト先へ送信する、すばらしい拡張です。
現状、標準のポスト先としてFlickr、Tumblr等がポスト先として選択出来る様になっています。
Minibufferフリークとしては、これをMinibufferから使えないのは物悲しい!
ってことで適当にハックしてMinibufferからpostする方法をご紹介します。
とは言っても今日ご紹介する方法は、ブックマークレットでもなければグリースモンキーでもありません。Firefoxの拡張を弄る事になりますので自己責任でお願い致します。
まずTomblooの拡張が格納されているフォルダ、
${FIREFOX_PROFILE}/extensions/tombloo@brasil.to/chrome/content/library/Mozaic.html
を開き
<script type="text/javascript" src="../library/20_Tumblr.js"></script>
<script type="text/javascript" src="../library/30_Tombloo.Service.js"></script>
<style>
となっている部分に
<script type="text/javascript" src="../library/20_Tumblr.js"></script>
<script type="text/javascript" src="../library/30_Tombloo.Service.js"></script>
<script type="text/javascript" src="../library/32_Minibuffer.js"></script>
<style>
と32_Minibuffer.jsを追加します。次に
${FIREFOX_PROFILE}/extensions/tombloo@brasil.to/chrome/content/library/32_Minibuffer.js
を作成し、以下のソースをペーストして保存します。
var GreasemonkeyServiceClass = Components.classes["@greasemonkey.mozdev.org/greasemonkey-service;1"];
log(GreasemonkeyServiceClass);
if (GreasemonkeyServiceClass) {
    function update(target, src){
        for(var key in src)
            target[key] = src[key];
        
        return target;
    }
    function addBefore(target, name, before) {
        var original = target[name];
        target[name] = function() {
            before.apply(target, arguments);
            return original.apply(target, arguments);
        }
    }
    var GreasemonkeyService = GreasemonkeyServiceClass.getService().wrappedJSObject;
    addBefore(GreasemonkeyService, 'evalInSandbox', function(code, codebase, sandbox){
        if (sandbox.Minibuffer && sandbox.LDRize) {
            sandbox.Minibuffer.addCommand({
                name: 'tombloo',
                command: function(stdin) {
                    var view = sandbox.LDRize.getSiteinfo()['view'];
                    var xpath_link = sandbox.LDRize.getSiteinfo()['link'];
                    var xpath_title = view || 'descendant::text()[normalize-space(self::text()) != ""]';
                    var nodes = sandbox.Minibuffer.execute('pinned-or-current-node');
                    forEach(nodes, function(node){
                        try {
                            var context = update(update({
                                document  : sandbox.unsafeWindow.document,
                                window    : sandbox.unsafeWindow,
                                title     : sandbox.unsafeWindow.document.title,
                                selection : '',
                                event     : {},
                                mouse     : {x:0,y:0},
                                menu      : null,
                            }, null), sandbox.unsafeWindow.location);

                            var text = '', url = '';
                            with(sandbox.unsafeWindow) {
                                var nodesSnapshot;
                                nodesSnapshot = document.evaluate(xpath_link, node, null,
                                    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
                                if (nodesSnapshot.snapshotLength > 0)
                                    context.href = nodesSnapshot.snapshotItem(0).href;

                                nodesSnapshot = document.evaluate(xpath_title, node, null,
                                    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
                                var allstringlength = 0;
                                var ypos = 0;
                                for(var n = 0; n < nodesSnapshot.snapshotLength; n++) {
                                    var item = nodesSnapshot.snapshotItem(n);
                                    var str = item.nodeValue.replace(/\s/g,'');
                                    allstringlength += str.length;
                                    if(allstringlength > 30){
                                        text += str.slice(0, 30) + '...';
                                        break;
                                    }else{
                                        text += item.nodeValue;
                                    }
                                }
                            }
                            if (text.length) context.title = text;

                            var exts = Tombloo.Service.check(context);
                            var service = Tombloo.Service;
                            forEach(exts, function(ext){
                                service.share(context, service.extracters[ext.name]);
                            });
                        } catch(e) {alert(e)}
                    });
                }
            });
        }
    });
}
あとはブラウザを再起動すれば、Minibufferにtomblooというコマンドが追加され、pinを付けて
:tombloo
と実行すれば、Tumblrにリンクがポスト出来る様になっています。
現状はTomblooが扱えるコンテンツの中でも、リンクのポストにしか対応していませんが、selection等を弄ればQuote、画像を選択させれば画像ポスト(Tumblr以外からのReblog)がMinibufferから可能になるかと思います。
今後やる気が続行すれば、作者殿にTomblooをプラガブルにする為の提案をさせて頂きたい...と思っています。
※やる気が続行すれば...の話です。

ただ、やっぱり特権のある部分からMinibufferを操作する行為は幾らevalInSandboxとは言え怖い...苦笑


リンク:Tombloo 0.1.0

2007/12/17

はてな
ちょ!!www
まだそれ出来てないすから!!!
http://h.hatena.ne.jp/noreply/9236556151112331479
id:noreply
ldrizeでpしたハイクにスターを打つminibufferコマンド欲しい
http://h.hatena.ne.jp/otsune/9236538558961639940
id:otsune
それ id:mattn で
週末時点ではアカウント取れてたしotsuneさんからのidコールには気付いていたけど週末は予定ぎっしりで、結局出来ませんでした。
とりあえず動くようになったので公開...
:pinned-node | Hatena::addStar
でピンを付けたノードに「はてなスター」を付けられます。
動作には、LDRizeとMinibufferと、mattnへの愛情が必要です。

動かなかったら...そんとき対応します。
別にはてなハイクで無くてもLDRizeが動いて、はてなスターが付けられる所だったら動くかもしれません。
※とりあえず、はてなハイクでは確認出来ています。

インストール:minibuffer.hatena.addStar.user.js
追記
pinを付けてキー「H S」でも動きます。

mattn the Haiku Haiker Haikest!

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
てか実用的な物つくれ!俺

新規投稿