o2on改造版のRelease Notesなど

現在できること:
	・専用ブラウザに読み込み用PROXYとして設定し、受信したdatをキャッシュ化
	・Chat用ノードをもらってきて設定するとChat用P2Pネットワークを形成し、
		みんなで「ぬるぽ」「ガッ」などの会話を楽しむことができる。
	・http://127.0.0.1:50000/にアクセスして何かを見ることができるかもしれない

まだできないこと:
	・datの共有

Variables:
Global
	o2on version: <!--$ver$-->
	Chat active connections: <!--$chat_connections$-->
	Chat all nodes: <!--$chat_nodes$-->
	/chat
		Chat messages: <!--$chat_messages$-->
		/chat/res.html
			Chat name: <!--$chat_name$-->
			Chat time: <!--$chat_time$-->
			Chat message: <!--$chat_msg$-->

Known Bugs:
	なんか終了が遅い
	○P2PChat
		・自分に接続してしまう
		・ノード情報生成がなんかおかしい
	○P2P(dat共有)

Done:
	・zlib更新
	・fasthashライブラリはアセンブラ版を使うように
	・chunked encoding のときにgzip解凍に失敗してしまうのを修正(頭の1Byteが削られてた)
	・NodeInfoは接続開始時にdecPriority、接続成功時にincPriority
	・8MB超えたら解凍を中止
	・ノードは100→80に圧縮だったかな？
	・Method: メソッド名\r\nContent-Length: 長さ\r\n\r\nXMLを投げるように変更した

ToDo:
○Temp
proxyはサニタイズしないとdoe以外で悲惨なことに?

・application/xhtml+xml

・ChatProcessorの変なインターフェースを…

・debug.cpp, .h を削る
・例外安全でないdtorを
・コンストラクタ呼び出しは T hoge = geho; に統一

・キーからノードを取り出して追加

wikiはキーを投げずにこちらから検索しに行く
・自分につながったら切って接続優先度を最低に

・自分自身につながせないスマートな方法を考える

・起動直後は全ノード firewalled。外部からの接続を検出した段階で firewalled = false に

自ノード←―→B(他o2onノード)

class Key {
	string guid;
	unsigned long addr;
	unsigned short port;
	bool firewalled;// デフォルトでfalse
	//以下省略
};


・自分がキャッシュを保持しているキーは各ノード addr=127.0.0.1, port=自port として保持しておく。
・キー交換時に自分が firewalled かどうかも相手に教える。

・B(nodeB)からキー(key)が入ってきたとき、
	if (key.addr == 127.0.0.1) {
		key.addr = nodeB.addr;
		// port そのまま
		key.firewalled = nodeB.firewalled;
	} else {
		// addr, port そのまま
		key.firewalled = false;
	}
	keys.insert(key);

・B(nodeB)にキー(key)を投げるとき、
	if (key.addr != nodeB.addr) {
		Key tmp = key;
		if (tmp.firewalled || rand() % 100 == 0) {
			tmp.addr = 127.0.0.1;
			tmp.port = myPort;
		}
		sendkey(tmp);
	} else {
		// 投げない
	}


//デバッグモード時以外は127.0.0.1に繋がらないようにする
proxy以外のthreadをIDLEで実行するオプション
・規定値まで同じキーがたまらないときは無視とか、
	実際にキャッシュをとりにいってキーロストの場合はキー削除とか(IPを偽装したキー対策)、
	指定した信頼するノードから自動でNGノードを持ってくるとか…
・場合によってはKeepAliveに対応しないと…。

・chatGUI抹消
・Firewalled 検出機構
・protocol version を見て場合によっては切断
・ノードが一つずつDSA鍵を持っておいて、普通のキーとは別に署名付きキーを投げられるようにする。
	あらかじめ信頼するノードしないノードを設定しておいて、キーに優先順位をつけるとか…
	キーを捏造警告に読み替えてもいいかな

