任意の 2 つのものの間の評価スケールを見つけるための Web アプリ。デヴィッド・ハッセルホフのようなものをエッフェル塔に匹敵するものに格付けしたいと思ったことはありませんか?さて、それができるようになりました。
Dave Pagurek と私は、TerribleHack Winter 2015 ハッカソンのためにこれを作成しました。私がバックエンドを書き、Dave がフロントエンドを書きました。その後、バックエンドを Nim で書き直し、さらに D で書き直して、デプロイしやすく、新しい言語を学習できるようにしました。
http://ratewith.science で試してみてください。
Rate With Science は、Wikipedia リンク グラフ上で最短パス グラフ検索を使用して、さまざまなもの間のつながりを見つけます。私の wikicrush プロジェクトで作成した効率的なバイナリ リンク グラフ形式を使用しているため、グラフ全体を約 500 MB のメモリに収めることができ、非常に高速に幅優先検索を行うことができます。
また、双方向パスに注釈を付ける wikicrush の機能も使用します。ある記事が別の記事にリンクしており、その記事がその記事にリンクを張っている場合、それは一方向のリンクよりも強い関係があることを示しています。アプリは最初に双方向リンクのみを使用してパスを検索しようとし、見つからない場合は単方向リンクにフォールバックします。双方向パスは、「ウィキペディアの本社はサンフランシスコ ベイエリアにある」などの希薄な接続を含まないため、通常はより適切に機能します。
Dave の JS は AJAX 経由でバックエンドの 2 つのエンドポイントに送信し、バックエンドはパスを形成する記事のリストを返します。または、パスが見つからない場合は、エラーが発生します。
フロントエンドは静的 HTML と JS で記述されており、さらに派手なデザインを実現する CSS3 アニメーションとプロパティが含まれています。バックエンドは現在 Rust で書かれており、4 回目の書き換えが行われています。以前は、楽しみのために D、Nim、Rust (最初に学習したとき) で書いていました。ただし、D コードベースは破損し続け、VPS にデプロイするのが困難だったので、より簡単に実行し続けることができるように Rust で書き直しました。
まずバックエンドは、wikicrush xindex.db
sqlite ファイルを使用して、指定されたページをバイナリ グラフで使用できるものに変換します。次に、バックエンドは wikicrush indexbi.bin
ファイルのメモリ内バッファに対して幅優先検索を実行します。より良いパスが得られるため、最初は双方向リンクのみを介して BFS を試みますが、それが失敗した場合は単方向の検索を試みます。次に、Sqlite データベースを使用して、取得したパス オフセットを記事名に変換し、JSON としてフロントエンドに送り返します。
最初の書き換えは、言語を学習し、古い Rust バージョンよりも全体のハック性を軽減する方法として、Tristan によって Nim で行われました。 Nim バックエンドは、Jester Web フレームワークを使用して、Dave のフロントエンドにサービスを提供し、パス検索のための API 呼び出しに応答しました。
バックエンドは、ratews_backend プロジェクトからコンパイルされた Rust バイナリを使用してパスを検索します。
残念ながら、それらの間のリンクは、Rust がアルファ品質であるという事実によってもたらされた完全なハックであり、私はそれを使用する方法を実際には知りません、そしてそれはたった 1 日のハッカソンでした。 Sqlite 接続タイプがスレッドセーフではなく、Iron がマルチスレッドであるため、Iron はグローバル グラフ データとリクエスト間の Sqlite 接続を適切に処理できないという壁にぶつかりました。適切なマルチスレッドとメッセージパッシングによってこの問題を回避できたはずですが、Rust でそれを行う方法がわからず、時間が足りなくなってしまいました。
解決策は、Rust バイナリが単純なテキスト形式を介して stdin および stdout 上で対話できるようにすることでした。次に、Dave のフロントエンドにサービスを提供し、API リクエストを IO パイプ経由で Rust プロセスに送り、JSON 経由でフロントエンドに戻すシンプルな Sinatra アプリを Ruby で作成しました。
ハッカソンはクリーンなコードを見つけるために行く場所ではありません...また、すべてのパスは、ラップトップのファイル システム上のさまざまなコンポーネント プロジェクトへのハードコーディングされた絶対パスです...
私はこれを新しい実験言語を試す実験として使用しているため、これをデプロイするのはそれほど簡単ではありません。しかし、信じてください、Nim や Rust バージョンよりも新しい D バージョンの方が簡単です。手順:
ratewithscience
data
フォルダーをratewithscience
ディレクトリにシンボリックリンクします。技術的には、 xindex.db
とindexbi.bin
のみが必要です。dub run
実行してサーバーをコンパイルして起動するか、 dub build
実行してバイナリをビルドしますこのコードは MIT ライセンスに基づいてリリースされています。