Week 8 - reflectie
Maandag - sprint 2 demo - 2e poging
Vandaag dan eindelijk mijn tweede sprint demo.
In een presentatie en met behulp van een demo heb ik de nieuwe functionaliteit toegelicht. De opkomst was heel behoorlijk en ook mijn opdrachtgever Frank was er bij.
Een aantal besproken punten:
- Er was een discussie over de ownership van de data. Frank Penning zal naar de mogelijkheden kijken.
- Onder aan de web pagina wordt de versie van de applicatie getoond. Luud gaf de suggestie om de datum toe te voegen, aangezien deze makkelijker te interpreteren is dan een git commit hash.
- Men vroeg of ik voor alles netjes een backup had draaien. Het antwoord daarop was nee…
- Het resultaat van sprint 3, de Excel 1.1 vervanger, zal tijdens de hue sprint demo geïntroduceerd en getoond worden.
Ik heb de collega’s uitgenodigd al eens een kijkje te nemen op de test server en feedback te geven.
Dinsdag - feedback van Matt
Matt heeft me al feedback gegeven:
- Werkt snel, en overzichtelijk
- Ik heb een Product release aangemaakt. Maar die zie ik in t overzicht niet terug. Moet ik die ook aan een Product kunnen koppelen?
- Na edit, zou ik verwacht dat het invul scherm gesloten wordt
- Initieel view moet de table zijn, niet de timeline.
Het eerste punt is fijn.
Het laatste punt is een kwestie van smaak, maar de tabel vorm is wel wat overzichtelijker dan de timeline view. Aangepast dus.
Het tweede en derde was een bug… bij de ProductRelease is een Product verplicht, maar die kon je nog niet in het edit scherm specificeren. De foutmelding daarvan werd dan weer niet aan de gebruiker getoond… Hier ontstaat scope creep. Ik wil dit fixen en heb het als story toegevoegd aan de planning…
Naast de feedback van Matt ben ik toch ook gaan werken aan een backup mechanisme voor al mijn data. Een tweede story toe gevoegd.
Backup script:
path=%path%;C:\Program Files\7-Zip;
REM Compress Git repositories
7z a %date:~-4,4%-%date:~-10,2%-%date:~-7,2%_hueProductDatabase_gitRepos.7z C:\gitbucket\gb\repositories\bashopman\hueProductDatabase.git C:\gitbucket\gb\repositories\bashopman\hueProductDatabase.wiki.git
REM Compress Database dumps
7z a %date:~-4,4%-%date:~-10,2%-%date:~-7,2%_hueProductDatabase_databases.7z TestServer\hueProductDatabase.sql ProductionServer\hueProductDatabase.sql
REM Compress Jenkins Job config
7z a %date:~-4,4%-%date:~-10,2%-%date:~-7,2%_hueProductDatabase_JenkinsConfig.7z C:\Jenkins\jobs
REM Compress Jenkins Builds
7z a %date:~-4,4%-%date:~-10,2%-%date:~-7,2%_hueProductDatabase_JenkinsBuilds.7z C:\builds
REM Delete this months backup one month ago
rd /s /q \\code1\storage\LightingRD\Louvre\hueProductDatabase_backups\%date:~-7,2%\
REM Give the server time to remove the files
ping 1.0.0.1 -n 1 -w 5000 > NUL
REM Copy data to network
xcopy *.7z \\code1\storage\LightingRD\Louvre\hueProductDatabase_backups\%date:~-7,2%\
Resultaat: voor iedere dag van de maand een folder met daarin de volgende files:
Woensdag/Donderdag - foreign keys updaten is lastig!
Even toevoegen dat je een Product, SoftwareReleases en een HardwareRelease kunt selecteren voor een ProductRelease. Da’s niet zo moeilijk….
Maar, hoe koppel ik in AngularJS een select aan een javascript array met objecten, zodanig dat deze ook gepost/geput kunnen worden? Stiekum toch wat uitzoekwerk.
En, dan komt de JSON correct binnen op de server, maar hoe maak ik dan Entity Framework wijs dat ie alleen het basis object moet opslaan en niet de gerefereerde objecten (foreign keys)?
Met acties als:
db.Entry(productRelease.Product).State = EntityState.Unchanged;
alleen gaat het niet lukken. Ik moest mijn data model aanpassen:
public int ProductId { get; set; }
public virtual Product Product { get; set; }
public Nullable<int> ApplicationSoftwareReleaseId { get; set; }
public virtual SoftwareRelease ApplicationSoftwareRelease { get; set; }
De virtual properties van de ProductRelease klasse worden niet opgeslagen. Daarvoor worden de ProductId en ApplicationSoftwareReleaseId properties gebruikt. Bij het ophalen van de data, blijven de virtuele properties leeg, tenzij je ze expliciet mee ophaald met een .Include commando:
IQueryable<ProductRelease> queryResult = db.ProductReleases
.Include(pr => pr.HardwareRelease)
.Include(pr => pr.Product)
.Include(pr => pr.ZigBeeBridgeSoftwareRelease)
.Include(pr => pr.ApplicationSoftwareRelease)
.Include(pr => pr.ReleasedInSystemRelease)
.Include(pr => pr.MaximumSystemRelease)
.Include(pr => pr.MinimumSystemRelease)
.Where(pr => pr.Id == id);
Het mechanisme is me nu duidelijk en lijkt me zelfs logisch, maar voor ik zover was….
Donderdag middag/Vrijdag - uitbreiden data model
De eerste week al grotendeels voorbij en nu pas tijd voor één van de grotere stories voor deze sprint…
Ben voortvarend begonnen klassen toe te voegen volgens het nieuwe model. Compileren was geen probleem, maar de database migratie scripts crashten de hele tijd en data opvragen resulteert ook in foutmeldingen… Niet te veel tijd aan besteed en opnieuw begonnen, maar dan stap voor stap. Tussendoor testen en dan lukt het wel.
Vrijdag middag - dat gaat niet goed
Ik heb zojuist een blik geworpen op mijn burn-down chart en dat ziet er niet goed uit… Van de 22 geplande story points, zijn er slechts 2 afgerond.
Overigens zijn er wel een paar story points toegevoegd na de start van de sprint:
- Naar aanleiding van de vorige demo/review: volledige backup van alle data, een nieuwe story van 1 story point
- Naar aanleiding van feedback van Matt een nieuwe story van 3 story points
- Vandaag, en dat had ik wellicht niet moeten doen, de geschatte story points voor het implementeren van het uitgebreide datamodel verhoogd van 2 naar 4
Kortom, met de beste wil van de wereld ga ik deze sprint niet op tijd afronden…
vrijdag 3 april 2015