Kategori Programmering

regex VS CSS

När jag skrev i onsdags hade jag fått klart prototypen för min Slinky-sida. Det var kul att forma sidan i Adobe XD. Jag fick jobba med snygga färger och kombinera elementen på ett stilrent och enkelt sätt. Sedan ska bara allt ihop implementeras.

Jag hade blivit rik från erfarenheten från tidigare projekt att jag denna gång skulle fokusera på att göra sidan så att den först och främst fungerar på en telefon. Så efter att ha lagt till alla HTML-element så började jag lägga till CSS för att styla sidan med mobil i åtanke. Och det gick relativt bra. Men det var innan jag visste att det är stor skillnad att ha sidan i ett litet fönster (för att imitera en mobil) mot att simulera en mobil. Detta var antagligen den skillnad som hade varit bra om jag hade koll på när jag gjorde mitt föregående projekt.

Av en slump så råkade jag trycka på Toggle Device Toolbar i webbläsarens utvecklarverktyg. Det som hände sedan var att mitt fönster började simulera en mobilskärm. Jag kunde då se att allt det jobb jag hade gjort med CSS för Slinky inte alls skulle passa så bra på en mobilskärm. Det innebar att jag fick göra många justeringar för att få det hela rätt. Men jag fick det rätt till slut!

Nästa utmaning med Slinky-sidan var att jag denna gång skulle ha ett navigationsfält som var fäst vid toppen, och som jag ville uppdara för att indikera var på sidan man var. Om var högst upp skulle Home vara upplyst. Om man sedan scrollade ned en bit så skulle istället Science lysas upp. Jag behövde googla lite grann och fann lösningen. Det handlar om att hämta y-koordinat för där respektive Home– eller Science-avsnittet börjar. Sedan jämföra om den nuvarande scoll-positionen är lika med eller större än den koordinaten. Ytterligare ville jag ta höjd för att y-koordinaten för respektive avsnitt kan ändras om läsfönstret ändras, så därför behöver jag uppdatera den informationen. Min implementering, och källa för inspirationen för att lösa det hela står här nedan:


        let homeLink = document.getElementById("home-link");
        let scienceLink = document.getElementById("science-link");
        let aboutLink = document.getElementById("about-link");
        

        let homeElement = document.getElementById("home");
        let scienceElement = document.getElementById("science");
        let aboutElement = document.getElementById("about");

        let yHome = homeElement.getBoundingClientRect().y;
        let yScience = scienceElement.getBoundingClientRect().y;
        let yAbout = aboutElement.getBoundingClientRect().y;

        // Inspiration from Amanda de Rijk, 2016 (https://www.competa.com/blog/add-a-css-class-on-scroll-with-vanilla-javascript/) [2020-02-20]
        window.onscroll = function changeClass() {
            yHome = homeElement.getBoundingClientRect().y;
            yScience = scienceElement.getBoundingClientRect().y;
            yAbout = aboutElement.getBoundingClientRect().y;

            let scrollPosY = window.pageYOffset | document.body.scrollTop;
            if (scrollPosY < yScience) {
                homeLink.className = ('link-container active');
                scienceLink.className = ('link-container');
                aboutLink.className = ('link-container');
            } else if (scrollPosY < yAbout + 158) {
                homeLink.className = ('link-container');
                scienceLink.className = ('link-container active');
                aboutLink.className = ('link-container');
            } else if (scrollPosY > yAbout + 158){
                homeLink.className = ('link-container');
                scienceLink.className = ('link-container');
                aboutLink.className = ('link-container active');
            }
        }

    

Med anledning av att detta projekt behövde så mycket handpåläggning så tog den lite längre tid än vad jag hade väntat mig. Men sidan är klar och återfinns på femtearenan.se/product/. Hela denna upplevelse fick mig dock att fundera på om inte regex kan vara lite enklare ibland än CSS.

