最近の更新

関連


その他いろいろ

多機能フィードリーダSynapse製作中

2月までは目が回るほど忙しい

MODxでつくる! 最強のCMSサイト カバー
MODxでつくる! 最強のCMSサイト

Synapse - フィードリーダ

RSS/Atom以外にも柔軟に対応できる省力・多機能フィードリーダ
初出:2007年05/25 更新:2008年10/13

この文書のキーワード: Python, C#, .NET

概要

Synapseは.NET Framework 2.0上で動作する省力・多機能(予定)フィードリーダです。開発中のα版がDL可能です。

主な特徴

screenshot

そろそろ0.1.0βをリリースしようかと思っています。

このページは基本的に最新版について書かれています。また、バージョンアップ直前には未リリースの最新版の内容を含む可能性もあるので注意してください。

実装済みの機能を列挙します。

ごく一般的なフィードリーダとして使うことも、様々な追加オプションを有効にして効率よく使うこともできます。RSSに限らずAtom等様々なフィードや、IronPythonによる擬似フィードを扱うことが出来るので「RSSリーダ」ではなく「フィードリーダ」との名称を用いていますが、本質的には同じようなものです。

SQLiteの閲覧・編集にはSQLite Database Browserが便利です。

設定やデータベースは実行ファイルと同じディレクトリか、Userdata\ユーザ名\以下に保存されます。実行ファイルと同じディレクトリにあるものはユーザ設定に優先します。

開発状況

Synapseは2007年7月現在、開発中です。基本的な部分は8割ほど書き上がっていますが、他のフィードリーダとの差別化を図る部分はほとんど未着手です。バージョンは以下を目安に上げていきます。些細な修正はビルド番号?をインクリメント。

バグはメールや掲示板で教えて貰えると助かります。その際はDebugウィンドウから関係ありそうな部分をコピーしてください。多機能を目指しているので、機能の追加要望もコンセプトに沿えば積極的に受け付けるつもりです。

実装予定の機能/既知の不具合

思いついたままに書き、頻繁に修正されます

次回の更新(0.0.18a)で実装される予定の機能/修正見込みの不具合

スクリーンショット

2ペインビュー3ペインビュー
2pane view 3pane view
フィードエディタ5ペインビュー
2pane view 3pane view
ティッカー表示通知領域
ticker notify icon
拡張セットエディタ
extension set editor

ダウンロード

このアプリケーションの実行には .NET Framework Version 2.0 再頒布可能パッケージ のインストールが必要です。(Windows Vista等で既に3.0が導入されていれば不要)

バージョン/DL日付概要
0.0.17α DL2008 10/13開発版
0.0.16α DL2007 06/30開発版
0.0.15α DL2007 06/23開発版
0.0.14α DL2007 06/22開発版
0.0.13α DL2007 06/20開発版
0.0.12α DL2007 06/16開発版
0.0.11α DL2007 06/12開発版
0.0.10α DL2007 06/11開発版
0.0.9α DL2007 06/11開発版
0.0.8α DL2007 06/10開発版
0.0.7α DL2007 06/09開発版
0.0.6α DL2007 06/08開発版
0.0.5α DL2007 06/08開発版
0.0.4α DL2007 06/07開発版
0.0.3α DL2007 06/05開発版
0.0.2α DL2007 06/03開発版
0.0.1α DL2007 06/02開発版
0.0.0α DL2007 05/30開発版

α版は開発中です。未実装の機能や、不完全な動作をする場合があります。

ショートカットキー

入力用コントロール以外でキーを押すことで、様々な機能にダイレクトにアクセスできます。以下はデフォルトの割り当てですが、変更可能です。

ファンクションキー
最小化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
エントリビュー自動スクロールON9
エントリビュー自動スクロールOFF0
外部ブラウザで開くO
ジャンプキューに追加V→G
ジャンプキューの最後の項目を削除P
ジャンプキューを開くCtrl + O
(グローバルホットキー)Synapseのアクティブ化Alt + 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版

NicoRankingSensor