Skapat av Trial and Error 2011
För att använda detta system behövs en webbserver med php-stöd samt php-sqlite och php-json. Enklaste sättet att sätta upp en sådan är att använda docker compose:
docker compose up
Efter detta finns servern på http://localhost:8080.
Inställningar för nginx-servern som används finns i default.conf.
Om du vill bygga din egen docker image, se README.docker.md.
Systemet består av två delar, presentation och rättning.
För starta presentationen öppna present.php i lämplig browser.
Presentationen består av ett antal slides som genereras av en datafil
som beskrivs nedan. Filen beskriver alla lag och grenar i rallyt.
Presentationen blir roligare om det finns resultat för de olika
grenarna, det är där rättningen kommer in. Öppna r.php och beskåda
alla tomma fält där prickar ska fyllas i.
Välj ett namn på rallyt, tex ht2011, och lägg in det i rebus_settings.php.
All information om ett specifikt rally finns i en fil med namnet ht2011.php.
Alla data som hör till rallyt finns i en katalog med namnet ht2011.
I ht2011.php filen finns en samling arrayer med data. Dessa är relativt självförklarande, men här är ändå en förklaring:
- teams: En array som mappar lagnamn mot lagnummer och antal lagmedlemmar. Antal lagmedlemmar behöver endast sättas till rätt antal om man vill använda prickberäkning baserat på antal lagmedlemmar. För att markera blåbärslag och småbil osv kan man använda syntaxen
'Lag namn' => array(<lag nummer>, <antal lagmedlemmar>, <flair>),
Flair en bild som läggs framför lagnamnet i grafer, för att använda tex markera
en småbil kan man skriva '<small>' och skapa en bild som heter small.png.
-
events: En ganska stor array som innehåller alla rebusar, pyssel och plock och övriga "grenar" som ger prickar, tex öppnade kuvert. De olika grenarnas kortnamn mappas mot deras fullständiga namn. Kortnamnens begynnelsebokstav måste vara R för rebusar, S för stjälprebusar, P för pyssel, FP för fotoplock och TP för tallriksplock. Övriga grenar behöver inte heta något speciellt.
-
parts: Här mappas rallyts etapper upp. Det är enligt denna gruppering som presentationen kommer att visas. Etapperna byggs upp av kortnamnen som definierades i events arrayen enligt ovan. Läs nästa avsnitt för mer information!
-
maxPoints: Pyssel mappas mot antal maxprickar i det pysslet. Om maxprickar finns för ett pyssel visas det i presentationen och på rättningssidan.
-
info: Här kan man mappa in specialinformation per gren. Denna info visas på rättningssidan till stor hjälp för de stackars satar som rättar. Man kan givetvis använda regexpar för att mappa. Man kan använda specialsyntaxen: för att markera texten röd om något är exakt viktigt. ersätts med X multiplicerat med antalet lagmedlemmar.
En etapp är antingen en enda gren som bara anges med kortnamnet eller
så består den av flera grenar, enligt formatet <etappnamn> => array(<grenar>). Efter att grenarna har visats generas automatisk en
summeringsslide som heter 'Summering '. Om namnet på etappen är
'Etapp X' och det finns en bild som heter etappX.xxx (xxx är jpg,
png eller gif) kommer bilden att visas i en egen slide. På samma sätt
visas bilder för pyssel och plock om det finns en bild med namnet
gren<grenkortnamn>.xxx eller bara <grenkortnamn>.xxx.
Det speciella grennamnet *sum* används för att summera resten av
grenarna i en array och presentera resultat i en sorterad lista.
På detta sätt kan man summera olika etapper, även
med fördel rekursivt. Man kan alternativt använda *sumcomp*, effekten
blir liknande som med *sum* men dessutom görs en animation som visar hur
lagens position har ändrats jämfört med den första sliden efter
*sumcomp*.
För extra effekt kan man lägga in en bild (som får titeln 'Lunch'):
*picture*Lunch:lunch.jpg
eller en speciallösning av en rebus:
*solution*S11puh
eller en event summering (första posten efter esum blir titeln):
array(*esum*, 'Stjälpplock totalt', 'StjPlk', 'ÖppPlk')
En gren som presenteras som sorterad (kan används för tex stilpris):
*sorted*Stil
Detta verkade nog mycket mer komplicerat än det är, utgå från en gammal fil så går det lätt. Använd webserverns log för att hitta eventuella syntaxproblem.
Här är ett utdrag från ht2011.php:
...
'Etapp 4' => array('R 4', 'P DOD', 'P HOP', 'TP 4', 'FP 4', 'Tid L'),
'Totalt efter Etapp 4' => array('*sumcomp*', 'Totalt efter Etapp 3', 'Etapp 4'),
'Lunch' =>
array('*picture*Lunch:lunch.jpg',
'P GRI', 'P TPS', 'P TAT', 'P HZZ', 'P TUP', 'ÖppPlk', 'StjPlk',
array('*esum*', 'Stjälpplock totalt', 'StjPlk', 'ÖppPlk'),
'ÖppReb',
'S 1', 'S 2', 'S 3', 'S 4', 'S 5', 'S 6', 'S 7',
'S 8', 'S 9', 'S 10', 'S 11',
'*solution*S11puh', 'S 12',
array('*esum*', 'Stjälprebusar totalt',
'ÖppReb', 'S 1', 'S 2', 'S 3', 'S 4',
'S 5', 'S 6', 'S 7', 'S 8', 'S 9', 'S 10', 'S 11', 'S 12')),
'Totalt efter Lunch' => array('*sumcomp*', 'Totalt efter Etapp 4', 'Lunchsummering'),
...
Här definieras två etapper, nämligen 'Etapp 4' som innehåller en rebus
och ett antal pyssel och plock. Även tidprickar för lunch visas
här. Eftersom etappen heter 'Etapp 4' visas även bilden som heter
etapp4.jpg. Efter att alla grenar har presenteras kommer en
automatisk summeringslide som visar resultatet av etappen och sedan
en sorterad av summering av hela rallyt så långt ('Totalt efter Etapp 4').
Lunchetappen inleds med en bild, sedan ett antal pyssel och en summering av stjälpplock. Ett antal stjälprebusar presenteras inklusive en alternativ lösning, till slut en summering av stjälprebusarna och ett totalresult efter lunchen.
Rebusar ska ha filnamn Rn.txt, Hn.txt, Bn.txt, Jn.txt, Xn.txt eller Sn.txt för vanliga rebusar,
hjälprebusar, blåbärsrebusar, blåbärshjälprebusar, bonusrebusar eller stjälprebusar, där n är numret på rebusen. För att göra
alternativlösningar kan man byta ut siffran mot valfri text och sedan använda
t.ex. 'solutionS' som beskrivs ovan.
Blåbärs-rebusar visas bara om de är med i arrayen bluerebus. Exempel:
$bluerebus = array(2, 3, 4, 6, 7, 8);
Blåbärshjälprebusar visas bara om de är med i arrayen bluehelprebus. Exempel:
$bluehelprebus = array(2, 3);
Vill man inte ha några blåbärsrebusar gör man två tomma arrayer.
I rebusfilerna kan man använda dessa taggar:
\bild <bild>
\orgbild <bild som inte skalas>
\rebus <rebus start>
\ort <rebussvar>
\upphovsman <signatur>
\av <signatur>
\op <rebus operation>
Allt annat blir vanlig text.
Operationer är: <->, i, om, ! och byten Byten skrivs som en kommaseparerad lista: A->B, +A, -B Kreativa associationer kan ha en förklaring inom parantes:
\op ! (förklaring)
Det finns ett script för att kolla att rebusarna är korrekta:
./check.py ht2011/S8.txt
Använd detta! Trasiga rebusar på presentationen kan bli tråkigt...
All inmatad information finns i en sqlite-databas som skapas i
rallyts katalog om den inte finns. Filnamnet är db. För att
rensa bort allt och börja med en ny databas är det bara att ta
bort den filen. Se dock till att inte fler än en dator skapar
upp en ny databas. Det tar en liten stund att skapa upp den,
men när den väl finns på plats kan flera använda den samtidigt.
Glöm inte att sätta lämpliga rättigheter så att webservern kan skriva i databsen. Oftast ska man göra:
chgrp www-data <katalog> <katalog>/db
chmod g+w <katalog> <katalog>/db
För att mata in resultat surfar man till r.php på servern.
Där möts man av en stor matris. Röd bakgrundsfärg betyder att
ingen har matat in något i den cellen. Vitt betyder att fältet
är inmatat. Grönt blir fältet om data matats in av någon annan
och du har fått det infört i ditt fält. Ajax!
Datat skickas till databasen när man lämnar en cell. Data hämtas kontinuerligt från databasen, kolumn för kolumn. Det är en halv sekund mellan kolumnuppdateringarna, så det tar en stund att uppdatera hela matrisen.
När som helst kan man kika på presentationen genom att surfa till
present.php. Man navigerar mellan sidorna i presentationen genom
att använda piltangenterna eller page up, page down. Vi använde
en trådlös presenterarmojt som var hårdkodad till page up, page down.
För att generera en statisk presentation (ren html som inte behöver
en databas eller php) använder man static.php från kommandoraden,
och pekar ut en mapp där resultatet ska läggas.
Om du kör sidan i Docker, kan du köra följande:
docker exec -it <container-id> /bin/sh
I shell kör du sedan php static.php . för att generera den statiska sidan, html-filerna hamnar i rotmappen.
För att få upp presentationen på fler än en skärm samtidigt använder
man inte VNC (som vi gjorde...). Däremot kör man lämpligtvis med remote.php:
sidan laddas på den eller de datorer som
är kopplade till projektorer etc. Sedan kör man den "vanliga" present.php
på en dator som då styr vad som visas på remote-datorerna.
Det finns också ett script (stats.php) som visar hur många procent som är rättade.
I rebus_settings.php går det att ändra diverse inställningar, tex
kan man få länkar till individuella sidor i presentationen
genom att sätta index_links till 1.
Det mesta av det grafiska går att justera med css. Just nu är det
en css-mall som heter <rallynamn>.css.