JAMADAM.COM

RSS Subscribe to my RSS feed

Stripe Calendar

Sep, 2010
Aug 1516171819202122232425262728293031 Sep 123456789

Entry: commons markerの件数をgoogle検索結果に表示するグリモンをつくった

commons markerの件数をgoogle検索結果に表示するグリモンをつくった

Initial post: 2010.01.14 | Last modified: 2010.01.15

[2010.01.15追記] 無駄な処理が多かったのでソースを少し整理した。

恥ずかしながら、commons markerというサービスを最近まで知らなかった。前々から出来たらいいなと思っていたことにすごく近いので使い始めてみた。

ところで、はてなブックマークのFirefoxアドオンはとても便利で、とくにGoogle検索の結果にブクマ件数が表示されるのは、クリックすべきリンクのアタリをつけるのに大変便利なのですが、同じ発想でcommons markerの件数も参考データとして意味があるかもしれないと思い、早速グリモンスクリプトで実現してみた。

googleResultWithMarker.user.jsをインストール

image

// ==UserScript==
// @name           googleResultWithMarker
// @namespace      http://jamadam.com/blog/
// @description    googleResultWithMarker
// @include        http://*.google.co.jp/search*
// ==/UserScript==


(function() {

    var $;
    var jversion = '1.3.2';
    var jexist = (typeof unsafeWindow.jQuery != 'undefined');
    var conflict = (jexist && unsafeWindow.jQuery.fn.jquery != jversion);
    // Add jQuery if not loaded
    if (! jexist || conflict) {
        var GM_JQ = document.createElement('script');
        GM_JQ.src = 'http://ajax.googleapis.com/ajax/libs/jquery/' + jversion + '/jquery.js';
        GM_JQ.type = 'text/javascript';
        document.getElementsByTagName('body')[0].appendChild(GM_JQ);
    }

    GM_wait();

    // Check if jQuery's loaded
    function GM_wait() {
        if (typeof unsafeWindow.jQuery == 'undefined' || unsafeWindow.jQuery.fn.jquery != jversion) {
            window.setTimeout(GM_wait,100);
        } else {
            if (conflict) {
                $ = unsafeWindow.jQuery.noConflict(true);
            } else {
                $ = unsafeWindow.jQuery;
            }
            letsJQuery();
        }
    }

    // All your GM code must be inside this function
    function letsJQuery() {

        var array = $('#res li.g');
        var procExist = false;
        var i = 0;
        var loop = function() {
            if (i < array.length) {
                if (procExist) {return;}
                procExist = true;
                var href = array.eq(i).find('h3 a').attr("href");
                var pos = array.eq(i).find('span.gl');
                var url = encodeURIComponent(href);
                var jsurl = "http://commonsmarker.com/tools/latest_info?url=" + url;
                unsafeWindow["__jsonp__aD3jHjaf27mZQxt"] = function(a) {
                    if (! a || ! a.marks || ! a.marks.length) {
                        return;
                    }
                    $("<a>" + a.marks.length + " markers</a>")
                        .attr('href', "http://commonsmarker.com/page/" + href)
                        .css({
                            backgroundColor:"#f5d0d0",
                            color:"#ff0000",
                            fontFamily:"arial,sans-serif",
                            fontWeight:"bold",
                            marginLeft:"4px",
                            padding:"1px",
                            fontSize:"85%"
                        })
                        .insertAfter(pos);
                }
                $.ajax({
                    type: "GET",
                    url: jsurl,
                    dataType: "script",
                    complete: function() {
                        i++;
                        procExist = false;
                        loop();
                    }
                });
            }
        }
        loop();
    }
})();

commons markerの公式のインターフェースはまだ機能不足なため他のユーザーの動向がよく掴めなかったんだけど、こうしてスクリプトで簡単に件数を把握できるようにしてみて分かったことは、「全然利用されてない」ということでした。予想はしていたけど。

なお、commons markerはこの手の外部スクリプトへのインターフェースや仕様を一切公開していません。今回のスクリプトはとても強引な処理と憶測で実装しているので、サーバーの仕様が変わって動かなくなることが大いに予想されます。

Entry: ある意味、世界一のURL短縮サービスを作った

ある意味、世界一のURL短縮サービスを作った

Initial post: 2009.07.18 | Last modified: 2009.11.04

[2009.09.30] Asiajinで取り上げていただきました。ありがとうございます。そして、同じネタがすでにあったと知りました。リサーチ不足。

 

長いURLの文字数を削減してくれるURL短縮サービスはたくさんあるけど、世界中のどの方式よりも文字数を短縮できる方法を発明しました。

縮.jp

