■+mod+mod 変更点
dmc，いわゆる1.5GB再エンコード仕様の動画とHTML5プレイヤーに対応．
Java 7以降が必要です．最新のJava環境での利用を推奨します．


NicoCache_nl+150304mod+170315mod2 (Patch Release)

不具合修正:
・不適切なエラーメッセージを除去してエラー発生箇所に適切なエラーメッセージを追加


NicoCache_nl+150304mod+170315mod (Patch Release)

機能追加:
・GetThumbInfoに対してAPI経由で不正なリクエストが発生しないようにチェックを追加

不具合修正:
・★HTML5プレイヤーでdmc動画のエコノミー判定に失敗していたのを修正
　(NicoCache_nl+150304mod+170226mod以降すべて非エコノミーとして扱われていた)
　音声のビットレート([a,b,c]のc)が64kbpsになっているものはエコノミーの可能性があります．
・再エンコードされた非dmc動画を不必要にキャッシュしないように(thx.NicoCache20>>435)


NicoCache_nl+150304mod+170226mod (Patch Release)

機能追加:
・data-api-data構造変更によりdmc動画のエコノミー判定が正確に行えるようになった

不具合修正:
・smidと動画サーバ上のIDが違う場合の処理がHTML5版のwatchページで
　動作していなかったのを修正(thx.NicoCache20>>424)
・2017/2/23のdata-api-data構造変更に対応
・eco=1が動作していなかったのを修正


NicoCache_nl+150304mod+170218mod (Patch Release)

機能追加:
・行方不明のキャッシュファイル探索を高速化
・仕様変更に備えてreencoded.csvにバージョンを追加

不具合修正:
・タイトルが長い動画でファイル名の切り詰めが機能していなかったのを修正
・info/v2 APIでキャッシュファイルが消えていた時に不整合な結果を返さないように修正


NicoCache_nl+150304mod+170212mod (Patch Release)

不具合修正:
・info/v2 APIがクラッシュすることがあるのを修正(まだあった)


NicoCache_nl+150304mod+170210mod (Patch Release)

不具合修正:
・info/v2 APIがクラッシュすることがあるのを修正
・一時ファイル削除時に内部情報から削除し忘れていたのを修正
・WatchVarsが原宿でタイトル取得に失敗していたのを修正

開発者向け
・WatchVarsから取れる情報を追加


NicoCache_nl+150304mod+170207mod (Patch Release)

機能追加:
・nlFilterに判定済みの再エンコード判定結果を取得する $REENCODED(smid) を追加しました．
　結果はtrue/false/nullのいずれかの文字列になります．不明時はnullとなります．
　使用例: $REENCODED($1)
・nlFilterに文字列一致判定と分岐を行うnlcase構文を追加しました．
　構文:<nlcase "対象文字列"><when "比較文字列1">出力文字列1<when "...">...</nlcase>
　対象文字列の部分には$REENCODEDや<nlVar:>を入れると事前に置換されます．
　対象文字列に">が含まれないようにご注意ください．
　使用例:
　<nlcase "$REENCODED($1)">
　<when "true">reencoded
　<when "false">RAW
　<when "null"><a href="#"...></a>
　</nlcase>

不具合修正:
・getDLFlagなどに不正なidが渡された時の非互換を修正(thx.NicoCache20>>316)
・Flash版のwatchページでdmcInfoが処理できていなかったのを修正
　Flash版ではdmcに対してlow判定が機能していなかったかも
・dmcのwatchページを開いたあとに再起動すると再生時にクラッシュすることがあったのを修正

開発者向け:
・JSONライブラリが拡張からも利用できるようになりました．
　もともとWatchVarsにあったものに手を入れてdareka.common.json以下に移動したものです．


NicoCache_nl+150304mod+170202mod (Patch Release)

不具合修正:
・キャッシュ済み分を送信した後にゴミがつくのを修正 (thx.NicoCache20>>220,221)
・dataフォルダがないときは作るようにした

nlFilter:
・209氏のおまけフィルタを元にIE対応等をしたものをマージ
　・209氏の nl_watchCacheIcon.{txt,js} は 20_watchFilter.txt に統合
　・既存の local/cache*.gif は削除可能
・デフォルトはdmcの色を変えるやつになりました


NicoCache_nl+150304mod+170120mod (Patch Release)

機能追加:
・再エンコード判定結果をdata/reencoded.csvに記録して再判定を避ける
・非dmc動画をキャッシュした際に一時ファイルでも積極的に再エンコード判定
・一時ファイルの取得済み領域情報(MappedRanges)を全スレッドで共有
・Partial downloadメッセージの数値にカンマを入れた(NicoCache20>>165)
・キャッシュ再開時・中断時にキャッシュ済みの割合を表示(NicoCache20>>165)
　reportCachingProgress設定で非表示にできます
・/cache/infoをdmcに対応(thx.NicoCache20>>120)
　dmc: dmcキャッシュか否か
　dmcMovieType: videoMode, videoBitrate, audioBitrateを含む
　非dmcキャッシュを持っている時にdmc動画のキャッシュが進行している場合，
　そのdmc動画が高画質か否かで書き込むフィールドが分岐
　・高画質時: dmcNormalCacheId, dmcNormalSize, dmcNormalCachingSize, dmcNormalMovieType
　・低画質時: dmcLowCacheId, dmcLowSize, dmcLowCachingSize, dmcLowMovieType
　キャッシュが進行している場合にnormal, dmcNormal, dmcLowと三種類に
　振り分けられてしまうため，それらの内もっとも良いものを統一的に提示する項目として
　  superiorCacheId, superiorSize, superiorCachingSize, superiorIsDmc,
　  superiorIsEconomy, superiorDmcMovieType
　を設けました．
・/cache/info/v2を新規追加
　/cache/infoが複雑化し過ぎなので新たにデザインしたAPIです．
　同様にクエリ文字列かPOSTでsmidを与えると次のフィールドが返ってきます．
　preferred: nlFilterで判定に利用されているキャッシュ
　preferredHTML5: HTML5プレイヤーで再生されるキャッシュ(より良い物が取得できなければ)
　preferredFlash: GINZAプレイヤーで再生されるキャッシュ(以下同)
　preferredSmile: dmcが再生できないプレイヤーで再生されるキャッシュ
　preferredDmc: dmcかつmp4(flvが再生できない環境用)の中で最も良いキャッシュ
　preferredDmcFlv: dmcの中で最も良いキャッシュ
　cacheIds: 動画に関連するcacheIdをソートした一覧
　cachings: キャッシュが進行中のcacheId一覧
　completes: キャッシュ済みのcacheId一覧
　caches: cacheIdをkeyに詳細をvalueとして持つ
　  videoId, cacheId, complete, economy, dmc, caching, movieType,
　  size, title, subFolder, filename, ts
    dmcMovieType (dmcに対して)
　  cachingSize (一時ファイルに対して)
　  reEncoded (非dmcの通常キャッシュに対して, 不明時はnull)

不具合修正:
・touchCache=true時にHTML5プレイヤーがキャッシュを読まないのを修正(thx.NicoCache20>>101,123)
　touchCache=true時にはLast-Modifiedを固定値で返すようにした．
・dmc動画でtouchCacheが機能していなかったのを修正
・ajax_infoの挙動が変化していたので元に戻した
　拡張性が足りずにdmcには対応できないので/cache/info(/v2) APIを利用してください
・キャッシュ一覧ページがソートされなくなっていたのを修正(thx.NicoCache20>>164)

nlFilter:
・06_topBarが2段になるのを解消.txt を追加
・my/mylistとrecommendationsのキャッシュアイコン追加が動作していなかったのを修正
・dmc色変え版のrecommendationsのリンク色変更が動作していなかったのを修正


NicoCache_nl+150304mod+170115mod2 (Patch Release)

機能追加:
・dmc動画がキャッシュ済みなら非dmcのエコノミーが要求された時にキャッシュしない．
　ニコニ広告で非dmcエコノミーが要求されるため．
・WatchVarsを原宿に再度対応
　wrapperの動作確認は出来ていないので動くかは不明

不具合修正:
・170115modの修正が壊れていたのを修正(thx.NicoCache20>>96)


NicoCache_nl+150304mod+170115mod (Patch Release)

不具合修正:
・キャッシュ済み動画から応答する際に全部メモリに読み込んでメモリ不足に
　陥っていたのを修正(thx.NicoCache20>>91-92)


NicoCache_nl+150304mod+170114mod (Patch Release)

機能追加:
・ストリーミングに対して警告を表示(thx.NicoCache20>>47)
　disableStreamingWarning設定で無効化できます．

不具合修正:
・flv形式のdmcキャッシュがnlFilter等で無視されていたのを修正(thx.NicoCache20>>69)
　disableCacheDmcFlv=true時は引き続き無視します．
・低画質の非dmcキャッシュがあるときに誤ってエコノミーではないURLに
　接続しに行くようになっていたのを修正
・一時ファイル削除時にデバッグメッセージが残っていたのを削除


NicoCache_nl+150304mod+170111mod (Patch Release)

機能追加:
・非dmcキャッシュが再エンコードされているかの判定機能を追加
　次のヒューリスティクスにより再エンコードを判定します．
　  video streamについて
　    handler_name = "VideoHandler" ∧ creation_time = 1970-01-01 00:00:00
・再エンコードされていない非dmcキャッシュを持っている場合に
　dmcキャッシュの代わりとして利用(useNotReEncodedCache設定)
・高画質なdmc動画をキャッシュした時に非dmcキャッシュが
　再エンコードされたものなら削除．同様に，再エンコードされていない
　非dmc動画をキャッシュした時にdmc動画を削除．(removeReEncodedCache設定)

不具合修正:
・Deprecatedなメソッドを使用している部分を修正&警告抑制(thx.NicoCache20>>33)
・ConcurrentModificationExceptionが出るのを(多分)修正(thx.NicoCache20>>40)
・公式動画のsmidを抽出できていなかったのを修正(thx.NicoCache20>>41)
・SearchRewriter.searchに後方互換性をもたせた(thx.NicoCache20>>42)
・全体をキャッシュ済みの一時ファイルが残っている場合に対処


NicoCache_nl+150304mod+170108mod (Patch Release, 人柱版)

機能追加:
・nlFilterでdmc/economyの4通りに分岐
　記法は次の2種類
　 <非dmc通常$$非dmcエコノミー$$dmc通常$$dmcエコノミー>
　 非dmc通常<$>非dmcエコノミー<$>dmc通常<$>dmcエコノミー
・watchやthumbinfoに新しいキャッシュIDでリクエストしてしまった場合に
　正しそうなURLへリダイレクトするワークアラウンドを追加 (thx.NicoCache20>>28)
・cachemanagerが概ね動作するようにCacheDirProcessorにワークアラウンドを追加

不具合修正:
・キャッシュ移動WebAPIが非dmcキャッシュに対して動作していなかったのを修正
　(thx.NicoCache20>>27)


NicoCache_nl+150304mod+170106mod (Patch Release, 人柱版)

