Etikett Femte Arenan

Här görs det JS.

Denna veckan påbörjade jag #100DaysOfCode samtidigt som jag slängde mig in i JavaScript. Jag har använt mig av en kurs från freeCodeCamp och så här långt har jag hunnit gå igenom följande:

  • Basic JavaScript
  • ES6
  • Regular Expressions
  • Debugging
  • Basic Data Structures
  • Basic Algorithm Scripting

Vad har varit svårast så här långt då? Regex! Regex (regular expressions) handlar om att skapa instruktioner för att hitta mönster. I JavaScript kan man göra enligt följande:

let regex = /\w{1,}/g;
let str = "Words on the screen";
str.match(regex);
// results in ["Words", "on", "the", "screen"]

Då kommer regex användas för att hitta mönster som passar in mot instruktionerna. I exemplet ovan så säger instruktionen att den ska fortsätta kolla igenom hela textsträngen tills den hittar bokstäver (och siffror) i en följd. Det ska ingå minst ett tecken i strängen men inga specialtecken eller mellanslag ska matchas. Ibland har jag trott att jag har haft koll på hur det ska användas, men ofta har det blivit lite av trial and error.

Det som jag har tyckt varit roligast hittils är det avsnitt som kallas för Basic Algorithm Scripting. Det har inneburit mer frihet att komma fram till lösningar själv. En klassiker som kom var att göra en funktion för att beräkna fakultet. Den är ett klassiskt exempel på hur man kan använda sig av rekursion. Min lösning såg ut så här:

function factorialize(num) {
  if (0 === num) {
    return 1;
  } else {
    return num * factorialize(num - 1);
  }
}

Vad rekursion innebär är att funktionen kommer kalla sig själv med ett nummer mindre för varje gång tills numret är lika med 0. Låt oss ta ett exempel:

let product = factorialize(3);

Första steget:

function factorialize(3) {
  if (0 === num) {
    return 1;
  } else {
    return 3 * factorialize(3 - 1);
  }
}

Vi har skickat in 3 till funktionen och kommer ned till att den kallar sig självt med 3 – 1:

function factorialize(2) { 
  if (0 === num) { //fortfarande inte lika med 2
    return 1;
  } else {
    return 2 * factorialize(2 - 1);
  }
}

Som ni kan se så blir det att den åter kallar sig själv tills talet blir lika med 0. 0 fakultet är definierat som 1 och det är detta värde som kommer returneras. Vi kommer då att åter hamna där funktionen åberopades första gången, och sammanfattat ser det då ut så här:

function factorialize(3) {
  if (0 === num) {
    return 1;
  } else {
    //varje parantes motsvarar de gånger som funktionen kallar sig självt: 
    return 3 * (2 * (1 * (1))); 
  }
} 

Funktionen ger svaret att 3! är 6.

Det har varit en rolig vecka, och mycket har också varit tack vare det stödet som jag får från alla på Twitter. Det är många som gör eller har gjort liknande resa som jag själv gör just nu. Även om vi har lite olika uppfattningar om den. Nästa vecka blir det lite objekt orienterad programmering följt av funktionell programmering. Det förstnämnda är jag välbekant med från Java och PHP, men funktionell programmering kommer nog bli något nytt.

Trevlig helg, allihopa!


Uppehåll över, nytt år är igång

Det har nu gått en hel månad sedan jag senast skrev ett inlägg. Då var datumet 20:e december 2019. Det är nu den 20:e januari 2020. I stort sett har jag under hösten skrivit tre inlägg i veckan och jag planerar att fortsätta så den närmaste tiden. Det uppehåll som jag hade var välbehövt. När det kommer till familj så är det något som kommer först. Över nyår och de första veckorna därefter så ägnade jag mycket tid till att hälsa på familj och släkt tillsammans med bebisar som fortsätter att utveckla sig. Till detta har kommit att slutföra den kurs jag har ägnat övrig tid åt: grundläggande statistik. Men ni läsare som har följt mina inlägg ett tag nu vet att jag antagligen lyckats hitta tid över till programmering trots allt detta. Ni har rätt!

Den gångna månaden har jag ägnat strötiden åt att göra en lättare data scaper. Den har till uppdrag att hitta bokinformation så att användare inte ska behöva fylla i femtioelva fält på egen hand. Istället ska användare kunna ägna sig åt att skriva om sin senaste läsning. Jag laddade upp denna funktion vid lunch idag. Så om du vill se om det funkar så kan du bli medlem idag på bokarenan.se/registrera.

Nästa steg i Bokarenan är några mindre justeringar i layouten och jag ska kolla på möjligheten att införa OAuth; eller möjligheten att logga in med ditt Google-konto. Uppdateringar om det kommer längre fram.

Denna vecka på Femte Arenan så kommer jag fortsätta i statistikens tecken. På onsdag kommer jag beskriva hur man kan analysera om det finns statistiskt signifikanta skillnader mellan röda slajmar och gröna slajmar vad avser deras preferens för att äta maskrosor. På fredag kommer jag försöka förutse hur mycket slajm en slajmklump kan producera baserat på hur mycket maskrosor den har ätit under dagen. Vi kommer alltså beröra chi2-analys och linjär regressionsanalys denna vecka. Det är ju toppen, och superintressant för en slajmproducent! Vi ses på onsdag!


Sökfunktion och DQL

Denna veckan blir antagligen den sista på ett tag med uppdateringar om Bokarenan och programmering. Jag påbörjar en kurs om statistik och kommer använda Femte Arenan för att beskriva de lärdomar jag drar av det. Så jag passar på att beskriva det senaste jag gjort i programmeringsväg över helgen.

