Веб-приложение для определения шкалы оценок между двумя произвольными вещами. Вам когда-нибудь хотелось оценить что-нибудь по шкале Дэвида Хассельхоффа и Эйфелевой башни? Что ж, теперь вы можете.
Мы с Дэйвом Пагуреком сделали это для хакатона TerribleHack Winter 2015. Я написал бэкэнд, Дэйв написал интерфейс. Позже я переписал бэкэнд на Nim, а затем на D, чтобы сделать его чище и проще в развертывании, а также в изучении новых языков.
Попробуйте это на http://ratewith.science!
«Rate With Science» использует поиск по графу кратчайших путей в графе ссылок Википедии, чтобы найти связи между различными вещами. Он использует эффективный формат графа двоичных ссылок, созданный моим проектом wikicrush, так что я могу уместить весь граф примерно в 500 МБ памяти и выполнять по нему очень быстрый поиск в ширину.
Он также использует функцию wikicrush для аннотирования двунаправленных путей. Когда статья ссылается на другую статью, а эта статья ссылается на нее, это указывает на более сильную связь, чем однонаправленная ссылка. Приложение сначала пытается найти путь, используя только двунаправленные ссылки, а если не может, обращается к однонаправленным ссылкам. Двунаправленные пути обычно работают лучше, поскольку они не включают в себя незначительные связи, такие как «штаб-квартира Википедии находится в районе залива Сан-Франциско».
JS Дэйва отправляет моему серверу две конечные точки через AJAX, а мой сервер возвращает список статей, образующих путь, или ошибку в том редком случае, когда он не может найти путь.
Интерфейс написан на статическом HTML и JS с анимацией и свойствами CSS3 для придания особого дизайна. Бэкэнд в настоящее время написан на Rust, после его четвертой переписывания. Раньше я писал это на D, Nim и Rust (когда только учился) ради развлечения. Однако кодовая база D продолжала ломаться, и ее было трудно развернуть на моем VPS, поэтому я переписал ее на Rust, чтобы, надеюсь, мне было легче поддерживать ее работу.
Сначала серверная часть преобразует данные страницы во что-то, что можно использовать с двоичным графом, используя sqlite-файл wikicrush xindex.db
. Затем серверная часть выполняет поиск в ширину в буфере в памяти файла wikicrush indexbi.bin
. Сначала он пытается выполнить BFS только через двунаправленные ссылки, поскольку они ведут к лучшим путям, но если это не удается, он пытается выполнить поиск в одном направлении. Затем он использует базу данных Sqlite для преобразования полученных смещений пути обратно в имена статей и отправляет их обратно во внешний интерфейс в формате JSON.
Первая переработка была сделана Тристаном в Nim как способ выучить язык и сделать его менее хакерским, чем старая версия Rust. Бэкэнд Nim использовал веб-фреймворк Jester для обслуживания интерфейса Дэйва, а также для ответа на вызовы API для поиска пути.
Бэкэнд использует скомпилированный двоичный файл Rust из проектаratews_backend для поиска пути.
К сожалению, связь между ними — это полный хак, вызванный тем фактом, что Rust — это альфа-качество, я действительно не знаю, как его использовать, и это был всего лишь однодневный хакатон. После того, как Iron столкнулся со стеной, он не смог корректно обрабатывать глобальные данные графа и соединение Sqlite между запросами, поскольку тип соединения Sqlite не был потокобезопасным, а Iron был многопоточным. Я мог бы обойти эту проблему, используя правильную многопоточность и передачу сообщений, но я не знал, как это сделать в Rust, а время поджимало.
Решение заключалось в том, чтобы заставить двоичный файл Rust взаимодействовать через стандартный ввод и вывод через простой текстовый формат. Затем я написал простое приложение Sinatra на Ruby, которое обслуживало интерфейс Дэйва и пересылало запросы API к процессу ржавчины через каналы ввода-вывода и обратно во интерфейс через JSON.
Хакатон - это не то место, куда вы идете, чтобы найти чистый код... Кроме того, все пути - это жестко закодированные абсолютные пути к различным проектам компонентов в файловой системе моего ноутбука...
Поскольку я использовал это в качестве эксперимента по опробованию новых экспериментальных языков, его не так-то просто внедрить. Но поверьте мне, с новой версией D проще, чем с версиями Nim или Rust. Шаги:
ratewithscience
data
wikicrush с ratewithscience
. Технически ему нужны только xindex.db
и indexbi.bin
dub run
для компиляции и запуска сервера или dub build
для сборки двоичного файла. Этот код выпущен под лицензией MIT.