機能追加:
・dmcサーバの動画に対応した．
　これに伴いdmc拡張を廃止します．
　dmcキャッシュのファイル名は次の形式です．
　  動画ID[解像度,映像のビットレート,音声のビットレート]_タイトル.拡張子
　dmcキャッシュの一時ファイルのファイル名は次の形式です．
　  nltmp_動画ID[解像度,映像のビットレート,音声のビットレート]動画データ識別子の先頭8文字_タイトル.拡張子
・(dmc拡張 v161226 との差分) エコノミーらしき動画ファイル名にlowを付加する．
　現在dmcサーバの動画の正しいエコノミー判定方法が不明です．
　暫定的に次のようなヒューリスティクスにより判定しています．
      ¬プレミアム会員 ∧ 混雑時間帯 ∧
           映像ビットレート ≦ 600kbps ∧ 音声ビットレート ≦ 64kbps
　誤ってエコノミーと判定された動画はエコノミーではない時間帯にアクセスすると
　自動でlowマークが外れます．
・通信切断時にdisconnectedメッセージを表示するようにした．
・リクエスト処理中の予期しない例外についてスタックトレースを表示した．

★仕様変更:
・キャッシュ管理構造を大きく変更した．
　既存のAPIはできるだけ非dmc動画のみサポートして互換性を保つ形で提供しているので
　ある程度，既存の拡張は動作すると思います．
　dmcの動画については拡張子が混在できるようになっています．
　GINZAプレイヤー(flv)とHTML5プレイヤー(mp4)で異なる形式の動画が配信されています．
　GINZAプレイヤーはmp4を解釈できるため，同画質・同音質のflvとmp4がある場合には
　flvを自動で削除します．画質・音質が異なる場合はそれぞれ最も画質が良い
　キャッシュを保持します．
・/cache/以下のWebAPIがdmc動画の情報を新しい形式のIDで返すようになった．
　既存のキャッシュ情報に加えてdmc動画の情報を返すようになった関係で，
　今までと違う形式のID(smXXXXXXXX[720p,2000,192].mp4など)が混ざります．
　これにより拡張やnlFilter, JavaScriptなどが動作しなくなる可能性があります．
・WebAPI /cache/rm?<smid> の挙動を変更しました．
　これまで<smid>にlowがついていない場合は，関連するキャッシュを全て削除して
　いましたが，lowがついていない非dmc動画のみが削除されるようになりました．
　全てのキャッシュを削除するための新しいWebAPIは /cache/rmall?<smid> です．
・WebAPI /cache/<smid>/{movie,audio} の挙動を変更しました．
　これまで<smid>にlowがついていない場合は，(非dmcの)通常キャッシュとエコノミー
　キャッシュから自動で選択して結果を返していましたが，非dmcの通常キャッシュから
　結果を返すようになりました．
　dmcキャッシュを含めたキャッシュから自動で選択して結果を返す新しいWebAPIは
　/cache/<smid>/auto/{movie,auto} です．

不具合修正:
・一時ファイルの削除時にmapファイルが削除されなかったのを修正


NicoCache_nl+150304mod+161226mod (Patch Release)

機能追加:
・flvキャッシュからmp4に変換して応答する機能を実装した(要ffmpeg)
　convertFlv2Mp4=trueにすると有効になります．
　リクエストされてから変換して応答するので多少時間がかかります．

不具合修正:
・JDK7でビルドできるようにした (thx.NicoCache19>>963)
・WatchVarsに失敗した時にクラッシュしないようにした (thx.NicoCache19>>962)
・mp4を要求された時，flvキャッシュを持っている場合にflvを返すせいで
　動画が再生できなくなっていたのを修正
・キャッシュ済み動画のリンクの色が変わらなくなっていたのを修正
　(thx.NicoCache19>>508,516)
・動画の種類ごとに適切なcontent-typeを返すようになった(?)


NicoCache_nl+150304mod+161224mod (Patch Release)

機能追加:
・HTML5版に暫定対応

★仕様変更:
・ファイルの途中からキャッシュできるようになりました．
　HTML5プレイヤーは最初からの再生であっても，ファイルの途中や末尾を要求して
　ブラウザ上にキャッシュするようになりました．そのため，NicoCache側で
　受信した部分はキャッシュに保存しておかないと，ファイルの末尾だけ
　受信要求が届かずキャッシュが完成しないと言った事態が生じます．
　キャッシュ済みの範囲は，拡張子の最後の文字が_になっているnltmpファイル
　(mapファイル)に格納されています．
・これに伴いキャッシュ済みサイズを管理する構造が変更されています．
　CacheManager.getDLSize/setDLFlag周りを利用している拡張が動作しなくなるかもしれません．
・同時ダウンロード時に2番目以降のセッションではキャッシュを保存しない処理は削除．
　HTML5プレイヤーは複数同時接続を行うことがあり，有効にしておくと，
　後から接続したセッションが多くのデータを受信した場合に
　保存されないという事態になると判断しました．

不具合修正:
・HTTPのOPTIONSメソッドが通らなかったのを修正
　それに伴い設定項目allowRestrictedHeadersは廃止されました．今後は常に有効になります．


■+mod 変更点

基本的にソースのリファクタリング中心なので機能追加はあまりありません。
とりあえず、ベースとなるバージョンのパッケージに対して上書きすれば多分動きます。
大きな問題が無ければいつもの人にパッケージングしてもらって個々の+modは終了です。
…のつもりだったけど、機能追加実験＆単体で最低限動作するパッケージにしました。

※行頭に★が付いているものは、影響の大きそうな変更なので注意してください

あと、JavaDocを付けていないpublicメソッドは将来的に変更される可能性があるので、
Extensionから呼び出さないで下さい(本体更新で動かなくなる可能性があります)。

[Java7]が付いている項目はJava7の機能を使うのでそれ以前のバージョンでは使えません
※NicoCache_nl+mod自体がJava7以外で動作しない、という意味ではありません


NicoCache_nl+150304mod (Patch Release)

不具合修正:
・ReplaceDelay=TRUEなフィルタをEachLine数分だけ実行する不具合を修正(thx>>200)
・exewrap等でexe化した際の不具合を一部修正(起動確認程度です…)


NicoCache_nl+150302mod (Patch Release)

★仕様変更:
・/cache/infoが返す情報をCSV形式(ajax_info同等)からKeyValue形式に変更
　　videoId:     動画ID(smid)
　　cacheId:     キャッシュID(エコノミーの場合は末尾がlow)
　　economy:     エコノミーキャッシュならtrue(通常キャッシュの場合は無し)
　　size:        最終的なキャッシュファイルのサイズ(bytes)
　　caching:     キャッシュ中の場合のみtrueを返す
　　cachingSize: キャッシュ中の現在サイズ(bytes)
　　movieType:   動画タイプ(flv/swf/mp4) ※キャッシュ拡張子の'.'以降
　　title:       動画のタイトル          ※キャッシュファイルのもの
　　subFolder:   サブフォルダのパス(キャッシュフォルダ直下の場合は無し)
　　ts:          キャッシュファイルのタイムスタンプ(UNIXTIME)
　以下はエコノミーキャッシュが存在して、かつ通常キャッシュ中の場合のみ返す
　　normalSize:  最終的な通常キャッシュのサイズ(この値があれば通常キャッシュ中)
　　normalCachingSize: 通常キャッシュ中の現在サイズ
　※各キャッシュ情報はキャッシュ無し＆キャッシュ中も無しの場合のみnullを返す
・nlFilter.txtに記述した[Replace]を[Style][Script]より後で処理するように変更
　→[Style][Script]に対しても置換処理可能になります

nlFilter:
・置換処理をnlFilter.txt段階まで遅延するオプションを追加(ReplaceDelay)
　→TRUEを指定するとnlFilter.txtの最初に記述したように振る舞います
・「キャッシュアイコン位置(共通)」でmarginとpaddingの指定を追加(thx>>36)

不具合修正:
・/cache/infoで動画タイプが常にflvになってしまう不具合を修正(thx>>33)
・ant extractした時はclassファイルを削除するように修正(thx>>66-67)
・Java8でビルド時の警告を出さないように修正(thx>>68-81)
　→Java9以降は1.5対応が無くなるのでエラーで止まるかも
・最近のMP4Box(0.5以降？)で固まる不具合を修正(thx>>172)
・ブラウザキャッシュ側だけにサムネがある状態で更新すると404を返す不具合を修正


NicoCache_nl+150201mod (Patch Release)

機能追加:
・キャッシュ情報一括取得API(/cache/info)を追加(GET/POST両対応)
　→GETの場合はパラメータとして'?'の後に<id>を','で区切って指定します
　　POSTの場合は<id>をカンマ/タブ/空白/改行のいずれかで区切って指定します
　　戻り値はJSONで"<id>":"<info>"のペアが指定順に返ります
　　　<id>   smid/videoId/threadIdのいずれか
　　　     ※threadIdを指定した場合の初回はgetthumbinfoを発行するので遅いです
　　　<info> 最初がsmidである以外は/cache/ajax_infoと同じ
　　　       キャッシュが存在しない場合はnull
・threadIdとsmidの対応保持数を無制限にした(getthumbinfoの発行を減らすため)
　→今のところファイル保存はしていないので再起動するまで有効です

nlFilter:
・ブラウザ等からコピペした「行末に空白が付いているフィルタ」に対応
　→セクション開始行の行末が空白文字の場合はセクション全体をtrimします
・キャッシュフォルダの空き容量が1GBを下回るとアラートを表示するようにした
・1/27の仕様変更に対応(thx.NicoCache18>>959-960)


NicoCache_nl+141221mod (Patch Release)

nlFilter:
・アニメトップページの「人気のアニメランキング」に対応(thx>>758)
・watchページのプレイリスト処理を大幅変更(DOMNodeInsertedを使うようにした)
　→非推奨なんだけど代替のMutationObserverはIE11以降対応らしいので…

その他:
・FFmpegがあれば優先的に使うようにした(thx>>762)
　→古いFFmpegだとCompressed SWFに対応していないっぽいです
　　もし問題が出るようなら useFFmpeg=false/noflv を設定して下さい
・起動時のキャッシュフォルダ空き容量を単位付き(MB/GB/TB)で表示するようにした
・watchページを検索状態のままリロードした時もRewriterを通るようにした
・getflvを発行しない仕様変更に対応(flvInfoにgetflvの置換を適用)
　→もし問題が出るようなら disableWatchRewriter=true を設定して下さい


NicoCache_nl+141201mod (Patch Release)

機能追加:
・nlFilterに[Style]と[Script]を追加
　→[Style]は</head>の直前に、[Script]は</body>の直前にまとめて追加します
　　[Style]はtype="text/css"、[Script]はtype="text/javascript"固定です
　　構文は[Replace]と同じですがMatchは記述せずReplaceの代わりにAppendを使います
　　内部処理的にはReplaceOnly=TRUEを指定した[Replace]とほぼ同様です
　　出力は全ての[Replace]処理後に[Style]→[Script]の順番で一括処理されます
　　よってフィルタで追加した内容に対してRequire等を使う場合は注意が必要です
・リロード時にフィルタファイルが更新されていなければ再パースしないようにした
・ユーザーフィルタのロード時間を表示するようにした

nlFilter:
・watchページの仕様変更(RequireJS導入)に対応
・watchページのキャッシュアイコンを出すまでバッファ率を表示するようにした
・「キャッシュ済動画のリンク色変更(チャンネル)」を追加
・Jarty系ページの仕様変更に対応(thx>>727)

不具合修正:
・一部の環境でキャッシュフォルダの空き容量取得がおかしかったので修正

開発環境:
・ant jarを実行した時にバックアップ(NicoCache_nl.jar.old)を作るようにした
・javadocのAPIリンク先をjava.sun.comからdocs.oracle.comに変更