Jag lämnade förra veckan med en fundering på om jag skulle hinna få på plats en sökfunktion. När jag gjorde en sökfunktion till den nuvarande Bokarenan så svalde jag efter för mycket. Jag gjorde så att användaren kunde söka efter varje detalj i varje liten entitet. Det gjorde sökfunktionen lite svår att använda. Istället har jag gjort sökfunktionen till ett textfält som alltid finns tillhands i navigationsfältet och det man söker efter är BÖCKER. Jag har för närvarande gjort så att man kan söka efter författare eller boktitel, men sökresultatet är alltid BÖCKER. Inte författare eller något annat. Jag är rätt nöjd med resultatet. Det var också rätt så enkelt att implementera med hjälp av Doctrine och dess queryBuilder.

Så efter att ha fått på plats sökfunktionen så kände jag att jag var på rull. Därnäst så implementerade jag ett navigationsträd för böcker. I navigationsfältet har användaren en länk som heter Böcker. Klickar man på den så kommer man till sida för att välja böcker enligt genrer. Genrer är uppbyggda hierarkiskt, så att till exempel thriller är en underkategori till skönlitteratur. Klickar man på Skönlitteratur så får man upp en ny lista på genrer inom skönlitteratur samt de populäraste böckerna associerade med genren skönlitteratur.

Implementeringen av genrer i kombination med lista på populära böcker innebar att jag hade att hantera tre olika entiteter: Book, BookAnalysis och Genre. Tidigare har jag helt enkelt använt den repository som var lämplig. Jag försökte mig på att använda repository för BookAnalysis med förhoppning att kunna använda den Book-referens som den entiteten har. Book har i sin tur referens till Genre-entitet. Jag vred och vände men fick inte till det. Jag hade några alternativ kvar, som tur var. Nuvarande Bokarena använder sig av SQL-kod som jag skrivit. Nackdelen med att använda det är att jag inte får tillbaka entitets-objekt, utan det är något som jag fått initialisera ”manuellt”. Men jag behöver inte göra på samma sätt här. Jag kan använda DQL (Doctrine Query Language) istället. Det innebär att jag blir lika flexibel som om jag skrev SQL men jag får fördelen med att få tillbaka de rätta entiteterna. Med följande sats så blev det inte så komplicerat trots allt:
"SELECT a FROM App\Entity\BookAnalysis a JOIN a.book b WHERE b.genre = $id ORDER BY a.numReviews DESC, a.avgRate DESC"

Ha en sån trevlig vecka. Nästa gång skriver jag om data i stora mängder.


Favoriter på framsidan

Så till slut kan jag säga att jag har uppnått veckans mål; att få fram en lista med rekommenderade recensioner och en lista på de böcker som fått bäst betyg. Resan hit tog en liten omväg. Hur lång? – Inte särskilt lång!

Respektive bok har inte ett betyg, men däremot har de recensioner som boken är associerad med ett betyg. För att kunna ta fram exempelvis de fem bästa böckerna behöver jag hämta alla böckers respektive recensioner, sedan ordna böckerna i fallande ordning utefter de genomsnittliga betygen. Därefter skulle jag kunna presentera resultatet för användarna. Detta tyckte jag verkade som ganska mycket jobb att göra varje gång någon laddar framsidan. Den lösning som jag tagit fram är istället att ordna en ny entitet: BookAnalysis. Denna entitet innehåller såväl genomsnittliga betyg för respektive bok som antal användare som har boken som ”att läsa”. Denna entitet kan innehålla fler fält, men vi börjar med detta. Idén är att bara administratörer kan komma åt kontrollen för BookAnalysis och därigenom aktivera en analys av databasens recensioner och böcker. På framsidan kan jag därför presentera de 5 bästa böckerna genom att hämta toppresultatet från BookAnalysis. Nackdelen är att användarna inte får det absolut senaste resultatet, men fördelen är att servern inte behöver genomföra beräkningar som bara kommer växa och bli större och tynga ner processorerna. Kanske är det så att beräkningarna inte skulle bli så tunga, men eftersom jag har en loop inom en loop så vill jag undvika risken.

Nu har jag fått ganska mycket på plats, men jag saknar någon sök-funktion. Detta skulle jag vilja få plats härnäst. Men! Frågan är om jag kommer ha någon tid över till det den närmaste tiden. Nästa vecka börjar jag en kurs om statistik och det kommer också synas på denna sidan. Och innan vi lämnar denna vecka så vill jag gå in på lite nöje!

Jag har under veckan haft nöjet att pröva ett spel som min sambo valt ut till mig: Shadow of the Tomb Raider. Spelet påminner mig i delar om Indiana Jones-filmerna och Rovdjuret. Man spelar som Lara Croft, en forskare/äventyrare, som är på jakt för att hämnas sin far. Men jakten uppdagar förebud om världens undergång. Och detta är något som Lara känner stor skuld till eftersom det mycket väl kan ha varit hennes hätska agerande som orsakat det. Så lika mycket som det handlar om hämnd handlar spelet om att försöka med alla medel att stoppa undergången. Jag har haft så himla kul och varit så imponerad av ett spel på länge. Det hänför mig med fantastiska miljöer och påhittiga banor. Jag sitter på spänn när jag hoppar mot en klippkant för att försöka klättra högre. Jag känner mig så grym när jag gömmer mig indränkt i lera mot en klippvägg och inväntar Laras fiender. På resans gång har Lara gått från att vara ett bytesdjur till att bli djungelns jaguar. Det spel jag kommer bita i härnäst är Hellblade: Senua’s Sacrifice. Jag har hört lite grann om spelet och jag är rädd för att det inte kommer ge mig samma tillfredsställelse som Tomb Raider men däremot en resa som kommer vara med mig länge. Vi får se.

Trevlig helg, allihopa!