Nu jobbar jag på det tredje projektet som omfattar en teknisk dokumentationssida. Jag kommer inte lägga mycket energi på att designa den, men jag vill få den funktionell. Så ytterligare rikare av erfarenheten från att göra Slinky-sidan så utvecklar jag dokumentationssidan med fokus på mobil i förstahand.

Och eftersom det nu är fredag och vi går mot helg så kommer jag ägna lite tid åt något kul. Denna gång kommer jag ge mig in i Slime Rancher på PS4. Vem vet om jag kommer träffa på Farmaren Frans (känd från mina inlägg om statistik)?

Trevlig helg, allihopa!


Att lära sig skillnaden på upp och ned

Den här veckan har jag fokus på web-design och responsiva sidor. Som led i #100DaysOfCode går jag igenom freeCodeCamp:s utbud med fokus på frontend. Jag har 5 uppgifter att genomföra i den kurs som kallas Responsive Web Design.

De 5 uppgifterna, varav den första är påbörjad:

  • Tribute. Jag har valt att göra en hyllning till Horizon: Zero Dawn. Dess aktuella form (f.n. inte klar, 17 februari 2020) återfinns på femtearenan.se/tribute.
  • Survey Form.
  • Product Landing Page.
  • Technical Documentation.
  • Personal Portfolio.

Målet är att få alla fem klara denna vecka. Men för det så behöver jag färdigställa en sida per dag. Jag har fokuserat en del på att använda nya tekniker som jag har lärt mig på den första uppgiften. Förhoppningsvis innebär det att jag lättare kan implementera rätt tekniker på de efterföljande uppgifterna.

Så vad har jag lärt mig då? Framförallt har allt med CSS animation varit nytt för mig. Det har inneburit att jag lärt mig om keyframes, timing, cubic Bezier curves, med mera. Jag har också lärt mig en del om CSS Flex. Med tanke på att jag framförallt har använt mig av CSS Grid så har detta varit nyttigt för mig. Men jag lärde mig trots detta även något nytt om Grid. Det jag lärde mig var att äntligen förstå vilka siffror det är som utgör hur mycket en cell ska uppta av kolumner och rader. Jag har trott att det har haft att göra med hur många kolumner (eller rader) en cell ska uppta (minus ett). Men det visade sig att siffrorna egentligen relaterar till tänka linjer som omger respektive kolumn. Ta första kolumnen som exempel. Den utgörs av linje 1 och 2.

Det var allt för idag. Ni kan fortsätta kolla på tribute-sidan om hur det hela utvecklas. På onsdag har jag tänkt att jag ska kunna presentera uppgift 2 och 3. Vi ses då!


Vad jag vill göra med JavaScript

Denna fredag skriver jag om tänkta projekt där jag kan få användning av JavaScript. Men jag skriver också om att gå tillbaka lite i tiden och repetera HTML och CSS, samt risker med att bara söka på sådant som man just nu försöker göra.

I 10 dagar nu har jag övat med JavaScript utan att egentligen göra något som är direkt relevant för frontend-projekt. Istället har fokus legat på att lära mig syntax och problemlösning. Det kommer nu närmast en vecka då jag repeterar HTML och CSS innan jag återvänder till JavaScript. Under tiden underhåller jag tanken om vad jag kan göra med JS. Här kommer således lite tankar som jag har:

  • AJAX till Bokarenan
  • Statistik med visualisering och enkel linjär regression
  • Masken

AJAX till Bokarenan
Asynchronous JavaScript and XML (AJAX) är användbart om man vill uppdatera en webbsida utan att användaren behöver uppdatera hela sidan på nytt. Istället kan AJAX användas för att uppdatera enstaka element.
Bokarenan finns flera ställen där det kan användas. Det kan handla om att kontrollera om ett användarnamn är upptaget när man registrerar sig. Då behöver inte användaren trycka på Registrera bara för att få ett meddelande att namnet är upptaget och användaren måste välje ett annat.
Ytterligare kan Ajax användas som sökningsförslag, men jag får se hur jag skulle vilja implementera en sådan lösning.
En till idé är att lägga till en omdömesfunktion för recensioner. Då skulle användare kunna visa om de tycker att någon recension var hjälpsam eller rolig. AJAX skulle då kunna uppdatera databaseb i bakgrunden utan att behöva uppdatera webbsidan.