NicoCache_nl+140914mod (Patch Release)

・「キャッシュアイコン追加」を特定のサムネURLに対応(15_thumbInfoFilter)
・とりあえずビルドしたい向けに HowToBuild.txt を添付
・build.xmlがGUILauncherIcon.gifを展開していなかったので修正(thx>>584)


NicoCache_nl+140908mod (Patch Release)

nlFilter:
・「キャッシュアイコン追加」を大きいサムネ(.M)に対応(15_thumbInfoFilter)
・8月の仕様変更で色々と機能しなくなったので修正(20_watchFilter)

不具合修正:
・smidが8桁以上なら逆引き検索対象をsm/so/nmに限定して効率化した
・一部の動画ページで再生出来ない場合がある不具合を修正(thx>>396-398)
・特定のサムネURLを動画URLと誤判断してしまう不具合を修正(thx>>491)
・知らない形式の場合はキャッシュしないように修正


NicoCache_nl+140509mod (Patch Release)

nlFilter:
・Replace内の置換処理を一切行わないオプションを追加(ReplaceOnly)
　→CSS/JavaScript追加のみといったフィルタで指定すると効率が良くなります
　　「$」をエスケープせずに記述できるようになります（自動でエスケープします）
　　既に「\」でエスケープしているフィルタは特に修正する必要はありません
・同一ページ内における$TS()の値を一意にした(NicoCache17>>115)
・idGroupでReplace内の<$>前後が空文字列だとエラーになる不具合を修正
・idGroup=!nがサムネIDだと常にマッチしない不具合を修正(NicoCache18>>335)

不具合修正:
・JSON内に空arrayがあるとパースに失敗する不具合を修正(ZeroWatch)
・特定のwatchページの右上コメントでエラーになる不具合を修正(NicoCache17>>109)
・TrackIDが格納順じゃないと音声抽出に失敗する不具合を修正(NicoCache18>>120)


NicoCache_nl+120609mod

機能追加:
・ニコニコ動画:Zero(ZeroWatch)になんとなく対応
　→ZeroWatchはまた色々と変わるらしいのでそのうち不具合出ると思います
　※将来的に強制移行があるだろうから嫌々でも今から対応する必要がある訳で…

・watchAPI(およびwatchAPIDataContainer内)のJSONに対してnlFilterが効くようにした
　→通常のnlFilterとは異なりエスケープ解除後の文字列に対してフィルタが効きます
　　現状はvideoDetail>descriptionの値のみが対象です(要望があれば追加します)
　★エスケープ解除前でもマッチする場合は2重置換を考慮する必要があります
　　User-Agentにバージョン文字列を設定するのでRequireHeaderを使って回避できます
　　ex) RequireHeader = !User-Agent: NicoCache_nl
　※不具合が出る場合は disableWatchRewriter=true を設定すれば禁止できます

・ZeroWatchで検索結果等の通信に失敗する不具合に対応(thx>>689)
　→CORS(Cross-Origin Resource Sharing)対策を2種類追加（詳細はdefaults参照）
・Nsenで対象動画のキャッシュがある場合に再生されない不具合を修正(thx>>748,840)
　→Nsenのニコ生プレイヤーはRTMPEでlow動画を取得するのでキャッシュは出来ません
　※ニコ生クルーズとか他のニコ生も同様だと思うけど全く見てないので…

nlFilter:
・★トップバー(ナビゲーションバー)の仕様変更に対応(05_topBarFilter.txt)
　→watchページ以外でもキャッシュメニューをプルダウン形式に変更しました
　　構造が変わっているので誤爆を避けるために以前との互換性を無くしてあります
　　フィルタでアイテムを追加する場合は新たに以下の置換ターゲットを使って下さい
　　<!--li_cachemenu_item_start-->
　　<!--li_cachemenu_item_end-->
・nlFilters/01_globalFilter.txt, local/nllib.js を追加
　→グローバル空間に NicoCache_nl オブジェクトを追加します
　　Prototype.js/jQuery に依存しない基本的な処理を定義しています
　※このオブジェクトの有無をチェックすることでnlを通したかどうか分かります
・scriptタグのsrc属性をドメイン付き(http://www.nicovideo.jp/〜)にした
・99_3列Filter+mod.txtにNGtitleを追加（あくまでサンプルです）

その他:
・201204の削除動画に対応 sm173920(?:25|40|55)
・デバッグウィンドウの保持行数を MaxLines の10倍に増やした(今までは2倍)

開発環境:
・開発環境を Eclipse Indigo SR2 (3.7.2) に更新
・開発環境の参照ライブラリを JDK7 Update 4 に更新

開発者向け:
・dareka.processor.impl.WatchVarsクラスを追加
　→watchページから情報を取得するためのクラス(原宿/Zero両方に対応)
　※今まで自前で正規表現とか使って取得していたのが多少は楽になるかも
・dareka.processor.impl.EasyRewriter.replace()を追加
　→文字列に対して直接nlFilterを適用できます
　※専用のURLを用意すればそのExtensionのみで使うnlFilterも可能
・dareka.common.TextUtil.{escapeHTML,unescapeHTML,escapeJSON,unescapeJSON}を追加
・デバッグ用にRewriterが処理した内容をログに出力する機能を追加(debugRewriter)
　→debugRewriter            trueなら処理した内容をログに出力
　　debugRewriterOriginal    trueなら書き換え前の内容もログに出力
　　debugRewriterMaxLength   ログに出力する内容の最大文字数
　　debugRewriterURLPattern  出力対象URLに部分一致する正規表現


NicoCache_nl+111225mod

機能追加:
・[Java7]フォルダの更新を監視して即座に変更を反映するようにした
　→対象はconfig.properties,nlFilter.txt,nlFilter_sys.txt,nlFiltersフォルダ以下
　　これまではリクエストの度に更新チェックをしていたのでレスポンスが悪かった
　　更新があった場合は変更を反映してから処理するので更にレスポンスが悪かった
　　Java7以降では即座に変更を反映するのでリクエスト毎の更新チェックを行わない
　※Java7より前(or disableDirectoryWatcher=true)の場合はこれまで通りです

・[Java7]JARが更新されたら終了するようにした(exitStatusIfJarModified)
　→NicoCache_nl.jarが上書きされるような場合は以降の正常動作ができないので
　※添付のスクリプトから起動した場合は終了コードを検知して再起動します
・Unix系OS用の起動スクリプトを追加(NicoCache_nl.sh)
　→Windows用のバッチファイルも修正があります(詳しくはReadme参照)

nlFilter:
・12/13の仕様変更に対応(動画トップ/カテゴリ合算ランキング/オススメ動画)
・チャンネル動画一覧でキャッシュアイコンが付かなくなっていたので対応

その他:
・local/vid2cid.jsonが読み込まれなくなっていた不具合を修正
・開発環境の参照ライブラリを JDK7 Update 2 に更新


NicoCache_nl+111130mod

・★イベント通知インターフェース(SystemEventListener)の仕様を変更
　→使用しているExtensionは互換性が無いので修正して再コンパイルが必要です

開発者向け:
・★SystemEventListener.EventIdを廃止してintに変更
　→EclipseとSun(Oracle)のjavacでenumのswitch文に対してコンパイラが生成する
　　コードが異なるので(javacはinner classを作るのでclassファイルが複数になる)
・build.cmdに-Xlint:-pathを追加(追加ライブラリは無いことがあるので)
・NicoApiUtil.getURLResource の中でリクエストヘッダにsetURLするようにした


NicoCache_nl+111124mod

・ローカルファイルサーバーが機能しなくなっていたので修正(thx>>961)
・ローカルファイルサーバーでルート("/")にアクセスした時の挙動を変更
　→"index.html"が有ればそちらを送信、無ければnl本体のバージョン文字列を送信

開発者向け:
・NLConfig.getPattern(String) を追加


NicoCache_nl+111123mod

・httpsが通らなくなっていたので修正(thx>>865-868,871)
・mime.types.defaultにWebM(video/webm)を追加

開発者向け:
・NLMain.getExtLoggerにプレフィックスをタブ名としてのみ扱う仕組みを追加
・SystemEventListenerにキャッシュ中断イベントを追加(CACHE_SUSPENDED)
　→サンプルソース(eventListenerSample)も更新
・SystemEventListenerにコンフィグ再読込イベントを追加(CONFIG_RELOADED)
　→ConfigObserverと被るけどExtension的にはこちらの方が使い易いかな？
　※ただし、再読込イベントなので初期化処理には使えません


NicoCache_nl+111111mod

機能追加:
・Extensionにイベントを通知するインターフェース(SystemEventListener)を追加
　→詳細は下記の開発者向け、およびJavaDoc参照のこと
・ローカルファイル(LocalFileResource)でgzip圧縮をサポート
　→foo.txtというアクセスに対してfoo.txt.gzがあればgzip圧縮のまま転送します
・起動時にVMのアーキテクチャ(os.arch)を表示するようにした
　→64ビットOS上で32ビットVMから起動した場合はx86になるので注意
・/cache/<id>.xml にパラメータを指定した場合に新プレ方式で取得するようにした
　→現状で有効な値はhas_owner_threadのみ、無効なパラメータは単に無視します
　※パラメータ無しの場合は従来通りに旧プレ方式で取得します
・NicoCacheフォルダ直下にdataフォルダを追加
　→HTTPアクセスする必要が無い、各種データを置くためのフォルダです

NicoCacheGUI:
・64bit環境用のDLLを同梱(NicoCacheGUI_native64.dll) ※動作確認はXP(x64)のみ
　→前にも書いたけどWindows環境で使っていないので不具合あるかも(パスは通してね)
・GUI起動時のデバッグモードの値はコマンドラインを優先するようにした
・終了時にログウィンドウを最後(finalized)まで表示するようにした

nlFilter:
・[Replace]以外のフィルタでURLを省略できるようにした
　→今までは省略できないので www.dummy.com とか書いて誤魔化していた
・[RequestHeader]でステータスコードを返せるようにした
　→現状でサポートしているのはNotModified,Redirect/Location,BadRequest,NotFound
・watchページにある「コメントを保存」を新プレ方式に対応した
　→毎分100コメ＆投コメ込み＆NG共有スコアあり
・getthumbinfo用のポップアップリンク化フィルタを追加(thx>>287)
　→パラメータに「?nlFilter」を付加した場合のみ有効です
・watchURLtoLinkが共有の貼り付けURLに誤爆するので修正(thx>>595,608,610)
・ニコニコTOPの仕様変更に対応(相当前のものですが…)
・ボーカロイド専門ページのリニューアルに暫定対応(111020)
・タイムシフトの「視聴する」ボタンをポップアップ対象から外した
・idGroupに数字以外の文字列を記述できるようにした(主にExtension用途です)

不具合修正:
・/cache/title?<smid>- で'%'文字を含むとエラーになる不具合を修正(thx>>267)
　→ついでに実際にタイトルを変更できた場合のみOKを返すようにしました
・不要なエントリをタイトルキャッシュに追加していた不具合を修正
・Refererを付加するブラウザでnoLiveCache=trueが効かなくなっていたので修正
・Windows環境でJNI用のパスが通っていない事があるのでReadmeに記述を追加(thx>>416)
・watchページのvideo_titleがclass→idに変更されたので対応(thx>>658,699)

その他:
・mimeTypesで指定したファイルが存在しない場合".default"を付加して見るようにした
　→config.propertiesと同様に編集する時は".default"を削るだけで良いです
・外部サムネのメモリキャッシュ条件を緩和してキャッシュ範囲を広げた
　→パラメータ指定を今までは"\?\d+$"だったのを"\?\w+$"に変更(?pop_FAとか)
　※今まで通り、パラメータ自体はリクエストに含めずに取得します
・ニコニコ動画として扱うドメインに simg.jp を追加
・ファイル名にゼロ幅文字(ZERO WIDTH SPACE等)が入らないようにした
・localFlvの説明文が誤解しやすいので文言を修正(thx>>465)
・キャッシュフォルダ検索時のメモリ使用効率を改善(thx>>497)

開発環境:
・開発環境を Eclipse 3.7.1 Indigo SR1 に変更(JDK7readyになったはず)
・NicoCache_nl.jarの作成にAntを使用するようにした
・参照ライブラリを JDK6 Update 29 に更新
・開発関連のファイルをdevelopment.zipにまとめた(詳しくはReadme参照のこと)
　→今までextensions以下にあったサンプルソース等もこちら

開発者向け:
・MANIFESTのClass-Pathに igo.jar (Java形態素解析器)を追加
　→詳細は http://igo.sourceforge.jp/ 参照のこと(MeCabより導入が楽っぽい)
・MANIFESTのClass-Pathに library.jar を追加
　→暫定でjarを追加したい時に使用します(恒久的に必要ならスレで報告願います)

・システム終了時にExtensionを呼び出す仕組みを追加
　→SystemEventListenerを実装していればSYSTEM_EXITを、実装していない場合は
　　public void onSystemExit() というインスタンスメソッドがあれば呼び出します
　※終了時に何か処理したいだけならSystemEventListenerを実装する必要は無いです

・nlFilter拡張用のインターフェースをNLFilterからNLFilterListenerに仕様変更
　→EventListenerと設計を合わせるため(暫定仕様だったので影響は無いはず)
　※もう一回見直すかも知れないので使う場合は自己責任でどうぞ

・Cache周りに色々と追加(詳細はJavaDoc参照のこと)
　→CacheManager.{isSmid,isLowSmid,stripLow,parseSmid,parseSmidInt,
　　getSmidComparator}, Cache#{getVideoId,isLow}

・CommentDownloaderに色々と追加(詳細はJavaDoc参照のこと)
　→CommentDownloader.{getURLResource,store,download,getTheBeginning,find,load}
　※JavaDoc付きですが暫定仕様かも(cacheCommentExtensionで使えますかね？)

・EasyRewriter.LST.remove() を追加(LST読み直しになるので効率は悪いです)
・HttpUtil.getDecodedInputStream(InputStream,String) を追加
・HttpRequestHeader#isGzipAccepted() を追加
・NLConfig.getFile() を追加
・URLResource#getResponseBody(boolean) を追加
・dareka.common.TextUtilクラスを追加(暫定仕様なので変更あるかも)


NicoCache_nl+110706mod

NicoCacheGUI:
・Windows環境でシャットダウン/サスペンド絡みの諸問題に対応
　1) ログウィンドウを一度も出さずにシャットダウンすると終了処理が呼ばれない
　→HideWindow=trueを指定した時も起動時に一瞬ログウィンドウを表示するようにした
　2) シャットダウン時に「応答無し」となりシャットダウン処理が中断する
　→JNI(NicoCacheGUI_native.dll/32bitのみ)を使ってWM_ENDSESSIONを処理するように
　　64bitは環境を作るのが面倒＆VMの判定方法がよく分からないので未対応
　※DLLは無くても動作するのでGUIを使わない人は削除しても構いません
　3) 通信中にサスペンドすると復帰後に無反応になる事がある
　→JNIを使ってサスペンド時に「プロキシ接続を全切断」するようにしてみた(thx>>208)
　※NicoCacheGUI.propertyにDisableSuspend=trueと書けばサスペンド移行を禁止
・トレイメニューに「プロキシ接続を全切断」を追加
　→あくまでプロキシ接続を強制的に閉じるだけ、Extension等の独自通信は対象外
・nlが完全に終了するまでログウィンドウを閉じないようにした

