ダウンロード機能、その他

今日からダウンロードをやっとまじめに作り始めました。

ダウンロード機能は、P2Pの場合とserver/clientモデルの場合では、全く違ったものになるなーと思いました。
アップロードに関しては、P2Pだろうが、server/clientだろうが、要求がきたらそれに答えるべきか判断して、答えるべきなら答える、答えるべきでなければ答えない(エラー応答など)と単純です。
かたやダウンロードは、まずどこへ接続するべきかというところから始まって、接続に成功して要求を投げた後も途中で切断される可能性があるためresume/retryを何度も行うことになります(なると考えます)。
ダウンロード予定のファイルは、それを持っているノードのアドレスを集めつつ、それらに要求を投げていくようにします。これは1つのファイルだけならまだ単純なのですが、たくさんダウンロード登録されていることを前提で作らないとならないので、ダウンロードの優先度(一度失敗したらどうするかとか、サイズが小さいものから早めにチャレンジしたほうがいいだろうとか)を動的に決めてやる必要があって、大きくいうと「ダウンローダー」と「ダウンロードスケジューラ」を作ることになります。

なかなかめんどうです。今、進捗60%くらいで、ダウンローダーはWinnyへの接続テストをしていた頃に使っていたので既にできています。

その他、前々から気にはなっていたけど、放置していた箇所を作ったり、修正したり。これには、NATノードからのキーアドレスを書き換えたり、ループしたクエリは折り返したり、長く繋ぎすぎなノードを切断したりがありました。
UIも少し増やして、ローカルキャッシュを操作するための「キャッシュ」タブと、ダウンロード登録したファイルを操作するための「ダウンロード」タブを作りました。

あと気になっているのが、たまにアクセス違反で落ちることがあります。これが、1晩起動していても落ちなかったり、起動後10分で落ちたりで、しかもphobos/internal/gc/gc.d (_d_arrayappendc)とかそんなところなので、GC的になにかまずいことしてんでしょうかと悩み中。(動的配列の結合?)
正直、次に作る予定のソフトはC++にしようかと思っています。D言語は、言語仕様的にはGoodなのですが、バグがなぜ起こっているのかものすごくわかりづらくて、今のやつも直せないんじゃないかと不安です(俺の理解度が足りないせいも十分ありますが)。
今回常駐するソフトを作るまで、ここまで困るとは思いませんでした。GC系のバグ発覚は後から来きます。起動後すぐに終了するソフトでは問題ないです。連想配列が変になってassertするのも、結局自分でハッシュテーブルクラスを書いて無かったことにしています。まじめに使うなら、これもなにがまずいのか調べないと不安です。ここで問題なのが、私がこれが自分のバグだろうと思いつつも、DMDやそのライブラリのバグじゃないのかと疑ってしまうことです。疑いは、自分の作っているソフト、コンパイラ・ライブラリ、OS、ドライバ、ハードウェアとローレベルになっていくのですが、できることなら自分の作っているソフト階層で止めたいと思うのです。DMDはまだ開発中で日々バグが報告されていることを考えると、まだ信じることができず、疑ってしまうため、バグ調査の範囲が格段に広がります(心理的な問題です)。考えが甘かった、いや、もともとネタで始めたから、そこまで深く考えなかったです。