Statistik
Ni som följt min blog ett tag vet att jag haft en viss relation med statistik här. Jag har gått från enklare deskriptiv statistik (med prat om histogram och hypoteser) till prat om chi2-fördelning samt inslag av prediktiv statistik i form av linjär regression. Ett pågående projekt jag har är att dokumentera min vikt före löpturer med olika distans och jämför detta med vikt efter. Med JavaScript kan jag visa ett plottdiagram där viktskillnaden ställs mot distans som jag sprungit. En linjär regressionsanalys skulle nog vara möjlig att göra även det i JavaScript.

Masken
För att spel och programmering är kul! Varför inte göra ett enkelt spel med JavaScript?

Men innan jag fokuserar på något av dessa projekt kommer jag att repetera HTML och CSS utifall att jag missat något grundläggande. Jag har redan hittat saker jag undgått att lära mig tidigare. En sådan sak är CSS variabler. Jag trodde tidigare att detta bara var en sak som fanns i SASS (som har ett slags pseudo-CSS som kan kompileras till CSS). Ytterligare upplever jag att jag bygger på mitt CSS för Bokarenan till en allt mer svåröverskodlig kod och har behov att lära mig att strukturera det hela lite bättre. Så detta är något som jag har missat när jag bara har sökt efter enskilda saker jag vill göra.

Denna veckan har jag gett en snabb överblick på objektorienterad- och funktionell programmering samt en försmak på vad jag skulle vilja använda JavaScript till. Kommande vecka kommer jag fortsätta gå igenom HTML och CSS för att förhoppningsvis förenkla strukturen för Bokarenan samt göra den smidigare att använda på mobiler. Vi får se vad mer jag kommer att ha lärt mig. Trevlig helg, allihopa!


Att leva med funktioner

Välkommen onsdag! Idag skriver jag om funktionell programmering i JavaScript. I grunden är det koncept som är lätta att ta till sig, och utifrån hur JavaScript kan vara så kan man också lätt förstå varför man borde ta till sig koncepten.

Funktionell programmering sätter funktioner i fokus och dessa ska följa ett antal grundläggande principer. Jag går igenom dem nedan om ni ursäktar att det låter lite svenglish.

Oföränderlighet (immutability)
Detta handlar om att inte orsaka någon förändring på variabler/funktioner utanför funktionens egna ramar. Med detta i åtanke borde funktioner inte förändra de variabler som skickas som argument till funktionen, eller på annat sätt förändra externa/globala variabler. Exempel på funktion som inte följer detta i JavaScript är Array.prototype.push(). Den bryter mot denna princip genom att modifiera den array som funktionen används på. Exempel på en liknande funktion men som följer principen är Array.prototype.concat(). Den kopierar innehållet från den array som åberopar funktionen och lägger till argumenten till den. Sedan returnerar den den nya arrayen utan att ha förändrat originalet.

Oberoende
Funktioner ska vara oberoende från globala variabler eller programmets status. Det kan likna föregående princip med skillnaden att detta handlar intom om funktionens output utan snarare om dess input.

Minimera bieffekter
Funktioner ska vara förutsägbara och begränsade. På så sätt kan man minimera risken för bieffekter och buggar.