サイト名ですでにネタばれですが、これは各URLに割り振るIDをマルチバイト文字の組み合わせにすることで、文字数的には短いでしょ、というネタです。ついったーなんかは完全に文字数に依存なので有効かも。

IDに使用する文字は日本の常用漢字1945字です。シーケンシャルに割り振り、使い切ったら繰り上がるので、最初の370万件は2桁に収まり、最初の73億件も3桁に収まります。

注意事項としては

  • Firefox3.5, IE7, Chrome, iPhoneで正常動作を確認しました。逆に、Androidエミュレータ, DoCoMoやAUのブラウザ(フルブラウザ含む)は日本語ドメインに未対応のようです。
  • IDはシーケンシャルに割り振られるので使用済みのIDは容易に推測できます。
  • 「悪」などというイヤなIDが当たってしまったらリロードして再割当してください。「縮AGAIN」ボタンを押してください。
  • これはジョークサービスです。本サービスの利用に起因または関連する利用者の損害について管理者は何ら責任を負いません。

 

Entry: ついったーユーザーへのタグらしきものを表示するグリモンつくった

ついったーユーザーへのタグらしきものを表示するグリモンつくった

Initial post: 2009.10.29 | Last modified: 2009.10.30

ユーザー名にマウスオーバーすると、その人に対して付けられたかもしれないタグが列挙されます。ページによって反応しないかもしれません。アルファ版ということでお願いします。

image1

image2

 

これをインストール

ちなみに、このスクリプトにはタグ付け機能がありません。タグ付けにはこちらのツールが使用できます。あと、複数ユーザーをタグ毎に束ねられなければタグの意味がないんですが、出来る気がしません。

Entry: 縮.jpに待望の「縮AGAIN」ボタンを搭載

縮.jpに待望の「縮AGAIN」ボタンを搭載

Initial post: 2009.10.08 | Last modified: 2009.10.16

縮.jp。7月に作って放置してたら10月になって話題になった。人生で一番集客した。そんな訳で、ネタを必要以上に膨らませるべく、システムを改修しました。見た目的にはあまり変化ありませんが、中身はほぼ丸々変わってます。特筆すべき変化は。。

待望の「縮AGAIN」ボタンを搭載

生成された短縮URLが気に入らなかった場合、このボタンを押すと別のURLを生成してくれます。なお、縮AGAINした場合、古いURLはしばらくして解放されます。

既設の短縮URLがあれば、短い順にご提案

今までは湯水のように新規作成してましたが、縮ボタンを押した際、まずは既設の短縮URLを提示するようになりました。縮AGEINすると短い順に既設URLが表示され、なくなれば新規作成されます。

転送時、末尾のゴミを可能な限り取り除く

Twitterでhttp://縮.jp/上これすげーみたいなつぶやきが多発していたので、こういう場合はhttp://縮.jp/上を検知して転送します。Perlでいうと、

$id =~ s/¥P{Han}.*//; 

となっています。漢字を表す正規表現なんて初めて知りました。

ちなみに、ファイルベースからPostgresqlに移行

パフォーマンスいいかなと思って、1件1ファイルなどというデータ管理をしてたんですが、IDがシーケンシャルに固定されるとか、逆引きできないとか、色々問題あったのでPostgresqlにしました。なお、ファイルベースのキャッシュの仕組みを導入したので転送時のパフォーマンスは以前と変わらない。はず。

APIにも変更あり

offsetというパラメータが新設されました。これは前述の既設URLの再利用と関連するもので、任意の既設URLを取り出すためのパラメータです。offsetを十分に大きくすると自動的に新規作成されます。通常は指定しないでください。

 

既知の問題

  • 元URLがbit.ly等ですでに短縮済みだった場合、iPhoneで転送されない。確かソフトバンクの仕様でiPhoneで多段リダイレクトできない。
  • Twitter用のいくつかのGreaseMonkeyスクリプトやアドオンで縮.jpへ飛べない。FirefoxのJavascriptのバグっぽい挙動が原因と思われる。対処法はこちら
  • Twitter周辺サービスで日本語ドメインが誤ってパーセントエンコードされているケースも見かけます。サーバサイドでの処理に問題があるのではないか(憶測)。
  • iPhoneの多くのアプリで開けない。おそらくアプリからwebkitだかのAPI的なものに渡すURLをpunycode変換してないのではないか(憶測)。対処法はこちらの12月15日の記事くらいしか見当たらなかった。

 

今後の予定

  1. 任意のIDを指定可能に
  2. 不人気文字を避ける仕組み
  3. 元URLがすでに短縮URLだった場合に展開してから短縮
  4. スパム対策

 

