I have been working recently on a new project: building a programming competition site for a small programming competition in February (UPDATE: site is up now at http://challenge13.jaybridgerobotics.com) and putting to good use what I learned in CS253. It is fun after years of ICFP competitions to implement my own competition site. The interesting parts are all back-end, design, and admin interface, so pretty invisible to the user, but neat none-the-less.
The public facing pieces are pretty simple and obvious:
- Home Page, overview of the competition start/end times and prize.
- Problem Description, FAQ and Leaderboard (only visible after the competition starts)
- Make everything look pretty and professional
User Accounts for Competitors gets more interesting:
- Registration with email authentication for participants
- Account Management with email authentication for password change requests etc.
- Submission page which accepts new submissions and reports date, score and link the grader output details for each submission
The most interesting pieces are under-the-hood or part of the Administrative interface:
- User submissions (zipped files) are checked for valid size/extension and stored in the google Blobstore.
- API for the grader machines to a) query for new submissions, b) download them from the Blobstore and c) report results.
- Authentication for the grader machines
- Submission grading queue with error recovery to ensure all submissions are graded (even if a grader crashes)
- Admin ability to re-run submissions (for example on update to the grader scripts), tracking of the grader versions etc
- Admin ability to inspect user submissions for fraud and abuse and disable or throttle abusive activity
- Event Log for admins to monitor activity on site.
- Automatically shut down the site for submissions when the contest ends
It’s a nice project. The udacity class was great prep and I have learned a bit more regarding email authentication, API design and other robustness requirements for this site. It will be fun to see what sort of attacks we will get when it goes live.