Eine Web-App zum Finden einer Bewertungsskala zwischen zwei beliebigen Dingen. Wollten Sie schon immer etwas auf einer Skala von David Hasselhoff bis zum Eiffelturm bewerten? Nun, jetzt können Sie es.
Dave Pagurek und ich haben dies für den TerribleHack Winter 2015-Hackathon gemacht. Ich habe das Backend geschrieben, Dave hat das Frontend geschrieben. Später habe ich das Backend in Nim und dann in D umgeschrieben, um es sauberer und einfacher bereitzustellen und das Erlernen neuer Sprachen zu ermöglichen.
Probieren Sie es unter http://ratewith.science aus!
„Rate With Science“ verwendet die Suche nach dem kürzesten Pfad-Graphen im Wikipedia-Link-Graphen, um Zusammenhänge zwischen verschiedenen Dingen zu finden. Es verwendet ein effizientes binäres Link-Graph-Format, das von meinem Wikicrush-Projekt erstellt wurde, sodass ich das gesamte Diagramm in etwa 500 MB Speicher unterbringen und sehr schnelle Breitensuche darauf durchführen kann.
Es nutzt auch die Funktion von Wikicrush zum Kommentieren bidirektionaler Pfade. Wenn ein Artikel auf einen anderen Artikel verlinkt und dieser Artikel wiederum darauf verlinkt, ist das ein Hinweis auf eine stärkere Beziehung als bei einem unidirektionalen Link. Die App versucht zunächst, einen Pfad ausschließlich über bidirektionale Links zu finden und greift auf unidirektionale Links zurück, wenn dies nicht möglich ist. Die bidirektionalen Pfade funktionieren im Allgemeinen besser, da sie keine schwachen Verbindungen wie „Wikipedia hat seinen Hauptsitz in der San Francisco Bay Area“ enthalten.
Daves JS sendet meinem Backend zwei Endpunkte über AJAX und mein Backend gibt eine Liste von Artikeln zurück, die einen Pfad bilden, oder einen Fehler, falls in seltenen Fällen kein Pfad gefunden werden kann.
Das Frontend ist in statischem HTML und JS geschrieben und verfügt über CSS3-Animationen und -Eigenschaften für ein besonders ausgefallenes Design. Das Backend ist derzeit in Rust geschrieben und wird zum vierten Mal neu geschrieben. Zuvor hatte ich es zum Spaß in D, Nim und Rust geschrieben (als ich es zum ersten Mal lernte). Allerdings brach die D-Codebasis immer wieder zusammen und es war schwierig, sie auf meinem VPS bereitzustellen, also habe ich sie in Rust umgeschrieben, damit ich sie hoffentlich einfacher weiterlaufen lassen konnte.
Zuerst übersetzt das Backend die angegebenen Seiten mithilfe der SQLite-Datei wikicrush xindex.db
in etwas, das mit dem Binärdiagramm verwendet werden kann. Das Backend führt dann eine Breitensuche in einem In-Memory-Puffer der Datei wikicrush indexbi.bin
durch. Zunächst wird versucht, BFS nur über bidirektionale Links durchzuführen, da diese zu besseren Pfaden führen. Wenn dies jedoch fehlschlägt, versucht es eine Suche in einer Richtung. Dann verwendet es die SQLite-Datenbank, um die erhaltenen Pfadoffsets wieder in Artikelnamen zu übersetzen und sie als JSON an das Frontend zurückzusenden.
Die erste Neufassung wurde von Tristan in Nim vorgenommen, um die Sprache zu lernen und das Ganze weniger hackig zu machen, als es die alte Rust-Version war. Das Nim-Backend nutzte das Jester-Webframework, um Daves Frontend zu bedienen und auf API-Aufrufe zur Pfadfindung zu reagieren.
Das Backend verwendet eine kompilierte Rust-Binärdatei aus dem ratews_backend-Projekt, um einen Pfad zu finden.
Leider handelt es sich bei der Verbindung zwischen ihnen um einen totalen Hack, der durch die Tatsache verursacht wurde, dass Rust Alpha-Qualität hat, ich nicht wirklich weiß, wie man es benutzt, und es nur ein eintägiger Hackathon war. Nachdem ich an die Wand gestoßen war, konnte Iron die globalen Diagrammdaten und die SQLite-Verbindung zwischen Anfragen nicht ordnungsgemäß verarbeiten, da der SQLite-Verbindungstyp nicht threadsicher war und Iron multithreaded ist. Ich hätte das durch richtiges Multithreading und Message Passing umgehen können, aber ich wusste nicht, wie man das in Rust macht, und die Zeit wurde knapp.
Die Lösung bestand darin, die Rust-Binärdatei über ein einfaches Textformat über stdin und stdout interagieren zu lassen. Dann habe ich eine einfache Sinatra-App in Ruby geschrieben, die Daves Frontend bediente und API-Anfragen über IO-Pipes an den Rust-Prozess und über JSON zurück an das Frontend weiterleitete.
Bei Hackathons sucht man keinen sauberen Code ... Außerdem sind alle Pfade fest codierte absolute Pfade zu den verschiedenen Komponentenprojekten im Dateisystem meines Laptops ...
Da ich dies als Experiment zum Ausprobieren neuer experimenteller Sprachen verwende, ist die Bereitstellung nicht so einfach. Aber glauben Sie mir, es ist mit der neuen D-Version einfacher als mit den Nim- oder Rust-Versionen. Schritte:
ratewithscience
data
mit dem ratewithscience
-Verzeichnis. Technisch gesehen benötigt es nur xindex.db
und indexbi.bin
dub run
aus, um den Server zu kompilieren und zu starten, oder dub build
um eine Binärdatei zu erstellen Dieser Code wird unter der MIT-Lizenz veröffentlicht.