programmingの最近のブログ記事
「すでに登録されています」
このメッセージを見るたびに、なんだか情けなくなってきます。
そこで前もって登録されていることを知らせるGreaseMonkeyスクリプトを作りました。
GM_xmlhttpRequestでマイリストページを非同期に読み込んで、
再生している動画が含まれていないかを検索します。
私はAjaxとかも実際に作ったことは1回もなかったので、
最初戸惑ったのが、どうやってパラメータをコールバック関数に渡すか、というところでした。
これこそクロージャの出番じゃないかということに気付くのにちょっと時間がかかってしまいました。
関数を返す関数を作って、上位関数の引数を下位関数に引き渡せば、
関数生成時に動的にパラメータを束縛できるわけですね。
// ==UserScript==
// @name 登録済みマイリストを表示
// @namespace http://eclipse.cspc.jp
// @include http://www.nicovideo.jp/watch/*
// ==/UserScript==
(new function() {
var sm = location.href.match(/(sm[0-9]+)/)[1];
var es = document.getElementById('mylist_add_group_id').getElementsByTagName('option');
for (i = 0; i < es.length; i ++) {
GM_xmlhttpRequest({
method: 'GET',
url: 'http://www.nicovideo.jp/mylist/' + es[i].value,
onload: onload_generator(es[i].innerHTML, es[i].value, sm)
});
}
function onload_generator(mylist_name, mylist_code, sm) {
return function(req) {
var e = document.getElementById('mylist_add_status');
if (req.responseText.indexOf('watch/'+sm) != -1) {
if (e.innerHTML == '')
e.innerHTML = '登録済み→'
e.innerHTML += ' <a href="mylist/' + mylist_code + '">' + mylist_name + '</a> ';
}
}
}
})();
台風が来るということで今日は早めに撤収してきました。
強風でビニ傘がひっくり返って、コンパクトにしようとしたら指切って血が出たよ鬱だ。
でもってすみません傘放置しました。
最悪やって自分でも思うけどこれだけは勘弁してください。
壊れたビニ傘を自宅まで持参するって相当の精神力が必要だぞ。
僕には無理でした。
今日は仕事がひm、じゃなくて時間的に「ゆとり」があったのでGreaseMonkeyを使ってみました。
GreaseMonkeyはFirefoxのプラグインで、
ブラウズしているWebページをクライアントサイドでいじくるスクリプトを動かす環境です。
スクリプトはJavaScriptで書きます。
ちょうど仕事に役立つ題材があったのでそれを紹介します。
私は毎週月曜日の朝に、検索順位のチェック作業をしています。
検索順位のチェックツールにはいろいろありますが、
合ってなかったりすることが多々あるので信用ならんということで、
いつも目視でやっております。
それをYahoo、Google、MSNの3サイトで確認します。
ググ厨はしらないかもしれませんが、Yahooには検索順位が表示されます。
でもGoogleとMSNは表示されません。
なので順位を知りたければ上から数えるしかないんですよ。
うん下から数えてもいいよ。
これがね、めちゃくちゃ不便なのです。
Macのマウスにボタンが1個しかないことの次くらいに納得いかない。
たぶん世界のGoogle様のことだから何か意味があるんでしょうけどうざいです。
これを解決するスクリプトをGreaseMonkeyでちゃちゃっと作ってみました。
Googleだけのなら他の人が作ったのがあるんだけど、
ソースが微妙にわかりにくかったので自己流にアレンジしました。
// ==UserScript==
// @name display_rank
// @namespace http://eclipse.cspc.jp
// @description GoogleとMSNの検索結果に順位を表示
// @include http://search.msn.co.jp/*
// @include http://www.google.co.jp/*
// ==/UserScript==
(function() {
var url = window.location.href;
var m, first, es;
// MSNの場合
if (url.match(/^http:\/\/search\.msn\.co\.jp/)) {
// URLからページ内の1件目の順位を取得
m = url.match(/first=([0-9]+)/);
first = (m == null)? 1 : parseInt(m[1]);
es = document.getElementById('results').getElementsByTagName('h3');
}
// Googleの場合
else if (url.match(/^http:\/\/www\.google\.co\.jp/)) {
// URLからページ内の1件目の順位を取得
m = url.match(/start=([0-9]+)/);
first = (m == null)? 1 : parseInt(m[1]) + 1;
t_es = document.getElementById('res').getElementsByTagName('div');
es = new Array();
for (i = 0; i < t_es.length; i++)
if (t_es[i].className == 'g')
es.push(t_es[i]);
}
// 順位を追加
for (i = 0; i < es.length; i++)
es[i].innerHTML = '<span style="color:red;font-weight:bold">'
+ (first + i) + '. </span>' + es[i].innerHTML;
})();
こいつをdisplay_rank.user.jsとして保存して、
アドレスバーにファイルパスを打ち込めばインストールできます。
もちろんGreaseMonkeyは最初にインストールしておいてからね。
ここにあるから。
これでGoogleとMSNで検索したときにもYahooみたく順位が表示されるようになります。
コードはJavaScript/DOMの単純な例っていう感じじゃないかな。
以外に簡単に便利にできるんだなぁ、とちょっと感動しました。
また何かいい題材があったらGreaseMonkey使ってみよう。
PHPを生まれて初めて使ってみた。
でもCやPerlとほぼ同じなので特に面白くはない。
作ったのは、問い合わせフォームがあって
POSTすると確認画面にいってもう一度POSTすると
完了画面にいってメールが送信されるっていうただそれだけのプログラムですけどね。
POSTするデータの名前が日本語だとどうしても化ける現象のせいで半日つぶしちまったぜ・・・
結局あきらめて名前を半角英字にしたよ。負けた気分で実に不愉快であった。
プログラミングにかかる時間のうち、こういった本質以外の部分が多すぎる。
趣味プロだとどう回避しようが自分の勝手なのでいいんですけど。
大体inputタグのname属性を日本語になんて本来俺だったらやらないんだよ。
仕事続けてるとなるべく他人が作った物に対して手を加えないようになっていくんだよね。
それは自分を抑えるということでもあり他人を尊重するということでもあるし
責任範囲を明確にするためでもあるし必要最低限の労働で済ませようとするためでもある。
でもそのせいでとってもプログラミングがつまらくなってしまったりするんだよね。
あとさ、いまやプログラミングに検索という行為は欠かせないよね。
Googleなくなったらけっこう困るよね。
でもさでもさ、今日俺がはまったところなんてGoogleはまったく役に立たなかったぜ。
それどころか貴重な時間をむさぼり食いやがったんだ。
なぜかってもし検索できなかったらとっくにあきらめて他の道を行くという決断をしてたからさ。
一旦足を突っ込むと人間なかなかその足を切断する気になれないんだよね。
そしてずぶずぶと深い沼の中に埋もれていくわけだ。
Googleで検索すると大量にヒットするんだよ。
この中にはきっと自分の求めている情報があるはずだ、
もうちょっと探せば問題は解決できるよきっと、そう思えてしまう罠があるんだ。
実際、やつが把握している何十万件というデータの中には答えがあるのかもしれん。
でもそんなの関係ねぇってことさ。
