
BitTorrentのDHTを使用した分散型フィード。アイデアはArvidとThe_8472の「DHT RSS feeds」http://libtorrent.org/dht_rss.html から。
BitTorrentのDHTを使用した分散型フィード。ArvidとThe_8472のアイデア「DHT RSSフィード」http://libtorrent.org/dht_rss.html
BitTorrentのDHTは、おそらくインターネット上で最も耐障害性が高く、検閲耐性のあるネットワークの一つです。PeerTweetはこのネットワークを使用して、ユーザーがツイートを聞いている誰にでもブロードキャストできるようにします。PeerTweetを起動すると、@33cwte8iwWn7uhtj9MKCs4q5Ax7Bのようなハッシュが生成されます。これはTwitterのユーザー名(例:@lmatteis)に似ています。違いは、投稿内容を完全に制御できることです。そのアドレスに関連付けられた秘密鍵を自分だけが所有しているからです。さらに、DHTのおかげで、投稿を政府や機関によって止められることはありません。
信頼できる(スパムでない)他のPeerTweetアドレスを見つけたら、フォローできます。これにより、クライアントはそのユーザーのツイートを保存し、時々DHTに再ブロードキャストしてフィードを生かし続けるように設定されます。このフォローによる協力により、フィードはDHTネットワーク上で存続できます。PeerTweetプロトコルは、私はちょうど@919c..をフォローしました や 私はちょうど@9139..をいいねしました、私はちょうど@5789..をリツイートしましたなどのアクションも公開します。これにより、新しいユーザーが信頼できる他のアドレスを見つけることが可能になります。もし私がユーザー@6749..を信頼していて、そのユーザーが@9801..をフォローしているなら、@9801..をスパムではないとマークできるかもしれません。このようにアクションを公開ツイートするアイデアは、将来このソーシャルグラフの強力なクロール分析を可能にします。
PeerTweetは、DHT RSSフィード提案(http://libtorrent.org/dht_rss.html) で提供されている実装ガイドラインのほとんどに従っています。現在のBEP44提案の上に実装されており、DHTネットワーク上でget()とput()機能を提供します。つまり、DHTを現在ダウンロード中のトレントを通知するためだけでなく、少量のデータ(約1000バイト)のputとgetにも使用できるということです。
PeerTweetは2種類のアイテムを区別します:
@lmattesハンドルに類似)。フィードヘッドはおおよそ以下のように構造化されています:{
"d": <unsigned int of minutes passed from epoch until head was modified>,
"next": <up to 80 bytes of the next 4 items in the feed, directly 1,2,3 and 4 hops away. 20 bytes each.>,
"n": <utf8 name of the feed>,
"a": <utf8 http url of an image to render as your avatar>,
"i": <utf8 description of your feed>
}
{
"d": <unsigned int of minutes passed from epoch until when item was created>,
"next": <up to 80 bytes of the next 4 items in the feed, 1, 2, 4 and 8 hops away. 20 bytes each.>,
"t": <utf8 contents of your tweet. up to 140 chars>
}
アイテムがリスト内の他のアイテムへの複数のポインタを持つ理由は、並列ルックアップを可能にするためです。私たちのスキップリスト実装は通常の実装とは異なり、ネットワークルックアップに特化しており、各アイテムは4つのポインタを含みます。そのため、アイテムを受け取ったときに、リスト内の他のアイテムに対して4つのget()リクエストを並列に発行できます。これは、DHTルックアップの応答時間が予測不可能なため、ユーザーのフィードにタイムリーにアクセスするために重要です。
誰かをフォローすると、基本的にクライアントにその人のフィードをダウンロードし、定期的に再公開するように指示することになります。DHTネットワークは永続的ではなく、アイテムは約30分でネットワークからすぐに消えます。フィードを存続させるためには、多くのフォロワーを持つことが重要です。そうでなければ、どこかで24時間稼働するサーバーを用意し、30分ごとにアイテムを再公開してフィードを維持することもできます。
依存関係をインストールします。
$ npm install
アプリにはいくつかのネイティブバインディングが付属しています。私のコンピュータで動作させるために以下のコードを使用しました:
Source: https://github.com/atom/electron/blob/master/docs/tutorial/using-native-node-modules.md
npm install --save-dev electron-rebuild
# Every time you run "npm install", run this
./node_modules/.bin/electron-rebuild
# On Windows if you have trouble, try:
.\node_modules\.bin\electron-rebuild.cmd
Windowsでed25519-supercopを動作させるには、node-gypと、node-gypが必要とするPython2.7やVisual Studioの関連ファイルもすべてインストールする必要がありました: https://github.com/nodejs/node-gyp
次に、Windowsでビルドするために以下のコマンドを実行します:
npm install -g node-gyp
cd ./node_modules/ed25519-supercop/
HOME=~/.electron-gyp node-gyp rebuild --target=0.36.9 --arch=x64 --dist-url=https://atom.io/download/atom-shell
2つのコマンドを__同時に__別々のコンソールタブで実行します。
$ npm run hot-server
$ npm run start-hot
注:Nodeバージョン4以上、npmバージョン2以上が必要です。
詳細はelectron-debugを参照してください。
詳細はredux-devtools-dock-monitorを参照してください。
webpackでビルドできないサードパーティライブラリを使用する場合は、webpack.config.base.jsにリストする必要があります:
externals: [
// put your node 3rd party libraries which can't be built with webpack here (mysql, mongodb, and so on..)
]
その行はファイル内にあります。
CSSファイルをcss-modulesとして.module.cssを使用してインポートします。
$ npm run package
すべてのプラットフォーム用にアプリをパッケージングするには:
$ npm run package-all
electron-packagerを使用して、--allオプションでダーウィン(OS X)、Linux、Win32(Windows)プラットフォーム向けにアプリをパッケージングします。ビルド後、releaseフォルダにそれらが見つかります。そうでなければ、自分のOS用のものだけが見つかります。
test、tools、releaseフォルダおよびpackage.jsonのdevDependenciesはデフォルトで無視されます。
アプリケーションサイズ削減のために、いくつかのモジュールのpeerDependenciesをデフォルトで無視オプションに追加しています。
babel-core is required by babel-loader and its size is ~19 MBnode-libs-browser is required by webpack and its size is ~3MB.注: 上記のモジュールをランタイムで使用したい場合(例:
require('babel/register'))、それらをdevDependenciesからdependenciesに移動する必要があります。
詳細は非WindowsプラットフォームからのWindowsアプリのビルドを参照してください。
ネイティブ風のユーザーインターフェース(OS X El CapitanおよびWindows 10)を希望する場合、react-desktopが最適かもしれません。
これはhttps://github.com/chentsulin/electron-react-boilerplateプロジェクトのフォークです。
MIT