Løs sjakkoppgaver på Advent of Chess hver dag i advent, og få muligheten til å vinne et sjakkbrett signert av Magnus Carlsen!
Hva er Advent of Chess?
Mitt hobbyprosjekt er enda en julekalender! I Advent of Chess (med et navn sterkt inspirert av Advent of Code) får man én sjakkoppgave hver dag frem til julaften. Som i Advent of Code har man ett døgn på å løse hver oppgave, der løsningen blir publisert når det stenges for besvarelser. Jeg lager kalenderen for Offerspill sjakklubb, og vi kan derfor tilby et sjakkbrett signert av Magnus Carlsen som premie, der hver løste oppgave gir ett lodd i trekningen.
Bak hver luke gjemmer det seg ganske vanskelige sjakkoppgaver, men ingen vanlige sjakkoppgaver der man skal finne beste trekk. Dette for å unngå at man skal kunne jukse ved å bruke en sjakkmotor. Noen oppgaver er selvlagde, noen er nøye utvalgte fra gamle sjakkblader, og flere brukere har sendt inn forslag til sjakkoppgaver de har komponert selv (det høres kanskje pretensiøst ut, men man komponerer sjakkomposisjoner!). Til eksempel så er gårsdagens oppgave fra mars-utgaven av British Chess Magazine fra 1913!
Teknologi
Første versjon av kalenderen oppsto da jeg var med i Bekks kodehjørnet-faggruppe i 2020, en faggruppe der man jobber med egne hobbyprosjekter. Denne versjonen ble lagd som en en kjapp MVP med en React-frontend, Sanity for lagring av oppgavene, og Google Sheets (!) som database for å lagre besvarelser! Dette var ikke en veldig skalerbar løsning, men det funket i starten.
I år bestemte jeg meg for å skrive om nettsiden fra bunnen av. Dette var ikke bare for å forbedre brukeropplevelsen, men også for å tilrettelegge for en rekke funksjoner som skulle gjøre administrering av nettsiden, spesielt håndtering av besvarelser, enklere. Jeg forkastet den gamle kodebasen, og starte et nytt Remix-prosjekt med Tailwind til styling, SQLite med LiteFS som database, hostet på Fly. Kun Sanity ble beholdt. Oppgraderingen viste seg å være helt nødvendig, for antall brukere økte betydelig i år! Her følger et par av funksjonene som ble nødvendig å implementere med økningen i antall brukere.
Automatisk retting av svar
Tidligere måtte alle svarene, som er i fritekst og på ulike formater, rettes manuelt. Dette er en tidkrevende jobb, men det har gått fint tidligere. I år har derimot antall brukere, og dermed også besvarelser, økt såpass at jeg innså rundt 2. desember at jeg måtte få på plass automatisk retting av besvarelser, slik at jeg unngår å bruke hver kveld frem til julaften på manuell retting!
Løsningen ble å sjekke alle innsendte svar mot et regulært uttrykk (regex) som prøver å gjenkjenne riktige svar. Hver oppgave har forskjellige svar, så dette håndteres ved å lagre det regulære uttrykket sammen med oppgaven i Sanity. Dersom den ikke klarer å automatisk verifisere at besvarelsen er korrekt, sendes den til manuell retting. Det skjer heldigvis ikke så ofte lenger – mer enn 90% av svarene sendt inn i går ble rettet automatisk!
Mulighet for å sende inn svar på ny
Kalenderen tillater bare ett svar per oppgave. Dersom det første svaret man sender inn er feil, får man ikke gjort noe med det. Dette har også fungert greit tidligere år, men et annet problem som oppstod med økningen i antall brukere, er at det skal veldig lite til for at én bruker feiltolker en detalj i oppgaveformuleringen, og derfor sender inn feil svar på grunn av det. Jeg trengte en måte å nullstille feil svar dersom det skyldtes at jeg hadde formulert oppgaven unøyaktig. Jeg implementerte derfor muligheten for å nullstille en besvarelse, samtidig som det sendes ut en e-post til brukeren om at formuleringen er endret og de kan prøve på ny.
Det var også flere brukere som spurte om de kunne endre besvarelsen mens den hadde status PENDING, altså mens den venter på manuell retting. Dette fikk jeg også nylig på plass, noe som har hjulpet på å få ned antall henvendelser.
Stjerne til de 10 første!
Alle nye funksjoner har ikke strengt tatt vært nødvendige. Jeg vet for eksempel ikke hvor lurt det var å gi de 10 første som løser hver oppgave en stjerne ved siden av brukernavnet sitt på ledertavlen. Etter dette ble implementert, har det ikke tatt mer enn rundt 4 minutter for topp 10-listen å fylles hver dag, og rundt 200 brukere ser ut til å holde seg våkne til midnatt for å ta fatt på den nye oppgaven med en gang den blir publisert.
Status
Til nå i år har Advent of Chess hatt over 25,000 unike besøkende, 76,000 sidevisninger, 1920 registrerte brukere, og 8167 innsendte besvarelser. Vi i Offerspill sjakklubb opprettet en Discord-kanal for å ta i mot tilbakemeldinger, og der har det vært fullt kjør hele desember.
Og det er selvfølgelig ikke for sent å delta. Lag deg en konto på Advent of Chess og prøv deg på dagens oppgave, så kan du være med i trekningen av et sjakkbrett signert av Magnus Carlsen!
Relevante lenker anbefalt av forfatteren
Uffda. En feil har oppstått, og vi klarer ikke å hente lenken!