nlFilter:
・キャッシュメニューの項目開始位置に<!--cachemenu_item_start-->を追加
　→最後に追加すると間違えて「キャッシュ削除」を選択することがあると思うので
・「コピー 〜 」「Copy of 」で始まるフィルタファイルを無視するようにした
・nlFiltersフォルダにサイズ0のtxtファイルがあるとロードできない不具合を修正
・$URLgの動作を改善(コンパイル結果を保持するようにした)
・Replaceで"<TAB>"をハードタブ(\t)に置換するようにした
・[Debug]モードでフィルタ名をファイルパス付きで表示するようにした
・静画(sg|im|mg)のポップアップに対応(popThumb_FAを使っている人は対応待ち)
・ポップアップリンク置換の対象smidの数字部分を8桁までに制限した
　→getthumbinfo等で改行が無い場合の誤爆が軽減されるかも
・公式がサポート終了したのでニコニコ動画(9)対応を削除

その他:
・生放送と静画の外部サムネもメモリにキャッシュするようにした
・コンパイラをJDK 6 Update 26に更新(…と今更ながら書くようにした)

開発者向け:
・MANIFESTのClass-Pathにsqlite-jdbc.jarを追加
　→NicoCacheフォルダにsqlite-jdbc.jarを置けばExtensionからSQLiteが使えます
　　http://code.google.com/p/sqlite-jdbc/からjarを取得してリネームしてください
　　ex) sqlite-jdbc-3.7.2.jar → sqlite-jdbc.jar
　※ググるとhttp://www.zentus.com/sqlitejdbc/の方が上位に出てくるけど、
　　更新が止まっている＆しばらく使った感じバグ持ちっぽいので…
・NLConfig.getMatcher()を追加(今までprivateだったのをpublicにしただけ)
・{GetThumbInfoUtil|URLResourceCache}.isCached()を追加
・JNIのソースをjarのnative/以下に同梱(Visual C++ 2008 Express用)
　→VC++ 2010でも大丈夫だと思うけど、インストールするのが面倒なので…
　　あと、64bitでもコンパイルが通るように書いたつもりだけど未確認


NicoCache_nl+110604mod

・nlFilterにタイムスタンプ置換($TS)を追加
　→[Replace]フィルタのみ有効です([RequestHeader]で使えても意味が無いので)
　- 引数にローカルファイル(NicoCacheフォルダからの相対パス)を指定すると、
　　引数にファイル更新時刻文字列(='?'+UNIXTIME)を付加して置換します
　　　$TS(local/popThumb.js)        → local/popThumb.js?1298081651
　　　$TS(local/nicoplayer.swf?ts=) → local/nicoplayer.swf?ts=1239336522
　- 引数のローカルファイルが存在しない場合、引数そのものに置換します
　　　$TS(local/nonexistent.json)   → local/nonexistent.json
　- 引数を指定しない場合、現在時刻文字列(=UNIXTIME)に置換します
　　　var replacedTime = "$TS()";   → var replacedTime = "1306132319";
　※基本はsrc指定におけるブラウザキャッシュ避け用途を想定していますが、
　　JavaScript内に置けば通信せずにファイルの有無と更新時刻を取得できます

・watchページのトップバーにあるキャッシュメニューをプルダウンメニューに変更
　→使えなくなったフィルタがあったらごめんなさい(いちおう旧版も残してあります)
　　<span id="nlbar">を置換するフィルタなら今まで通りに使えると思いますが…
　　メニューに項目を追加する場合は<!--cachemenu_item_end-->を置換してください
・添付フィルタの細かな修正($TS対応、仕様変更対応、etc.)

・idGroupで1番目の引数がマッチしない場合も2番目の引数を見るようにした
　→あくまでグループ参照した結果がnullだった場合です(存在しないグループでは無い)
・$URLgでグループ参照した結果がnullだった場合に空文字列で置換するようにした
・書き換え可能なローカルファイルに対するIf-Modified-Sinceの不具合を修正
　→nlFilterの対象か否かに関わらず、必ず200を返していた
・ソースコードの整理(コメントアウトした修正前のコードを削除)

開発者向け:
・★RewriterProcessor#getPostStringをテスト版から仕様変更
　→引数で文字セットを指定するようにした(nullなら"ISO-8859-1"でデコード有り)


NicoCache_nl+110522mod テスト版

・vid2cidFileのID対応情報をキャッシュの検索にも反映するようにした
　→簡単に言えば、あるsmidに対して異なるsmidのキャッシュを返すことができます
　※ただし、IDタイプを変更することはできません(sm→so等は駄目)
・Extensionで選択的にProcessor処理できるようにした(詳しくは開発者向け参照)
・kakorokuRecorderが誤パースするのでwatch/lv〜をポップアップ書き換えURLから外した

nlFilter:
・Match以外の正規表現が記述できる場所(Requireとか)でも$LSTを使えるようにした
　→共通処理として括り出したので、今後更に対象が増えても同様に使えます
　※$INC/$SETはMatch内でしか意味を持たないので無視しています
　　$NESTも使えるはずですが(意味があるかは分かりませんけど…)テストしていません
・ContentType(というかMatch以外)でも否定条件(行頭の'!')を使えるようにした
・フィルタファイルの更新チェック間隔を指定できるようにした(nlFilterCheckInterval)
　→デフォルト5秒(今まで1秒だったけど処理を変更したので間隔を長くした)
・複数リクエスト(=スレッド)が同時に更新チェックした場合の動作を改善(したはず)
・フィルタの正規表現に記述ミスがあるとそこでロードが止まっていた不具合を修正
　→記述ミスのあるフィルタをスキップして処理を継続するように(>>37はこれかも？)

RequestFilter:
・適用順序をRewriterと同じにした(nlFilter_sys→nl内蔵→Extension→nlFilter)
・★全ての[RequestHeader]フィルタを処理するようにした
　→今までは最初にマッチした[RequestHeader]のみ処理して打ち切っていた
　※書き換えた後に更にマッチするフィルタがある場合の挙動が今までと異なります
　　また、Matchを分割するとループ回数が増えるのでまとめた方が速度的に有利です
・[RequestHeader]フィルタ処理時にnlFilterの更新チェックをするようにした
　→今まではいずれかの[Replace]対象URLを処理しないと更新が反映されなかった

