Redovisning av kursmoment i kursen linux
Kmom01
Jag har sedan tidigare en egen server som kör archlinux. Så jag har därifrån lärt mig en del om linux/unix, men jag känner mig fortfarande inte som att jag kan prata med datorn helt flytande. Jag har en laptop på vardagsrumsbordet och kör linux så mycket jag kan. Jag känner själv att jag har en del att lära men skriver inte allt för sällan egna shell/bash script för enklare grejer eller automatiserade installationer o.s.v. Jag har koll på det mest basic, kan hitta saker och har grep (haha) på terminalen.
Jag valde att köra på VirtualBox med Debian approachen. Jag är sedan tidigare bekant med virtualbox då jag behövde köra en windows server av någon anledning förut. Den ståt fortfarande och snurrar och jag använder den ibland när jag behöver nå något genom ett grafiskt gränssnitt. Jag kör utan desktop på min archlinux server så jag fick sätta upp debian lådan med vboxmanage (termin interfacet för virtualbox). Det är najs med virtualbox tycker jag, det är riktigt smidigt att bara spinna igång en dator för att testa något man inte vill testa på en dator som kör massa annat. Man kan dessutom skapa images av lådor så det går ännu snabbare. Det var inget som riktigt krånglade förutom att jag råkade installera guesten fel första gången så jag fick göra om.
Kmom02
Apache känns hittills ganska lugnt, det här med virtual hosts liknar sättet som nginx konfigureras med virtuella servrar. Det är inte helt främmande men syntaxen och variablerna är annorlunda vilket gör det lite knepigt. Terminalen däremot känns det som att jag har bättre koll på. Det enda som jag inte använt mycket tidigare är rsync men lite manpages senare så var det lugnt.
Ssh nycklar använder jag mycket själv så att fixa det var inte heller något större problem. Detsamma gäller tmux, det har jag använt på alla mina servrar och datorer så jag är rätt bekväm med det. Jag använde det endast till att vara uppkopplad mot två servrar samtidigt i uppgiften.
Jag har försökt gå över till Unix-system så mycket som möjligt då jag tycker det är bekvämt och allt går att ställa in nästan precis som jag vill.
Kmom03
Detta är inte min första bekantskap med bash. Jag kan ändå tycka att det är jobbigt att skriva för “standard” bash då jag mest kör zsh och har ett antal installerade kommandon och egna aliases för att förenkla livet lite. Jag kan tycka att bash är rätt knepigt att skriva i då jag tycker att det verkligen känns som ett skriptspråk, man kan göra lite som man vill och saker inte blir fel förens i sista biten och det blir super drygt att felsöka. Det beror säkerligen på att jag fortfarande inte har ordentlig koll på felhantering i bash. Jag får flashbacks från PowerShell där felhanteringen alltid blir helt kaos med terminating errors och non-terminating errors och du inte kan fånga ett non-terminating med try catch o.s.v. Men om jag har förstått rätt så är det bättre i bash.
Som sagt tidigare felhantering ser jag som en utmaning. Det som är bra dock är att du relativt lätt kan skapa automatiserade saker som exempelvis att övervaka statusen på någon daemon och skicka ett mail om statusen på något vis är felaktig. Men oftast vill man nog bara automatisera enklare mindre saker som man ofta gör. Jag tyckte första uppgiften i labben var dryg, men bara för att jag läst fel. Jag fick för mig att jag skulle läsa in hela filen i en variabel. Hade inte kunnat vara tydligare vad man skulle göra om man läste texten ordentligt. Jag tyckte också att primtalsfaktoriseringen var jobbig, mest för att jag inte kom ihåg hur man räknar ut sådant. Jag började med att skapa en funktion som genererade ett table över primtal upp till ett nummer inskickat som argument. Sedan gick jag bara igenom tablet tills jag hittade en match och backade då till första primtalet och började om tills remainder var 0.
Tyvärr kollade jag inte på video serien så kan inte säga något om den.
Kmom04
Jag har kört nodejs sedan 2012/13 någon gång. Jag började precis såhär men upptäckte snart express och sedan kom koa så jag känner mig rätt hemma med js på serversidan. Jag började skriva uppgiften med koa men jag läste sedan igenom vad som skulle göras och tyckte det var så pass enkelt att jag lika gärna kunde göra det som exemplet. Det kändes enklare så med tanke på hur barebones server som skulle byggas. Jag byggde även en egen enklare router mekanism, den skulle behöva en use funktion för att registrera routes med bara. Den skulle fortfarande vara ordentligt barebones den också dock.
När det gäller ECMA6 så har jag kört det sen det kom ut. Jag hoppade på det tåget direkt då det lovade att fixa en massa saker som man alltid blev frustrerad över. Nu vet jag knappt hur man skriver på något annat sätt. Tänk bara “callback hell” så vet man att allt är bättre nu. Jag använder nästan alltid ECMS6 syntax och features så att gå tillbaka är väldigt jobbigt för mig. Jag tror ni fattar...
Koncept klient och server är inget nytt då jag som tidigare sagt redan haft rätt stor kontakt med node och så. Det spelar ingen roll vilket språk man skriver i så fort man ska ha information från en annan dator så måste man över nätverk och köra. Http protokollet har gjort det enkelt att sätt upp serverar som på ett standardiserat sätt kan kommunicera med varandra. Jag har skrivit server och klient kod sedan långt långt tillbaka så de konceptet har jag koll på. Jag tror det första jag skrev som skickade information mellan två datorer var för ett multiplayerspel i 1:an på gymnasiet, det skickade spelar actions över udp tror jag.
Termen funktionell programmering kom jag nog i kontakt med någon gång när jag började lite smått med PHP. Det beror lite på vad man vill göra om jag tycker det är bra eller inte. Jag kommer från C# och gillar att programmera objektorienterat. Jag använder mig ändå lite av funktionell programmeringsstil då jag vill hantera stora mängder av liknande data och inte vill att något udda edge case state sabbar allt mitt i processen. I det läget är det bättre att köra funktionellt så att resultatet om beräkningen lyckat alltid blir samma.
Kmom05
Jag tycker varken att node js moduler eller JSON API:er är särskilt konstigt, det är heller inte helt nytt för mig. Jag har vi jobbet en hel del kontakt med JSON API:er och på fritiden leker jag en del med node js. Jag kände mig väldigt förberedd inför de uppgifterna och det var tyvärr inget nytt för mig i det. Jag tror dock att det för någon som aldrig kört node js och/eller knapp javascript innan kan var smått “overwhelming” så det är relevanta uppgifter.
Bash däremot, en helt annan historia. Bash håller enligt mig på precis som vilket skriptspråk som helst, fel som i exempelvis C# skulle vara ett kompileringsfel kan köras och det smäller först efter några rader eller till och med i den anropande funktionen. Sådana saker gjorde att det tog mig extremt lång tid att felsöka då jag sällan skriver bash och i princip aldrig såhär pass långa script. Jag är ändå rätt nöjd men min mazerunner, det kunde definitivt varit bättre felhantering och sådant men jag kände att jag ändå gjort tillräckligt. Jag är speciellt nöjd med den funktion jag skapade för att hantera frågor till servern. Den skickar en request med curl och om det inte fungerar så vrålar den i terminalen att den inte kunde nå servern och avslutar med felkod 1. Får den ett svar däremot så kollar den på http status koden och om den inte är 200 skrivs text och hint ut i terminalen och avslutar med felkod 1. Annars “returnerar” den content.
Jag kikade lite på servern för att se vilka routes som fanns och kolla vad de ville ha för “parameters”. Jag gillar dock inte att servern kraschar om man skickar in ett tomt roomid. Jag orkade inte ta reda på vad i servern som hände utan fixade istället min klient. Felet inträffade då man försökte gå från ett rum utan id. Jag gissar att request såg ut något liknande detta “http://localhost:1337/12345/maze//south”. Annars var det inte något jag reagerade förutom att en egen Route klass byggts, känns som att om man vill göra det enklare för sig kan använda exempelvis koa och koa-router.
Kmom06
Jag tycker att jag har koll på vad som är klienten och vad som är servern. Det är för mig inga konstigheter. Det känns för mig heller inte konstigt att utveckla i node jag känner mig rätt bekväm där och har koll på den asynkrona programmerings modellen. Det kan bli rörigt när man väntar på många olika saker men det är något som verkligen behövs om man vill göra saker parallellt eller visa någon snurra medans datorn i “bakgrunden” gör något annat.
CLI-program, heller inga konstigheter. Jag är mer för program som tar ett kommando och sedan gör något skriver ut ett resultat och sedan stänger ner när jag är i terminalen. Jag tycker personligen det är jobbigt att avsluta, göra något och sedan starta igen. Det går alltid att skapa ett “fönster” i tmux men det är ändå extra knapptryck.
Jag gjorde alla extra uppgifterna, jag tyckte att det jobbigaste var att skapa en smart random funktion. Men den blev riktigt smart… eller algoritmerna tar reda på vad den kan göra och väljer oftast det bästa alternativet. Det enda är när den ska välja en av flera linjer att blockera då finns det ingen viktning på vilken linje som är “farligast” och därmed mest relevant att blockera. Det gör det dock möjligt att vinna lite enklare än att försöka få in algoritmen i en omöjlig situation. Något som jag inte gillar som jag gjort är att det är GomokuBoard som tar reda på vart markören skall hamna. Den skulle egentligen bara ha stödfunktioner för att hitta linjer o.s.v och så skulle själva viktningen och så ske utanför i exempelvis servern.
Jag blir lite sugen på att utveckla detta och skapa ett grafiskt webbgränssnitt för att spela och hålla koll på mina klienter med en session, websockets eller någon typ av token. Jag skulle troligtvis använda sessioner för att hålla koll på mina klienter och om det inte går ge dem ett unikt token dem kan identifiera sig med. Kan inte riktigt se att man skulle behöva göra det svårare än så. Detsamma gäller fler spel samtidigt, sessioner eller namespace i websocket.
Det känns som att som att min placeRandom är rätt nära en AI jag tror att den är långt ifrån lika smart som de i gomocup topplistan. Jag är däremot absolut sugen på att försöka utveckla min AI mer. Jag har några idéer om att man skulle kunna identifiera mönster och vikta de tomma platserna och på så vis få fram vilken position som är bäst. Ett enkelt sådant känns inte särskilt svårt.
Kmom10
Bash för att konvertera XLS till JSON
Jag tror nog att jag gjorde detta svårare än nödvändigt. Jag tror dock att jag har fått en arbetsskada från jobbet, all data måste verifieras och valideras fyra gånger innan den går att använda. Detta gjorde att jag gärna ville få till att headern och värdena i den csv fil jag skapade från xsls:en skulle vara korrekt även om en kolumn skulle byta plats. Det var inte allt för knepigt men kan ha gjort att skapandet av scriptet tog lite längre tid. Scriptet ska dock fungera som tänkt.
Server för att visa och söka bland salar
Jag råkade skriva min server med hjälp av biblioteken koa och koa-router, det är min initiala instinkt när jag skriver servrar med node. Jag upptäckte när jag laddade upp till studentservern att node_modules mappen inre följde med. Den ville heller inte köra “npm i”. Att skriva servern var inga större problem jag blev dock lite ledsen i ögat när skulle lägga till develop flaggan och jag inte hade någon som helst support för det. En loggnings modul senare och det var löst. Jag hade nog ändå mest problem med searchp routen. Jag tyckte det var lite jobbigt att lägga till så att det tvunget var ett värde mellan 0 och 1. I vanliga fall skulle jag ha adderat på “poäng” och sedan sorterat resultaten efter det.
När detta var klart och jag insåg att det kanske inte var så bra med koa för detta projekt så skrev jag om servern helt till att bara använda inbyggda node bibliotek. Vill du kika på koa servern finns den kvar i bthappen/server-koa. När jag skrev om servern försökte jag skriva min egen router klass, det gick sådär så jag har tagit mycket inspiration från den som fanns i example mappen.
Jag tycker också att jag löste inläsningen av salar filen bra. Servern läser bara in den första gången som den får en förfrågan och håller sedan den filen cachad.
Klient i Node.js för att testköra mot servern
Klient appen var egentligen inte alls konstig. Jag gjorde egentligen bara precis som vi gjort i tidigare kursmoment. Jag ändrade så att det stog rätt överallt och skrev en klient klass som pratar med servern sen fick index.js hantera utskrift och input. Det är kanske lite mycket kod i index.js men det är i min mening egentligen inget som ligger utanför dess ansvarsområde. Jag brukar försöka tänka som att varje modul eller klass när jag programmerar har ett eget “ansvarsområde”, jag tycker att det oftast blir en fin struktur på koden då. Detta syns tydligt i servern.
Bättre sökalgoritm
Jag försökte här skapa ett viktningssystem där jag adderar poäng till resultaten beroende på hur relevanta de är. Sedan läste jag att värdet skulle vara mellan 0 och 1. Så jag fick lägga till lite matte för att hantera det och ändra poängen för de olika fälten.
Poänsättning:
- Salsnr = 1
- Salsnamn = 0.9
- Lat = 0.1
- Long = 0.1
- Ort = 0.7
- Hus = 0.8
- Våning = 0.4
- Typ = 0.5
Poängen per fält ges enligt följande:
- Exakt match = p * 1
- Börjar med = p * 0.85
- Innehåller = p * 0.7
Poängen per fält adderas och delas sedan med antalet fält. Det blir oftast väldigt små värden men det funkar som det ska.
Filtrera antalet träffar
Jag börjar med att slänga ur mig att jag inte tycker “max” är rätt namn. För mig känns det helt fel jag vill egentligen ha “offset” och “limit”. Jag tänker direkt på paginering när jag ser vad uppgiften beskriver att resultatet ska vara. Jag tyckte inte det var knepigt att lägga till detta då jag gjort exakt samma saker förut, läsa ut vilka rader som ska med från querysträngen. Jag la dessutom till offset så att jag kände att man kan paginera. Det påverkar inte max så länge man inte anger offset såklart så jag ser inga problem med detta extra tillägg. Man behöver ju inte använda den för att den finns där.
Bättre testmöjligheter
Jag har lagt till develop flaggan i både server och klient. I server la jag till en hel loggnings modul där man kan ställa in vilka typer av loggning som skall visas. När man angett develop flaggan sätts loggnings nivån till debug vilket innebär att allt som loggas som debug eller lägre skrivs ut. Däribland det som skickas till klienten. I klienten sätts även där en loggning nivå, det finns har dock bara dev eller prod. Om loggning nivån är “dev” skrivs urlen som anropas ut.
Test scriptet skrev jag ihop rätt snabbt. Det läser in tester från csv-filen tests.csv. Det finns tre olika nivåer av loggning här; normal, verbose eller useful. Normal nivån loggar bara http status koden medans verbose även loggar resultatet från servern. Useful är egentligen mer åt likt enhetstestning, här anger i csv-filen vilken statuskod och conten som förväntas och scriptet kollar det och skriver ut om testet lyckats eller misslyckats. Detta hjälpte mig mycket nät jag skrev om servern.
Hur gick projektet att genomföra?
Jag tycker att det gick bra även om jag skrev två servrar. Jag kan ha snöat iväg lite ibland när jag gjort något jag tycker är lite extra intressant. Jag har gjort alla extra uppgifter och även lagt till lite extra. Jag hoppas verkligen inte att jag missat något, jag tyckte att det gick lite väl snabbt att genomföra projektet men jag har läst igenom kravspecen 10 gånger. Jag är riktigt hemma med node nu för tiden så det var inget som var sådär jättesvårt. Det hände dock att jag googlade på småsaker som glömts bort. Jag sitter gärna och försöker få mina program att bli så effektiva som möjligt och att aldrig skriva kod två gånger. Det gick ganska bra den här gången, iblan blir jag dock sittande då dessa två mål nästan ständigt är i konflikt.
Tankar
För mig har kursen varit riktigt bra. Jag har lärt mig massor av bash, jag hade dock koll på både virtualbox och node sedan tidigare så för mig hade mer bash varit bättre. Jag känner ändå att jag lärt mig en hel del och det är aldrig fel att repetera vboxmanage (glömmer alltid vad som gör vad). När det gäller att lära sig grunderna i bash skulle jag rekommendera detta till i princip vem som helst. Där tycker jag att kursen kan få en 8, det kunde varit på lite mer detaljnivå. Speciellt när det gäller if-satser i bash. Node och vbox tyckte jag var bra, där kändes instruktionerna genomtänkta. Slutbetyg 8.