livedoor Reader@20141204120512

ライブドア(livedoor、現LINE株式会社)が2006年4月20日にβ版をリリースしたRSSリーダー。LDRと略されることが多い。

-[http://reader.livedoor.com/:title:bookmark]

極めて多機能かつ高性能であり、国産RSSリーダーとして高い評価を得てきた。2014年にサービス終了が発表されたが、ユーザーからの終了撤回の要望を受け、ドワンゴに「Live Dwango Reader」として譲渡した。2014年12月1日よりドワンゴが運営。

* 機能

主にキーボードショートカットを使い読み進めていく使い方がメイン。

ピンをたててタブブラウザなどで一気に気になった entry を開くことができる。

feed 先読み機能がついており、現在表示中の feed の一つ先の feed を先読みすることにより、サクサク読み進めることが可能。また開いた feed の描画は最初 entry の一つを描画し、後にすべての entry 描画を行う方法を採っているためにユーザはほぼ wait 無しで読み進めることが可能となっている。

左サイドバーのフィード絞り込みインクリメンタル検索では、ローマ字を入力すると簡易 migemo のような機能によりひらがな、カタカナもローマ字から検索することが可能になっている。

インターフェイス周りの部分は主に<a href="http://ma.la/">最速の中の人</a>が作っている。またサーバサイドとの通信は JSON で行われている。

* 公式リソース
-<a href="http://reader.livedoor.com/" title="livedoor Reader - RSSリーダー">livedoor Reader - RSSリーダー</a>
-<a href="http://blog.livedoor.jp/staff_reader/" title="livedoor Reader 開発日誌 - livedoor Blog(ブログ)">livedoor Reader 開発日誌 - livedoor Blog(ブログ)</a>
-<a href="http://wiki.livedoor.jp/staff_reader/d/FrontPage" title="FrontPage - livedoor Reader まとめサイト - livedoor Wiki(ウィキ)">FrontPage - livedoor Reader まとめサイト - livedoor Wiki(ウィキ)</a>

* API 一覧
http://d.hatena.ne.jp/nTeTs/20060422/1145637483

* Tips
** 人を喋らせる
>||
javascript:window.message('hello world!');
||<

* 裏技
**キーボードショートカット
- shift + z
- (shift + z) * 2

** オートスクロール
- ▼をshift + クリック
- shift + クリック連打でどんどん高速に

** 記事の表示を逆順にする
- ▲をshift + クリック
- shift + クリックで「新→古」「古→新」のトグル動作

** イースターエッグ
- 上の人を11回クリックすると…

** vi モード
コロン ":" 押下により、vi モード突入。中の人の吹き出しにコマンドを入力できる。また、greasemonkey スクリプトにより、容易にカスタムコマンドを登録可能(:qa! で全既読化するとか。とはいえ当然 vi っぽいコマンド名である必要はない)。この機能は、後述の PlaggerLDR においても、重要な役割を果たしていたりする。
現在実装されているコマンドは以下の通り。
-:q (中の人を消す)
-:[0-5] (レートを変更。たとえば ":5" で、いま展開されているフィードのレートを 5 にする)
カスタムコマンドを作成したら、下記のテンプレを用いて、共有しましょう。
またこの Greasemonkey は http://lab.rails2u.com/misc/ldr_keyword_gm.user.js からインストールできるかもしれませんでした。
>||
// ==UserScript==
// @name          LDR Vi Commands
// @namespace     http://d.hatena.ne.jp/keyword/livedoor%20Reader
// @include       http://reader.livedoor.com/reader/*
// ==/UserScript==

(function(){
    var w = unsafeWindow;
    with (w) {
||<

*** // :qa! - 全フィードを既読化 by id:antipop
>||
        vi['qa!'] = function () {
             var api = new API('/api/subs?unread=1');
             api.post({}, function (subs) {
                 subs.forEach(function (i) {
                     touch_all(i.subscribe_id);
                 });
            });
        };
||<

*** // :sub - rss フィードを登録 (スペース区切りで複数指定可) by id:reinyannyan
>||
        vi.sub = function () {
          var i = 0;
          var q = new Queue;
          q.interval = 500;
          Array.from(arguments).forEach(function (url) {
            q.push(function () {
              (new API("/api/feed/discover")).post({ url: url }, function (list) {
                if (list.length) {
                  var item = list.sort_by("subscribers_count")[0];
                  if (!item.subscribe_id) {
                    var feedlink = item.feedlink;
                    (new API("/api/feed/subscribe")).post({ feedlink: feedlink },
                                                          function (res) {
                      feedlink2id[feedlink] = res.subscribe_id;
                      message(++i + '\u4ef6\u767b\u9332\u3057\u307e\u3057\u305f');

                    });
                  }
                }
              });
            });
          });
          q.push(function () {
            subs.update(true);
          });
          q.exec();
          message('\u767b\u9332\u4e2d...');
        };
||<

*** // :mt DIRNAME - 既存のディレクトリ DIRNAME へ現在のフィードを移動 by id:reinyannyan
>||
        register_command("mt|moveto", function (folder) {
          if (State.now_reading)
            Control.move_to(folder);
        });
||<

*** // :mkdir DIRNAME - 新規ディレクトリ DIRNAME を作成 by id:reinyannyan
>||
        register_command("mkdir", function (folder) {
          create_folder(folder);
        });
||<

*** // :ruby RUBY-EXPRESSION - ruby シェル by id:reinyannyan
>||
        register_command("irb|ruby", function() {
          var self = arguments.callee;
          if (!self.gen_param)
            self.gen_param = function (args) {
              var cmd, headers, onload;
              if (self.sess) {
                cmd = encodeURIComponent(w.Array.from(args).join(" "));
                headers = {
                  Cookie: ["_session_id", self.sess
                              ].map(encodeURIComponent).join("=")
                };
                onload = function(res) {
                  message(res.responseText);
                };
              }
              else {
                cmd = "!INIT!IRB!";
                onload = function(res) {
                  self.sess = res.responseText;
                  self.apply(null, args);
                };
              }
              return {
                method: "GET",
                url: "http://tryruby.hobix.com/irb?cmd=" + cmd,
                headers: headers,
                onload: onload
              };
            };

          message("..");
          GM_xmlhttpRequest(self.gen_param(arguments));
        });
||<

*** // ↑ここにコマンドを追加(この行は削除しないでください)

>||
    }
})();
// == end == ←削除しないで下さい。
||<

新しくコマンドを追加する場合は、編集画面内のtextareaから以下のテンプレをコピーしてコードを入力した後、上にペーストしてください。

*** // コマンド名 - コマンドの説明
>||
コマンドの実装
||<

* ユーティリティー関数一覧 (開発者向け)

** register_command

vi コマンドを追加。

文法:
>||
register_command(command_name, function)
||<
command_name は "|" 区切りで複数指定可能。

例:
>||
register_command("h!|help!", message.curry("Don't panic!"));
||<

** LDR_addStyle

スタイルシートに新しいルールを追加。

文法:
>||
LDR_addStyle(selector, style)
||<
style は文字列または配列

例:
>||
LDR_addStyle("div.body", "word-break: normal!important;"); // 英語ブログを読みやすく
||<

*Firefox での拡張・変更
** GreaseMonkey
-SBMとの連携
--<a href='http://tokyoenvious.xrea.jp/b/web/livedoor_reader_meets_hatebu.html'>はてブの被ぶくま数を表示</a>(今は使えない)
---<a href='http://d.hatena.ne.jp/tnx/20060716/1152998347'>はてブの被ぶくま数を表示(画像API)</a>(今は使えない)
---<a href='http://la.ma.la/blog/diary_200610182325.htm'>エントリごとにはてなブックマークの件数表示</a>(上記2つは今は使えないようなのでこちらを使いましょう)
--<a href="http://d.hatena.ne.jp/aki77/20060601/1149184418">livedoor Readerにはてブコメントを表示</a>
--<a href="http://mae.deep.am/2006/05/livedoorreadersbm.html">livedoorReaderから、ショートカットキー一発ではてブと delicious へ同時ポスト</a>
---<a href='http://d.hatena.ne.jp/antipop/20060427/1146067330'>ショートカットキー一発ではてなブックマークにポスト</a>
---<a href='http://susu.whitesnow.jp/note/coding/060428-ldr2sbm.html'>ショートカットキー一発ではてなブックマークとdel.icio.usにぶくま</a>
--<a href="http://d.hatena.ne.jp/arikui/20060519#1147964613">MMへポストする画面を開く</a>
--<a href="http://d.hatena.ne.jp/teramako/20061030/p1">sbmCommentsViewerForLDR</a>(はてな,del.icio.us,livedoorReader,ECナビのコメントを表示)

-他サービスとの連携(SBM以外)
--<a href="http://tokyoenvious.xrea.jp/b/web/hatena_diary_comment_from_ldr.html">livedoor Readerからはてなダイアリーにコメントする</a>
--<a href="http://d.hatena.ne.jp/antipop/20060531/1149075430">LDR 内に YouTube のプレイヤを展開、動画を観られるようにする</a>
----<a href="http://d.hatena.ne.jp/antipop/20060603/1149314071">↑の改良版: YouTube Anywhere

-ショートカットキーカスタマイズ
--<a href="http://la.ma.la/blog/diary_200604261407.htm">livedoor Readerのショートカットキーをカスタマイズ</a>
--<a href="http://la.ma.la/blog/diary_200605010152.htm">マウスホイールで前後フィードに移動</a>

-ピン関連
--<a href="http://la.ma.la/blog/diary_200605070200.htm">ピンをGoogle Bookmarksに保存</a>
--<del><a href="http://d.hatena.ne.jp/antipop/20060504/1146730450">ピンの状態をローカルマシンに保存</a></del>(ピンの状態をサーバに保存する機能が追加されました)

-その他
--<a href="http://d.hatena.ne.jp/antipop/20060702/1151780210">フィードの履歴を遡れるようにする</a>
-エクストリーム系
--<a href="http://d.hatena.ne.jp/m4i/20060514/1147553562">livedoor Reader で EntryFullText</a>

-裏技系
--<a href="http://d.hatena.ne.jp/antipop/20060430/1146343265">livedoor Reader をより快適にするかもしれない、ちょい「<ruby><rb>不良</rb><rp>(</rp><rt>ワル</rt><rp>)</rp></ruby>」 greasemonkey スクリプト</a>

**CSS
- <a href='http://unknownplace.org/memo/2006/04/20#e001'>CLON - 2006/04/20</a> ( header, footer, ad を消す )

* ブックマークレット
-<a href="http://d.hatena.ne.jp/reinyannyan/20060501/p1">livedoor Reader からはてなブックマークに登録</a>
-<a href="http://d.hatena.ne.jp/reinyannyan/20060507/p2">livedoor Reader を一発で全画面表示にするブックマークレット</a>
-<a href="http://d.hatena.ne.jp/reinyannyan/20060511/p1">livedoor Reader のホットキーをカスタマイズするブックマークレット</a>
-<a href="http://d.hatena.ne.jp/reinyannyan/20060515/p1">livedoor Reader から直接はてなフォトライフに投票するブックマークレット</a>
-<a href="http://neotokio.blog10.fc2.com/blog-entry-37.html">livedoor Readerのピンのリスト出力ページの機能を拡張するブックマークレット</a>

* PlaggerLDR
LDR 互換 API の実装、greasemonkey スクリプトによる使用 API の切り替え(LDR 本家、互換 API 他)、クロスドメインリクエストの組み合わせにより、LDR の UI を Plagger のフロントエンドにしてしまおうってな激烈にステキなプロジェクト。miyagawa 氏を中心とする Plagger Authors による。
-<a href="http://subtech.g.hatena.ne.jp/miyagawa/20060509/1147150987">Bulknews::Subtech - [Plagger] Livedoor Reader Frontend</a>

* バナー
-<a href="http://reader.livedoor.com/publish/banner/">公式バナー</a>
-<a href="http://phpspot.org/blog/archives/2006/06/livedoorreader.html">phpspot開発日誌版</a>

* その他関連性がありそうなモノ
- Plagger
- LDR