開発者向け:
・EasyRequestFilter.javaを削除してEasyRewriter.javaに機能をまとめた
　→機能的にクラスを分ける必然性が無い(=むしろ不利になる)ので
　　RequestFilterを2つ(sys/usr)に分けたことで見通しも良くなった
・Processor#onRequestでnullを返した時は次のProcessorで処理を継続するようにした
　→Extensionで選択的にProcessor処理することができるようになります
・POST文字列を取得するメソッドを追加(RewriterProcessor#getPostString)
　→nl本体側で入力をバッファリングするのでProcessor#onRequest内から使えます
　　そのため、POSTの内容を選択処理の判断に使うことができます
　※UTF-8文字列以外で取得したい場合は自前で処理して下さい(ただし取得長に注意)
・CacheManager#id2Smidでidが10桁以上の場合はスレッドIDとして扱うようにした
　→既にsmidを取得していればそちらを、取得していなければgetthumbinfoから取得
　※getthumbinfoの場合は取得できないケース(DELETEDとか)があるので注意


NicoCache_nl+110424mod

・特定のケースでjava.lang.ArrayIndexOutOfBoundsException: -1が出る不具合を修正
・vid2cidFileにdeletedVideoIdにマッチするvideoIdが含まれるとまずいので対策
・vid2cidFileのバックアップを作成するようにした

開発者向け:
・クラスを跨ぐ共有情報をパッケージスコープなクラスにまとめた(NLShared)
　→不必要なpublicメソッドは危険＆Extensionから使われると変更できなくなるので
・NicoCache_nl+101219mod以降に追加した幾つかのpublicメソッドの可視性を下げた
　→新規Extensionも公開されていないので外部からは使われていないはず
・各パッケージのpackage-info.javaのJavaDocが本家をコピペしただけだったので修正


NicoCache_nl+110411mod テスト版(差分のみ)

・★チャンネル動画等でsmidと動画鯖へリクエストするIDが異なる場合に対応(thx>>854)
　→対応内容の詳細は基本的に>>856に書いた通りです(watchページのvideoIdで保存)
　　IDの対応情報はデフォルトでlocal/vid2cid.jsonに保存します(vid2cidFile)
　　削除動画の問題はdeletedVideoIdでID指定することで対応します(ただし未テスト)
　※副作用で一度動画を視聴(getflv)すればキャッシュアイコンも付くようになります
　※外部ツール等もgetflvをnlに通せば機能します(対応版のnlMovieFetcherを同梱)

・サムネキャッシュのブラウザ保持期間を指定できるようにした(thcacheExpires)
　→デフォルト150日、ニコ動のサムネ鯖が返す値と同じです
・thcacheMode=folderの時に全てのサムネ鯖が404を返して来た場合の挙動を修正
　→thcacheReplace404が"http://〜"の時も0バイトファイルを作成するように
　※削除された動画でも無いのに全てのサムネ鯖が404を返す動画があるっぽいです
　　一度0バイトファイルを削除して再度サムネを取得しても駄目なら諦めてください

・★ローカルファイルに対するIf-Modified-Sinceの挙動を修正
　→今までは過去のバージョンに戻すことを考慮して一致した場合のみ304を返していた
　　今後は本来の仕様通りにIf-Modified-Sinceの値以前なら304を返す(今までが特殊)
　※過去のバージョンに戻す時は素直にブラウザキャッシュをクリアして下さい

・検索ページの仕様変更に対応(99_3列Filter+mod >>587)
・ログウィンドウの位置を保存し忘れていたので対応(起動時から移動した時のみ保存)
・(今更ながら)旧バージョンのwatchページでもタイトルを取得するようにした
・チャンネルトップ等でキャッシュアイコンが付かなくなったのでなるべく対応
　→いくらHTMLの仕様上は問題無くても</a(改行)>とか止めて欲しい…

nlFilter:
・[RequestHeader]でもidGroupを使えるようにした
・ExtensionからidGroupとnlVarを拡張できるようにした(暫定仕様)

開発者向け:
・ExtensionでnlFilterを拡張するインターフェースを追加(NLFilter)
　→暫定仕様なので変更するかも知れません(その場合はExtension互換が無くなります)
・CompleteCache#getPriority()の値が0より大きい場合は0とみなすようにした(thx>>586)
・GetThumbInfoUtil.getを実行した時にIDキャッシュを更新するようにした
・Cache.id2Smid()を継承元のCacheManager.id2Smid()に移動した


NicoCache_nl+110219mod

・ログウィンドウで最大行数を超えた場合の挙動を変更
　→バックログの時は表示位置が更新されて不便なので削除しないように
　　通常ログ(最後までスクロールした状態)の時にまとめて削除します
　※常時バックログ状態だとログが増え続けてメモリを圧迫するので注意
・ログウィンドウの細かな挙動を色々と修正(ほぼ全面書き換え)
　→これで自分的には常用できるレベルになったかなー、と
・ログウィンドウの右クリックメニューに「起動時に隠す」を追加
・設定値に変更が無い場合 NicoCacheGUI.property を上書きしないようにした

・Rewriterのデフォルト文字セットを指定できるようにした(rewriterDefaultCharset)
　→デフォルトISO-8859-1、指定しない場合はこれまで通りの動作です
・キャッシュのタイトル文字列に含まれる実体参照を置換するようにした
・Extensionの初期化に失敗した場合もスキップして起動するようにした
・ニコニコチャンネルで特定のページが正しく動作しない不具合を修正
　→jqueryオンリーのページで「prototype.js埋め込み」が機能していたため
・公式動画のポップアップは連続アクセス規制になることがあるので廃止(popThumb.js)
・ソースコードの整理

開発者向け:
・Configの更新を通知するインターフェースを追加(ConfigObserver)
　→Config.addObserver()で追加(多重追加しないように注意！)
・LocalFileResourceでRangeヘッダをサポートした
・Cache#getSanitizedDescription()の可視性をpublicにした
・Broken pipeも頻繁に出るのでスタックトレースを出さないようにした


NicoCache_nl+110125mod

・Extension用の拡張ロガーを実装した(NLMain#getExtLogger)
　→対応ExtensionではGUI起動の場合に専用タブにもログを出力します
・ログウィンドウの「閉じる」ボタンで終了できるようにした
　→mainタブ＞右クリックメニュー＞「閉じる」で終了
・ログウィンドウのフォント名とサイズを指定できるようにした(FontName/Size)
・ログウィンドウの前景色と背景色を反転できるようにした(FlipColor)

開発者向け:
・ExtLoggerHandlerを実装したのでDefaultLoggerHandlerの修正を元に戻した
・サンプルソースを追加(extLoggerSample.java)、および修正(addTabSample.java)


NicoCache_nl+110122mod

・nlFilterでバージョン文字列を取得できるようにした(<nlVar:VERSION>)
・ログウィンドウをタブ化してデバッグログを別タブ表示にした(thx>>251)
　→mainタブに通常ログ、デバッグモードの時はdebugタブにデバッグログ
・ログウィンドウの右クリックメニュー「クリア」→「全選択」に変更
　→ログを取得する目的で「クリア」は危険なので
・起動時の初期化順によってはdebug.logに追記するようになっていたので修正

開発者向け:
・外部(Extension等)からタブを追加できるようにした
　→NLMain#addTab(String, Icon, Component, String) で追加できるのでお好きなように
　　追加処理が重い場合は NLMain#isLaunchGUI() で事前にGUI起動か確認するべし
・Extension のサンプルソースを追加
　→addTabSample.java, completeCacheSample.java (by いつもの人)


NicoCache_nl+110118mod

・★NicoCacheGUI相当の機能を実装 (GUI起動対応)
　→NicoCacheGUI ver0.09 fix20090925 を参考にしていますが、ソースは８割以上
　　書き直しています。仕様面では NicoCacheGUI と互換性があります

・検索でエコノミーキャッシュに2件以上ヒットするとエラーになる不具合を修正(thx>>190)
・キャッシュ操作時に内部テーブルへのフォルダ登録が間違っていたので修正(thx>>197)
・Java 1.5で動かなくなっていたので気が付いた部分を修正
　→AppleもJavaのサポートを止める事だし、いい加減1.5の考慮を止めてもいい？
　※不具合報告があれば善処したいとは思います(今まで報告無かったけど…)
・「watchページトップのリンク表記短縮」にtitle属性を付けた(topBarFilter)

開発者向け:
・GUI起動対応に伴い Main-Class: dareka.NLMain に変更
　→daraka.Main は弄っていないので特に問題にならないと思うけど
・紛らわしいので CacheManager#id2path→id2dir に名前変更


NicoCache_nl+110113mod

デバッグログのファイル出力機能を付けたので、次回からnl本体の障害報告をする場合、
debug.log を短期うｐろだに上げてからURLを添えて報告をお願いします。m(__)m

・storeFilterIgnoreのコードを弄ったらエンバグしていたので修正(thx>>155)
　→すいません、デバッグログがあれば直ぐに分かる問題でしたorz
　　やっぱりちゃんとテストしないと駄目だな(使ってない機能のテストはやりづらい…)
・dirListに完了したキャッシュのパス名が追加される不具合を修正(thx>>156)
　→これまたかなり以前(+100820mod)から存在した不具合ですねぇ…
　　/cache/dirlist.jsonで取得した場合は読み直しになるので発覚しなかったっぽい
・ログをファイルに出力する機能を追加(dareka.logfile)
　→起動オプションで-Ddareka.logfile=<path>と書くと<path>にもログを出力します
　　起動用バッチファイルのデバッグモードには上記オプションを追加してあります
　※主にデバッグ目的なのでオプションは動的に反映されません(dareka.debugと同じ)


NicoCache_nl+110112mod

・Content-Encoding: identity を返す鯖でRewriter処理されない不具合を修正
　→本来返してはいけない値だけどチェックするのを忘れていた…
・localRewriter=trueの時に/local/以下のアクセスが"ぬるぽ"になる事がある不具合を修正
　→If-Modified-Sinceがある場合に発生するのでブラウザキャッシュが影響します
　　エラーになってもブラウザキャッシュが使われるので表面上問題が露呈しません
　　(+101221modから存在していた不具合、問題自体は+101219modから存在するけど…)
・今更ながらthcacheMode=folderの時にwrapper(旧プレイヤー)のオススメに対応
　→今のところ許可するオプションは &.jpg のみです
・リンク色変更とポップアップを「過去のニコレポを見る」に対応
・READMEの構成を変更(必ず目を通しておいてください)

開発者向け:
・JavaDocで警告が出る部分を修正
・JavaDoc生成用バッチファイルを追加(extensions\makedoc.cmd)
　→Windows版のみでごめん(Un*xyな人は自分で作れるよね？)
・RewriterProcessor.stringRewriter(String, String)を@Deprecatedにした
	 * こちらはnlFilter拡張(RequestHeader, ContentType 等)に対応できないので
	 * HttpRequestHeader, HttpResponseHeader 引数のある版を使ってください。
　※現状使っている事が分かっているのはcacheCommentExtensionくらい
　　cacheCommentExtensionはConfig.getStringも直した方が…


NicoCache_nl+110110mod

機能追加:
・キャッシュ検索APIを追加(/cache/r?search/<string>{\?order=[ad]})
　→キャッシュを検索した結果をJSON(内容はcachelist.jsonと同じ)で返します
　- /cache/search/検索文字列   ファイル名を単語OR検索(SearchRewriterと同じ)
　- /cache/rsearch/検索文字列  パス名を正規表現検索(?を含む場合は%3Fで指定)
　　オプション(?order=[ad])で昇順・降順を指定できます(デフォルトは昇順)
　ex1) /cache/search/vocaloid+-ランキング
　　　"vocaloid"(大小文字無視)を含み"ランキング"を含まないものを取得
　ex2) /cache/rsearch/%5Edeleted/?order=d
　　　キャッシュフォルダ直下のdeletedフォルダ以下を降順で取得
　ex3) /cache/rsearch/[%23%E7%AC%AC]%5Cd%2B
　　　ナンバリング([#第]\d+)されているものを取得(#\+?等の文字は要エスケープ)
・LST重複除去APIを追加(/cache/trimlist/<filename>{\?type=smid})
　→LSTの重複文字列と前後の空白を省いて辞書昇順でソートして書き出します
　　オプション(?type=smid)を指定した場合は動画IDとみなしてソートします
・★LST追加APIの仕様を変更(/cache/addlist/<filename>\?<string>)
　→重複チェックを行うようにしました(LSTのパターンマッチで判定)
　※LSTに正規表現のメタ文字を含む場合は正確な判定ができないので注意

nlFilter:
・★$LSTで'!'を指定した時の挙動を逆にした('!'を付けなければエスケープ無し)
　→デフォルトでエスケープ無しの方が色々と都合が良いので(メモリ使用効率とか)
　※LSTに正規表現のメタ文字を含まない場合はどちらでも結果は同じです
・nlFilterでマッチした回数を参照できる機能を追加($INC)
　→Match内に"$INC(NGCount)"と書くとReplaceで"<nlVar:NGCount>"として参照できます
　　$INCはマッチした場合に指定した変数の値をインクリメントします
　　変数が存在しない場合は0で初期化してからインクリメントします
　　変数が既に存在してかつ数値として評価できない場合はエラーになります
　　$INC自体は除去してからマッチングを行うのでMatch内の任意の位置に記述できます
　※実際の使用例は 99_3列Filter+mod.txt を参照してください
・nlFilterでマッチした時に変数を設定できる機能を追加($SET)
　→Match内に"$SET(name=value)"と書くとマッチした時に変数に値を設定できます
　※現状、オミトロンと異なりvalue部分は固定値しか書くことはできません
・nlFilterでconfig.propertiesの値を参照できる機能を追加
　→Replaceに"<nlVar:config!name>"と書くとconfigのnameという値を参照できます
　　$SETと組み合わせることで、nlFilterにあらかじめデフォルト値を書いておき、
　　config.propertiesに値がある場合はそちらを優先する、という使い方ができます
　ex) Match<
　　　$SET(config!nlFilterA.useFunction=false)
　　　</head>
　　　>
　　　Replace<
　　　<script type="text/javascript"><!--
　　　var nlFilterA = { useFunction: <nlVar:config!nlFilterA.useFunction> };
　　　//--></script>
　　　</head>
　　　>
　※$SETを書かないとconfigに値が存在しない場合は置換処理されないので注意
・<nlVar:〜>で参照する変数が存在しない場合は置換処理をスキップするようにした
・デバッグログで重複メッセージの表示を抑制するようにした
・複数のnlFilterが同じLSTを参照する場合の更新に関する不具合を修正
　→LSTの更新が最初にマッチしたフィルタにしか反映されていませんでした

その他:
・niconicoMode=trueの場合もローカルファイルサーバ機能が効くようにした(thx>>23)
　→[RequestHeader]が効くようにコードの位置を移動したのが原因ですね…orz
・RewriterProcessor(nlFilter)でZLIBヘッダ無しdeflateに対応(thx>>59)
　→ZLIBヘッダが有効な時だけnowrap=falseでInflaterを生成するようにしたけど、
　　ぶっちゃけZLIBヘッダ有りdeflateを返す鯖でテストしていないので問題あるかも
　※問題があれば問題の出る鯖のURLをNicoCacheスレにて報告してください
・popThumb.jsでユーザー生放送(watch/co〜)に対応(thx>>67)
　→コミュニティのサムネをポップアップするようにしました
・thcacheMode=folderの時に対象とする動画IDの桁数を9桁以下とした
　→スレッドIDでリクエストしてくるケース(当然サムネは存在しない)があるので
・rewriterIgnoreExt→rewriterExtIgnoreに名前を変更(命名則を合わせるため)
・3列Filter+modでNG登録時にキャッシュも削除するようにした
・storeFilterIgnoreのコードを弄った(使っている人は確認よろしく)

開発者向け:
・nlFilterが管理するLSTをExtensionから扱うAPIを追加(EasyRewriter.LST)
　→API化にあたってまたコードを書き直したので不具合出るかも
　- EasyRewriter.LST.getPattern()  LSTのパターンを取得
　- EasyRewriter.LST.append()      LSTに文字列を追加(重複チェックあり)
　- EasyRewriter.LST.trim()        LSTの重複削除＆ソートして書き出し
　※詳しくはJavaDocを参照のこと
・コメントアウトしたコードが多数残っているので次回にでも整理予定


NicoCache_nl+101221mod

・LocalFLVでspeedLimitがデフォルト値のままだと転送が異常に遅くなる不具合を修正
　→本家Configマージ時のエンバグでした(0に律速されて実質転送が終わらない…)
・LocalFLVの場合もブラウザにキャッシュさせるようにした
・動画鯖が200以外を返してきた場合はブラウザにキャッシュさせないようにした
　→もしかしたら動画の読み込みに失敗するケースが改善されるかも


NicoCache_nl+101219mod

nicolist.netが無くなってしまったのと、ベースのNicoCache_nl (9).12が古くなったので、
NicoCache_nl+mod として単体動作するパッケージをリリースしてみるテスト。

パッケージ:
・★本家NicoCache 0.45をマージ
　→Configを本家コードに、あとヘッダ周りで問題が出るかも(特にIEとwrapper)
　※ヘッダ全体のエンコード指定メソッドを廃止したので、それらを使っている
　　Extensionがもしあれば、代替手段を使うように修正してください
・★以下は同梱していませんので必要な人は個別に導入してください
　　NicoCacheGUI、cacheManager、新プレイヤーコントローラ、サンプルフィルタ
　　Readme.html および documents/html/ 以下(メンテできません、ごめんなさい)
・★同梱していないものを参照するデフォルト設定を参照しないように変更
　　ついでに、幾つかのデフォルト値を変更予定(変更後の値をNEWに記述しています)
　※以下は変更前のデフォルト値なので必要な人はconfig.propertiesに追加してください
　　templateFile=/local/listCacheManager.html
　　thcacheReplace404=local/thumb404.jpg
　　touchCache=false
　　checkRealCache=false
　　cacheThumbnail=false
　　thcacheMode=file
・NicoCache_nl.bat の引数にdebugを指定した場合はデバッグモードで起動するように
・proxy_sample.pac を現状に合うように修正
・defaults/00_NicoCache.properties を追加(本家の設定ファイルそのまま)
・defaults/11_NicoCache_nl_BASIC.properties は重複記述なので廃止
・extensions/build.cmd を追加(Extensionビルド用バッチファイル)
・local/popThumb.js を修正(Prototype.jsを使わないように＆エラー処理追加)
・nlFilters/99_3列Filter.txt を追加
　→必要無い人はconfigに nlFilterIgnore=99_3列Filter\.txt を追加してください
・その他、細々とした修正多数

機能追加:
・ローカルファイルサーバ機能を追加(localFileServer)
　→nlProxyPacをより汎用的にしたようなもの、実験なのでデフォルトON
　　http://localhost:8080/Readme.txt とか表示できるようになります
　　内部的に http://LOCAL/〜 なアドレスとして扱います
　　nlFilterを適用する場合は URL = LOCAL/documents/ とか書きます
・/local/以下にもnlFilterが効くようにした(localRewriter)
　→現状、nlFilterのみ有効です(Rewriter全般は抑制)、実験なのでデフォルトON
　　jsファイル内の設定項目をnlFilterで書き換えたりできます
　　文字コードはHTMLの場合はmeta指定優先、それ以外はUTF-8で処理します
　※既存のnlFilterに関しては MatchLocal = TRUE を記述しない限りマッチしません
・localDirAddLastModifiedを廃止して常にLast-Modifiedヘッダを付けるようにした
・Rewriter(nlFilter)で書き換えた場合はLast-Modifiedヘッダを削除するようにした
　→jsを書き換えた場合等でブラウザが積極的にはキャッシュしなくなるはず
・/local/以下のファイルにContent-Typeヘッダを付けるようにした(mimeTypes)
　→デフォルト設定は mimeTypes=local/mime.types.default
　　Apacheのmime.types形式なのでApacheのものを直接指定することもできます
・thcacheReplace404にURLを書けるようにした(302を返します)
・Rewriter処理するContent-Typeを指定できるようにした(rewriterContentType)
・Rewriter処理させない拡張子を指定できるようにした(rewriterIgnoreExt)
　→内部的に画像系を拡張子で弾いていたものをconfigで外部指定できるように
　　処理の冒頭で弾くので明らかに書き換えない拡張子を指定すると効率が良くなります
・フィルタとかローカルファイルとかの処理効率を改善
　→全体的に細かな改善を色々と入れています(個別に書くのは面倒なので省略)
・thcacheMode=folderの場合にタイムアウトを指定できるようにした(thcacheTimeout)
　→指定時間で別鯖に繋ぎ直します(混雑時間帯にサムネ鯖の反応が悪い事があるので…)
　　Chromeは全ての画像をロードし終わるまでpopThumbが動かないので有効かと
・LST追加APIをテスト実装(/cache/addlist/<filename>?<string>)
　→現状は単純にファイルの末尾に追加のみ、重複チェックはありません
　　ex) /cache/addlist/NGuserId.txt?12345678
　　APIからの追加はlistフォルダ以下に限定、文字列はエンコードしたUTF-8です
　　ファイルが存在して、かつ文字コード判定用文字列がある場合はコード変換します

