Um aplicativo da web para encontrar uma escala de classificação entre duas coisas arbitrárias. Sempre quis avaliar algo na escala de David Hasselhoff até a Torre Eiffel? Bem, agora você pode.
Dave Pagurek e eu fizemos isso para o hackathon TerribleHack Winter 2015. Eu escrevi o backend, Dave escreveu o frontend. Posteriormente, reescrevi o back-end em Nim e depois em D para torná-lo mais limpo e fácil de implantar, bem como aprender novos idiomas.
Experimente em http://ratewith.science!
Rate With Science usa a pesquisa de gráfico de caminho mais curto no gráfico de links da Wikipedia para encontrar conexões entre coisas diferentes. Ele usa um formato de gráfico de link binário eficiente criado pelo meu projeto wikicrush para que eu possa encaixar o gráfico inteiro em cerca de 500 MB de memória e fazer pesquisas iniciais muito rápidas nele.
Ele também usa o recurso do wikicrush para anotar caminhos bidirecionais. Quando um artigo tem um link para outro artigo e esse artigo tem um link de volta para ele, isso indica um relacionamento mais forte do que um link unidirecional. O aplicativo primeiro tenta encontrar um caminho usando apenas links bidirecionais e recorre a links unidirecionais se não conseguir. Os caminhos bidirecionais geralmente funcionam melhor, pois não incluem conexões tênues como "A Wikipédia está sediada na área da baía de São Francisco".
O JS de Dave envia dois endpoints para meu back-end via AJAX e meu back-end retorna uma lista de artigos formando um caminho ou um erro no caso raro de não conseguir encontrar um caminho.
O frontend é escrito em HTML estático e JS com animações e propriedades CSS3 para um design ainda mais sofisticado. O backend está atualmente escrito em Rust, em sua quarta reescrita. Anteriormente eu havia escrito em D, Nim e Rust (quando estava aprendendo) por diversão. No entanto, a base de código D continuava quebrando e era difícil de implantar em meu VPS, então eu a reescrevi em Rust para poder mantê-la funcionando com mais facilidade.
Primeiro, o backend traduz as páginas fornecidas em algo utilizável com o gráfico binário usando o arquivo sqlite wikicrush xindex.db
. O back-end então executa uma pesquisa ampla em um buffer na memória do arquivo wikicrush indexbi.bin
. Ele primeiro tenta fazer o BFS apenas por meio de links bidirecionais, pois eles levam a caminhos melhores, mas se isso falhar, ele tenta uma pesquisa em direção única. Em seguida, ele usa o banco de dados Sqlite para traduzir os deslocamentos de caminho obtidos em nomes de artigos e os envia de volta ao frontend como JSON.
A primeira reescrita foi feita em Nim por Tristan como uma forma de aprender a linguagem e tornar tudo menos hackeado do que a versão antiga do Rust. O back-end do Nim usou a estrutura da web Jester para servir o front-end de Dave, bem como responder às chamadas de API para localização de caminhos.
O backend usa um binário Rust compilado do projeto ratews_backend para encontrar um caminho.
Infelizmente, a ligação entre eles é um hack total causado pelo fato de Rust ser de qualidade alfa, eu realmente não sei como usá-lo e foi um hackathon de apenas um dia. Depois de atingir o limite, o Iron não conseguiu lidar normalmente com os dados do gráfico global e a conexão Sqlite entre as solicitações porque o tipo de conexão Sqlite não era thread-safe e o Iron é multithread. Eu poderia ter contornado isso com multi-threading e passagem de mensagens adequados, mas não sabia como fazer isso no Rust e o tempo estava se esgotando.
A solução foi fazer com que o binário Rust interagisse com stdin e stdout por meio de um formato de texto simples. Então escrevi um aplicativo Sinatra simples em Ruby que atendia ao frontend de Dave e transferia solicitações de API para o processo de ferrugem por meio de pipes IO e de volta ao frontend via JSON.
Hackathon não é onde você encontra código limpo ... Além disso, todos os caminhos são caminhos absolutos codificados para os vários projetos de componentes no sistema de arquivos do meu laptop ...
Devido ao fato de eu usar isso como um experimento para experimentar novas linguagens experimentais, não é tão fácil de implantar. Mas acredite em mim, é mais fácil com a nova versão D do que com as versões Nim ou Rust. Passos:
ratewithscience
clonagem com ciênciadata
do wikicrush para o diretório ratewithscience
. Tecnicamente, ele só precisa de xindex.db
e indexbi.bin
dub run
para compilar e iniciar o servidor ou dub build
para construir um binário Este código é lançado sob a licença do MIT.