Synapse - フィードリーダ
概要
Synapseは.NET Framework 2.0上で動作する省力・多機能(予定)フィードリーダです。開発中のα版がDL可能です。
主な特徴
- RSS, Atomは勿論、その他の形式も拡張機能によりスクレイピング。RSS/Atomの全文取得も容易
- 1/2/3ペインビュー
- 頻繁に使う機能はショートカットキーでアクセス(カスタマイズ可)
- 過去記事は保存されるので未読も気兼ねなく放置できる
- IEビューでホイールを回すだけで次々に記事・フィードを送ることができる
- 速度可変の自動スクロール, マウストラッキングで省力操作重視
- 「未読フィードのみ表示」「最近のエントリのみ表示」でスクロール低減
- リンクを溜めて最後にまとめて開くジャンプキュー
- はてブ追加タグ付加、新着メール送信、ティッカー表示などを自由に組み合わせられるIronPython・.NET拡張体系
- 拡張機能の組み合わせをGUIで編集できるエディタ
- 本体(C#部)クローズド、IronPython部オープンのフリーウェア
そろそろ0.1.0βをリリースしようかと思っています。
このページは基本的に最新版について書かれています。また、バージョンアップ直前には未リリースの最新版の内容を含む可能性もあるので注意してください。
実装済みの機能を列挙します。
- 殆どの機能をON/OFF設定可能
- OPMLインポート・エクスポート
- 3ペイン/2ペイン
- データをSQLiteで保存しているため、外部ツールによる操作が容易
- RSS 0.92, 1.0, 2.0/Atom 0.3標準対応に加え、IronPython, .NET, C#による拡張で、全文取得や非フィードの取得(擬似フィード化)も可能。
- ツリービュー、リストビューのItem by Itemスクロール
- 「フィードリスト」「エントリリスト」「エントリビュー」がシームレスに繋がる連続スクロール(ヒステリシス設定可能)
- カーソル移動で表示記事を切り替えるマウストラッキング(遅延設定可)
- エントリリスト/エントリビューの自動スクロール
- 外部リンクを蓄え、一気にブラウザで開くジャンプ・キュー
- 過去記事の保存
- IEコンポーネントビュー(画像表示などに対応、CSS/HTML指定可能)
- UIは英語・日本語両対応、切り替え可能
- リストビューの背景色の変更
- 更新待ち双方向リスト(巡回:優先度低, 手動更新:高)
- アイテム毎スクロールで余裕を持たせたEnsureVisible(可変幅)
- 自動巡回/更新の中止
- Feedのfavicon
- 3ペインの エントリビュー→エントリリスト の連続スクロールで逆方向の場合、前のエントリの最終行まで移動するオプション(IEコンポーネント)
- ブラウザからのD&Dで登録 (フィード/フィードを含むHTMLのURL等)
- If-Modified-Since対応
- 通知領域のバルーン表示
- 更新時のタイムアウト設定
- カスタマイズ可能なショートカットキー
- リストビューのhumane datetime表示
- エントリの検索(本文・タイトル)
- 記事にマーク(マークしても今のところ利用できません)
- フィードリストの「未読のみ表示/すべて表示」
- フィード/グループの簡易並び替え・位置保存
- 拡張を外部ファイルに配置(\Extensions\Sensor 等)
- IronPythonのキャッシュ保持
- Notifierのテスト用のTicker表示
- 暫定的(どのフィード集合の更新をどのNotifierに向けるかの設定が可能になるまで)に更新をすべてのNotifierに通知
- 通知アイコンのコンテキストメニュー
- Ctrl修飾せずaタグクリックすると外部ブラウザで開くオプション
- 外部ブラウザ指定
- 自動スクロールの速度調整トラックバー
- 設定をインポート・エクスポート
- データベース、設定、ショートカットキー設定をユーザごとに管理
- データベースの自動バックアップ(日毎)
- Proxy対応
- TwitterSensor
- Basic認証の必要なRSS/Atomを取得 RSSAtomParserBasicAuth
- 2pane viewで表示エントリ数制限
- はてなブックマーク、del.icio.usに登録するリンクを付加 LinkToOnlineBookmark(Filter)
- IronPython以外の.netアセンブリによる拡張(Synapse.Extensions.dllを参照)
- 入力:出力 N:1でフィルタをつなげる拡張セット
- TickerNotifier(C#)ソース公開
- C#の生ソースコードによる拡張
- グループの開閉を保存
- 記事ビュー全面表示(F12)
- マークされたエントリ一覧, 一括ON/OFF
- 拡張セットGUIエディタ
- 未読+指定件数表示モード
ごく一般的なフィードリーダとして使うことも、様々な追加オプションを有効にして効率よく使うこともできます。RSSに限らずAtom等様々なフィードや、IronPythonによる擬似フィードを扱うことが出来るので「RSSリーダ」ではなく「フィードリーダ」との名称を用いていますが、本質的には同じようなものです。
SQLiteの閲覧・編集にはSQLite Database Browserが便利です。
設定やデータベースは実行ファイルと同じディレクトリか、Userdata\ユーザ名\以下に保存されます。実行ファイルと同じディレクトリにあるものはユーザ設定に優先します。
開発状況
Synapseは2007年7月現在、開発中です。基本的な部分は8割ほど書き上がっていますが、他のフィードリーダとの差別化を図る部分はほとんど未着手です。バージョンは以下を目安に上げていきます。些細な修正はビルド番号?をインクリメント。
- 0.1.0: マウス・キーボード操作周りの整備、フィード/エントリ操作の遅延・高速化
- 0.2.0: IronPython拡張仕様決定
- 1.0.0:
バグはメールや掲示板で教えて貰えると助かります。その際はDebugウィンドウから関係ありそうな部分をコピーしてください。多機能を目指しているので、機能の追加要望もコンセプトに沿えば積極的に受け付けるつもりです。
実装予定の機能/既知の不具合
思いついたままに書き、頻繁に修正されます
- アイコンの考案
- 検索機能の強化(対象フィード、日時等。SQLによる検索)
- キーリピート前のannoyingな時間を排したキー操作
- 通知領域で状態表示(待機中/更新中/新着あり)
- タブオーダの設定
- 未読記事のみを選択するアイテム毎スクロール
- 「未読のみ表示」で未読フィードを含まないグループを隠す
- 検索結果強調表示
- 特定のfavicionの読み込みに失敗する
- faviconやサイト情報取得の別スレッド化、タイムアウト、中止
- 指定HTMLに含まれるすべてのフィードを登録
- フィードごとの更新頻度
- FTPによるlocal.dbの同期
- ジャンプ・キューの保存
- 取得済みエントリをフィルタに掛ける
- 大量のフィードが含まれるグループを選択→長時間待たされる (リストvirtual化で対応予定。それまではオプション→フィードリスト/エントリリスト→子要素の列挙の階層制限 を0や1にしてください)
- タグの利用
- 過去記事との比較(diff)を扱う仕組みを盛り込むか検討中
- 再取得周りのバグ(エントリ二重取得)
- 「未読のみ表示」で既読エントリが表示される
次回の更新(0.0.17a)で実装される予定の機能/修正見込みの不具合
- 「次の未読」操作で未読数が狂う
スクリーンショット
| 2ペインビュー | 3ペインビュー |
|---|---|
| フィードエディタ | 5ペインビュー |
| ティッカー表示 | 通知領域 |
![]() |
|
| 拡張セットエディタ | |
ダウンロード
このアプリケーションの実行には .NET Framework Version 2.0 再頒布可能パッケージ のインストールが必要です。(Windows Vista等で既に3.0が導入されていれば不要)
| バージョン/DL | 日付 | 概要 |
|---|---|---|
| 0.0.16α | 2007 06/30 | 開発版 |
| 0.0.15α | 2007 06/23 | 開発版 |
| 0.0.14α | 2007 06/22 | 開発版 |
| 0.0.13α | 2007 06/20 | 開発版 |
| 0.0.12α | 2007 06/16 | 開発版 |
| 0.0.11α | 2007 06/12 | 開発版 |
| 0.0.10α | 2007 06/11 | 開発版 |
| 0.0.9α | 2007 06/11 | 開発版 |
| 0.0.8α | 2007 06/10 | 開発版 |
| 0.0.7α | 2007 06/09 | 開発版 |
| 0.0.6α | 2007 06/08 | 開発版 |
| 0.0.5α | 2007 06/08 | 開発版 |
| 0.0.4α | 2007 06/07 | 開発版 |
| 0.0.3α | 2007 06/05 | 開発版 |
| 0.0.2α | 2007 06/03 | 開発版 |
| 0.0.1α | 2007 06/02 | 開発版 |
| 0.0.0α | 2007 05/30 | 開発版 |
α版は開発中です。未実装の機能や、不完全な動作をする場合があります。
- DBMigration.exeが含まれる場合、旧バージョンのデータベースファイルをD&Dして移行してください。
- IEコンポーネント表示をする前に、設定画面を一度開いて保存する必要があります
- 初回起動した後、再起動しないとショートカットキーが使えない場合があります
ショートカットキー
入力用コントロール以外でキーを押すことで、様々な機能にダイレクトにアクセスできます。以下はデフォルトの割り当てですが、変更可能です。
| ファンクション | キー |
|---|---|
| 最小化 | Q |
| すべて巡回 | Ctrl + R |
| 更新中止 | Ctrl + Shift + R |
| 検索 | Ctrl + F |
| グループリスト表示トグル | Ctrl + G |
| ジャンプキュー表示トグル | Ctrl + J |
| エントリリスト表示トグル | Ctrl + E |
| スペーサ表示トグル | Ctrl + B |
| 3ペインビュー表示 | 1 |
| 2ペインビュー表示 | 2 |
| フィードエディタ表示 | 3 |
| フィードリスト上(グループ) | A |
| フィードリスト下(グループ) | S |
| フィードリスト上(未読) | Shift + D |
| フィードリスト下(未読) | Shift + F |
| フィードリスト上(フィードのみ) | D |
| フィードリスト下(フィードのみ) | F |
| フィード更新 | R |
| フィード強制更新 | Shift + R |
| 未読のみ表示 | Z |
| すべて表示 | X |
| エントリリスト上 | K |
| エントリリスト下 | J |
| エントリリスト上(既読にしない) | Shift + K |
| エントリリスト下(既読にしない) | Shift + J |
| エントリリスト次の未読 | Space |
| 前のエントリ | Shift + Space [未実装] (不要?) |
| 次のエントリ | Ctrl + Shift + Space [未実装] (不要?) |
| エントリリスト/2ペインビュー 自動スクロールON | 7 |
| エントリリスト/2ペインビュー 自動スクロールOFF | 8 |
| マーク | N |
| マーク解除 | M |
| すべての未読にマーク | Shift + Ctrl + N |
| すべてマーク | Shift + N |
| すべてマーク解除 | Shift + M |
| 記事削除 | Ctrl + Delete |
| 未読にする | BackSpace |
| すべて未読 | U |
| すべて既読 | I |
| 未読を既読より前に表示 | Shift + Z |
| エントリビュー上 | H |
| エントリビュー下 | L |
| エントリビュー自動スクロールON | 9 |
| エントリビュー自動スクロールOFF | 0 |
| 外部ブラウザで開く | O |
| ジャンプキューに追加 | V→G |
| ジャンプキューの最後の項目を削除 | P |
| ジャンプキューを開く | Ctrl + O |
機能・用語の解説、便利な設定
- 連続スクロール (エントリビューをエントリリストに繋げる)
- エントリビューで、限界を超えて下スクロールしようとすると、次のエントリが読み込まれる機能。同様に上スクロールで前の記事につなげることも可能。ヒステリシス設定を0より大きくすると、限界を超えた下スクロールがヒステリシス設定分溜まって初めて次のエントリを読み込むようになります。
- 連続スクロール (エントリリストをフィードリストに繋げる)
- 同様に、エントリリストの限界を超えて下スクロールしようとすると、次のフィードを読み込む機能。上スクロールも同じ。
- ジャンプ・キュー
- あとでまとめて開くURLのリスト。全文表示しないフィードやIEコンポーネント内のリンク等を普段使っているブラウザで開きたいことは多々ありますが、そのたびに外部ブラウザを起動したり、FirefoxユーザなのにIEコンポーネントビューを強制されるのは気分が悪いので実装された機能。ショートカットキーVで現在見ているエントリを追加し、Ctrl+Oでキューに溜まっているURLをまとめて開く。ジャンプ・キューを介さず直接外部ブラウザで開く場合はショートカットキーO. 内部ブラウザのリンクのクリックは、「[Ctrl]修飾でキューに入れる」オプションが有効の場合は[Ctrl]修飾した場合のみキューへ、修飾しない場合は直接外部ブラウザで開きます。同オプションがオフの場合はすべてキューに入ります。
- アイテム毎(item by item)スクロール
- 通常ツリービューやリストビューでスクロールすると、表示領域が移動するだけで選択項目は移動しません。しかしことフィードリーダにおいては、選択項目を変更する目的でスクロールすることが大半です。そこでスクロールの挙動を「次/前のエントリに移動」に変更するのがアイテム毎スクロール。リストビューでは視認性のため、表示領域の端から確保するスペース(余裕/margin)を設定可能。
- 自動スクロール
- エントリリスト、3ペインビューの内部ブラウザ、2ペインビューの内部ブラウザでそれぞれ自動スクロールが可能です。各内部ブラウザではスクロールの速度をビュー横のスライダで調整できます。(上:低速 下:高速) 現状、自動スクロールによる連続スクロールはできませんが、近々対応予定。
- マウストラッキング
- フィードツリー、エントリリストでマウスカーソルを載せただけで選択する機能。フィードツリーで頻繁にリロードが発生したり意図せず既読にしてしまうのを防ぐため、選択するまでの時間を設定可能。
- If-Modified-Since
- フィードの更新要求が発生した場合に、まず更新があるかどうかサーバに確認し、更新されていた場合のみ内容を取得するオプション。更新されていないのにフィードを読み込む無駄が省け、サーバにもトラフィックにもうれしい機能。
- 「未読のみ表示」「すべて表示」
- ショートカットキーZ/X、あるいはフィードツリーのツールバーで切り替え可能。「未読のみ表示」では、未読フィード以外は隠されるので大量に登録している方でもストレスなく閲覧できます。
- OPMLインポート・エクスポート
- 他のフィードリーダとフィードリストの授受をする際の標準的なフォーマット、OPMLを取り込んだり吐き出したりできます。現時点では、Synapse固有の設定情報(パーサなど)はOPMLに含まれません。
- ブラウザからドラッグ&ドロップで追加
- 「フィードのURL」「フィードのURLをlink alternate要素に含むウェブページのURL」を挿入したいフィードグループにドロップすると、簡単に登録できます。FirefoxやIEのアドレスバー、リンク文字列(RSS, RDF, Atomアイコン含)、Firefoxのタブなど、広範に対応。
- SQLite3
- SynapseではフィードやエントリをSQLite3で管理しています。
- favicon
- ウェブサイトを象徴する16x16の小さなアイコン。フィードのリンク先を調べ、meta shortcut icon要素があればそれを、なければfavicon.icoを、それでもなければフィードのドメイン直下のfavicon.icoを探すので、feedburner等を用いても比較的正確に検出できます。場合によっては存在しても読み込めないfaviconがあるようで、現在調査中です。
- Humane datetime
- 人間にわかりやすい日付の表示。エントリの更新時刻表示で「3時間前」や「5日前」のように表示します。オプションで多少設定できるようにする予定。
- 巡回
- Synapseでは、すべてのフィードの更新チェックを「巡回」、単独あるいは複数のフィードの更新チェックを「更新」と呼んでいます。巡回中でも、フィードのダブルクリックやショートカットキーRで選択フィードを更新出来、これは通常の巡回に割り込んで処理されます。「更新の抑止」ではこの更新待ちリストをクリアし、新たな更新要求がきても無視するようにします。自動巡回のカウンタも止まりますが、リセットはされません。
- ビューアの余白(スペーサ)
- リストビューは幅を広く取りたいが、エントリビューは視点の移動を低減するため幅を抑えたい場合に使用します。ある程度開いておいてCtrl+BでON/OFFを切り替えると便利です。
- 設定の保存場所
- 保存場所は実行ファイルと同じディレクトリか、\Userdata\ユーザ名\以下です。実行ファイルと同じディレクトリに設定ファイルがあれば、常にユーザ設定に優先して使用され、マスター設定が無い場合のみユーザ設定が適用されます。どちらも存在しない場合はユーザ設定が作成されます。
- 拡張セット
- フィード(グループ含)をフィルタに通す手順を書いたxml. オプション»拡張»拡張セットGUIエディタ で編集できます。
- IronPythonによる拡張
- 下に詳しい説明があります。
IronPython, .NET, C#による拡張
Synapseでは、IronPythonスクリプトやその他の.NETアセンブリ、C#のソースコードによる各種の拡張が可能です。正式リリースまでに仕様が変更になる可能性が高いので、実用のために拡張を作ることはまだお勧めしません。
拡張はデフォルトでExtensions以下の親クラスごとのディレクトリ(Sensor, Filter等)に置きます。ファイル名は拡張クラスと同じ名前(case sensitive)で、拡張子はIronPythonなら.py、.NETアセンブリなら.dll、C#コードなら.csとなり、.NETやC#の場合の名前空間は任意です。
Console.WriteLine等はDebugウィンドウに出力されます。(printは使えません)
IronPythonスクリプトではimport Synapse.Extensionsするだけで拡張基本クラスが使えますが、.NETアセンブリを作成する際はSynapse.Extensions.dllを参照に追加し、using Synapse.Extensions;してください。原理的にはC#.NET, VB.NET, C++.NET等で作成できるはずですが、C#でしか確認していません。
Synapse.Extensions.Miscに便利な関数群、Synapse.Extensions.SynapseMainBridgeに本体操作用のデリゲートが含まれています。
詳しくは同梱のソース(Extensions.cs)を見てください。
IronPythonでプロパティのoverrideって出来るんでしょうか…ここを見ると言語としてプロパティをoverrideすることは出来ないようですが…(self.PROP = property(....)は失敗しました)
Sensor
標準のRSSAtomParserを含め、フィードパーサは全てSensorインターフェイスを継承します。
また、RSSAtomParserを継承することもできます。(BeginParseでフィードを内部xmlに取得しFeed情報を抽出、GetEntriesで各エントリをパース。リクエスト生成にHttpWebRequest CreateRequest(string url)メソッドを使用しているので、オーバーライドすることでBasic認証を通したりできます)
Filter
更新前にインスタンスが生成され、BeginInvokeProcess、更新によりエントリがフィードに追加されるとProcessFeed, 次いで各エントリに対してProcessEntry, 更新終了でEndInvokeProcessが呼ばれます。
ProcessFeed, ProcessEntryでfalseを返すと、そのフィード/エントリは無視されます。
feedやentryの変更は次の処理に反映されます。
FilterConfiguration
拡張セットエディタの「フィルタ」タブと拡張セットxmlの属性値の読み込み・保管を担当します。FilterのGetFilterConfigurationで生成されますが、nullを返すことでデフォルト(属性値を単に保持)のDefaultFilterConfigurationが使用されます。継承する場合は、xmlの属性が格納された辞書を管理する必要があることに注意してください。
C#による拡張の例: RemoveAdsCSharp.cs
ビルドしてRemoveAdsCSharp.dllとして使うことも、そのままExtensions\Filterに入れて使うこともできます。
using System;
using System.Text.RegularExpressions;
using Synapse.Extensions;
namespace RemoveAdsCSharp.Extension {
public class RemoveAdsCSharp : Filter {
Regex re;
public RemoveAdsCSharp()
: base() {
re = new Regex(@"^(AD|PR):");
}
protected override void BeginInvokeProcess() {
Console.WriteLine("RemoveAdsCSharp BeginInvokeProcess");
}
protected override void EndInvokeProcess() {
Console.WriteLine("RemoveAdsCSharp EndInvokeProcess");
}
public override bool ProcessEntry(Entry entry) {
Match m = re.Match(entry.Title);
return !m.Success;
}
}
}
拡張セットの記述
Filterをつなげるには、xmlで拡張セットを(\ExtensionSets直下)に記述します。
オプション»拡張»拡張セットGUIエディタで手軽に編集することができます。
<?xml version="1.0" encoding="utf-8"?>
<extensions>
<EMailNotifier preprocess="SEND_TO='mail@example.com'" SEND_FROM="'sendfrom@example.com'">
<PlainText>
<TestNotifier>
<feed id="4" />
<feed id="5" />
<group id="12" />
</TestNotifier>
</PlainText>
</EMailNotifier>
</extensions>
extension要素の中にFilterの子クラスを並べ、それぞれのFilterには別のFilterかfeed要素、group要素、global要素を書きます。上の例では、id=4とid=5のフィードとid=12のグループ(フォルダ)以下の全フィードの更新がTestNotifier, PlainText, EMainNotifierに順次渡されます。globalは特殊なfeedで、すべてのフィードの更新に対応します。尚、一つのxml中にfeed/groupとglobalが混在する場合、globalの意味は「同xmlファイルでfeed/groupタグで出現しないIDをもつフィードすべて」です。IronPython拡張のFilter要素限定で、preprocess属性にPythonコードを書くことができます。これはBeginInvokeProcessの前に毎回実行されます。また、preprocess以外の名前の属性はそのままグローバル変数として定義されます。
まだC#, .NET拡張にはpreprocessを渡せませんが、今後何らかの形で対応します。
Synapse本体の更新もFilterを継承したReturnクラスによって行われているため、以下のようにglobalがReturnに渡されるような拡張セットを記述する必要があります。
<?xml version="1.0" encoding="utf-8"?>
<extensions>
<Return>
<LinkToOnlineBookmark BOOKMARKS="'hatena',">
<RemoveHTMLTags>
<AddBaseTag>
<global />
</AddBaseTag>
</RemoveHTMLTags>
<LinkToOnlineBookmark>
</Return>
</extensions>
各Filter要素の属性値はそのままPythonに渡されるので、文字列の場合 ARGUMENT="'string'"のようにクオートが必要になります。
同梱の拡張機能
RSSAtomParser (Sensor, C#)
デフォルトのパーサ。RSS 0.92, 1.0, 2.0 / Atom 0.3に対応。
RSSAtomParserBasicAuth (Sensor, 0.0.14a)
BASIC認証が必要なRSS/Atomに対応
EntryFullTextRegex (Sensor, 0.0.13a)
RSSAtomParserを継承し、正規表現による全文抽出を行う。
GeneralSmartFeed (Sensor)
エントリへのリンク一覧、エントリをそれぞれ正規表現で抽出する。
Return (Filter, C#)
更新エントリをSynapse本体に渡し、DBに保存・表示する
Ticker Notifier (Filter, C#, オープンソース:BSDL)
巡回や更新で新着エントリが検出されると表示されるウィンドウです。Closeを押すことで、それまでに溜まったエントリをすべてクリアして閉じることができます。ウィンドウの内側をドラッグすることで位置を移動でき、次回から同じ場所に表示されます。ソース同梱
設定は右クリックで現れるコンテキストメニューから。
Test Notifier (Filter)
新着のフィードタイトル、エントリのタイトルをDebugウィンドウに表示するだけの単純なものです。IronPythonでFilterを作る際の参考にしてください。
EMail Notifier (Filter)
新着エントリをメール送信
Remove Ads (Filter)
AD:で始まるエントリ(大概は広告)を削除、本文中のRSS Adを削除
Remove Ads CSharp (Filter)
AD:で始まるエントリ(大概は広告)を削除。C#による外部拡張
Remove HTML Tags (Filter)
script, iframeタグを除去
Add Base Tag (Filter)
baseタグを追加
nl2br (Filter)
改行を<br />に変換
PlainText (Filter)
すべてのHTMLタグを削除
LinkToOnlineBookmark (Filter)
はてなブックマーク、del.icio.usに登録するタグを付加
その他の拡張機能
NicoRankingSensor (Sensor, C#, オープンソース:BSDL)
ニコニコ動画の各種ランキングページを取得するSensor. クッキーをブラウザから手動で抜き出して
user_session=user_session_?????_???????????????;のような形式でテキストファイルに格納したものを使用します。20070701版

