เว็บแอปสำหรับค้นหาระดับการให้คะแนนระหว่างสองสิ่งใดก็ได้ เคยต้องการที่จะให้คะแนนบางสิ่งบางอย่างในระดับของ David Hasselhoff ถึงหอไอเฟลหรือไม่? ตอนนี้คุณสามารถ
Dave Pagurek และฉันทำสิ่งนี้เพื่อแฮ็กกาธอน TerribleHack Winter 2015 ฉันเขียนแบ็กเอนด์ Dave เขียนส่วนหน้า ต่อมาฉันได้เขียนแบ็กเอนด์ใหม่ใน Nim จากนั้นตามด้วย D เพื่อให้สะอาดขึ้นและง่ายต่อการปรับใช้ รวมถึงเรียนรู้ภาษาใหม่ๆ
ทดลองใช้ได้ที่ http://ratewith.science!
Rate With Science ใช้กราฟเส้นทางที่สั้นที่สุดค้นหาบนกราฟลิงก์ Wikipedia เพื่อค้นหาความเชื่อมโยงระหว่างสิ่งต่าง ๆ ใช้รูปแบบกราฟลิงก์ไบนารี่ที่มีประสิทธิภาพซึ่งสร้างโดยโครงการ wikicrush ของฉัน เพื่อให้ฉันสามารถใส่กราฟทั้งหมดลงในหน่วยความจำประมาณ 500mb และทำการค้นหาในแนวกว้างอย่างรวดเร็วในครั้งแรก
นอกจากนี้ยังใช้คุณลักษณะของ wikicrush ในการใส่คำอธิบายประกอบเส้นทางแบบสองทิศทาง เมื่อบทความเชื่อมโยงไปยังบทความอื่นและบทความนั้นเชื่อมโยงกลับไปยังบทความนั้น นั่นบ่งบอกถึงความสัมพันธ์ที่แน่นแฟ้นมากกว่าการเชื่อมโยงแบบทิศทางเดียว ก่อนอื่นแอปจะพยายามค้นหาเส้นทางโดยใช้ลิงก์แบบสองทิศทางเท่านั้น และจะถอยกลับไปยังลิงก์แบบทิศทางเดียวหากไม่สามารถทำได้ โดยทั่วไปแล้ว เส้นทางสองทิศทางจะทำงานได้ดีกว่าเนื่องจากไม่มีการเชื่อมต่อที่ไม่สำคัญ เช่น "วิกิพีเดียมีสำนักงานใหญ่ในบริเวณอ่าวซานฟรานซิสโก"
JS ของ Dave ส่งจุดสิ้นสุดแบ็คเอนด์ของฉันสองจุดผ่าน AJAX และแบ็กเอนด์ของฉันจะให้รายการบทความที่สร้างเส้นทางหรือข้อผิดพลาดในกรณีที่ไม่พบเส้นทางซึ่งพบไม่บ่อยนัก
ส่วนหน้าเขียนด้วย HTML และ JS แบบคงที่พร้อมภาพเคลื่อนไหว CSS3 และคุณสมบัติสำหรับการออกแบบที่หรูหราเป็นพิเศษ ปัจจุบันแบ็กเอนด์เขียนด้วยภาษา Rust ในการเขียนใหม่ครั้งที่สี่ ก่อนหน้านี้ฉันเขียนด้วยภาษา D, Nim และ Rust (ตอนที่ฉันเรียนครั้งแรก) เพื่อความสนุกสนาน อย่างไรก็ตาม โค้ดเบส D ยังคงพังอย่างต่อเนื่อง และมันยากที่จะปรับใช้บน VPS ของฉัน ดังนั้นฉันจึงเขียนมันใหม่ด้วยภาษา Rust เพื่อหวังว่าจะสามารถให้มันทำงานต่อไปได้ง่ายขึ้น
ขั้นแรกแบ็กเอนด์จะแปลหน้าเว็บที่กำหนดเป็นสิ่งที่ใช้งานได้กับกราฟไบนารี่โดยใช้ไฟล์ wikicrush xindex.db
sqlite จากนั้นแบ็กเอนด์จะทำการค้นหาแบบกว้างก่อนบนบัฟเฟอร์ในหน่วยความจำของไฟล์ wikicrush indexbi.bin
ขั้นแรกจะพยายาม BFS ผ่านลิงก์แบบสองทิศทางเท่านั้น เนื่องจากสิ่งเหล่านี้นำไปสู่เส้นทางที่ดีกว่า แต่หากล้มเหลว ก็จะพยายามค้นหาในทิศทางเดียว จากนั้นจะใช้ฐานข้อมูล Sqlite เพื่อแปลค่าชดเชยเส้นทางที่ได้รับกลับเป็นชื่อบทความ และจัดส่งกลับไปยังส่วนหน้าเป็น JSON
การเขียนใหม่ครั้งแรกเสร็จสิ้นใน Nim โดย Tristan เพื่อเป็นวิธีการเรียนรู้ภาษาและทำให้ทุกอย่างแฮ็กน้อยลงกว่าเวอร์ชัน Rust เก่า แบ็กเอนด์ Nim ใช้เฟรมเวิร์กเว็บ Jester เพื่อให้บริการฟรอนต์เอนด์ของ Dave ตลอดจนตอบสนองต่อการเรียก API สำหรับการค้นหาเส้นทาง
แบ็กเอนด์ใช้ไบนารี Rust ที่คอมไพล์แล้วจากโปรเจ็กต์ Ratews_backend เพื่อค้นหาเส้นทาง
น่าเสียดายที่ความเชื่อมโยงระหว่างสิ่งเหล่านั้นคือการแฮ็กทั้งหมดที่เกิดจากความจริงที่ว่า Rust นั้นมีคุณภาพระดับอัลฟ่า ฉันไม่รู้วิธีใช้งานจริงๆ และมันเป็นแค่แฮ็กกาธอนวันเดียวเท่านั้น หลังจากชนกำแพง Iron ไม่สามารถจัดการข้อมูลกราฟทั่วโลกและการเชื่อมต่อ Sqlite ระหว่างคำขอได้อย่างสวยงาม เนื่องจากประเภทการเชื่อมต่อ Sqlite ไม่ปลอดภัยสำหรับเธรด และ Iron เป็นแบบมัลติเธรด ฉันสามารถแก้ไขปัญหานี้ได้ด้วยการมัลติเธรดและการส่งข้อความที่เหมาะสม แต่ฉันไม่รู้ว่าต้องทำอย่างไรใน Rust และเวลากำลังจะหมดลง
วิธีแก้ไขคือทำให้ไบนารี่ของ Rust โต้ตอบกับ stdin และ stdout ผ่านรูปแบบข้อความธรรมดา จากนั้น ฉันเขียนแอป Sinatra ง่ายๆ ใน Ruby ที่ให้บริการฟรอนต์เอนด์ของ Dave และคำขอ Shuttled API ไปยังกระบวนการสนิมบนไปป์ IO และกลับไปยังฟรอนต์เอนด์ผ่าน JSON
Hackathon ไม่ใช่ที่ที่คุณจะไปหาโค้ดที่สะอาด... นอกจากนี้พาธทั้งหมดยังเป็นพาธแบบสัมบูรณ์แบบฮาร์ดโค้ดไปยังโปรเจ็กต์ส่วนประกอบต่างๆ บนระบบไฟล์แล็ปท็อปของฉัน...
เนื่องจากฉันใช้สิ่งนี้เป็นการทดลองในการทดลองใช้ภาษาทดลองใหม่ๆ จึงไม่ใช่เรื่องง่ายที่จะปรับใช้ แต่เชื่อฉันเถอะว่าเวอร์ชัน D ใหม่จะง่ายกว่าเวอร์ชัน Nim หรือ Rust ขั้นตอน:
ratewithscience
data
wikicrush ลงในไดเร็กทอรี ratewithscience
ในทางเทคนิคแล้วต้องการเพียง xindex.db
และ indexbi.bin
dub run
เพื่อคอมไพล์และเริ่มเซิร์ฟเวอร์ หรือ dub build
เพื่อสร้างไบนารี่ รหัสนี้เผยแพร่ภายใต้ใบอนุญาต MIT