apache, svn, mysql för prov

Idag skriver ett par elever omprov i kursen Avancerade Webbteknologier 1 i Agile Web Developer-programmet på kyh.se (yrkeshögskola). Deras prov består av två delar: en pappersdel och en “praktisk” del.

Den praktiska delen presenterar ett antal handritade skisser över en webbplats. I det första provet skulle de göra en enkel version av twitter. I detta prov ett enkelt forum. All hjälpmedel är tillåtna och poängen är att det skall vara likt en riktig arbetssituation. Studenten kan då visa vad han eller hon faktiskt kan åstadkomma på en viss tid, visa upp på kod han/hon väljer att checka in och visa prov på färdighet. Pappersdelen visar mest på nivå av kunskap – inte den hantverksmässiga färdighet man som utvecklare faktiskt bygger upp.

Hur funkar det då?

Förra gången uppstod konstiga fel för en del av de som satt på Windows och körde Eclipse med Subclipse. Problemet visade sig vara att de som inte köra “pure Java”-versionen, aka SVNKit, utan istället köra native-bryggan inte alls kunde interagera med svn-repot. Detta hade tidigare inte varit något problem under kursen, men då var alla läsoperationer tillåtna för hela världen (anonymous access) och endast skrivning krävde inloggningsuppgifter.

“Svn-repot” är egentligen flera repon – ett repo per student. De är skyddade så att bara ett konto kan komma åt just det repot, både vad gäller läs och skriv (och alla andra operationer). Repot accessas via HTTP och Apache via mod_authz_svn / mod_dav_svn (man får akta sig så att dav_svn.conf som medföljer vid installation inte används med default-inställningar).

Så, jag satte ihop ett par skript (bash och python) som

  • skapar svn-repo med branches, tags och trunk-kataloger (om det inte redan fanns),
  • skapar htpasswd-fil,
  • skapar apache-config-fil, samt
  • skapar MySQL-databas (en per person) och populerar med lite grunddata.

Konfiguration av Apache

Hela webbplatsen kör på en egen virtual host och konfigurationen för detta ligger i en enda fil. För varje student genereras följande:

<Location /live/carw949>
 AuthType Basic
 AuthName "Live - carw949"
 AuthUserFile /srv/prov/live/carw949.htpasswd
 Require valid-user
 Order allow,deny
 Allow from all
</Location>
<Location /svn/carw949>
 DAV svn
 SVNPath /srv/prov/svn/carw949
 AuthType Basic
 AuthName "AD10Gbg carw949"
 AuthUserFile /srv/prov/live/carw949.htpasswd
 Require valid-user
</Location>

Utöver det kör jag också ett cronjobb som checkar ut deras kod var tredje minut och lägger upp “live”. (Även denna “live”-katalog är skyddad och access ges bara till ett enda konto.)

Konfiguration av Subclipse och Eclipse

Idag fungerar det fint utan problem  för alla. Det gäller dock att man i Eclipse (med Subclipse-plugin) väljer att använda SVNKit istället för JavaHL (JNA). Installeras enklast via Help » Install New Software och med arkivet som finns på http://subclipse.tigris.org/update_1.6.x. För att kontrollera vilket SVN-lib (eller backend) som används så är vägen denna:

Window » Preferences
Team » Svn
Svn Interface » Client: SVNKit (Pure Java)

Alla skript ligger under http://wendt.se/software/education/kyh.se/awt1/ och do-it-all.sh gör “allt”. Filen elever.txt innehöll alla elever och var på det format som jag fick rått från SCAS (administrativt system).

Projektdelen i Avancerade Webbteknologier 1

Detta är min egen utvärdering av sättet att arbeta i projekt efter halva tiden.

Aktiva val

  • Fyra projekt presenterades. Studenterna fick 10 minuter på sig att skriva upp sitt namn på det projekt som de ville jobba med.
  • Grupperna formas inte om.
  • Helt fri indelning i grupper.
  • Två projekt fick user stories från mig, samt “vision” för webbplatsen som skall byggas.
  • Det tredje projektet var student-idé.
  • Projekten skall använda gemensam databas och källkodsrepo.
  • Inga sprintplaneringar, inga burndowns (vi har chansen att jobba med detta i nästa kurs).
  • Det ska finnas en fil som skapar hela databasen, inkl grunddata för att demonstrera den differentierande featuren.
  • Fokus på att producera user story med störst affärsvärde först – “ni möter VC om ett fåtal dagar: vad måste ni visa för att ro hem kosingen?”

Positivt

  • Bra storlek på grupper och lämplig fördelning med (för-)kunskaper.
  • Bra närvaro.
  • Bra stå-uppmöten (inga lösningsdiskussioner, inget trams, en talar i taget, avstämningsinriktat) och projektdiskussioner i helhet.
  • Varierande arbetssätt, bra variation i ena gruppen, mer statisk indelning/uppdelning i de andra.
  • Högt intresse för projekten.

Negativt

  • Studenterna har spenderat mycket tid på att diskutera projektets innehåll, såsom funktion.
  • Studenterna har spenderat mycket tid på att diskutera och få till databasdesign.
  • Överlag har ett fåtal producerat lösningarna, medan flertalet haft svårt att få ihop det själva.

Sammanfattning

Till nästa period kommer jag nog gå in och tillhandahålla en färdiddesignad databas. Detta kommer få dem att inte lägga tid på sådant som ligger utanför kursen. Jag kommer försöka tillhandahålla user stories, viktade efter affärsvärde. Eftersom det varit ett par personer som dominerat kanske dessa skall sättas i eget projekt för att få utmaning?

Notiser

  • Teckenkodning har varit en issue i Eclipse men framför allt i MySQL.
  • Två grupper har valt att använda user stories/tickets på papper, uppsatta på väggen. Tredje gruppen jobbar ad-hoc.

Trac

För vart och ett av projekten tänkte jag slänga upp Trac så att de får tillgång till en wiki, får möta ett web-UI som visar upp Subversion-repot och ger en (dålig) möjlighet att spåra issues t ex. Subversion-repot måste vara skapat – trac-admin initenv kör inte svnadmin create åt en.

aptitude install libapache2-mod-python

trac-admin kulattjobba.se initenv kulattjobba.se sqlite:db/trac.db svn /srv/svn/kulattjobba.se
<Location /trac/>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnv /srv/trac/bokbutiken.se
PythonOption TracUriRoot /trac/
Order allow,deny
Allow from all
AuthType Basic
AuthName “Bokbutiken.se”
AuthUserFile /srv/xyz/file_with.passwd
Require valid-user
</Location>