一個用於尋找兩個任意事物之間的評級量表的網路應用程式。您是否曾經想過用大衛哈塞爾霍夫 (David Hasselhoff) 與艾菲爾鐵塔 (Eiffel Tower) 的規模來評價某個事物?好吧,現在你可以了。
Dave Pagurek 和我為 TerribleHack Winter 2015 黑客馬拉松製作了這個。我寫了後端,戴夫寫了前端。後來我用 Nim 和 D 重寫了後端,使其更乾淨、更容易部署以及學習新語言。
請訪問 http://ratewith.science 嘗試!
Rate With Science 使用維基百科連結圖上的最短路徑圖搜尋來尋找不同事物之間的連結。它使用由我的 wikicrush 專案創建的高效二進位連結圖格式,這樣我就可以將整個圖放入大約 500MB 的記憶體中,並對其進行非常快速的廣度優先搜尋。
它也使用了 wikicrush 註解雙向路徑的功能。當一篇文章連結到另一篇文章並且該文章又連結回它時,這表示關係比單向連結更強。該應用程式首先嘗試僅使用雙向連結來查找路徑,如果不能,則使用單向連結。雙向路徑通常效果更好,因為它們不包含諸如“維基百科總部位於舊金山灣區”之類的脆弱連接。
Dave 的 JS 透過 AJAX 向我的後端發送兩個端點,我的後端返回形成路徑的文章列表,或者在極少數情況下找不到路徑時返回錯誤。
前端是用靜態 HTML 和 JS 編寫的,帶有 CSS3 動畫和屬性,可實現額外的精美設計。後端目前是用 Rust 寫的,這是第四次重寫。之前我為了好玩而用 D、Nim 和 Rust(當我第一次學習時)寫過它。然而,D 程式碼庫不斷損壞,很難在我的 VPS 上部署,所以我用 Rust 重寫了它,這樣我就有希望讓它更輕鬆地運行。
首先,後端使用 wikicrush xindex.db
sqlite 檔案將給定頁面轉換為可用於二進位圖的內容。然後後端對 wikicrush indexbi.bin
檔案的記憶體緩衝區執行廣度優先搜尋。它首先嘗試僅透過雙向連結進行 BFS,因為這些連結會帶來更好的路徑,但如果失敗,它會嘗試單向搜尋。然後,它使用 Sqlite 資料庫將其獲取的路徑偏移轉換回文章名稱,並將它們作為 JSON 傳回前端。
第一次重寫是由 Tristan 在 Nim 中完成的,作為學習語言的一種方式,並使整個事情比舊的 Rust 版本不那麼麻煩。 Nim 後端使用 Jester Web 框架為 Dave 的前端提供服務,並回應用於路徑查找的 API 呼叫。
後端使用ratews_backend專案中編譯的Rust二進位來尋找路徑。
不幸的是,它們之間的聯繫完全是由 Rust 是 alpha 品質這一事實帶來的,我真的不知道如何使用它,而且這只是一場為期一天的黑客馬拉松。碰壁後,Iron 無法優雅地處理請求之間的全局圖形資料和 Sqlite 連接,因為 Sqlite 連接類型不是線程安全的,而 Iron 是多線程的。我本可以透過適當的多執行緒和訊息傳遞來解決這個問題,但我不知道如何在 Rust 中做到這一點,而且時間已經不多了。
解決方案是讓 Rust 二進位檔案透過簡單的文字格式透過 stdin 和 stdout 進行互動。然後,我用 Ruby 編寫了一個簡單的 Sinatra 應用程序,為 Dave 的前端提供服務,並透過 IO 管道將 API 請求傳送到 Rust 進程,並透過 JSON 返回前端。
黑客馬拉松不是您尋找乾淨程式碼的地方...此外,所有路徑都是硬編碼的絕對路徑,指向我的筆記型電腦檔案系統上的各個組件項目...
由於我用它作為嘗試新的實驗語言的實驗,所以部署起來並不容易。但相信我,新的 D 版本比 Nim 或 Rust 版本更容易。步驟:
ratewithscience
data
夾符號連結到ratewithscience
目錄。從技術上講,它只需要xindex.db
和indexbi.bin
dub run
來編譯並啟動伺服器,或dub build
來建置二進位檔案該程式碼是根據 MIT 許可證發布的。