Una aplicación web para encontrar una escala de calificación entre dos cosas arbitrarias. ¿Alguna vez quisiste calificar algo en una escala de David Hasselhoff a la Torre Eiffel? Pues ahora puedes.
Dave Pagurek y yo hicimos esto para el hackathon TerribleHack Winter 2015. Yo escribí el backend, Dave escribió el frontend. Más tarde reescribí el backend en Nim y luego en D para hacerlo más limpio y fácil de implementar, así como para aprender nuevos idiomas.
¡Pruébalo en http://ratewith.science!
Rate With Science utiliza la búsqueda del gráfico de ruta más corta en el gráfico de enlaces de Wikipedia para encontrar conexiones entre diferentes cosas. Utiliza un formato de gráfico de enlace binario eficiente creado por mi proyecto wikicrush para que pueda colocar el gráfico completo en alrededor de 500 MB de memoria y realizar búsquedas muy rápidas en él.
También utiliza la función de wikicrush de anotar rutas bidireccionales. Cuando un artículo enlaza con otro artículo y ese artículo enlaza con él, eso es indicativo de una relación más fuerte que un enlace unidireccional. La aplicación primero intenta encontrar una ruta utilizando solo enlaces bidireccionales y recurre a enlaces unidireccionales si no puede. Las rutas bidireccionales generalmente funcionan mejor ya que no incluyen conexiones tenues como "Wikipedia tiene su sede en el área de la Bahía de San Francisco".
El JS de Dave envía a mi backend dos puntos finales a través de AJAX y mi backend devuelve una lista de artículos que forman una ruta o un error en el raro caso de que no pueda encontrar una ruta.
La interfaz está escrita en HTML estático y JS con animaciones y propiedades CSS3 para un diseño más elegante. El backend está actualmente escrito en Rust, en su cuarta reescritura. Anteriormente lo había escrito en D, Nim y Rust (cuando estaba aprendiendo por primera vez) por diversión. Sin embargo, el código base D seguía fallando y era difícil implementarlo en mi VPS, así que lo reescribí en Rust para poder seguir funcionando más fácilmente.
Primero, el backend traduce las páginas dadas en algo utilizable con el gráfico binario usando el archivo sqlite xindex.db
de wikicrush. Luego, el backend realiza una búsqueda en amplitud en un búfer en memoria del archivo wikicrush indexbi.bin
. Primero intenta realizar BFS solo a través de enlaces bidireccionales, ya que estos conducen a mejores rutas, pero si eso falla, intenta una búsqueda en una sola dirección. Luego utiliza la base de datos Sqlite para traducir las compensaciones de ruta que obtuvo en nombres de artículos y los envía de regreso a la interfaz como JSON.
Tristan realizó la primera reescritura en Nim como una forma de aprender el idioma y hacer que todo fuera menos complicado que la versión anterior de Rust. El backend de Nim utilizó el marco web Jester para servir al frontend de Dave y responder a las llamadas API para encontrar rutas.
El backend utiliza un binario Rust compilado del proyecto ratews_backend para encontrar una ruta.
Desafortunadamente, el vínculo entre ellos es un hack total provocado por el hecho de que Rust tiene calidad alfa. Realmente no sé cómo usarlo y fue solo un hackathon de un día. Después de chocar contra la pared, Iron no pudo manejar con gracia los datos del gráfico global y la conexión Sqlite entre solicitudes porque el tipo de conexión Sqlite no era seguro para subprocesos y Iron es multiproceso. Podría haber solucionado este problema mediante subprocesos múltiples y transmisión de mensajes adecuados, pero no sabía cómo hacerlo en Rust y el tiempo se estaba acabando.
La solución fue hacer que el binario de Rust interactúe sobre stdin y stdout mediante un formato de texto simple. Luego escribí una aplicación Sinatra simple en Ruby que sirvió la interfaz de Dave y transfirió solicitudes de API al proceso de oxidación a través de tuberías IO y de regreso a la interfaz a través de JSON.
Los Hackathon no son el lugar al que se acude para encontrar código limpio... Además, todas las rutas son rutas absolutas codificadas de forma rígida a los diversos proyectos de componentes en el sistema de archivos de mi computadora portátil...
Debido a que utilicé esto como un experimento para probar nuevos lenguajes experimentales, no es tan fácil de implementar. Pero créame, es más fácil con la nueva versión D que con las versiones Nim o Rust. Pasos:
ratewithscience
clonación con cienciadata
de wikicrush al directorio ratewithscience
. Técnicamente sólo necesita xindex.db
e indexbi.bin
dub run
para compilar e iniciar el servidor, o dub build
para crear un binario Este código se publica bajo la licencia MIT.