nlFilter拡張:
・RequireHeader オプションを追加
　→特定のUser-Agentやuser_sessionに限定できます(Requireのリクエストヘッダ版)
　　ex) RequireHeader = user_session_12345678_\d+
　　上手く記述すればログインユーザー毎にnlFilterを切り換えることができるかも
・ContentType オプションを追加
　→特定のContent-Typeに限定できます(部分一致する正規表現を記述)
　　ex) ContentType = text/(?:html|xml)
　※指定した場合、Conetnt-Typeが無い場合にマッチしなくなるので注意
・MatchLocal オプションを追加
　→URL = www\.nicovideo\.jp/ と記述した場合に、このオプションをTRUEにすると
　　/local/以下にもマッチするようになります(FALSEならマッチしません)
　※よって、MatchLocalオプションの記述が無い既存フィルタはマッチしません
　　URL = www\.nicovideo\.jp/local/ と/local/以下まで記述した場合は、
　　MatchLocalの値に関わらず常にマッチします
・AddList オプションを追加
　→nlFilterからLSTファイルにReplaceの内容を追加できます(動作仕様はAPIと同じ)
　　ex) AddList = list/NGUserId.txt
　※このオプションを指定した場合、コンテンツの内容は書き換えません
・AddVariable オプションを追加
　→URL固有の変数にReplaceの内容を保存して、他のフィルタから参照できます
　　ex) AddVariable = foo
　　同じ変数に対して複数追加する場合は文字列が連結されます
　　他のフィルタから参照するにはReplaceに"<nlVar:foo>"と書きます
　※このオプションを指定した場合、コンテンツの内容は書き換えません
・idGroup指定時のReplaceの記述を拡張
　→以下のように文字列中に埋め込む事ができます(従来の記述も有効です)
　　Replace<
　　$0<div style="position:relative;">
　　<img src="http://www.nicovideo.jp/local/cache<icon$economy>.gif" 〜>
　　</div>
　　>
　　$の左右に\w+が存在した場合は<>前後の文字列と連結します
　　片方が空白文字の場合も有効、\w以外の文字があると認識しません
　　また、同一Replace中に複数の記述はできません
・Replaceで"<CRLF>"を改行コード(\r\n)に置換するようにした
　→EachLine = TRUE の時でも改行できるようになります
・★Replaceの改行コードをLFからCRLFに変更した
・Replaceで"$URL0"も置換するようにした
・Replaceで"<freeSpace>"をいつでも使えるようにした
・disableLSTmodを廃止して$LSTの動作仕様を+101017modのものとした
　→若干内部動作が変わって$LSTが空の時は"(?!)"に置換します
・$LSTのファイル名指定で""(ダブルクォート)を省略できるようにした
・$LSTで重複文字列を除外してパターンを作るようにした
・$LSTで!を指定しない場合が実質機能していなかった不具合を修正