・IDをサニタイズしてない件について(そもそもIDはまだ実装されてないが)
・GUIをすべて捨てブラウザから操作したい
・同一IPでport違いのノードを別のものとして認識させる？(微妙)
・HEADを投げるときはAccept-Encoding: gzipはつけたらいけないらしい

	○P2P(dat交換部分)
		・302を返した時だけで取得する暫定版を作る
		・というか、キー交換実験に取り掛かる？
		・いったんHEADをなげてsizeとlastModifiedをもらって来る方針で？
			↑本スレで議論が展開されると思われ。まとまるまで待ちまつ(･∀･)
				↑議論がされて無い気がしますが
	○Proxy
		・失敗時に何かレスポンスを返す
		・キャッシュをblowfishか何かで暗号化
	○P2PChat
		・IDを導入。DSAかなんかの公開鍵(寿命1日)を投げておいてそれで署名するとかで実現可？
		・ID指定でNG機能。NGにされたらそのIDの発言は破棄されネットワークにも流されない。
			接続中のノードの半数以上からNG要請が流れてきたら自分もそのIDをNGにしたりする。
			NGは伝播して行きネットワークから荒らしを自動で排除可能か？
			問題は公開鍵をいっぱい投げて一人で複数人を騙りつつ荒らされるとか
			(荒らしも鍵を複数保持しておかないと投稿できないので自演数に限界あり)
			(鍵だけをせっせと連投する荒らしが考えられるが…)
		・チャット設定(ポート番号、ノード追加等)ダイアログを別に付ける
		・人が増える→部屋で分ける(IRCみたいな？)
		・ID実験
	○P2Pwiki
		・とか面白いかも(某ソフトのパkうわおまえなにすrやめrくぁすぇdrftgyふじこlp;@:｢｣)
		・未来の投稿が流れてきたら破棄
		・荒らしがかなり日付の古い投稿を流してきてもwiki上では最新の物しか表示されないからok?
		・まとめサイトなんかに使えるんじゃないかと妄想
		・wiki毎に管理鍵を作る
		・wikiのguidは鍵のfingerprintを使う
		・timeはすべてUTCで
		・1000post, 512KBで制限
		・仮のものです
			<wiki>
				<fingerprint or guid></fingerprint or guid>
				<key>DSA public key...</key>
				<lastmodified>lastmodified...</lastmodified>
				<msgs>
					<signed sign="DSA sign...">
						<time>time of admin update</time>
						<msg page="hoge/geho" time="time...">......</msg>
						...
					</signed>
					<nonsigned>
						<msg page="hoge/geho" time="time...">......</msg>
						...
					</nonsigned>
				</msgs>
			</wiki>
		・handshake時に時間を投げさせあまりにもずれていたら切断

Release Notes:
2004-10-24 ver. 0.13a
	・<script type="text/JavaScript" src="script.js" charset="UTF-8"/>
		をIEが正しく認識してくれないので対策
	・substrの使い方が間違っていてIEからchatを投稿できなかったのを修正

2004-10-24 ver. 0.13
	・POSTを実装してブラウザからchatを閲覧投稿可能に

2004-10-21 ver. 0.12
	・3分おきにchatノードを投げるように
	・終了時に落ちるのを修正
	・http://127.0.0.1:50000/のほうは毎回HDから読み込むのではなくメモリ上にキャッシュするようにした。
		キャッシュをクリアしたいときはhttp://127.0.0.1:50000/reloadにアクセス。
	・chatをブラウザから閲覧可能に
	・SetProcessWorkingSetSizeをはずしてみたりした

2004-10-14 ver. 0.11
	・Chatノードが保存されないバグ修正
	・コンパイル環境を
		VS.net 2002 and VCTK2003 ver.1.01
		STLport-4.6.2
		boost-1.31.0 with regex patch
		に変更(XP SP2 SDKを入れていろいろやってみたけどコンパイル通らなくなったから(汗)元に戻した。
		その名残でソースはinclude調整のために…)
	・Httpサーバをチューニング。abでいじめてパフォーマンスアップを確認(意味あるのか？)
	・おいらが追加した socket.h と socket.cpp をCCのライセンスにしてみたけど、いいのかなぁ…
		(GPLじゃ無いソフトにも使えるように…)

