임의의 두 가지 항목 사이의 평가 척도를 찾기 위한 웹 앱입니다. David Hasselhoff와 에펠탑 수준으로 평가하고 싶었던 적이 있나요? 이제 할 수 있습니다.
Dave Pagurek과 저는 TerribleHack Winter 2015 해커톤을 위해 이것을 만들었습니다. 저는 백엔드를 썼고, 데이브는 프론트엔드를 썼습니다. 나중에 Nim과 D로 백엔드를 다시 작성하여 더 깔끔하고 쉽게 배포하고 새로운 언어를 배울 수 있도록 했습니다.
http://ratewith.science에서 사용해 보세요!
Rate With Science는 Wikipedia 링크 그래프에서 검색하는 최단 경로 그래프를 사용하여 서로 다른 사물 간의 연결을 찾습니다. 이것은 내 wikicrush 프로젝트에서 만든 효율적인 바이너리 링크 그래프 형식을 사용하므로 전체 그래프를 약 500MB의 메모리에 맞추고 매우 빠른 너비 우선 검색을 수행할 수 있습니다.
또한 양방향 경로에 주석을 추가하는 wikicrush 기능을 사용합니다. 기사가 다른 기사에 연결되고 해당 기사가 다시 해당 기사에 연결되면 이는 단방향 링크보다 더 강한 관계를 나타냅니다. 앱은 먼저 양방향 링크만 사용하여 경로를 찾으려고 시도하고, 찾을 수 없으면 단방향 링크로 대체합니다. 양방향 경로는 일반적으로 "Wikipedia의 본사는 샌프란시스코 베이 지역에 있습니다"와 같은 빈약한 연결을 포함하지 않기 때문에 더 잘 작동합니다.
Dave의 JS는 AJAX를 통해 내 백엔드 두 개의 엔드포인트를 보내고 내 백엔드는 경로를 형성하는 기사 목록을 반환하거나 드물지만 경로를 찾을 수 없는 경우 오류를 제공합니다.
프런트엔드는 더욱 멋진 디자인을 위해 CSS3 애니메이션과 속성을 갖춘 정적 HTML 및 JS로 작성되었습니다. 백엔드는 현재 네 번째 재작성 시 Rust로 작성되었습니다. 이전에는 재미로 D, Nim, Rust(처음 배울 때)로 작성했습니다. 그러나 D 코드베이스는 계속해서 손상되었고 내 VPS에 배포하기가 어려웠습니다. 그래서 더 쉽게 계속 실행할 수 있도록 Rust로 다시 작성했습니다.
먼저 백엔드는 wikicrush xindex.db
sqlite 파일을 사용하여 주어진 페이지를 바이너리 그래프와 함께 사용할 수 있는 것으로 변환합니다. 그런 다음 백엔드는 wikicrush indexbi.bin
파일의 메모리 내 버퍼에 대해 너비 우선 검색을 수행합니다. 먼저 더 나은 경로로 이어지는 양방향 링크만을 통해 BFS를 시도하지만 실패하면 단일 방향 검색을 시도합니다. 그런 다음 Sqlite 데이터베이스를 사용하여 다시 얻은 경로 오프셋을 기사 이름으로 변환하고 이를 JSON으로 프런트엔드에 다시 전달합니다.
첫 번째 재작성은 언어를 배우고 모든 것을 이전 Rust 버전보다 덜 해킹적으로 만드는 방법으로 Tristan이 Nim에서 수행했습니다. Nim 백엔드는 Jester 웹 프레임워크를 사용하여 Dave의 프런트엔드를 제공하고 경로 찾기를 위한 API 호출에 응답했습니다.
백엔드는 ratews_backend 프로젝트에서 컴파일된 Rust 바이너리를 사용하여 경로를 찾습니다.
불행하게도 그들 사이의 연결은 Rust가 알파 품질이라는 사실로 인해 발생하는 완전한 해킹입니다. 나는 그것을 어떻게 사용하는지 잘 모르고 그것은 단지 하루의 해커톤이었습니다. Sqlite 연결 유형이 스레드로부터 안전하지 않고 Iron이 다중 스레드이기 때문에 Iron이 전역 그래프 데이터와 요청 간의 Sqlite 연결을 우아하게 처리할 수 없다는 벽에 부딪힌 후입니다. 적절한 멀티스레딩과 메시지 전달을 통해 이 문제를 해결할 수 있었지만 Rust에서 어떻게 해야 하는지 몰랐고 시간이 부족했습니다.
해결책은 간단한 텍스트 형식을 통해 Rust 바이너리가 stdin 및 stdout과 상호 작용하도록 만드는 것이었습니다. 그런 다음 Dave의 프런트엔드를 제공하고 API 요청을 IO 파이프를 통해 Rust 프로세스로 전달하고 JSON을 통해 프런트엔드로 다시 전달하는 간단한 Sinatra 앱을 Ruby로 작성했습니다.
Hackathon은 깨끗한 코드를 찾기 위해 가는 곳이 아닙니다... 또한 모든 경로는 내 노트북 파일 시스템의 다양한 구성 요소 프로젝트에 대한 하드 코딩된 절대 경로입니다...
새로운 실험적 언어를 시도하는 실험으로 이것을 사용하기 때문에 배포하기가 쉽지 않습니다. 하지만 Nim이나 Rust 버전보다 새로운 D 버전이 더 쉽다는 것을 믿으세요. 단계:
ratewithscience
data
폴더를 ratewithscience
디렉토리에 Symlink로 연결하십시오. 기술적으로는 xindex.db
및 indexbi.bin
만 필요합니다.dub run
실행하여 서버를 컴파일하고 시작하거나 dub build
실행하여 바이너리를 빌드하세요. 이 코드는 MIT 라이센스에 따라 공개됩니다.