nlFilters:
・05_topBarFilter でキャッシュ容量表示をtitle属性で行うように変更
　→トップバーに限らず土地問題は深刻です…
・10_thumbInfoFilter のポップアップリンク置換を2種類に分けた
　−ポップアップリンク置換(<smid>等の文字列をポップアップリンク化)
　−ポップアップ追加(<a href="watch/<smid>">リンクにポップアップを追加)
　※ポップアップリンク置換(検索系)は複雑なので弄らないことにしました
・15_thumbInfoFilter のキャッシュアイコンHTML構成を変更(thx>>560)
　→<div position:relative;><div cacheIcon><img></div></div> から
　　<div position:relative;><img cacheIcon></div> に一階層減らしました
・検索等でtitle属性に<>が含まれるケースを考慮していなかったので対応

その他:
・★NicoCache_nl (9).07 で変更されていた終了時の待ち時間を本家に戻した
　→不都合ある人は useWorkaroundFastFinalize=true を試してみれば良いかと
・使い勝手がイマイチなのでnlContentTypeConfを廃止
　→今後はconfigのrewriterContentTypeを使ってください
・文字セットを判定して読み込む処理が多数重複していたのでまとめた
・e.getMessage()がnullを返す場合を考慮していなかったので修正(thx>>572)
・タイトルが長過ぎてファイルシステム制限を超えるとキャッシュできない不具合を修正
　→タイトルを1文字ずつ切り詰めてリトライするようにしました

開発者向け:
・dareka.processor.LocalFileResourceを実装
　→URLResource(file.toURI().toString())より効率が良いはずです
　　Last-ModifiedやContent-Typeをサポートしています
・RewriterProcessor#localRewriter()を実装
　→ローカルファイルの(必要なら書き換えた)リソースを返します
・RewriterProcessor#rewriteContent()→contentRewriter()に名称変更
　→RewriterProcessor#stringRewriter()と命名則を合わせました
・RewriterProcessor#stringRewriter()にヘッダを渡せるバージョンを追加
　→RequireHeader,ContentTypeを適用する場合はこちらを使ってください
・URLResource#setTransferTimeout()を実装
　→指定した時間(ミリ秒)以内に転送が終わらない場合に強制クローズします
　　転送用のスレッドを別途起動するので若干オーバーヘッドがあります
　※URLResource#getResponseHeader()には効きません(transferToを使わないので)
・FileUtil.getInputStreamReader()を実装
　→開始文字列を指定して文字セットを判定して読み込む処理を汎用化
　　サポートしている文字セットは今のところ以下の通り
　　　MS932,Unicode(UTF-8/UTF-16BE/UTF-16LE/BOM),EUC-JP
　※BMO付きUTF-8が一番効率良く判定できます
・nl周りの設定をdareka.NLConfigに実装(本家のBasicConfigを継承)
　→大きなところではconfigの文字コード判別読み込みかな
・★HttpHeader#getHeaderEncode,HttpHeader#setHeaderEncodeを廃止
　→メソッド本体は警告メッセージを出すだけになっています
　※該当メソッドを使っているExtensionは、HttpHeader#setMessageHeaderOnCharsetを
　　使ってヘッダ個別にエンコードを指定してください
・★Resource#getHeaderEncode,Resource#setHeaderEncodeを廃止(同上)
・Resource#setResponseHeaderOnCharsetを追加
　→本家で追加されていなかったので(変更される可能性があります)
　※add〜は未対応(今回は最低限必要なものしか追加していません)
・本家のsetXxxOnCharsetでcharsetNameにnullを許容するようにした
　→単純にOnCharsetに置き換えた時にnullを許容していないと都合が悪いので
・CommentDownloader.getResourceでURLResource#getResponseHeaderを使うように修正
　→ヘッダを書き換えるだけで内部変換無しにコメント鯖から直接取得するように
　　ところで誰かが追加した投コメ取得ってちゃんと機能していたの？
　　fork=="1"はおかしいので"1".equals(fork)に変更しましたが試してません
・EasyRewriter(nlFilter)をRewriterProcessor内で個別処理するようにした
　→リクエストヘッダを処理するのに必要、処理効率も若干良くなっているはず
・その他、色々と変更(詳しく知りたい人はdiff取ってください)
　→上記に無いpublicメソッドについては仕様が変更される可能性があります


NicoCache_nl (9).12 +101103mod
・ExtThumbProcessorを実装して外部サムネをメモリにキャッシュするようにした
　→/api/getthumbinfoメモリキャッシュと仕組みは同じです
・/api/getthumbinfoの書き換えを?nlFilterパラメータ付き限定にした
　→XML文書内にHTMLが含まれるのはイリーガル＆想定していないアプリがあるため
　※書き換えが必要な場合は/api/getthumbinfo/<id>?nlFilterで呼び出してください
・/api/getthumbinfo/<id>?<数字>の場合はキャッシュを破棄して再取得するようにした
　→鯖に対してはパラメータ無しで取得します(?nlFilterも同様)
　※?nlFilterと併用可能です(?nlFilter&<数字>とすれば書き換え有で再取得)
・チャンネルのポップアップに対応(popThumb)
nlFilters:
・キャッシュアイコン位置の調整をCSSで行うようにした(cacheIcon)
　→サンプルも兼ねてニコニ広告に対応してみました(IEでは多少ずれるけど)
・nlFilterが属性(style,onMounseOver等)を追加する場合は末尾に追加するようにした
　→なるべくオリジナルの属性並びを維持するように(ただしJarty等の複雑なのは除く)
・フィルタを全体的に見直して不要と思われるものを削除する等の整理をした
・原宿対応で視聴履歴の対応を忘れていたので追加
開発者向け:
・RewriterProcessor#rewriteContent()を実装
　→Extension等でContent-body(byte配列)に対してRewriter処理できます
　　RewriterProcessor#stringRewriter()と異なり一度文字列にする必要がありません
・URLResourceCache#cacheAndRewrite()を実装
　→Rewriter処理した結果を取得できます(ただし内容チェックはしていません)
・dareka.debug=trueで頻繁に発生するExceptionの一部のスタックトレースを抑制した
　→これで少しはデバッグログが見易くなるんじゃないかと

フィルタを大幅に弄ったので、おかしなところがあれば報告願います。
報告ついでに修正して貰えるとありがたい。


NicoCache_nl (9).12 +101029mod
・ニコニコ動画(原宿)にとりあえず対応
　→旧バージョンの積極的な対応は致命的な不具合が出ない限り行いません
・/cacheを/local同様にwwwドメイン以外でも処理するようにした
・nlFilterの変数置換でnineドメインのwatchページも対象とするようにした


NicoCache_nl (9).12 +101017mod
・10/14の仕様変更でwatchページからのタイトル取得が機能しなくなったので対応
　→NicoCachingTitleRetriever.getTitleFromResponse()の修正です
　　念のため <p class="video_title"→Video.title→H1 の順に取得するように
　※今後の仕様変更で<p class="video_title"にマッチしなくなったら警告が出ます
・$LSTの動作を変更(期待しない全マッチ対策)
　→#startの記述を不要に＆一つでも空$LSTが含まれる場合は置換処理をスキップ
　　副作用で行頭が'#'の正規表現を書く場合は'\'でエスケープする必要があります
　※disableLSTmod=trueで従来の動作になります
・正式版パッケージに付属のファイルで弄ったものを添付してみた

watchページの仕様変更に対応した本家 NicoCache 0.44 が出ていますが、
nlへのマージは一度正式版にパッケージングされてからにしたいと思います。
ざっと確認したところnlからの取り込みも結構ありますが(Configの動的読込とか)、
変更点や追加修正も多数あるので現時点でのマージはちょっと危険っぽいです。

nlの場合、Extensionが本体の機能を使っている事があるので、大きな構成変更を
やることが難しいのよね(まあ、その多くは自分の作ったExtensionなんですけど…)。
nl独自機能(↓NicoApiUtilへの機能追加とか)はnl独自クラスを作って実装した方が
良い気がしてきたのですが、Extensionへの影響が大きすぎるからなぁ。例えば 
nlApiUtil extends NicoApiUtilとして本家機能を継承した上で独自機能を実装とか。
まあ、それでも本家側にも継承を意識した修正を入れる必要はあるでしょうけど。


NicoCache_nl (9).12 +101011mod
・/cache/<id>.xmlで公式動画等のthreadkeyが必要なコメントの取得に対応
・NicoApiUtilに以下のメソッドを追加した
　- query2map  クエリ文字列をマップにして返す
　- map2query  マップをクエリ文字列にして返す
　- makePath   API名とパラメータマップからpath文字列を生成する
　- getURLResource    URLにアクセスするためのURLResourceを返す
　- getResourceContent URLにアクセスして内容を文字列にして返す
　- getFlapiContent  flapiにアクセスして内容を文字列にして返す
　※flapi以外も上記メソッドの組み合わせで対応出来ます


NicoCache_nl (9).12 +100926mod
・特定条件で内部的に一時ファイルが残ったままになる不具合を修正
　→キャッシュのDL中削除やnoLiveCache=trueでキャッシュをスキップした時など
・noLiveCache=trueの時は一時ファイルを無視してそのまま返すようにした
　→"no cache found: 〜 live Movie. skip."の表示も冗長なので抑制しました
・thcacheMode=folder時のメモリ使用効率等を改善した…つもり
　→最近実装した処理を使うように書き換えたので効率は良くなっているはずだけど、
　　実測してみたら体感できるほどの違いが感じられない…
　※一旦メモリに読み込むのを止めたからメモリ使用効率は良くなっているはずです
・thcacheMode=folder時の代替サムネに関する挙動を変更
　→代替サムネのコピーを止めてゼロバイトのファイルを作成するようにしました
　　この変更により代替サムネを動的に切り換えることができるようになります
　※今まで通りの挙動が良い人はthcacheReplace404Mode=copyを指定してください
・$NESTで','を含む条件を記述できなかった不具合を修正(thx>>905)
　→条件に','を含む場合は'\'でエスケープしてください


NicoCache_nl (9).12 +100918mod
・マイリスト連続再生で公式動画を再生すると正しくキャッシュされない不具合を修正
　→外部プレイヤーと同じ理由です(watchページを介さないため)
　　http://flapi.nicovideo.jp/watch/〜の内容を見て動画IDとタイトルを取得します
　　公式動画以外でも最初からタイトル付きでキャッシュするようになります
　※Rewriterで取得するのでnlFilter_sysにContentType(.+/json)の追加が必要です


NicoCache_nl (9).12 +100914_2mod
・一度ダウンロード中削除を行うと同じ動画はずっと削除される不具合を修正
　→ダウンロード終了後の削除処理にremoveAll()を使っていたのを忘れていた…orz