Entry: GreaseMonkey用pbtweetでIDNを正常動作させる

GreaseMonkey用pbtweetでIDNを正常動作させる

Initial post: 2009.10.12 | Last modified: 2009.10.12

縮.jpがFirefoxのGreaseMonkyスクリプト「pbtweet」のv1.4.10 GreaseMonkey 005810で動作しなかったので、pbtweet側を直してみた。

pbtweet_revamped.user.js

[2009.10.12追記] 本家に取り込んで頂いたのでこちらから最新版をDLするといいと思います。ちなみに、同様の現象はTwitter本家の検索結果でも起きていて、pbtweetの最新版を使うとこれを回避できます。

231-236行に下記を追加。

//jamadam added below
var links = 
    entry[i]
        .getElementsByClassName('entry-content')[0]
        .getElementsByTagName('a');
for (var cnt = 0; cnt < links.length; cnt++) {
    links[cnt].href=decodeURI(links[cnt].href);
}
// jamadam added above

 

うちだけの問題かもしれないけど、Mac版Firefox3.5.3のJavascriptでinnerHTMLを取得した場合、子要素のaタグのhref属性が、パーセントエンコードされてしまっている。上記ではこの現象をキャンセルしている。

HTML

<body id="main">
<a title="縮" href="http://縮.jp/">http://縮.jp/</a>
</body>

Javascript

var hoge1 = document.getElementById('main').innerHTML;
var hoge2 = document.getElementById('main').getElementByTagName('a')[0].href;
alert(hoge1);
alert(hoge2);

Firefoxの場合

<a title="縮" href="http://%E7%B8%AE.jp/">http://縮.jp/</a>
http://縮.jp/

Safariの場合

<a title="縮" href="http://縮.jp/">http://縮.jp/</a> 
http://縮.jp/

 

 

Entry: マルチプラットフォームなアプリ一覧

マルチプラットフォームなアプリ一覧

Initial post: 2009.01.14 | Last modified: 2009.08.01

いつでもMacOSとLinuxとWindowsを行き来できるように。

ブラウザ Firefox 定番ブラウザ。下記はおすすめプラグイン。
  • ViewSourceWith(任意のエディタでHTMLソースを表示。マック版は多少工夫しないと使えない。)
  • Firebug(WEB開発の便利ツールがいっぱい)
  • YSlow(WEB開発時のパフォーマンスチェック。その他、スクリプトなどを外部も含めて全て結合表示してくれたりもして超便利。)
  • FoxyProxy(サイト毎にプロキシを設定)
  • Html Validator(HTML文法チェック、実はMac版もあった)
  • Link Evaluator(ページ内の全リンクを検証)
  • Resizeable Textarea(ルーターの設定画面がマックで散々だったので導入)
  • Ubiquity(コマンド。今のところalcコマンド専用と化している)
  • XUL/Migemo(ページ内検索の機能拡張。Migemoは置いといて、正規表現検索は完全に使える)
メーラー Thunderbird 定番メーラー。下記はおすすめプラグイン。
  • Lightning(スケジューラー)
  • Provider for Google Calendar(Lightningをgoogleカレンダーと同期)
  • Google Contacts(アドレス帳をGoogleの連絡先と同期)
テキストエディタ jEdit Mac版は割と軽い。下記はおすすめプラグイン。
  • BufferTabs(バッファーをタブ表示)
  • Editor Scheme(フォントや色を一元管理)
  • FTP(リモートファイルの編集。SFTPにも対応)
  • Highlight(任意のキーワードをハイライト)
  • TextTools(ソートなど)
  • WhiteSpace(インデントの可視化に使える)
Editra 日本語入力に難あり。作者も認識してるけど直せないらしい。
Scintilla Text Editor EUC-JP不可。
Komodo Edit jEdit使うようになってから出番がめっきり減った。
ファイル転送

Filezilla mac版は驚くほど使いづらい。主な用途はファイラであるmuCommanderで事足りるので、Filezillaは今のところ不要。

波形編集 Audacity
オフィススィート OpenOffice 定番。下記はおすすめ機能拡張。 GanttProject 結構あやしい動きをするけどOPENPROJよりずっと使いやすい。今後に期待。
OPENPROJ プロジェクト管理
アーカイバ PeaZip Mac版なかった..どうしよう
ファイラ muCommander
動画エンコード HandBrake
マインドマップ XMind 中国製。結構おいしい操作性。でも、win版はよく落ちる。Mac版はちょっと前まで起動すらしなかったけど、最近のバージョンで改善。将来に期待。
メディアプレーヤー Songbird 最近本格的にiTunesから乗り換えたけど、特に問題ないんじゃないかと思う
Miro 動画専用かな。今のところ満足な出来。
Amarok
DTP Scribus インストールが激しく難しい
GIMP たいていの人はPhotoshopなんて要らないんじゃないかと思う。Perlでマクロも組める。
フォント IPAフォント OOoのPDF出力時にはTTFフォントが必要なようで、日本語用にIPAフォントがおすすめ。
UML Jude/community 国産。MacOSX版もざっと見たところ、普通に動く。

 