I grunden handlar dessa principer om att göra ett lätt överskådligt program utan buggar. Det gör det också lättare att underhålla över tid. Jag förstår att det finns mycket mer att säga om funktionell programmering än så, men så här långt räcker det att förstå de grundläggande principerna. Jag lärde mig detta bara de senaste dagarna och har haft ganska enkelt att implementera principerna i JavaScript. Eftersom JavaScript har haft en historia av att ibland låta oförutsedda saker hända så har dessa principer ofta underlättat. JavaScript är ett ganska enkelt språk som går med på mycket (särskilt innan introduktionen av let och const). Det är därför lätt hänt att man inte har koll på vilka variabler som förändras (mutability). Funktionell programmering är svaret på det.

Det var allt för denna onsdag. Nästa gång jag skriver blir det lite idéspruta; på vilka sätt kan jag använda JavaScript i mina projekt? Det är på fredag, vi ses då!


Objektorienterat

Jag avslutade förra veckan med att säga att jag var välbekant med objektorienterad programmering (OO) från Java, och då kan man ju tänka sig att det inte ska vara några konstigheter med OO i JavaScript. Men där hade jag fel!

Denna vecka kommer jag gå igenom objektorienterad programmering i JavaScript och funktionell programmering. Utöver det får vi se vad jag hinner med. Utöver det så har det hänt lite uppdateringar på Bokarenan också. När jag senast lämnade Bokarenan så hade jag uppdaterat den med en funktion så att jag kunde göra nyhetsinlägg som kunde publiceras på inställd tid. Det jag hade missat då var en funktion som inte ville låta mig föra inlägg. Lösningen var att byta ut ett likamedstecken till ett utropstecken. Senaste nyhetsinlägget kan läsas här: https://bokarenan.se/nyheter/post/2020-02-08_Bokarenan_förbättras_med_din_hjälp

Åter till objektorienterad programmering i JavaScript och vad jag har lärt mig från freeCodeCamp. Förvånansvärt lite class användes, men jag har lärt mig om prototypes för att hantera objektgemensamma egenskaper och ärftlighet. Mixins var ett helt nytt ämnesområde för mig. Jag skulle vilja säga att det påminner om interface så som jag känner det från Java, men ändå inte. Mixins kan komma med egna inplementeringar redo att används direkt i de objekt som vill importera dem. En svaghet verkar vara att mixins inte ställer något direkt krav på det objekt som ska använda det, vilket kan göra det enkelt att missa detaljer som en mixin kan vara beroende av. Med andra ord ser jag en risk att sätta en mixin som kräver en viss egenskap på ett objekt som saknar den egenskapen.

Jag har även fått lära mig om Immediately Invoked Function Expression (IIFE). Dessa typer av funktioner exekuteras så fort som de är deklarerade. Tydligen är ett populärt användningsområde för dem att skapa moduler. De skapade modulerna sparas till en variabel för att kunna användas vid ett senare tillfälle. Moduler var också ett nytt koncept för mig och de används för att para ihop funktioner för att sedan kunna åberopas genom den variabel de sparats i. Exempel på en IIFE och en modul med två funktioner:

let mathModule = (() => {
  return {
    add: function(...args) {
      let sum = 0;
      for (let i = 0; i < args.length; i++) {
        sum += args[i];
      }
      return sum;
    },
    average: function(...args) {
      return this.add(...args) / args.length;
    }
  }
})();

console.log(mathModule.add(5, 6));    // prints 11
console.log(mathModule.average(5, 6));// prints 5.5

Nu har jag lärt mig en hel del nya koncept men eftersom jag inte rört så mycket class så räknar jag med att återvända till OO för att lära mig mer.

Det var allt för idag. På onsdag kommer jag beröra funktionell programmering som handlar om att göra funktioner lättare att leva med. Vi ses då!


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!


Det går framåt

Det blev visst en ordvist här. ”Det går framåt”. Jättekul! För att JavaScript ofta handlar om frontend. Men titta här:

