一个用于查找两个任意事物之间的评级量表的网络应用程序。您是否曾经想过用大卫·哈塞尔霍夫 (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 许可证发布的。