Det har hänt väldigt mycket på kort tid nu i Webbutvecklingsprogrammet sista läsår 2! Först vill jag klargöra att detta skrivs inte som ett sätt att paradera på andras bekostnad då jag är fullt medveten om att andra har det mycket tuffare med studierna just nu än jag. "Stolthetssyftet" är endast utifrån min egen nuvarande livssituation. Och nej, det är inte så att någon privat har "konfronterat" mig i mina studier utan jag klargör bara vilken delvis "tur" jag har haft med mina egna studier.
Jag har studerar som tidigare skrivet för närvarande två parallella kurser: Programmering i C# .NET introduktionskurs och Javascriptbaserad utveckling. Båda kurserna har hittills haft väldigt lättsamma moment utifrån min egen studiesituation. Därför kommer jag att beta av dessa nu i alla moment som jag är färdiga med förutom Moment 4 i JS Utveckling som jag kommer att bli färdig med imorgon någon gång innan lunchtid.
C# .NET - Moment 1
Detta moment var mycket simpelt då det bara handlade om att installera och få igång utvecklingsmiljön i C#. I princip bara installera Visual Studio 2022 och sedan få ut ett enkelt "Hello World!"-program sparad i en "Program.cs"-fil. Jag skrev även så att inmatning från användaren kunde skrivas och sedan skrev den ut det varpå efter programmet avslutades.
Vad som blir riktigt spännande i C# .NET är att få till en CRUD-baserad WPF-applikation. Mer om det längre ned i rubriken om slutprojekten. Lärarna har samtidigt klargjort att de endast kommmer att beröra/lära ut (i den utsträckning det går att använda de orden) C# .NET Konsolapplikationer, dvs., klassiska "DOS"-fönstret. Ja, jag växte upp på den tiden då DOS-spel också fanns!
JS Utveckling - Moment 1
Första momentet i JS Utveckling (i princip NodeJS med MongoDB) var också enkel då det var endast att ändra lite CSS-kod för en färdig statisk webbplats som även läste in JSON från en lokal JSON-fil där jag sedan fick ändra lite för att visa återstående kurser kvar.
Sedan skulle momentet laddas upp någonstans inklusive JSON-filen och så användes inbyggd gammal Angular-kod inuti HTML-filen som då matade ut kurserna och även tillät sortering av kurserna utifrån inmatning från användaren. Allt kring Angular var redan färdigt i de erhållna uppgiftsfilerna - alltså inget vi gjorde.
C# .NET - Moment 2
Nästa moment 2 i C# .NET introduktionskursen var att komma igång med grunderna i programmeringsspråket C#, främst syntaxen och hur klassisk programmering sker inuti C# jämfört med tidigare språk. C# är som insatta känner till starkt typat så om du inte använder "var" för att deklarera variabler så måste du istället ange datatyp. Detta är något jag har haft problem med i TypeScript när jag försökte mig på där då det också är starkt typad version av JavaScript för "bättre kod"(?)
Hursomhelst så var det inga problem med detta moment 2 förutom att vi skulle använda oss av Zeller's algoritm för att ta reda på veckodagsnamn (mån-sön) för valt datum. Tanken var att kunna få mata in ett datum i formatet ÅÅÅÅ-MM-DD eller ÅÅÅÅMMDD (valfritt) så skulle den först kontrollera att du angett giltigt datum (exempelvis 30:e feburari går aldrig medan 29:e februari går i vissa fall - men denna skottårsdel var ej krav att lyckas implementera i felhanteringsdelen i koden) och sedan matade den ut rätt veckodag om allt var OK.
Min lösning var att läsa in strängen i en "var" och sedan kolla om den matchade ett Regex-mönster som kräver "DDDD-DD-DD", dvs:
och sedan splittade jag strängen på "-" och kontrollerade därefter månads- och dagsnummer så att det var giltigt valt antal av vilken månad och dag som valts. Vissa månader har ju 30, 31 dagar och så har vi unika fallet med februari där vi utgick från att det alltid har 28 dagar som högst.
Jag gjorde kanske misstaget att jag hade väldigt många if-satser för att kontrollera rätt antal dagar per månad när jag fick återkoppling - dock godkänt - om att använda en int[]-array med antalet dagar för varje månad som då månadsvärdet kunde använda sig av för att kontrollera om det är rätt array-elementsvärde för den valda månaden, annars neka istället för 12 separata if-satser. Pinsamt att jag inte kom på det då jag har en array för alla veckodagar som nyttjar sådan lösning.
Vad som var smått frustrerande med detta moment var att vi skulle använda oss av en färdig formel, Zeller's algoritm, vilket i sin tur förekommer i två varianter. Jag förstår mig på ingen av dessa varianter och även om jag kan följa matematiska prioriteringsregler så vet jag inte vad den egentligen gör. Som tur var fanns det en webbplats där du kunde välja datum ur en kalender och få veckodag så jag kunde jämföra om min lösning gav samma veckodag vilket den gjorde för de flesta fall men inte vissa vilket möjligen berodde något på skottårs-tjofset.
JS Utveckling - Moment 2
Moment 2 i NodeJS-kursen var faktiskt rolig om än enkel då det hela handlade om en CRUD fast endast krav på R och D men jag gjorde alla fyra vilket jag är glad över att jag gjorde då det påskyndade Moment 3 då det blev krav på det fast då med hjälp av anslutning till en lokal MongoDB-databas.
Återigen skulle vi använda JSON-data som lästes från en NodeJS server (med hjälp av ExpressJS) som sedan READ- & DELETE:ade data utifrån givna endpoints:
- visa alla kurser i årskursen (GET - http://localhost:3000/courses)
- visa enskild kurs i årskursen med angivet id (verb GET - http://localhost:3000/courses/2)
- radera en enskild kurs från listan med angivet id (verb DELETE - http://localhost:3000/courses/2)
Jag gjorde som sagt även POST- och PUT-bitarna vilket blev enklare än jag trodde senare att anpassa för CRUD-anrop mot lokal MongoDB-databas även att först läsa in JSON-fil och sedan ändra i inläst variabel för att sedan skriva över hela JSON-filen på nytt.
I NodeJS ExpressJS använde jag router-objektet för att förenkla hanteringen av CRUD-anropen mot REST API:t inklusive implementeringen av en "catch-all" när en given endpoint inte fanns. Vedertagen felhantering implementerades också.
C# .NET - Moment 3
Moment 3 i C# .NET introduktionskursen var objektorienteringen i C# där vi skulle ta fram en simpel gästbok i konsolapplikationsanvändargränssnittet där du kunde välja mellan 1 - Skriv inlägg och 2 - Radera inlägg eller "x" för att avsluta programmet. Här skulle då en klass skapas för att hantera möjliga CRUD-anrop mot gästboksklassen.
Här gjorde jag möjligen en tabbe men troligen ändå godkänt vilket var att jag inkluderade all Console.WriteLine() inuti klassen istället för att hålla det utanför och endast hantera simpel logik inuti klassen och dess klassmedlemmar. Min lösning är mer "hårdkodad" än att du bara har en simpel klass som kontrollerar inmatning och sedan lägger in i en JSON-fil om allt är OK annars ska den ge false och så får false-svaret från klassanropet i sig leda till felhantering inuti Main()-funktionen. Som vanligt kom jag på detta i efterhand men inte orkade ändra men tar med mig det tills nästa uppgifter.
Jag gjorde nödvändiga kontroller inklusive en rolig lösning i att när den läste in all gästinlägg lagrade i en JSON-fil så kontrollerade den om det fanns några inlägg och fanns inga gästinlägg först eller för att alla var borttagna så fanns inte heller menyalternativet "2 - Radera inlägg" och siffran två nekades även då som försök att navigera dit vid inmatning.
Övriga vedertagna fehanteringar implementerades som att bara acceptera siffror i huvudmenyn och vid borttagning av inlägg då dessa är indexerade med siffror. Denna är jag 100 % säker på att jag får godkänt men troligen får jag kommentar om att jag hårdkodat för mycket i gästboksklassen och kunde ha nöjt mig med att bara (miss)lyckas att lägga in och/eller radera inlägg och sedan sköta visning av felhanteringstext i Main().
JS Utveckling - Moment 3
Moment 3 i JS utveckling trodde jag först skulle vara jobbigare för att nu skulle vi plötsligt gå ifrån något vi varit mycket bekväma med: JSON, och över till någonting helt annat än JSON och MySQL, nämligen MongoDB. Här dök ett problem upp fort vilket var att det som gör dokumentobjekt unika i MongoDB är ObjectID vilket i sig inte är något du vill skriva in i dina REST API-endpoints.
Du vill fortsätta använda numeriskt {id} så jag la till nytt fält "id" i varje dokumentobjekt även om det kanske är fel när du arbetar med MongoDB - jag har ingen aning. Men den lösningen gjorde att det blev supersimpelt att ändra all CRUD inuti NodeJS ExpressJS. Bara ansluta till MongoDB-klienten och sedan skriva en simpel "query"-liknande operation för MongoDB-databasen ifråga och så var det färdigt!
Här uppgraderade jag även frontend-biten även fast det är noll krav och gjorde det möjligt att kunna ändra genom att bara skriva i fälten för kurskod, kursnamn och period. Detta gjorde jag också i moment 2 men jag tog det extra steget och kontrollerade om värdet som ändrades inte redan fanns sparat i ett data-attribut i tabellcellen. Om värdena var annorlunda så skickades ett PUT-anrop annars ignorerades det. Så då kan du klicka på olika tabellceller men gör du ingen ändring så sker ingen PUT så där snackar vi prestandaoptimering om än i liten skala!
C# .NET - Moment 4
Moment 4 i C# .NET introduktionskursen - och jag upprepar att det är en introduktion till språket och egentligen är det noll .NET i det hela förutom kanske detta omment då - så gällde det att använda ett kodexempel från Machine Learning som finns i .NET 7 där vi skulle ta fram en simpel Konsolapplikation där du matar in ett omdöme om en matrestaurang på engelska.
Sedan skulle den kontrollera mot en färdigtränad ML-modell som i sin tur består av 1000 Yelp-recensioner i första kolumnen medan andra kolumnen har 1 = positiv recension eller 0 = negativ recension. Detta returvärde (1 eller 0) användes sedan i lösningen för att veta om den skulle skriva ut huruvida ett inmatat omdöme på engelska ansångs vara positivt eller negativt.
Jag tränade min modell i 120 sekunder men den insisterade på att vara färdig efter redan 106 sekunder. Resultatet är ändå riktigt dåligt tycker jag, men det fungerar och så länge du använder typiska positiva ord så får du oftast 1 medan negativa ord ger 0 så all träningsdata från kodexemplet från Microsofts officiella webbplats är riktigt axelryckande.
Konceptet i sig är dock coolt: köra ML-träning direkt i ens egen dator med träningsdata och sedan försöka nyttja en färdigkodad (efter den körda 120-sekunders träningen, inget jag själv skrev) ML-modell. Det vore såklart intressant att se vad för annan slags ML-modell som skulle gå att ta fram med egen träningsdata.
Ett videoklipp skulle också spelas in där det redovisades och det berättades om vad de olika delarna i koden gjorde. Jag förstod inte mer av ML-koden mer än att en instans av den verkade skapas där den sedan ville att en skulle välja i vilken kolumn ens inmatning skulle föras in i och sedan försökte den förutse utifrån all tillgänglig träningsdata inklusive det en själv matat med huruvida omdömet var positivt eller negativt.
JS Utveckling - Moment 4
Moment 4 i JS Utveckling är jag snart färdig med. Den handlar enbart om att jämföra tre stora frontend-ramverk: Angular, Vue.js och ReactJS varav sistnämnda också ska inkludera ett simpelt kodexempel som sedan förklaras i detalj. Jag tänker mig klassiska useState för en räknare och sedan hur useEffect också kan användas i samband med detta såväl som hur de skiljer sig åt.
Imorgon ska jag även diskutera ReactJS med en klasskamrat då slutuppgiften i denna JS utveckling-kurs låter oss välja en av de tre stora frontend-ramverken för att utveckla en CRUD-fullstacksapp som nyttjar NodeJS ExpressJS och MongoDB i grunden. Jag ska äntligen bli en av de många CodeTubers som berättar/visar hur en MERN-app webbutvecklas i praktiken!
Lämpliga slutuppgifter för kurserna?
Den stora frågan är dock vad för slags CRUD-appar jag bör utveckla i JS utveckling-kursen såväl som i C# .NET. Som tidigare sagt så är jag sugen på WPF-utveckling i C# .NET då vad jag sett så påminner XAML-delen mig om HTML som haft trekant med CSS och JavaScript. Vi har händelselyssnare som kan hanteras och möjligen går det också att implementera "global states"-liknande funktionalitet med.
En fördel vi har med WPF-appar - tror jag - är att när jag väljer att appen ska dölja något så går det inte att göra något magiskt med Inspect eller CLTR+F5 i WPF-appen. Ska väl vara om de kan dekompilera hela .exe-filen? En utmaning dock är detta: Hur ska jag CRUD:a inuti WPF-appen när jag inte har någon SSL aktiverad? Jag vill ju inte skicka "renskriven data" utan jag vill ju skicka krypterad data via någon SSL/TLS eller kanske krypterat och så finns det en dekrypteringsnyckel på backend-sidan? Men då kommer vi till frågan: blir det för mycket för något som ska vara klart 15:e januari 2023 senast? 🤔
Lärarna sa också som sagt innan att de fokuserar främst på Konsolappar i denna kurs och även om HttpClient-objektet fungerar även där så har jag ändå frågan om vad för CRUD-användbart som kan kodas i en simpel Terminal? Vad finns det för behov där som inte redan har lösts av andra? Alltså, vad för mer unikt och mervärde går att skapa på så kort tid även i en Konsolapp i C# .NET? 🤔
Så många funderar och så fort det har gått med dessa två parallella kurser. De började 1:a november 2023 och nu knappa 2 veckor senare har jag snart bara slutuppgifterna kvar för båda kurserna när de annars brukar vara tänkta att påbörjas två-tre veckor innan kursavslut.
Signaturen är äntligen här - men utan stöd för BB?
Ingen har frågat men nu har jag äntligen en signatur! Dessvärre är den inte som jag önskade då jag ville oavkortat rada upp varje status, slutbetyg och namn för varje kurs hittills. Endast fem rader tillåts dock som mest. Så då fick jag göra vad jag gjorde. Jag hittar dock inte hur jag ska lägga till ett simpelt länkelement? Är det url inuti hakparentes må tro?
Ja just det, "ex-jobbs-mingel" nu nästa vecka!
Nästa vecka är det ex-jobbsmingel vid universitetet där jag bor och då tänkte jag delta. Vad jag har lite svårt med är att myndigheter som vanligtvis söker ex-jobbsfolk tenderar att ha ensidiga arbetsuppgifter tänker jag mig. Sedan har jag full förståelse att få om ens något IT-bolag vill ha någon "n0_ob-c0d3R" vara inne och kladda på deras och/eller deras kunders kodbaser.
Sen har vi det här med karriärsmöjligheter inom myndigheter i och med den myndighetsmässiga anställningsformen. Hursomhelst så blir det nog ett mysigt ex-jobbsmingel och kanske jag kan få in foten hos någon mer lönsamhetsfokuserad verksamhet som också kanske har spännande kunder även om jag kanske inte får vara med så himla nära där.
Jag kan "100 % CRUD™" och nu med olika behörighetsnivåer sedan tack vare Vue.js+Laravel-kursen där jag och en samarbetskodare tog fram ett simpelt men helt fungerande(?) varulagersystem med olika behörighetsnivåer och kontohantering av en primär systemadministratör. Detta kan nu bara bli bättre härifrån! 😎
På återseende - som vanligt, i framtiden!
Mvh,
WKL.
---------
✔️Kurs 1: (B) HT2022 DT057G Datateknik GR (A), Webbutveckling I, 7,5 hp (distans)
✔️Kurs 2: (A) HT2022 DT084G Datateknik GR (A), Introduktion till programmering i JavaScript, 7,5 hp (distans)
✔️Kurs 3: (A) HT2022 DT068G Datateknik GR (B), Webbanvändbarhet, 7,5 hp (distans)
✔️Kurs 4: (B) HT2022 DT200G Datateknik GR (A), Grafisk teknik för webb, 7,5 hp (distans)
✔️Kurs 5: (A) VT2023 DT093G Datateknik GR (B), Webbutveckling II, 7,5 hp (distans)
✔️Kurs 6: (C) VT2023 DT003G Datateknik GR (A), Databaser, 7,5 hp (distans)
✔️Kurs 7: (A) VT2023 DT197G Datateknik GR (B), Webbdesign för CMS, 7,5 hp (distans)
✔️Kurs 8: (A) VT2023 DT173G Datateknik GR (B), Webbutveckling III, 7,5 hp (distans)
✔️Kurs 9: (A) HT2023 IK060G Informatik GR (A), Projektledning, 7,5 hp (distans)
✔️Kurs 10: (A) HT2023 DT193G Datateknik GR (B), Fullstack-utveckling med ramverk, 7,5 hp (distans)
🚧Kurs 11: (Pågår) VT2023 DT162G Datateknik GR (B), Javascriptbaserad webbutveckling, 7,5 hp (distans)
🚧Kurs 12: (Pågår) VT2023 DT071G Datateknik GR (A), Programmering i C#.NET, 7,5 hp (distans)