Entry: commons markerの件数をgoogle検索結果に表示するグリモンをつくった
commons markerの件数をgoogle検索結果に表示するグリモンをつくった
[2010.01.15追記] 無駄な処理が多かったのでソースを少し整理した。
恥ずかしながら、commons markerというサービスを最近まで知らなかった。前々から出来たらいいなと思っていたことにすごく近いので使い始めてみた。
ところで、はてなブックマークのFirefoxアドオンはとても便利で、とくにGoogle検索の結果にブクマ件数が表示されるのは、クリックすべきリンクのアタリをつけるのに大変便利なのですが、同じ発想でcommons markerの件数も参考データとして意味があるかもしれないと思い、早速グリモンスクリプトで実現してみた。
googleResultWithMarker.user.jsをインストール

// ==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短縮サービスを作った
[2009.09.30] Asiajinで取り上げていただきました。ありがとうございます。そして、同じネタがすでにあったと知りました。リサーチ不足。
長いURLの文字数を削減してくれるURL短縮サービスはたくさんあるけど、世界中のどの方式よりも文字数を短縮できる方法を発明しました。
サイト名ですでにネタばれですが、これは各URLに割り振るIDをマルチバイト文字の組み合わせにすることで、文字数的には短いでしょ、というネタです。ついったーなんかは完全に文字数に依存なので有効かも。
IDに使用する文字は日本の常用漢字1945字です。シーケンシャルに割り振り、使い切ったら繰り上がるので、最初の370万件は2桁に収まり、最初の73億件も3桁に収まります。
注意事項としては
- Firefox3.5, IE7, Chrome, iPhoneで正常動作を確認しました。逆に、Androidエミュレータ, DoCoMoやAUのブラウザ(フルブラウザ含む)は日本語ドメインに未対応のようです。
- IDはシーケンシャルに割り振られるので使用済みのIDは容易に推測できます。
- 「悪」などというイヤなIDが当たってしまったら
リロードして再割当してください。「縮AGAIN」ボタンを押してください。 - これはジョークサービスです。本サービスの利用に起因または関連する利用者の損害について管理者は何ら責任を負いません。
Entry: ついったーユーザーへのタグらしきものを表示するグリモンつくった
ついったーユーザーへのタグらしきものを表示するグリモンつくった
ユーザー名にマウスオーバーすると、その人に対して付けられたかもしれないタグが列挙されます。ページによって反応しないかもしれません。アルファ版ということでお願いします。


ちなみに、このスクリプトにはタグ付け機能がありません。タグ付けにはこちらのツールが使用できます。あと、複数ユーザーをタグ毎に束ねられなければタグの意味がないんですが、出来る気がしません。
Entry: 縮.jpに待望の「縮AGAIN」ボタンを搭載
縮.jpに待望の「縮AGAIN」ボタンを搭載
縮.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日の記事くらいしか見当たらなかった。
今後の予定
任意のIDを指定可能に- 不人気文字を避ける仕組み
- 元URLがすでに短縮URLだった場合に展開してから短縮
- スパム対策
Entry: GreaseMonkey用pbtweetでIDNを正常動作させる
GreaseMonkey用pbtweetでIDNを正常動作させる
縮.jpがFirefoxのGreaseMonkyスクリプト「pbtweet」のv1.4.10 GreaseMonkey 005810で動作しなかったので、pbtweet側を直してみた。
[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: マルチプラットフォームなアプリ一覧
マルチプラットフォームなアプリ一覧
いつでもMacOSとLinuxとWindowsを行き来できるように。
| ブラウザ | Firefox 定番ブラウザ。下記はおすすめプラグイン。
|
|---|---|
| メーラー | Thunderbird 定番メーラー。下記はおすすめプラグイン。
|
| テキストエディタ | jEdit Mac版は割と軽い。下記はおすすめプラグイン。
Scintilla Text Editor EUC-JP不可。 Komodo Edit jEdit使うようになってから出番がめっきり減った。 |
| ファイル転送 |
Filezilla mac版は驚くほど使いづらい。主な用途はファイラであるmuCommanderで事足りるので、Filezillaは今のところ不要。 |
| 波形編集 | Audacity |
| オフィススィート | OpenOffice 定番。下記はおすすめ機能拡張。
OPENPROJ プロジェクト管理 |
| アーカイバ | |
| ファイラ | 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行ってきた
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
以前にこんなエントリ書いたり、こんな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窓に更新ボタンつけた
Entry: jQueryの.live()が右クリックに反応してしまう現象の回避方法(改)
jQueryの.live()が右クリックに反応してしまう現象の回避方法(改)
.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のみの現象らしい。
Subscribe to my RSS feed