Sedan jag startade min JavaScript-resa i måndags med freeCodeCamp så har jag nu gått igenom grundstegen. Jag gillar upplägget med ett interaktivt fönster som man kan koda i och jag tog mig snabbt genom de grundläggande delarna (Basic JavaScript). Jag har fortsatt till ES6. ES6 står för EcmaScript 6 och är synonymt med den senaste standarden av JavaScript. Det ES6 erbjuder är bland annat konkurrerande variabeldeklarationer till var; dessa är let och const. Med let så kan man få varning om man försöker deklarera en till variabel med samma namn. Det innebär också att den variabel som deklareras också kommer hålla sig inom det block där det deklarerades. I en for-loop så kommer let i att vara förbehållet den loopen. Men med var så kommer i att finnas tillgänglig utanför loopen. Med const så kan man skapa konstanter. Om jag gör en konstant const PI = 3.14; så kommer jag inte kunna ändra värdet på PI senare i koden.

Fler roliga saker är arrow functions. Dessa påminner om de lambda-funktioner som kom med Java 8. Det dessa gör är att det blir enklare att göra anonyma funktioner. Kombinerat med att man kan skicka godtyckligt många argument så får man väldigt mycket flexibilitet.

Än så länge har ES6 erbjudit JavaScript sådant som jag känner igen från min tid med Java. Något som jag däremot bara skrapat på ytan än så länge är callback functions och destructuring assignment. Jag behöver mer träning här.

Jag fortsätter med kurserna på freeCodeCamp och återkopplar vad jag lär mig. Under tiden rekommenderar jag att ni håller ögonen på #100daysOfCode på Twitter. Det är fantastiskt vad folk motiverar varandra där och det är något som gör mig glad. Vi ses på fredag!


Från baksida till framsida – dags att lära mig JavaScript

Förra veckan la jag till en nyhetsblogg till Bokarenan som dessutom kom med logisk perma-länk till respektive inlägg. Det finns fortfarande fler funktioner och justeringar som kan göras till hemsidan, men för närvarande riktar jag min blick till JavaScript. Jag vet att det finns de som löser både frontend och backend med JavaScript, men för min del har jag än så länge undvikit det hela på alla sidor. Undantaget är när användare ska manuellt lägga till bokinformation och behöver fler fält om en bok har flera författare. Faktum är att jag vet näst intill ingenting om JavaScript. Nu är det dags att ändra på det!

Denna vecka kommer jag därför att börja lära mig JavaScript. Jag tittar därför på www.freecodecamp.org och ser om deras sätt att lära ut är något för mig. Detta blir det tredje programmeringsspråket jag lär mig. Tidigare har jag lärt mig Java och PHP. Med Java var det inledningsvis böcker som jag använde mig av, för att sedan använda TeamTreehouse. Med PHP började jag också med en bok och försökte sedan med TeamTreehouse igen. Men att lära mig PHP genom Treehouse var inget för mig då. Jag tror att jag började på en för enkel nivå då och blev lite uttråkad. Jag kunde bygga funktionella saker efter den första boken, så att använda officiella guider verkade vara lösningen för mig. Nu går jag alltså in för JavaScript utan att ha läst någon bok innan. Jag är dock väl inläst på de grundläggande detaljerna som är gemensamt för många programmeringsspråk, jag måste dock lära mig dialekten och de finesser som följer med språket.

Upplägget på freeCodeCamp är textbaserad förmedling av information kombinerat med interaktiva test. Det innebär att det finns ett kodar-fönster i samband med informationen där man får försöka klara av olika test. Så här kan det se ut:

Exempel på en sida ur JavaScript-tutorial på freeCodeCamp.org

Som del av att lära mig JavaScript så har jag gått med i gemenskapen #100DaysOfCode. Det innebär ett åtagande gentemot gemenskapen att programmera en timme om dagen i etthundra dagar. För att hålla mig på banan nu när jag ger mig in i ett nytt språk är det bra att få det extra lilla stödet man kan få av varandras pepp.

Vi ses på onsdag, då blir det lite initiala reaktioner på JavaScript. Men nu kör vi!