Une application Web permettant de trouver une échelle de notation entre deux éléments arbitraires. Vous avez toujours voulu évaluer quelque chose sur une échelle comparable à celle de David Hasselhoff à la Tour Eiffel ? Eh bien, maintenant vous pouvez.
Dave Pagurek et moi avons réalisé ceci pour le hackathon TerribleHack Winter 2015. J'ai écrit le backend, Dave a écrit le frontend. J'ai ensuite réécrit le backend en Nim puis en D pour le rendre plus propre et plus facile à déployer ainsi qu'apprendre de nouvelles langues.
Essayez-le sur http://ratewith.science !
Rate With Science utilise la recherche graphique du chemin le plus court sur le graphique de liens Wikipédia pour trouver des liens entre différentes choses. Il utilise un format de graphique de liens binaires efficace créé par mon projet wikicrush afin que je puisse insérer le graphique entier dans environ 500 Mo de mémoire et y effectuer des premières recherches très rapides.
Il utilise également la fonctionnalité de wikicrush consistant à annoter des chemins bidirectionnels. Lorsqu'un article renvoie à un autre article et que cet article y renvoie, cela indique une relation plus forte qu'un lien unidirectionnel. L'application essaie d'abord de trouver un chemin en utilisant uniquement des liens bidirectionnels et s'appuie sur des liens unidirectionnels si elle n'y parvient pas. Les chemins bidirectionnels fonctionnent généralement mieux car ils n'incluent pas de connexions ténues comme "Wikipedia a son siège dans la région de la baie de San Francisco".
Le JS de Dave envoie à mon backend deux points de terminaison via AJAX et mon backend renvoie une liste d'articles formant un chemin ou une erreur dans les rares cas où il ne trouve pas de chemin.
L'interface est écrite en HTML et JS statiques avec des animations et des propriétés CSS3 pour un design encore plus sophistiqué. Le backend est actuellement écrit en Rust, à sa quatrième réécriture. Auparavant, je l'avais écrit en D, Nim et Rust (lorsque j'apprenais pour la première fois) pour m'amuser. Cependant, la base de code D n'arrêtait pas de se briser et il était difficile à déployer sur mon VPS, je l'ai donc réécrit dans Rust afin de pouvoir, espérons-le, le faire fonctionner plus facilement.
Tout d'abord, le backend traduit les pages données en quelque chose d'utilisable avec le graphique binaire à l'aide du fichier sqlite wikicrush xindex.db
. Le backend effectue ensuite une recherche en largeur sur un tampon en mémoire du fichier indexbi.bin
de wikicrush. Il essaie d'abord d'accéder à BFS via des liens bidirectionnels uniquement, car ceux-ci conduisent à de meilleurs chemins, mais si cela échoue, il tente une recherche dans une seule direction. Ensuite, il utilise la base de données SQLite pour traduire les décalages de chemin qu'il a récupérés en noms d'articles et les renvoie au frontend au format JSON.
La première réécriture a été réalisée dans Nim par Tristan afin d'apprendre la langue et de rendre le tout moins hacké que l'ancienne version de Rust. Le backend Nim a utilisé le framework Web Jester pour servir le frontend de Dave ainsi que pour répondre aux appels d'API pour la recherche de chemin.
Le backend utilise un binaire Rust compilé du projet ratews_backend pour trouver un chemin.
Malheureusement le lien entre eux est un hack total provoqué par le fait que Rust est de qualité alpha, je ne sais pas vraiment comment l'utiliser, et ce n'était qu'un hackathon d'une journée. Après avoir heurté le mur, Iron ne pouvait pas gérer correctement les données du graphique global et la connexion Sqlite entre les requêtes, car le type de connexion Sqlite n'était pas thread-safe et Iron est multithread. J'aurais pu contourner ce problème en multi-threading et en passant des messages, mais je ne savais pas comment faire cela dans Rust et le temps manquait.
La solution était de faire interagir le binaire Rust sur stdin et stdout via un simple format texte. Ensuite, j'ai écrit une simple application Sinatra dans Ruby qui servait l'interface de Dave et transférait les requêtes API vers le processus Rust via les tuyaux IO et de retour vers l'interface via JSON.
Les hackathons ne sont pas l'endroit où vous allez pour trouver du code propre... De plus, tous les chemins sont des chemins absolus codés en dur vers les différents projets de composants sur le système de fichiers de mon ordinateur portable...
Étant donné que j'utilise cela comme une expérience pour essayer de nouveaux langages expérimentaux, ce n'est pas si facile à déployer. Mais croyez-moi, c'est plus facile avec la nouvelle version D qu'avec les versions Nim ou Rust. Mesures:
ratewithscience
data
wikicrush dans le répertoire ratewithscience
. Techniquement, il n'a besoin que xindex.db
et indexbi.bin
dub run
pour compiler et démarrer le serveur, ou dub build
pour créer un binaire Ce code est publié sous licence MIT.