Aplikasi web untuk menemukan skala penilaian antara dua hal yang berubah-ubah. Pernah ingin menilai sesuatu pada skala David Hasselhoff hingga Menara Eiffel? Nah sekarang kamu bisa.
Dave Pagurek dan saya membuat ini untuk hackathon TerribleHack Winter 2015. Saya menulis backend, Dave menulis frontend. Saya kemudian menulis ulang backend di Nim dan kemudian D untuk membuatnya lebih bersih dan lebih mudah untuk diterapkan serta mempelajari bahasa baru.
Cobalah di http://ratewith.science!
Nilai Dengan Sains menggunakan pencarian grafik jalur terpendek pada grafik tautan Wikipedia untuk menemukan hubungan antara berbagai hal. Ini menggunakan format grafik tautan biner efisien yang dibuat oleh proyek wikicrush saya sehingga saya dapat memasukkan seluruh grafik ke dalam memori sekitar 500mb dan melakukan pencarian pertama dengan sangat cepat.
Ini juga menggunakan fitur wikicrush untuk membuat anotasi jalur dua arah. Ketika sebuah artikel tertaut ke artikel lain dan artikel tersebut tertaut kembali ke artikel tersebut, hal ini menunjukkan hubungan yang lebih kuat daripada tautan satu arah. Aplikasi pertama-tama mencoba menemukan jalur hanya menggunakan tautan dua arah dan menggunakan tautan searah jika tidak bisa. Jalur dua arah umumnya bekerja lebih baik karena tidak menyertakan koneksi yang lemah seperti "Wikipedia berkantor pusat di San Francisco Bay Area".
JS Dave mengirimkan dua titik akhir ke backend saya melalui AJAX dan backend saya memberikan kembali daftar artikel yang membentuk jalur atau kesalahan dalam kasus yang jarang terjadi, tidak dapat menemukan jalur.
Frontend ditulis dalam HTML statis dan JS dengan animasi dan properti CSS3 untuk desain ekstra mewah. Backend saat ini ditulis dalam Rust, pada penulisan ulang keempat. Sebelumnya saya pernah menulisnya di D, Nim dan Rust (saat pertama kali belajar) untuk bersenang-senang. Namun basis kode D terus rusak dan sulit untuk diterapkan di VPS saya, jadi saya menulis ulang di Rust agar saya dapat membuatnya tetap berjalan dengan lebih mudah.
Pertama, backend menerjemahkan halaman tertentu menjadi sesuatu yang dapat digunakan dengan grafik biner menggunakan file sqlite wikicrush xindex.db
. Backend kemudian melakukan pencarian luas pertama pada buffer dalam memori file wikicrush indexbi.bin
. Pertama-tama ia mencoba melakukan BFS hanya melalui tautan dua arah karena ini mengarah ke jalur yang lebih baik tetapi jika gagal, ia mencoba pencarian satu arah. Kemudian menggunakan database Sqlite untuk menerjemahkan offset jalur yang didapatnya kembali menjadi nama artikel dan mengirimkannya kembali ke frontend sebagai JSON.
Penulisan ulang pertama dilakukan di Nim oleh Tristan sebagai cara mempelajari bahasa dan membuat semuanya tidak terlalu rumit dibandingkan versi Rust yang lama. Backend Nim menggunakan kerangka web Jester untuk melayani frontend Dave serta merespons panggilan API untuk pencarian jalur.
Backend menggunakan biner Rust yang dikompilasi dari proyek ratews_backend untuk menemukan jalur.
Sayangnya tautan di antara mereka adalah peretasan total yang disebabkan oleh fakta bahwa Rust adalah kualitas alfa, saya tidak begitu tahu cara menggunakannya, dan itu hanya hackathon satu hari. Setelah mengalami kendala, Iron tidak dapat dengan baik menangani data grafik global dan koneksi Sqlite antar permintaan karena jenis koneksi Sqlite tidak aman untuk thread dan Iron bersifat multithread. Saya bisa mengatasi ini dengan multi-threading dan penyampaian pesan yang tepat, tetapi saya tidak tahu bagaimana melakukannya di Rust dan waktu hampir habis.
Solusinya adalah membuat biner Rust berinteraksi melalui stdin dan stdout melalui format teks sederhana. Lalu saya menulis aplikasi Sinatra sederhana di Ruby yang melayani frontend Dave dan meneruskan permintaan API ke proses karat melalui pipa IO dan kembali ke frontend melalui JSON.
Hackathon bukanlah tempat Anda mencari kode bersih... Juga semua jalur adalah jalur absolut yang diberi kode keras ke berbagai proyek komponen di sistem file laptop saya...
Karena saya menggunakan ini sebagai eksperimen dalam mencoba bahasa eksperimental baru, penerapannya tidak mudah. Tapi percayalah, ini lebih mudah dengan versi D baru daripada versi Nim atau Rust. Tangga:
ratewithscience
kloning dengan ilmu pengetahuandata
wikicrush ke direktori ratewithscience
. Secara teknis hanya membutuhkan xindex.db
dan indexbi.bin
dub run
untuk mengkompilasi dan memulai server, atau dub build
untuk membangun biner Kode ini dirilis di bawah lisensi MIT.