2008/01/31



http://twitter.com/itkz/statuses/220045412
GtkTwitter の configure がこける理由がわからないので、aclocal.m4 の AM_PATH_GTK_2_0 を解析する羽目になった。仕事ってなにそれおいしいの
http://twitter.com/itkz/statuses/219941692
GtkTwitter をどうやっても起動できない。GTK+ Runtime をインストールしても動かないし、DLL を全て実行ファイルと同じ階層に置いても動かない。関数のエントリポイントが見付からないんだとよ! 舐めてっとぶっ飛ばすぞ。どういうことだ。
http://twitter.com/itkz/statuses/222783012
(続き)もちろん、GtkTwitter の configure は pkg-config をスルーしてるので config.log にエラーなど残っていない。だからコンパイル時の問題だと思って CFLAGS をいじくったりしていたわけだ。
http://twitter.com/itkz/statuses/221271572
結局のところ、数時間かけても GtkTwitter のビルドには成功していない。まずバイナリで落としてきた libcurl をリンクすると「エントリポイントがねえ」と言ってくる。調べると「cURL が MinGW で動かねえと騒いでる糞どもはソースからビルドしろ」と一喝されている

これ以上ほったからしにしておくと、惨殺されるという噂なので焦って記事アップしました...(嘘です)

まず、リポジトリですが
http://gtktwitter.googlecode.com/
にあります。ダウンロード用アーカイブは古いのでsvnから使って下さい。
mingw32の場合は、autotoolを使うまでもないので確認していません。(ごめんなさい)
必要な物は
GnuWin32
Glade/GTK+ for Windows
cURL: win32-ssl-mingw from Mirrors
あたりでダウンロード出来るかと思います。
Makefileは適当に
all : gtktwitter.exe

gtktwitter.exe : gtktwitter.o gtktwitter.res
    gcc -o gtktwitter.exe \
        -Lc:/gtk/lib \
        gtktwitter.o \
        gtktwitter.res \
        `pkg-config --libs gtk+-2.0 libxml-2.0 gthread-2.0` \
        -lcurl

gtktwitter.o : gtktwitter.c
    gcc -c \
        `pkg-config --cflags gtk+-2.0 libxml-2.0` \
        gtktwitter.c

gtktwitter.res : gtktwitter.rc
    windres -o gtktwitter.res --output-format=coff gtktwitter.rc

clean:
    -rm *.o *.res *.exe
あたりで誤魔化して下さい。
あとは、curl.hやlibcurl.aをmingwへ入れ
set PKG_CONFIG_PATH=C:\GTK\lib\pkgconfig
してからmake(mingw32-make)すると出来上がると思います。

どうか、これでお許し下さい。苦笑
Posted at by




WindowsにあるようなToggleDesktopをROX用に作ってみました。

http://rox.sourceforge.net/desktop/node/243
ソースはわずか17ステップ...。苦笑
Posted at by




追記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
Posted at by