Skapat av Trial and Error 2011
Om du vill slippa installera lika mÄnga beroenden kan du köra i Docker. KrÀver dock exempelvis Docker Desktop.
Kör dÄ först följande i lÀmplig terminal bör att bygga en container, nÀr du stÄr i roten:
docker build -t rebusrally .
DÀrefter följande för att starta, mounta C:\github\Das-Rebussystem
(Àndra till din uppsÀttning) till containerns html-mapp, och mappa port 8080 till containerns 8080-mapp.
docker run -dp 8080:8080 -v C:\github\Das-Rebussystem\:/var/www/html rebusrally
DÀrefter gÄr det att nÄ sidan pÄ localhost:8080, eller frÄn en annan dator pÄ samma nÀtverk via serverns IP-adress.
PÄ Docker i Windows kan det vara lite meckigt att fÄ till skrivrÀttigheterna pÄ mappen, dÄ den mountade volymen Àgs av 'root' istÀllet för 'nobody'. Detta kan man lösa igenom att endast bygga första delen av docker containern:
docker build --target rebusrally_root -t rebusrally_root .
med samma volymmount och logga in pÄ terminalen och köra:
chown -R nobody:nobody var/www/html
Efter det sÄ skall det gÄ utmÀrkt att köra den vanliga dockercontainern. Börja med att titta sÄ att rÀttningssidan laddar. Det kan vara bli fel vid installationen av PHP och Sqlite3.
Om förstasidan laddar men ingen av de andra sidorna sĂ„ kan du öppna containern i Docker. DĂ€r finns en log du kan titta pĂ„. Om du fĂ„r fel som sĂ€ger att Sqlite3 inte kan laddas sĂ„ kan det vara sĂ„ att php har uppgraderat till en ny version utan att uppdatera vĂ„rt installationsscript. Uselt av dem. Ăppna terminalfönstret och skriv 'php --version' och se vilken version som gĂ€ller. Om det Ă€r en nyare version Ă€n den som finns i Dockerfile sĂ„ behöver du Ă€ndra pĂ„ den raden som lĂ€nkar in olika versioner av sqlite.
För att anvÀnda detta system behövs en webbserver med php-stöd samt php-sqlite och php-json. LÀgg hela skiten i lÀmplig katalog och sÀtt igÄng!
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(, , ),
Flair en bild som lÀggs framför lagnamnet i grafer, för att anvÀnda tex markera en smÄbil kan man skriva '' 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
, Xn.txt
eller Sn.txt
för vanliga rebusar,
hjÀlprebusar, blÄbÀrsrebusar, 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);
Vill man inte ha nÄgra blÄbÀrsrebusar gör man en tom array.
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.
Det finns ett Python-script (check.py) för att kolla att rebusarna Àr korrekta.
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
.