2004-10-11 ver. 0.10
	・キャッシュ削除時の例外を捕まえるようにした
	・ソケット周りを書き直した
	・適当にhttp serverを作った(http://127.0.0.1:50000/とか…)

2004-09-23 ver. 0.03
	・接続に失敗したソケットが消されずに残るバグ修正

2004-09-23 ver. 0.02
	・proxyでファイルを閉じる前に削除して落ちてたのを修正
	・chatでconnectをノンブロッキングに(socket周りは後で書き直しますsocket++使って…)

2004-09-14 ver. 0.01
	・xyzzyの2ch-modeでdatキャッシュが作られないのを修正
	・chatにノードエンコードボタンを設置

2004-09-11
	・Chatポート・自ノードハッシュの確認、新しいノードの追加を簡単にできるようにした

2004-09-10 F99a.q8oVE
	chat.cpp:	Class P2PServent(綴りが正しいかは不明) を作成し chat.cpp を書き直し
				ノード情報を接続した相手からもらうようにした(今のところこちらからは送らない)
					ノード情報を交換する時に投げるXML
						<?xml version="1.0" encoding="Shift_JIS"?>
						<o2on service="chat" type="nodes">
							<node>暗号化されたノード情報</node>
							<node>〃</node>
							〃
						</o2on>

2004-09-08 F99a.q8oVE
	MSXMLを初期化したスレッドで開放していなかったのを修正
	bufferにXMLが詰まるバグ修正

2004-09-07 F99a.q8oVE
	●Chat(β)を実装 (こういう仕様はwikiに書いとかないといけませんな…)
		○chatnode.txtに書かれているノードに接続に行く(ノードの形式はP2Pで使ってるものと同一)
		○使用するポートはデフォルトで7744
		　(iniに "chat_port=ポート" のように指定してやることで変更可)
		○接続数が10になるまで外に繋ぎに行く(今のところ同一ノードに何本も繋がってしまう)
		○外部からの最大接続数は15
		○Timeの横のカッコ内に表示される数値はメッセージが投稿されてから到達するまでにかかった時間
		○メッセージは現在接続中のすべてのノードに向けてTTLをランダムに設定して投げる
		○受け取った側は初めて受信したメッセージであるかGUIDで確認し、画面に表示。
		　そして、TTLを1減らし現在接続されているすべてのノードに投げる。(もちろんTTLが0になると破棄)
		○メッセージを投稿した本人はいったん投げて帰ってきたものを表示し、
		　TTLを減らしまた投げる(ただし初めて受信した物のみ)(要検討)
		○20秒間何も送信していなかった場合はnoopを投げ、30秒間何も受信していなかった場合は切断
		○握手(なぜか一方的(謎))する時に投げるXML
			<?xml version="1.0" encoding="Shift_JIS"?>
			<o2on service="system" type="handshake">
				<protocol name="o2on" ver="0.1"/>
				<client name="o2on" ver="0.1"/>
				<nodeinfo myport="自分のポート"
					yourip="相手のIPAddress(未使用なので細かいことは未定)"/>
			</o2on>
		○メッセージを交換する時に投げるXML
			<?xml version="1.0" encoding="Shift_JIS"?>
			<o2on service="chat" type="message">
				<name>名前</name>
				<message>メッセージ</message>
				<time>メッセージ投稿者の投稿時のlocaltime(sec)</time>
				<guid>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXの形式のGUID</guid>
				<id>reserved</id>
				<sign>reserved</sign>
				<ttl>Time To Live</ttl>
			</o2on>
		○noopのXML
			<?xml version="1.0" encoding="Shift_JIS"?>
			<o2on service="system" type="noop"></o2on>
		○</o2on>が付かない物は受信完了を見分けられないので避けてほすい…
		　(XMLの長さが8KBを超えたら切断とかもあったなぁ…)
		○GUIが作りこまれていないのは仕様です…
		○そしてこれら仕様はすべて暫定の物です

	●iniの形式をちょっと変えた
		○いったん起動して終了してiniをエディタで開いてみると詳細は分かると思います。。。
		○[o2on]以下が新しい形式です

2004-08-24 F99a.q8oVE
	proxy.cpp (proxy_thread):	chunkedで送られてきたデータの処理にバグを
								作ってしまったのを修正

2004-08-22 F99a.q8oVE
	proxy.cpp (proxy_thread):	datファイル以外ならメモリに読み込まないように
								(chunkedは例外)
	socket.cpp (Socket):		portがかぶるとbindに失敗するように変更

2004-08-20 F99a.q8oVE
	o2on.exe.manifest:		New Visual Style用
	socket.cpp:				New 適当ソケットラッパークラス
	socket.h:				New
	proxy.h:				New
	main.h:					New
	p2p.h:					New
	main.cpp (init_app):	Visual Style対応用修正
			 (end_app):		調節, etc...
	p2p.cpp:				Socket Classを使って書き直し等
	proxy.cpp:				Socket Classを使って書き直し。
							キャッシュに書き出すハッシュをSHA-1に変更。
							キー追加部分を変更。

2004-08-09 F99a.q8oVE
	* proxy.cpp (proxy_thread):	キャッシュ破損検出。破損していたら削除
								リクエストヘッダに Connection: close を付加

2004-08-08 F99a.q8oVE
	* proxy.cpp (proxy_thread):	ちゃんとステータスコードを見るようにした
								MD5をキャッシュに書込むようにした

2004-07-31a F99a.q8oVE
	* proxy.cpp (proxy_thread): debug用MessageBoxが残っていたのを除去
								lastModifiedが空の時はキャッシュを作らないように

2004-07-31 F99a.q8oVE
	* proxy.cpp (proxy_thread): subject.txt取得時に落ちるのを応急処置。
								subject.txtに対する処理をコメントアウト。
								datファイルのキャッシュを作成するように
	* main.cpp (main_window_proc): explorerが落ちたときにタスクトレイから復帰

Jul 18, 2004
	P2Pポートへの想定外接続によるバッファオーバーラン対策
	エンコードがchunkedなデータを受信した時に落ちるようになってしまっていたのを修正

Jul 17, 2004
	細かなバグとり
	なんとなく boost::lexical_cast を使ってみた

Jul 15, 2004
	最小化でタスクトレイに入れる
	その他STLPortでDebugモード時でもコンパイルが通るよう修正等

// 以下メモ

#if 0
/if datファイルなら
	キー名生成
	/if キャッシュ読み込み成功
		/if キャッシュに Force Reload Flag がたっていない
			P2Pで取得試行(一定秒でタイムアウト)
		/back
	/else
		P2Pで取得試行(一定秒でタイムアウト)
	/back
	続きを鯖に向けて試行
	/if P2Pで取得成功
		/if 鯖で取得成功
			連結する
			200系を返す
		/else
			/if 416 request range not satisfied
				Force Reload Flag を立てる
				416を返す
			/else
				200系を返す
			/back
		/back
	/else
		鯖のレスポンスをそのまま返す
		ダウンリストにキーを登録
	/back
	クライアントにレスポンス
	/if 200系を返した場合
		ハッシュを計算
		キャッシュファイル作成
		キー追加 or 更新
	/back
/back
#endif

// template <typename T, std::size_t N> std::size_t arraynum( T (&)[N] ){ return N; }

==== VS.net 2002 and VCTK2003 ver.1.01 ============================
VS.netにVCToolkitを上書きしておく
Plathome SDKも入れてpathをいじっておく

==== STLport-4.6.2 ================================================
/srcに移動しvsvars32.bat実行

** stl_user_config.hに **

#ifdef NDEBUG
#undef _STLP_DEBUG
#else
#define _STLP_DEBUG 1
#endif

** を書き込む **

> set MSVCDIR=C:\Program Files\Microsoft Visual Studio .NET\Vc7
> copy vc71.mak makefile

** makefileの該当部分を **

EXTRA_COMMON_FLAGS=/FI "vc_warning_disable.h" /D "_MBCS" /Zc:wchar_t

** に書き換え(/Zc:wchar_tを追加) **

> nmake clean all
> nmake install

Headers C:\Program Files\Microsoft Visual Studio .NET\Vc7\include\stlport
Libs C:\Program Files\Microsoft Visual Studio .NET\Vc7\lib
ファイルがコピーされるのでそれぞれIDEを設定

==== boost-1.31.0 with regex patch ================================
vsvars32.bat実行

> set STLPORT_PATH=L:\libs\STLport-4.6.2\stlport
> set STLPORT_VERSION=4.6.2
> set STLPORT_4.6.2_PATH=L:\libs\STLport-4.6.2
> bjam -sTOOLS=vc7.1-stlport -sVC71_ROOT="C:\Program Files\Microsoft Visual Studio .NET\Vc7" -sBUILD="<native-wchar_t>on" --prefix="C:\Program Files\Microsoft Visual Studio .NET\Vc7" install

Headers C:\Program Files\Microsoft Visual Studio .NET\Vc7\include\boost-1_31\boost
Libs C:\Program Files\Microsoft Visual Studio .NET\Vc7\lib
ファイルがコピーされるのでそれぞれIDEを設定
===================================================================