NicoCache_nl (9).12 +100914mod
・SwfConvertResource#swfHeaderに9バイト目以降の情報も保持するようにした
　→今までは先頭8バイトのみで圧縮部分に掛かる部分は保持していませんでした
　　また、#swfHeaderInfoにヘッダの解析結果を以下のCSV形式で保持します
　　　signature,version,length,width,height,fps,count
　※ついでにswfHeader内のFrameSizeが可変しても大丈夫なようにしましたが、
　　今まで特に問題は出ていなかったので今後も9バイト固定だと思います
・swfDebug=trueの時にログに出ていたZLIB〜は勘違いだったので削除orz
・dareka.common.LRUMap(容量上限付きLinkedHashMap)を追加した
　→URLResourceCacheで使っていたものをExtensionから使えるように切り出しただけです
　※ExtensionでLRUMapを実装するとクラスファイルが複数になって美しくないので…
・dareka.common.NullOutputStreamを追加した
　→純粋に何もしないOutputStreamなのでnlMovieFetcherの方法より効率良いです
・Cache.removeAll()でダウンロード中のキャッシュも削除予約できるようにした
　→Extensionから削除予約できるようになります(totalRenameは次版で対応)


NicoCache_nl (9).12 +100903mod
・ファイルシステム跨ぎ移動の場合はI/Oを直列化して競合状態を防ぐようにした
　→100MBクラスのファイルコピーが並列に複数走るとシステム的によろしくないので
　※リネームの場合はメタデータの操作だけなので並列のままです
・外部プレーヤーから通常キャッシュが使われないケースがあったので対応
　→?eco=1対応の影響でエコノミー時間帯に?eco=1アクセスだと判断していた
・ソースの整理(コメントアウト部分を削除)


NicoCache_nl (9).12 +100820mod
・Cache実装周りの排他制御を更に真面目にやってみた
　→Cache#cacheFileを無くして(これが元凶)、常にid2Fileを参照するように
　　CacheManager.id2FileLock(ReentrantReadWriteLock)を使って排他制御
　※通常はアクセサメソッド(id2File_get/id2File_put)を介して使います
　　排他制御コストは更に増えていますが、Cache#moveTo()は直列化が無くなったので
　　/cache/move?等のレスポンスは今までよりも速くなっています
・意味的におかしいのでCacheManager.dir2Path→dir2Fileに名前を変更
　→dir=pathなので混乱の元(Fileならファイルシステム上であることが自明なので)
　　valueもString→Fileに変更(必ずnew FileしているのでStringの必要が無い)
　※Cache/CacheManagerを継承してdir2Pathを参照するExtensionは動作しなくなります
　　現状で把握しているものはcacheMoveExtensionのみ(同時に修正版出します)

CacheManager内の用語整理:
  id   - 動画ID(=Cache#cacheId or smid)
  path - cacheFolderをルートとするnlから見た相対path(フォルダ名)
  dir  - pathと同じ
  dirList - nlが認識しているpathの集合(ソート済)

機能追加:
・簡易振り分けで無視するフォルダを指定できるようにした
　→storeFilterIgnoreに無視するフォルダにマッチする正規表現を記述する
　　ex) storeFilterIgnore=(対象外|フォルダ|正規表現)
・StringResource.getBadRequest()を追加
　→パラメータのおかしなAPIリクエストへの返答用

不具合修正:
・/cache/ajaxのContent-Typeにcharset=UTF-8を追加(ブラウザの自動検出対策)
　→今後は"application/x-javascript; charset=UTF-8"になります
・/cache/*.jsonのContent-Typeをapplication/jsonに変更
　→今まで"application/x-javascript"だったのでJSONとして認識しなかったはず
　※でも、ニコ動のPrototype.jsは1.5系なのでresponseJSONは使えません…
・/cache/ajax等でキャッシュの更新日時が初回しか反映されない不具合を修正
　→touchCache=trueの場合に動画の視聴による更新が反映されていませんでした
　※getxmlの場合はXMLキャッシュの影響でreload=trueじゃないと反映されません
・/cache/getxmlがパラメータによっては"ぬるぽ"になる不具合を修正
・ExtensionのCompleteCacheで発生した例外を捉えて処理を続行するように修正
・speedLimitを一度設定した後にコメントアウトすると値が残る不具合を修正

・外部プレーヤーから公式動画を再生すると正しくキャッシュされない不具合を修正
　→外部プレーヤーの場合は動画情報を取得してからキャッシュするように変更
　　今まではsmXXXXでキャッシュ後に存在しない動画情報を取得して失敗していた

…なんだけど、プレ垢以外だと殆ど外部プレーヤーで再生できない(数回再生できただけ)
なんかアクセスパターンを見るとプレーヤーが動画の取得まで行かないみたい。
一般・ゲスト共に殆どテストできないので、デバッグ表示を残したままにしてあります。
また、一週間ほど様子を見てからコード整理等の修正を入れた版を出します。


NicoCache_nl (9).11 +100807mod
・Cache.removeAll()で通常IDの場合にエコノミーキャッシュが消えない不具合を修正
　→片方のケースしか考慮していませんでした…(thx>>168)


NicoCache_nl (9).11 +100805mod
★不具合修正のみで機能追加は無し(タイミング問題絡みなのでテスト不十分です)
・キャッシュDL中フラグを降ろすのをwrapup()の後に移動した
　→nlMovieFetcherで稀にDL成功したのにリトライするのは多分これが原因
　　CompleteCache等で時間のかかる処理をすると発生確率が上がる(から気付いた)
　※尤も次版ではリトライするケースを減らすのでfailedにならないだけですが…
・Cache実装周りを見直して結構真面目に排他制御するようにした
　→cacheFile.renameTo()が成功した瞬間にCache#exists()が失敗するのはまずいので
　※真面目にやった副作用で排他制御コストが結構かかっていると思います
・Cache.removeAll(String id)を追加した(cache/rm?から切り出しただけ)
　→通常キャッシュ、エコノミーキャッシュ、それらの一時ファイル、を一括削除
・キャッシュ削除周りを見直して実際に削除できたかどうかチェックするようにした
・キャッシュ中削除でもCache.removeAll()で関連ファイルを削除するようにした


NicoCache_nl (9).11 +100801mod
・SwfConvertResourceでストリーム処理できそうな気がしたのでやってみた
　→受信しながら逐次変換するので全てオンメモリ処理になります
　　メモリ消費量も従来より格段に少ないはずですが効率は若干悪いかも知れません
　※これに伴いswfConvertMemoryLimitは廃止となります
・swfHeaderのサイズ拡張分を完全に満たしていなかったので残りを0で埋めるようにした
　→今まで特に不具合も出なかったので殆ど影響無いと思いますが…
・出力側もバッファリングしてクライアントがまとまった単位で受信するようにした
　→これでwrapperを自動再生許可にしても大丈夫になるかも？
・非圧縮SWFは非圧縮のまま返すようにした
　→SWF的に問題無いはずですがユーザーニコ割の再生に失敗する事があるので
　　同じSWFなのに再生出来たり出来なかったりってのが質悪い…
・swfDebug=trueの時のログ内容をちょっとだけ見易くした
・deletedMoviePlayMode,useSearchExtensionを動的反映するようにした
・ローカルFLVサーバ機能をlocalFlvの値を見て動作するようにした
　→これまでlocalFlvの値に関わらず常に動作していました(常にONで良い気も…)


NicoCache_nl (9).10a +100715mod
・[RequestHeader]で/cache以下にリダイレクトするとおかしくなる不具合を修正
　→HttpRequestHeader#setURI()した時にhost,port,pathも更新するようにしました
・getthumbinfoキャッシュでstatusCodeが200以外の時は30秒以内に破棄するようにした
・リロードのタイミングによっては[Config]が存在しない事がある可能性を無くした
・NicoCachingTitleRetrieverでぬるぽが出る可能性があったので修正
・cacheGetThumbInfoDebug周りを削除
・書き換えた部分のコメントアウトを削除した
※いちおうdefaults推奨値はこのあたりで(あまり少ないと意味無いので…)
　　cacheGetThumbInfo=true
　　cacheGetThumbInfoMax=100
　　cacheGetThumbInfoExpire=1800


NicoCache_nl (9).10a +100708mod
・URLResource#getResponseBodyを実装してそれを使うように書き換えた
　→似たようなコードが複数(本体はもちろんExtensionにも)あったので纏めてみた
　　URLResource#transferToの代わりに使えばデコード処理まで行います
　※メモリ内に受信するのであまり大きな物には使わないでください
・URLResourceCacheを実装してメモリキャッシュを簡単に使えるようにしてみた
　→URLResourceをメモリ内にキャッシュします(MaxおよびExpire付き)
　　URLResource#getResponseBodyを使うと受信したBodyをメモリ内に保持するので
　　一度受信した内容をResourceのまま使い回すことが出来ます
・GetThumbInfoProcessorを実装してgetthumbinfoをキャッシュするようにした
　→cacheGetThumbInfo=true で有効になります(デフォルト無効、有効で良い？)
　　cacheGetThumbInfoMax=10 は保持する最大数
　　cacheGetThumbInfoExpire=600 はレスポンスが生成されてから有効な時間(秒)
　　cacheGetThumbInfoDebug=true でキャッシュの動作確認(問題無ければ削除)
　※まだdefaultsを書いていないので各自config.propertiesに追加で
・GetThumbInfoUtilをURLResourceCacheを使うように書き換えた
・NicoCachingTitleRetrieverからGetThumbInfoUtilを使うように書き換えた
・[Config]リロード周りの不具合を修正
　→システムフィルタとユーザーフィルタで別々に管理するようにしました
・コンパイル/Javadocで警告が出る部分を修正＆古いコメントアウトを削除
・書き換えた部分の元コードはコメントアウトのまま残しています(問題無ければ削除)


NicoCache_nl (9).06 +091225mod
・キャッシュフォルダ直下の'#'から始まるフォルダをサブフォルダの対象から外した
・フォルダリストをソートして格納するようにした(+StringBuilderを使うようにした)
・キャッシュからの検索結果でタグのネストがおかしかったので修正(</span></p>の順)


NicoCache_nl (9).04 +091114mod
・Main.javaのコメントアウトがバッサリ削除されていたので、整合性を取るために
　Configの@Deprecated関係も削除して本家とのdiffを取り易い状態に戻した
・Eclipseで警告が出る部分を修正(主に未使用importのコメントアウト)


NicoCache_nl (9).03 +091110mod
・StringBuffer/Builderの初期容量を指定するようにした
　→AbstractStringBuilderのソースを見ると、常時配列を操作して足りなければ
　　拡張するという、お世辞にも効率的とは言えない実装だったので…
・StringBufferを扱うループ内で文字列連結操作をしている部分を修正
　→可能ならStringBuilderに置き換え＆元のBuilderにappendするようにした
　　まあ、キャッシュ2万ファイルを処理しても10ms程度しか速くなりませんが…
・メンテナンス中(503)もRewriterの書換対象にした
・idGroupに'!'を許容して「キャッシュが存在しない場合のみ置換」出来るようにした
・EasyRewriter#onMatchが長かったので置換処理を別メソッドに分離した

以下はいつもの人と被ったので中止(実装内容も向こうの方が安全っぽいし)
・生放送から呼ばれた時はキャッシュしない機能を追加(disableCacheOnLive=true)
　→なんとなく思い付いたのでやってみた(コード量も大したこと無いし)
　　キャッシュが有る場合はキャッシュを利用、無い場合はキャッシュ処理をスキップします
　　判定方法は直前のgetflvに"&ckey="が含まれるかどうか、なので並列して同時に複数
　　呼び出すと誤判定すると思いますし、この方法で正しいかどうかも正直分かりません…
