コードDJ 第0回
とうとう始まってしまった。Help me, hackers!に上がったコードの中身を毎回紹介していくコードDJ。
「始まる、始まる」って電波を送信しといたから、宇宙の知識の全てが記録されているというアカシックレコードにアクセスしてた人は、本当にお待たせ。komagata a.k.a. DJです。
第0回といっても準備号的なものってわけじゃなく、ゼロオリジンなだけなので注意だ。
今回紹介するのはコレ。
はてなブックマークのコメントをGoogle Readerに表示するFirefox Add-onかGreasemonkey – Help me, hackers!
Google ReaderとはてブはDJも愛用している。正直俺も欲しい。
machibuse a.k.a. ネオニートが投稿してくれた。ありがとう!
即効でGistにアップしてくれたのがm_satyr a.k.a. short-coder-wannabe。畜生、わかってるじゃねえか。
コード:
https://gist.github.com/406743/cebdd9dd0579311277ba044f0931ea5684361de1
(右上のrawのリンクからグリースモンキースクリプトをインストールできる。)
DJ正直、Javascriptとかグリモンとか詳しくないが行数はたった67行。BSDのlsより遥かに小さいコードだから頑張ってみていこう。
const HB = 'http://b.hatena.ne.jp/', HBE = HB + 'entry/';
いきなりconstか、おしゃれじゃねえか・・・。ついていけるのか心配だ。
概要はGM_addStyleでスタイルを定義してGM_xmlhttpRequestで取ってきたはてブをsetInterval内でそれぞれのエントリーにくっつけてる。
GM_xmlhttpRequestのクロスドメイン通信はChromeでは出来ないけど何か方法があるらしいからChromeユーザーは頑張ってくれ!
GM_addStyle(.hatebu-count {float:right}
${margin:0; padding:0; clear:both}
9行目に素でCDATAが置いてある。これはアレか、E4XのXMLリテラルか。
$は何?そういうCSSセレクターがあるの?
function qse(node, sel, fn) Array.forEach(node.querySelectorAll(sel), fn);
20行目には便利な関数が。querySelecterの略でqseか?素敵だ、パクろう。
setInterval(function watch(){
qse(document, '.entry:not([data-grhc-done])', fetch);
}, 1e3);
その前にsetIntervalの第二引数の1e3。これはよく見たら指数形式の整数。基数を10として扱うから 「1e3」は「1×103」のことで「1000」。確かに慣れるとわかりやすいが1文字少ない方を選ぶとはさすがshort-coder・・・。
setInterval第一引数の関数にwatchと名前がついてるのはどういう意味があるんだろうか?
その後はfetch関数の中になる。
for each(let {user, tags, comment, timestamp} in o.bookmarks)
ls += let(uu = HB + user +'/') String.concat(
41行目にfor each in文。こんなのあったのか。for inとどう違うんだ?
さらにlet式。次の行にはlet文。Javascript 1.7からはletなんて使えるのか。DJはCommon Lispで軽いlet恐怖症だよ。
最近はこんなモダンな書き方ができるのか、Javascript&m_satyrスゲーな。DJ勉強になったよ。
machibuseはおそらく結果に満足。はてブAddon風Userstyleも公開してくれて、気前よく報酬を支払ってくれたみたいだが、
Twitter / murky-satyr: http://help-me-hackers.com …
http://help-me-hackers.com/tasks/30 重畳。今月のアフタが買える
9:21 PM May 21st Ubiquityから
この金はどうやらアフタヌーン代に消えたようだ。
letとアフタヌーンに幸あれ!