Entry: OSC行ってきた

OSC行ってきた

Initial post: 2009.06.22 | Last modified: 2009.06.22

OSC行ってきた。朝から晩までセミナー三昧。

一番面白かったのはPostgresqlで全文検索というやつでした。to_tsvectorってのを使うことでlikeでマッチングするより速度が100倍(!)っていうデモをやってました。バージョン8.3からって言ってたかな。

その他にはFirefoxの中の人のセミナーでは、オープンソースの基礎知識的な話題もあって、今さら人には聞けない系の知識を収集できた。Netscapeがブラウザのソースを公開する際に、フリーウェアという名称の代替えとしてオープンソースと呼称したのがOSSの始まりだったとか、GIFのサブマリン特許の話、動画を巡る同様の問題を回避する取り組み->Firefox3.5という流れ。

OpenOffice Baseに関するセミナーも面白かった。まだ、MS Accessの代替にはならないけど、がんばってますって話。なんか、自分には何かできることがあるだろうか、なんて発想が自然と湧いてくるいい内容でした。

最後にAndroidのアプリ開発に関するセミナー。何らかのトラブルでうまく進行してなかったみたいだけど、人が開発してる様子をリアルに眺めるだけでも刺激的。そして、となりの席にリアル兄がいたという偶然。

その他にもサーバー系とネットワーク系のセミナーも受けたけど、全く理解できなくて少し凹んだ。サーバーマシントラブルのほとんどはホコリが原因だという話だけがためになった。

Entry: text-overflow:ellipsis

text-overflow:ellipsis

Initial post: 2009.06.21 | Last modified: 2009.06.22

以前にこんなエントリ書いたり、こんなjQueryプラグイン作ったりしたけど、それってCSSだけでできるんじゃん!

http://www5e.biglobe.ne.jp/~access_r/hp/css/css_text_019.html

text-overflow
テキストがオーバーフロー(領域を超えてしまう事)する際にオーバーフローしたテキストを「...」で省略することが出来ます。

しかも属性名と値などのキーワードも思い描いたまんまじゃん。ただし、省略記号を有効にする指定はtext-overflow: ellipsis;だ。以前にもちゃんとググったつもりだったけど、英語の情報無視してたかなあ。

ただしFirefoxは未対応なので依然としてJavascriptでのハックは必要。また、text-overflowはIEのみの対応のようで、SafariやOperaはそれぞれの拡張属性を併記して対応できる。

a.width-limited {
    display:block;
    overflow: hidden;
    white-space:nowrap;
    -webkit-text-overflow: ellipsis; // Safari
    -o-text-overflow: ellipsis; // Opera
    text-overflow: ellipsis; // IE
}

Entry: twitter窓に更新ボタンつけた

twitter窓に更新ボタンつけた

Initial post: 2009.06.06 | Last modified: 2009.06.06

twitter窓に更新ボタンつけた。あと、それっぽい(どれっぽい?)見栄えにしてみた。mac版Firefox, Safariで動作確認。

いったい何処を目指してるのか見失いつつある。

Entry: jQueryの.live()が右クリックに反応してしまう現象の回避方法(改)

jQueryの.live()が右クリックに反応してしまう現象の回避方法(改)

Initial post: 2009.05.31 | Last modified: 2009.06.01

.live() wrongly firing upon right click
http://www.nabble.com/.live()-wrongly-firing-upon-right-click-td22820456s27240.html

jQuery1.3.2にて。.live()にclickを指定するとき、本来なら左クリックイベントにバインドされるべきところが、右クリックなどにもbindされてしまう。なお、click以外のイベントについては未検証。

回避方法。

$(selector).live('click', function(event) {
    
    // jQueryのliveメソッドと右クリックにまつわるバグを回避
    if (event.which != undefined && event.which != 1) {return}
    
    // ここに目的の処理
});

event.whichは1のとき左クリック、2, 3はそれぞれ中央と右。らしい。

[追記] .trigger('click')したときにはevent.whichはセットされない。なのでevent.which != undefinedが必要かもしれない

[追記] return falseじゃなかったね。単にreturnで十分。ちなみにこのバグ全体はFirefoxのみの現象らしい。