[{"data":1,"prerenderedAt":4399},["ShallowReactive",2],{"referenceCache":3,"devCache":84,"personalCache":4181},[4,20,30,40,51,63,73],{"id":5,"title":6,"extension":7,"link":8,"meta":9,"quote":17,"stem":18,"__hash__":19},"reference\u002Fquotes\u002Freferences\u002FGarden-Outlet-00.md","Garden Outlet","md","https:\u002F\u002Fsky.telia.no\u002Fs\u002F325939fa6b48048441a8c03049650726a34",{"body":10},{"type":11,"value":12,"toc":13},"minimark",[],{"title":14,"searchDepth":15,"depth":15,"links":16},"",2,[],"Han står på med godt humør, og er alltid på jakt etter nye utfordringer.","quotes\u002Freferences\u002FGarden-Outlet-00","PcLTHf3wIPbQfBKbj76XI09SssZA1BFxDdYOMSckvMs",{"id":21,"title":6,"extension":7,"link":8,"meta":22,"quote":27,"stem":28,"__hash__":29},"reference\u002Fquotes\u002Freferences\u002FGarden-Outlet-01.md",{"body":23},{"type":11,"value":24,"toc":25},[],{"title":14,"searchDepth":15,"depth":15,"links":26},[],"Kristoffer har vært en pålitelig kollega.","quotes\u002Freferences\u002FGarden-Outlet-01","s5rskswaLzpcMXiMDrUHbz8H4urJt5Sa2zf9lhDXxzg",{"id":31,"title":6,"extension":7,"link":8,"meta":32,"quote":37,"stem":38,"__hash__":39},"reference\u002Fquotes\u002Freferences\u002FGarden-Outlet-02.md",{"body":33},{"type":11,"value":34,"toc":35},[],{"title":14,"searchDepth":15,"depth":15,"links":36},[],"Vi anbefaler Kristoffer på det sterkeste!","quotes\u002Freferences\u002FGarden-Outlet-02","aE4zaVIMaf2xAyLXQ3p8TwgqMNhep9YXHgY90kw7CdI",{"id":41,"title":6,"extension":7,"link":42,"meta":43,"quote":48,"stem":49,"__hash__":50},"reference\u002Fquotes\u002Freferences\u002FGarden-Outlet-03.md","https:\u002F\u002Fsky.telia.no\u002Fs\u002F325e67cd3542cd247fe8a2734063f0b2aee",{"body":44},{"type":11,"value":45,"toc":46},[],{"title":14,"searchDepth":15,"depth":15,"links":47},[],"Kristoffer Gjøsund har utført sine arbeidsoppgaver på en tilfredstillende måte.","quotes\u002Freferences\u002FGarden-Outlet-03","N9NAieIJXdk2YiKtKvW-LZ8eUDy1V4bOcFpHwAKF9gI",{"id":52,"title":53,"extension":7,"link":54,"meta":55,"quote":60,"stem":61,"__hash__":62},"reference\u002Fquotes\u002Freferences\u002FIngrids-Glassverksted-00.md","Ingrids Glassverksted","https:\u002F\u002Fsky.telia.no\u002Fs\u002F32586b70b3a7f384d1e8c4f98f69782afc1",{"body":56},{"type":11,"value":57,"toc":58},[],{"title":14,"searchDepth":15,"depth":15,"links":59},[],"Vi har bare positive erfaringer med han.","quotes\u002Freferences\u002FIngrids-Glassverksted-00","FAxiWTjWFJE8jOvJ5KXqYGrcWOevM3AU6UXohqA5juA",{"id":64,"title":53,"extension":7,"link":54,"meta":65,"quote":70,"stem":71,"__hash__":72},"reference\u002Fquotes\u002Freferences\u002FIngrids-Glassverksted-01.md",{"body":66},{"type":11,"value":67,"toc":68},[],{"title":14,"searchDepth":15,"depth":15,"links":69},[],"Punktlig, lite fravær, positiv, humoristisk og klar for å angripe oppgaver han aldri har prøvd seg på før.","quotes\u002Freferences\u002FIngrids-Glassverksted-01","ewTWaeT1cN9_PIyDULP1TKI0sXAqpyoZjXEqziYxO1o",{"id":74,"title":75,"extension":7,"link":54,"meta":76,"quote":81,"stem":82,"__hash__":83},"reference\u002Fquotes\u002Freferences\u002FIngrids-Glassverksted-02.md","Ingrids-Glassverksted",{"body":77},{"type":11,"value":78,"toc":79},[],{"title":14,"searchDepth":15,"depth":15,"links":80},[],"Kristoffer var både interessert, utholdende og pålitelig.","quotes\u002Freferences\u002FIngrids-Glassverksted-02","EvZ9M7Ax-b_ZAHIMJ4hUolY59fQsOgcaIBbggpvCj2Y",[85,156,247,285,323,358,393,446,487,522,568,611,658,693,725,764,795,981,1038,1082,1137,1258,1417,1613,1672,1734,1783,1954,2160,2295,2333,2452,2694,2729,2853,2983,3032,3107,3153,3239,3277,3337,3396,3470,3558,3619,3663,3725,3766,3807,3852,3892,3941,4016,4070,4133],{"id":86,"title":87,"body":88,"date":149,"description":14,"extension":7,"ingress":14,"meta":150,"navigation":151,"path":152,"seo":153,"sources":14,"status":14,"stem":154,"__hash__":155},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002Ftets.md","tets",{"type":11,"value":89,"toc":147},[90,95,99,106,109,112,116,119,124,127,129,133,136,139,144],[91,92,94],"h4",{"id":93},"brukergrensesnitt-og-merkevarekonsistens","Brukergrensesnitt og Merkevarekonsistens",[96,97,98],"p",{},"Det var Variasjoner i hvordan datoer og ikoner ble vist på tvers av nettstedet skapte en stykkevis og uprofesjonell brukeropplevelse. Standardisere alle visuelle datakomponenter for å sikre en trygg og gjenkjennelig identitet.",[100,101,102],"ul",{},[103,104,105],"li",{},"Samlet logikken for datoer og medieikoner på tvers av kjernekomponenter i frontend.",[96,107,108],{},"Forbedret det digitale uttrykket, da brukere nå møter et brukervennlig grensesnitt hvor all informasjon følger det samme visuelle \"språket.\"",[110,111],"hr",{},[91,113,115],{"id":114},"navigasjon-og-brukerreise","Navigasjon og Brukerreise",[96,117,118],{},"Logikken bak sidens topptekst og menyer var unødvendig kompleks, noe som førte til en uforutsigbar nettleseropplevelse. For å løse dette må jeg forenkle navigasjonsarkitekturen for å gi brukeren en smidig og intuitiv reise.",[100,120,121],{},[103,122,123],{},"Forenklet den forhåndskalkulerte datalogikken",[96,125,126],{},"Takket være en raskere og mer responsiv meny som lar besøkende finne informasjonen de trenger uten forsinkelser.",[110,128],{},[91,130,132],{"id":131},"tilgjengelighet-og-søkesynlighet","Tilgjengelighet og Søkesynlighet",[96,134,135],{},"Bildene i frontend får nå en standardisert alternativ tekst for alle bilder, dette førte til at prosjektene mine viste den alternative teksten som gjorde at nettsiden ble rotete.",[96,137,138],{},"Oppgaven blir å fjerne den standardiserte teksten med å legge til white-space i beskrivelsen av bilde.",[100,140,141],{},[103,142,143],{},"Oppgradert backend-modellene til å automatisk generere white-space i bilde beskrivelsen.",[96,145,146],{},"Fjernet standard alt-tekst til fordel for white-space bildetekster i grensesnittet, noe som gir et renere visuelt uttrykk.",{"title":14,"searchDepth":15,"depth":15,"links":148},[],"2026-04-30T16:02:03.086Z",{},true,"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Ftets",{"title":87,"description":14},"posts\u002Fdev\u002FProject\u002Fportfolio\u002Ftets","ygfYhuA9DUWNVlvFmWXYLkC-Ra6q6Nqru8CkKK4ZD2o",{"id":157,"title":158,"body":159,"date":238,"description":239,"extension":7,"ingress":240,"meta":241,"navigation":151,"path":242,"seo":243,"sources":14,"status":244,"stem":245,"__hash__":246},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FOppgradering-og-feilsikring-av-skjemasystem-og-brukergrensesnitt.md","Oppgradering og feilsikring av skjemasystem og brukergrensesnitt",{"type":11,"value":160,"toc":236},[161,175,178,192,195,230,233],[96,162,163,164,174],{},"Medlemsportalen og skjemasystemet hadde en del teknikske etterslep, som gjorde det unødvendig komplisert for utviklere å tilpasse skjemaer til nye behov. Den underliggende koden hadde noen løse tråder som gjorde det vanskelig for utviklere å oppdage feil før de nådde den live nettsiden, noe som utgjorde en risiko for stabiliteten. Koden hadde mindre skjønnhetsfeil, som datoer ikke ble vist riktig i lister hvis informasjon manglet, samt teknisk etterslep fra ",[165,166,168,169,173],"abbr",{"title":167},"Gammel kode som er fortsatt i bruk","«",[170,171,172],"em",{},"legacy koden","»"," som lå igjen i systemet. Det fantes også små visuelle uregelmessigheter i ikoner og navigasjonslenker som kunne få nettsiden til å virke ustabil og mindre profesjonell. I tillegg var den interne organiseringen av prosjektfilene ikke optimal, noe som førte til at nye utviklere ville bruke tid på å finne frem til riktige verktøy.",[96,176,177],{},"Hovedmålet med arbeidet var å optimalisere det interne arbeidsområde for å øke produktiviteten.",[100,179,180,183,186,189],{},[103,181,182],{},"Forenkle brukeropplevelsen i medlemsportalen ved å gjøre navigasjonen og flyten mer intuitivt for brukeren, slik at portalen oppleves som profesjonell og enkel å bruke",[103,184,185],{},"Optimalisere skjemasystemet ved å transformere skjemaene til et mer fleksibelt og pålitelig system, som enkelt kan tilpasses nye behov for kunden uten omfattende spesial koding.",[103,187,188],{},"Styrke grunnlaget i applikasjonen ved å forbedre feilsikringen, som forhindrer tekniske feil før de når brukeren ,som gjør at fremtidige vedlikehold og videreutvikling mer vennlig.",[103,190,191],{},"Finpusse sluttproduktet ved å rette småfeil og fjerne unødvendig rot, som skaper unødvendig støy i systemet.",[96,193,194],{},"Handlingen jeg gjorde for å oppnå målet mitt :",[100,196,197,200,203,213,221,224,227],{},[103,198,199],{},"Fjernet utdatert notater, og midlertidige loggfiler for å skape et rent og effektivt miljø i prosjektet.",[103,201,202],{},"Samlet styringen av hvordan ikoner vises på ett sted, noe som sikrer visuell konsistens og gjør det enklere å oppdatere designet i fremtiden.",[103,204,205,206],{},"Sørget for at ledetekster og innlastningsfelt er korrekt knyttet sammen, for å forbedre Brukervennlighet og ",[165,207,209],{"title":208},"Universell Utforming",[210,211,212],"strong",{},"UU",[103,214,215,216,220],{},"Plasserte skjemarelaterte ",[165,217,219],{"title":218},"legokloseer med data","komponenter"," i en logisk mappestruktur, for å redusere tiden på å lete og øke tiden på å produsere.",[103,222,223],{},"Transformerte flere filer til å bruke typesikkerhet, som fanger opp logiske feil automatisk underveis i utviklingen.",[103,225,226],{},"Oppdaterte sikkerhetsregler for innlogging, og la til støtte for flere funksjoner i skjemaer som obligatoriske felt, deaktiverte knapper og flervalg.",[103,228,229],{},"Forbedret visningen av datoer slik at systemet håndterer manglende informasjon på en elegant måte, og fjernet gamle utviklernotater.",[96,231,232],{},"Revideringen av nettsiden har resultert i en fleksibel løsning. Ved at skjemasystemet nå er mer fleksibelt, kan bedriften rulle ut nye typer skjemaer betydelig raskere, noe som reduserer tiden fra ide til lansering. Dette profesjonelle inntrykket forbedrer tilliten til organisasjonen, da et polert og konsekvent grensesnitt reduserer usikkerhet hos brukeren og sikrer at plattformen er enkel å navigere i for alle.",[96,234,235],{},"Gjennom omfattende risikoreduksjon og kostnadsbesparelse har vi skapt et system der feil fanges opp tidlig, slik at vi unngår kostbar nedetid og nødrettinger. Denne \"renere\" koden betyr også at fremtidige oppdateringer blir langt raskere å gjennomføre. Den økte påliteligheten gjør at brukerne slipper å møte forvirrende tomrom eller feilmeldinger, noe som gir en tydelig følelse av et gjennomført kvalitetsprodukt. Til slutt har dette ført til en markant operasjonell effektivitet; bedre orden \"bak kulissene\" gjør at utviklingsteamet kan respondere raskere på forespørsler fra forretningssiden og løse problemer hurtigere enn tidligere.",{"title":14,"searchDepth":15,"depth":15,"links":237},[],"2026-04-08T12:19:50.252Z","Medlemsportalen og skjemasystemet hadde en del teknikske etterslep, som gjorde det unødvendig komplisert for utviklere å tilpasse skjemaer til nye behov. Den underliggende koden hadde noen løse tråder som gjorde det vanskelig for utviklere å oppdage feil før de nådde den live nettsiden, noe som utgjorde en risiko for stabiliteten. Koden hadde mindre skjønnhetsfeil, som datoer ikke ble vist riktig i lister hvis informasjon manglet, samt teknisk etterslep fra «legacy koden» som lå igjen i systemet. Det fantes også små visuelle uregelmessigheter i ikoner og navigasjonslenker som kunne få nettsiden til å virke ustabil og mindre profesjonell. I tillegg var den interne organiseringen av prosjektfilene ikke optimal, noe som førte til at nye utviklere ville bruke tid på å finne frem til riktige verktøy.","Gjennom målrettet opprydding i kildekode, filstruktur og skjemasystem, har jeg i dag lagt grunnlaget for en mer effektiv og fleksibel medlemsportal. Ved å tette tekniske gap og finpusse grensesnittet, har jeg skapt en plattform som er enklere å vedlikeholde for utviklere og mer intuitiv å navigere for sluttbrukere. Resultatet er en operasjonell effektivisering som korter ned tiden fra en god ide til ferdig lansert løsning.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fsosial-innovasjon\u002Foppgradering-og-feilsikring-av-skjemasystem-og-brukergrensesnitt",{"title":158,"description":239},"#### Dagens Aktiviteter\n\n* Fjernet utdaterte notater, midlertidige loggfiler og teknisk rusk for å skape et rent og effektivt utviklingsmiljø.\n* Omorganisert prosjektfilene og plassert skjemakomponenter i en logisk mappestruktur for å redusere tid brukt på leting og øke produksjonstiden.\n* Tilrettelagt det interne arbeidsområdet for å øke den generelle produktiviteten i utviklingsteamet.\n* Transformert flere filer til å bruke typesikkerhet, som nå fanger opp logiske feil automatisk underveis i utviklingen.\n* Oppdatert sikkerhetsreglene for innlogging for å styrke applikasjonens grunnlag.\n* Forbedret feilsikringen i applikasjonen for å forhindre tekniske feil før de når brukeren, noe som gjør fremtidig vedlikehold enklere.\n* Transformert skjemasystemet til en mer fleksibel og pålitelig løsning som enkelt kan tilpasses nye kundebehov uten spesialkoding.\n* Lagt til støtte for obligatoriske felt, deaktiverte knapper og flervalgsløsninger i skjemaene.\n* Forbedret visningen av datoer slik at systemet håndterer manglende informasjon på en elegant måte uten å skape støy eller feilmeldinger.\n* Forenklet navigasjonen i medlemsportalen for å gjøre flyten mer intuitiv og profesjonell for brukeren.\n* Sentralisert styringen av ikoner på ett sted for å sikre et helhetlig design og enklere oppdateringer i fremtiden.\n* Rettet den tekniske koblingen mellom ledetekster og inntastingsfelt for å forbedre både brukervennlighet og universell utforming.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen er så fin den kan bli, opplevd litt spenning i hode.\n","posts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FOppgradering-og-feilsikring-av-skjemasystem-og-brukergrensesnitt","8df1Je2v0X5wL542NjTAvWk7K1xvVNMtXBz1itX4fHA",{"id":248,"title":249,"body":250,"date":277,"description":254,"extension":7,"ingress":278,"meta":279,"navigation":151,"path":280,"seo":281,"sources":14,"status":282,"stem":283,"__hash__":284},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FVersjonering-av-Klasser.md","Versjonering av Klasser",{"type":11,"value":251,"toc":275},[252,255,258,272],[96,253,254],{},"Jeg manglet en oversikt over hvilken utgave av logikken som ble brukt i de forskjellige delene av koden, noe som skapte usikkerhet ved vedlikehold og oppdateringer.",[96,256,257],{},"Oppgaven ble å innføre en fast standard for merking av de viktigste verktøyene mine for å ha full kontrollhva som kjører til enhver tid.",[100,259,260,263,266,269],{},[103,261,262],{},"Jeg har lagt inn et fast versjonsnummer på verktøyet som snakker med GitHub.",[103,264,265],{},"Jeg har merket databasemodulen min med en egen versjonskode for bedre sporing.",[103,267,268],{},"Jeg har lagt til versjonsmerking på oppsettet for selve klienten.",[103,270,271],{},"Jeg har innført versjonskontroll på innsamlingsverktøyet (Scanneren) slik at jeg vethvilken logikk som ble brukt.",[96,273,274],{},"Jeg har nå kontroll på versjonene av klassene mine. Dette gjør det mye enklere og tryggere å gjøre store oppgraderinger senere.",{"title":14,"searchDepth":15,"depth":15,"links":276},[],"2026-04-07T13:50:41.784Z","Det var tidligere uklart hvilken utgave av logikken som ble brukt i de ulike delene av systemet. Ved å innføre en fast standard for merking av alle viktige verktøy, er usikkerheten nå fjernet. Med full oversikt over hvilke versjoner som kjører til enhver tid, er det nå langt tryggere å gjøre store forbedringer uten at noe går i stykker.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fversjonering-av-klasser",{"title":249,"description":254},"#### Dagens Aktiviteter:\n\n* Opprettet en ny standard for å merke alle viktige deler av systemet med egne numre, slik at det alltid er klart hvilken utgave som er i bruk.\n* Lagt til tydelig merking på selve hovedoppsettet (klienten), slik at man vet nøyaktig hvilke innstillinger som kjører.\n* Innført nummermerking på \"scanneren\", slik at man alltid vet hvilken logikk som ble brukt da informasjonen ble hentet inn.\n* Samlet full oversikt over alle utgaver av verktøyene, noe som gjør det tryggere og langt enklere å gjøre store forbedringer senere.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen er så fin den kan bli !\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FVersjonering-av-Klasser","zZd6RmNBCnPldrJby9s_xdkocZavejnJUYwa4DTVGko",{"id":286,"title":287,"body":288,"date":315,"description":292,"extension":7,"ingress":316,"meta":317,"navigation":151,"path":318,"seo":319,"sources":14,"status":320,"stem":321,"__hash__":322},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FWeb-Scraping-and-Crawler-Forbedringer.md","Forbedringer av nettside skanning",{"type":11,"value":289,"toc":313},[290,293,296,310],[96,291,292],{},"Verktøyet jeg bruker for å hente informasjon fra nettsiden var tregt og tok ofte med seg mye unødvendig \"støy\" fra nettsiden, som krevde mye tid på å vaske dataene i etterkant.",[96,294,295],{},"Oppgaven var å automatisere denne prosessen slik at jeg sitter igjen med informasjon som har verdi for slutt brukeren.",[100,297,298,301,304,307],{},[103,299,300],{},"Jeg har oppgradert logikken i innsamlingsverktøyet mitt slik at det nå automatisk kjenner igjen og filtrerer bort uinteressant innhold.",[103,302,303],{},"Jeg har lagt til nye metoder for å vaske nettsidene for unødvendige elementer før dataene lagres.",[103,305,306],{},"Jeg har gjort det mulig for verktøyet å utføre mange innsamlinger samtidig i stedet for å måtte vente på én og én, noe som øker farten voldsomt.",[103,308,309],{},"Til slutt så fikset jeg feilen med at sidene ikke fantes ved å auto genenere filene før kompilering og bygging av nettsiden.",[96,311,312],{},"Jeg får nå levert ferdig vaskede data på mye kortere tid. Dette øker kvaliteten på informasjonen jeg leverer uten at jeg trenger å bruke tid på manuelt etterarbeid.",{"title":14,"searchDepth":15,"depth":15,"links":314},[],"2026-04-06T13:37:12.702Z","Tidligere var prosessen med å hente informasjon både treg og full av støy. Ved å lære verktøyet å kjenne igjen og fjerne uinteressant innhold automatisk, leveres nå ferdigvaskede data. Med evnen til å gjøre mange oppgaver samtidig og tåle små avbrudd, spares det mye tid. I tillegg er feil med manglende sider løst, slik at alt alltid er klart til bruk.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fweb-scraping-and-crawler-forbedringer",{"title":287,"description":292},"#### Dagens aktiviteter:\n\n* Oppgradert verktøyet slik at det nå automatisk kjenner igjen og fjerner uinteressant informasjon og \"støy\" fra nettsider.\n* Innført nye metoder som renser nettsidene for unødvendige elementer før informasjonen blir lagret.\n* Gjort det mulig for verktøyet å hente informasjon fra mange steder samtidig, i stedet for å måtte vente på én og én oppgave.\n* Forsterket systemet slik at det tåler små avbrudd eller feilmeldinger fra nettsider uten at hele prosessen stopper opp.\n* Løst problemet med manglende sider ved å sørge for at nødvendige filer blir laget automatisk rett før nettsiden ferdigstilles.\n* Sikret at sluttresultatet består av ferdigvaskede data med høy nøyaktighet, noe som fjerner behovet for manuelt etterarbeid.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen er så fin den kan bli !\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FWeb-Scraping-and-Crawler-Forbedringer","PnsS2MBUQ4mU8MM8wJR9OTER2NhEfTiAeBmbqhdAZgg",{"id":324,"title":325,"body":326,"date":350,"description":330,"extension":7,"ingress":351,"meta":352,"navigation":151,"path":353,"seo":354,"sources":14,"status":355,"stem":356,"__hash__":357},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FAPI-Endpoint-and-Handler-Enhancements.md","API Endepunkt &Handler forbedringer",{"type":11,"value":327,"toc":348},[328,331,334,345],[96,329,330],{},"De forskjellige \"veiene\" og funksjonene i systemet mitt manglet klare navn, noe som gjorde det uoversiktlig å holde styr på hva som faktisk var i drift og hvordan de presterte.",[96,332,333],{},"Oppgaven ble å gi hver del av systemet et tydelig navn for å få bedre kontroll og gjøre det lettere å bygge ut prosjektet senere uten at eksisterende ting går i stykker.",[100,335,336,339,342],{},[103,337,338],{},"Jeg har oppdatert alle definisjonene i systemet med unike merkelapper for å gjøre det lettere å kjenne igjen hver enkelt rute.",[103,340,341],{},"Jeg har forbedret måten systemet rapporterer sin egen tilstand på ved å bruke disse nye navnene i oversikten.",[103,343,344],{},"Jeg har fjernet gamle og utdaterte sjekkfunksjoner som lå spredt rundt, og samlet alt ansvaret i den nye modulen jeg laget.",[96,346,347],{},"Dette gir meg full oversikt over driften. Det er nå mye tryggere for meg å legge til nye funksjoner i fremtiden fordi jeg har stålkontroll på hvordan de ulike delene snakker sammen.",{"title":14,"searchDepth":15,"depth":15,"links":349},[],"2026-04-03T13:28:42.798Z","Det var tidligere vanskelig å holde styr på alle de ulike delene av løsningen. Ved å gi hver del et eget, forståelig navn og rydde bort rot, er det nå mye enklere å se nøyaktig hva som er i drift og hvordan alt virker. Dette gjør det både tryggere og lettere å bygge ut prosjektet videre, som en konsekvens av at jeg har nå oversikt over hvordan de ulike delene snakker sammen.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fapi-endpoint-and-handler-enhancements",{"title":325,"description":330},"#### Dagens aktiviteter:\n\n* Oppdatert alle systemdefinisjoner med unike merkelapper (labels) for å sikre at hver enkelt \"vei\" og funksjon i systemet er lett å identifisere.\n* Implementert de nye, unike navnene i systemets oversiktsrapport, noe som gir bedre innsikt i operativ status og ytelse for hver enkelt komponent.\n* Identifisert og fjernet utdaterte sjekkfunksjoner som lå spredt i koden, for å redusere teknisk gjeld.\n* Samlet alt ansvar for tilstandskontroll i én ny, dedikert modul for å forenkle vedlikehold og fremtidig utvidelse.\n* Etablert kontroll på samspillet mellom de ulike delene av systemet, noe som gjør det tryggere og mer oversiktlig å introdusere ny funksjonalitet.\n\n#### Motivasjon & Energi 6 \u002F 10\n\nDagen er så fin den kan være, litt irritert på at AI ikke følger instruksene den får.\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FAPI-Endpoint-and-Handler-Enhancements","FC_-AYsMWsrBN8fKphCzRRQ_e0gfW5nmoxlfivQF9As",{"id":359,"title":360,"body":361,"date":385,"description":365,"extension":7,"ingress":386,"meta":387,"navigation":151,"path":388,"seo":389,"sources":14,"status":390,"stem":391,"__hash__":392},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FOptimalisering-av-rammeverk-for-skbar-kunnskapsdeling.md","Health Check system oppgraderinger",{"type":11,"value":362,"toc":383},[363,366,369,380],[96,364,365],{},"Jeg hadde ingen god måte å vite om feil skyldtes min egen kode eller om det var problemer hos de eksterne tjenestene jeg henter data fra. Dette gjorde det vanskelig å vite hvor jeg skulle starte feilsøkingen når noe stoppet opp.",[96,367,368],{},"Oppgave ble å lage til et varslingssystem som gir meg svar med en gang på om alle koblinger fungerer som de skal, slik at jeg slipper å lete i blinde når noe ikke virker.",[100,370,371,374,377],{},[103,372,373],{},"Jeg har laget en helt ny, egen modul som kun har som oppgave å sjekke tilkoblingene mine mot interne kilder.",[103,375,376],{},"Jeg har bygget om systemets hovedpunkt for helsesjekk slik at det gir en detaljert statusrapport for hver enkelt tjeneste i stedet for bare en generell melding.",[103,378,379],{},"Jeg har lagt til en funksjon som lister opp alle tilgjengelige koblinger og viser nøyaktig hvilken tilstand hver enkelt av dem er i.",[96,381,382],{},"Jeg har redusert tiden det tar å fikse feil betraktelig. Nå er det lettere å finne ut hvor utfordringen ligger med en gang det skjer, noe som gjør at løsningen min er mye mer stabil for de som bruker den.",{"title":14,"searchDepth":15,"depth":15,"links":384},[],"2026-04-02T07:33:30.027Z","Ved å innføre en dedikert modul for helsesjekk og detaljerte statusrapporter for hver enkelt tjeneste, er det nå slutt på usikkerheten om feil skyldes egen kode eller interne kilder. Systemet gir umiddelbar oversikt over alle tilkoblinger, noe som sikrer raskere feilretting og en mer stabil løsning.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Foptimalisering-av-rammeverk-for-skbar-kunnskapsdeling",{"title":360,"description":365},"#### Dagens Aktivitet\n\n* Bygget om systemets sentrale endepunkt for helsesjekk. Systemet leverer nå detaljerte statusrapporter per tjeneste fremfor kun generelle feilmeldinger.\n* Lagt til funksjonalitet som lister opp samtlige tilgjengelige koblinger og viser nøyaktig sanntidstilstand for hver enkelt.\n* Identifisert og utbedret svakheter i feilhåndteringen for å skille mellom feil i egen kildekode og problemer hos eksterne tjenesteleverandører.\n* Redusert responstiden ved feilretting, som resulterer i en mer robust og stabil løsning for sluttbrukerne.\n\n#### Motivasjon & Energi 9 \u002F 10\n\nKjenner at jeg er klar for en ferie :)\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FOptimalisering-av-rammeverk-for-skbar-kunnskapsdeling","Vm1TRxoEcYKquxHoNhQygglWVnpsIyw7g2TbTleLREk",{"id":394,"title":395,"body":396,"date":438,"description":400,"extension":7,"ingress":439,"meta":440,"navigation":151,"path":441,"seo":442,"sources":14,"status":443,"stem":444,"__hash__":445},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FForbedret-plattformstabilitet-og-akselerert-synlighet-i-skemotorer.md","Forbedret plattformstabilitet og akselerert synlighet i søkemotorer",{"type":11,"value":397,"toc":436},[398,401,404,428],[96,399,400],{},"Prosjektet hadde enkelte utfordringer knyttet til hvordan innhold ble presentert for brukerne mens det lastet, samt enkelte svakheter i hvordan forfatterinformasjon og datoer ble koblet sammen. Dette medførte en risiko for en uventet brukeropplevelse og økt tidsbruk ved vedlikehold og videreutvikling.",[96,402,403],{},"Målet var å forbedre brukeropplevelsen, fjerne ukorrektheter i visningen og rydde i det digitale grunnlaget. Jeg ønsket å sikre at nettsiden føles rask og stabil for besøkede, samtidig som jeg legger til rette for mer effektiv jobbing i fremtiden.",[100,405,406,409,412,420],{},[103,407,408],{},"Jeg har lagt inn visuelle indikatorer som gir brukeren umiddelbar tilbakemelding mens innholdet hentes, slik at man unngår inntrykket av at siden har fryst.",[103,410,411],{},"Logikken bak kobling av forfattere og artikler er forbedret for å sikre at riktig informasjon alltid vises på tvers av hele nettstedet.",[103,413,414,415,419],{},"Jeg har fjernet ",[165,416,418],{"title":417},"Duplikate kode \u002F Uoversiktlig kode","overflødig"," kode og organisert arbeidsmiljøet bedre for å redusere risikoen for fremtidige feil.",[103,421,422,423,427],{},"Jeg har automatisert Optimalisert muligheten for at ",[165,424,426],{"title":425},"SearchEngineOptimization \u002F Søkemotoroptimalisering \u002F Finnbarhet for søkemotorer som Google, Bing","SEO","'n kan hente ny informasjon fra nettsiden raskere",[96,429,430,431,435],{},"Gjennom disse endringene har jeg styrket plattformen ved å levere en mer stabil og tillitvekkende brukeropplevelse som reduserer sjansen for at besøkende forlater siden på grunn av treghet eller visuelle mangler. Ved å rydde opp i den underliggende strukturen og standardisere ",[165,432,434],{"title":433},"Lego-klosser med data","komponentene",", har jeg også redusert fremtidige forsinkelser betydelig. Dette betyr at fremtidig utvikling vil gå raskere, samtidig som systemet er klargjort for å håndtere vekst uten at kvaliteten på innholdet som presenteres for kunden svekkes.",{"title":14,"searchDepth":15,"depth":15,"links":437},[],"2026-03-30T13:34:21.657Z","Dagens oppdatering fokuserer på å styrke plattformens profesjonalitet og forbedret synlighet gjennom en mer effektiv brukeropplevelse og en ryddigere nettside. Ved å fjerne visuelle forsinkelser, automatisere \u003Cabbr title=\"SearchEngineOptimization \u002F Søkemotoroptimalisering \u002F Finnbarhet for søkemotorer som Google, Bing\">SEO\u003C\u002Fabbr> og fjerne tekniske hindringer, har jeg redusert risikoen for brukerfrafall og lagt til rette for en langt raskere videreutvikling av tjenesten og en forbedret digital profil for samtlige av organisasjonens mange medlemmer.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fsosial-innovasjon\u002Fforbedret-plattformstabilitet-og-akselerert-synlighet-i-skemotorer",{"title":395,"description":400},"#### Dagens Aktiviteter\n\n* Lagt inn støtte for \"venteskjermer\" på artikler, gallerier og mediekort. Dette skal fjerne usikkerheten hos brukere med lav nett forbindelse, ved at nettsiden nå viser at innholdet er på vei i stedet for at siden ser tom eller defekt ut.\n* Forbedret logikken for hvordan systemet kobler sammen forfattere og artikler. Dette sikrer at riktig skribent alltid krediteres.\n* Fjernet utdatert og overflødig kode (inkludert ubrukte funksjoner) og forenklet kompliserte beregninger. Dette reduserer risikoen for fremtidige system feil.\n* Automatisert og forbedret måten teknisk informasjon som sendes til søkemotorer. Dette gjør at søkemotorer som Google raskere kan plukke opp og vise ferske oppdateringer fra nettsiden.\n* Organisert prosjektfilene på en mer oversiktlig måte, som gjør at utviklere kan jobbe mer effektivt og reduserer tiden det tar å feilsøke i fremtiden.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen er så fin den kan bli.\n","posts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FForbedret-plattformstabilitet-og-akselerert-synlighet-i-skemotorer","YqEF4xOx-a1JCbct0ORtPxy_sVp6ju32-B7xhk5FQjM",{"id":447,"title":448,"body":449,"date":479,"description":453,"extension":7,"ingress":480,"meta":481,"navigation":151,"path":482,"seo":483,"sources":14,"status":484,"stem":485,"__hash__":486},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FModernisering-av-arkitektur-og-dokumentasjon-for-fremtidig-vekst.md","Modernisering av arkitektur og dokumentasjon for fremtidig vekst",{"type":11,"value":450,"toc":477},[451,454,457,460,474],[96,452,453],{},"Applikasjonen hadde over tid utviklet seg slik at de interne dokumentasjonene ikke lenger stemte overens med hvordan systemet faktisk fungerte. Dette skapte unødvendig tidsbruk ved vedlikehold. Samtidig har den indre oppbygningen blitt unødvendig komplisert, noe som gjorde det vanskeligere og mer risikabelt å legge til nye funksjoner eller rette feil effektivt.",[96,455,456],{},"Målet var å rydde opp  i systemets indre struktur for å gjøre det mer stabilt i drift. Jeg forenklet hvordan systemet er organisert, ved fjerne unødvendig kompleksitet, og sørge for at all dokumentasjon og oversiktskart faktisk reflekterer virkeligheten. Dette ble gjort for å redusere risikoen for feil og sørge for at fremtidig utvikling kan skje raskere.",[96,458,459],{},"For å løse dette har jeg gjennomført følgende tiltak:",[100,461,462,465,468,471],{},[103,463,464],{},"Jeg har flyttet oversiktskart (diagrammer) dit selve arbeidet utføres, slik at om det skal gjøres en endring er jeg alltid har oppdatert informasjon i samme kategori.",[103,466,467],{},"Jeg har flyttet fellesoppgaver til ett sentralt sted i stedet for at de ligger spredt, noe som gjør at systemet snakker bedre og mer stabilt med eksterne tjenester.",[103,469,470],{},"Jeg har flyttet viktige kontrollfunksjoner (som køhåndtering) fra de enkelte under og opp til en felles \"foreldre-enhet\". Dette sikrer at hele systemet følger de samme reglene automatisk.",[103,472,473],{},"Jeg har slettet gammel og ubrukt kode \u002F informasjon som ikke lenger tjente noen hensikt, for å unngå fremtidig rot og misforståelser i arbeidet.",[96,475,476],{},"Gjennom dette arbeidet har jeg redusert de løpende tiden ved å minimere tiden som går med til feilsøking. Ved å samle kontrollfunksjoner på ett sted har jeg gjort systemet mer stabilt mot overbelastning, noe som sikrer en stabil tjeneste for brukerne. Den største verdien for meg er at vi nå har en plattform som er rigget for vekst; jeg kan rulle ut nye funksjoner raskere og med høyere kvalitet fordi fundamentet er oversiktlig og logisk bygget opp.",{"title":14,"searchDepth":15,"depth":15,"links":478},[],"2026-03-25T13:06:02.385Z","For å sikre fremtidig vekst og stabil drift har jeg gjennomført en profesjonalisering av applikasjonens grunnmur. Ved å tette gapet mellom dokumentasjon og virkelighet har jeg redusert tidsbruken på vedlikehold og fjernet usynlige hindringer i utviklingsløpet. Dette betyr at jeg nå kan levere nye funksjoner raskere. Jeg har nå en stabil drift som er klar for å vokse.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fmodernisering-av-arkitektur-og-dokumentasjon-for-fremtidig-vekst",{"title":448,"description":453},"#### Dagens Aktiviteter\n\n* Plassert oversiktskart og diagrammer direkte der arbeidet utføres, slik at informasjonen alltid er relevant og lett tilgjengelig ved endringer.\n* Flyttet spredte oppgaver til ett felles punkt for å sikre mer stabil og forutsigbar kommunikasjon med eksterne tjenester.\n* Samlet funksjoner (som køhåndtering) i en felles overordnet enhet, slik at hele systemet nå følger de samme reglene automatisk.\n* Identifisert og slettet gammel, ubrukt kode og utdatert informasjon for å fjerne rot og forebygge fremtidige misforståelser.\n* Forenklet den indre oppbygningen for å redusere tidsbruk på feilsøking og legge til rette for raskere utrulling av nye funksjoner.\n\n#### Motivasjon & energi 10 \u002F 10\n\nDagen er så fin den kunne bli.\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FModernisering-av-arkitektur-og-dokumentasjon-for-fremtidig-vekst","zVaZaRIEEPO9K2z8vaD44m5e8mIwZBlPb3KOEXxBK-8",{"id":488,"title":489,"body":490,"date":514,"description":494,"extension":7,"ingress":515,"meta":516,"navigation":151,"path":517,"seo":518,"sources":14,"status":519,"stem":520,"__hash__":521},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FAutomatisert-kompetanseoversikt-og-systemmodernisering.md","Automatisert kompetanseoversikt og systemmodernisering",{"type":11,"value":491,"toc":512},[492,495,498,509],[96,493,494],{},"Tidligere baserte porteføljens oversikt over teknisk kompetanse og programmeringsspråk seg på manuelt vedlikeholdte data og statiske lister. Dette innebar en risiko for at informasjonen som ble presentert for andre ikke reflekterte den faktiske dataen jeg har jobbet med i språket. I tillegg trengte denplattformen en generell modernisering for å opprettholde sikkerhet og ytelse.",[96,496,497],{},"Målet var å automatisere innsamlingen av teknologidata slik at profilens kompetanseoversikt alltid er korrekt og oppdatert uten manuelt arbeid. Samtidig skulle jeg forbedre det visuelle uttrykket for å gjøre statistikken mer forståelig for besøkende, samt oppgradere systemets kjernekomponenter for å sikre en stabil og fremtidsrettet løsning.",[100,499,500,503,506],{},[103,501,502],{},"Har lagt til en standardisert data motor (Pinia store) som automatisk teller og summerer bruken av ulike kodespråk på tvers av alle prosjekter.",[103,504,505],{},"Erstattet statiske lister med dynamiske fremdriftsmålere som viser data i sanntid. Jeg har også finjustert designet for bedre lesbarhet.",[103,507,508],{},"Oppdatert alle biblioteker og ryddet i kodebasen (fjerning av unødvendig logging og optimalisering av byggprosessen) for å gjøre nettsiden raskere og mer stabil.",[96,510,511],{},"Gjennom dette arbeidet har jeg økt troverdigheten til porteføljen ved at den nå viser et alltid oppdatert bilde av teknisk erfaring (målt i KB) uten behov for manuelt vedlikehold. Den visuelle fremstillingen gjør det enklere for ikke-tekniske interessenter å raskt få oversikt over kjernekompetansen min, mens oppgraderingen av systemet sikrer en raskere og mer stabil plattform. Dette resulterer i en mer profesjonell digital tilstedeværelse som er pålitelig for fremtidig vekst og reduserer tiden som brukes på administrasjon.",{"title":14,"searchDepth":15,"depth":15,"links":513},[],"2026-03-25T00:00:00.000Z","For å øke effektiviteten og styrke tilliten til presentert kompetanse, har jeg automatisert innsamlingen av teknologidata i porteføljen. Ved å fjerne manuelt vedlikehold sikres en alltid oppdatert og nøyaktig oversikt over kjernekompetanse. Sammen med forbedret visualisering og teknisk modernisering, gir dette en mer profesjonell og stabil plattform som reduserer tidsbruk og rigger løsningen for fremtidig vekst.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fautomatisert-kompetanseoversikt-og-systemmodernisering",{"title":489,"description":494},"#### Dagens Aktiviteter\n\n* Opprettet en standardisert datamotor som automatisk beregner og summerer kodebruk (målt i KB) på tvers av alle prosjekter.\n* Erstattet statiske lister med fremdriftsmålere som viser teknisk kompetanse i sanntid.\n* Finjustert det visuelle uttrykket og layouten for å øke lesbarheten for besøkende.\n* Oppgradert alle prosjektets avhengigheter og biblioteker til nyeste versjoner.\n* Fjernet unødvendig logging og optimalisert byggrutinene for å forbedre ytelse og stabilitet.\n\n##### Motivasjon og energi 10 \u002F 10\n\nDagen har vært så fin den kan være.\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FAutomatisert-kompetanseoversikt-og-systemmodernisering","BmDss0mGJggakp-Qqroy-eoRcd2yVyhIC-IMKQiu9vM",{"id":523,"title":524,"body":525,"date":560,"description":529,"extension":7,"ingress":561,"meta":562,"navigation":151,"path":563,"seo":564,"sources":14,"status":565,"stem":566,"__hash__":567},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FModernisering-for-feilfri-drift-og-enklere-videreutvikling.md","Modernisering for feilfri drift og enklere videreutvikling",{"type":11,"value":526,"toc":558},[527,530,533,536,547],[96,528,529],{},"Prosjektet tekniske fundament hadde over tid blitt oppdelt. Forskjellige deler av siden brukte ulike metoder for å vise frem innhold, som artikler, forfattere og arrangementer. Dette gjorde siden tyngre å laste, økte risikoen for småfeil i visningen (som feil datoformater), og gjorde det tidkrevende for selv små endringer uten at noe annet ble påvirket.",[96,531,532],{},"Målet var å rydde opp i nettsidens logikk for å sikre en mer stabil og profesjonell brukeropplevelse. Oppgaven innebar å standardisere hvordan legoklossene brukes, forenkle logikken bak visning av innhold, og fjerne gammel \"gjeld\" (ubrukt kode) som bare tok opp plass.",[96,534,535],{},"Jeg har gjennomført en omfattende forbedring av nettsidens kjerne:",[100,537,538,541,544],{},[103,539,540],{},"Jeg har skrevet om logikken for hvordan artikler, forfattere og arrangementer hentes frem. Nå blir for eksempel arrangementer automatisk sortert etter dato, og forfatterprofiler kobles alltid riktig sammen med sine artikler.",[103,542,543],{},"Jeg har lagt inn sikkerhetsmekanismer (fallbacks) som gjør at siden ikke \"krasjer\" eller ser tom ut hvis et bilde eller en tekst bruker litt lang tid på å laste.",[103,545,546],{},"Jeg har fjernet utdatert og ubrukt kode, samt ryddet i hvordan systemet gjenkjenner medlemskap og partnerskap, slik at de blir vist på en sikkelig måte for brukere.",[96,548,549,550,553,554,557],{},"Gjennom denne omgjøringen har jeg skapt en mer profesjonell og driftssikker nettside. Kundene og brukerne opplever nå en raskere side med korrekt informasjon og en logisk flyt, noe som bygger tillit og reduserer frustrasjon. For foreningen  betyr dette at de har gått fra et komplekst og sårbart system til en ryddig og pålitelig plattform. Dette reduserer også fremtidige vedlikehold og gjør at jeg kan rulle ut nye funksjoner mye raskere enn før, ettersom jeg nå jobber med standardiserte byggeklosser fremfor å drive brannslukking av småfeil. Datakvaliteten sikrer også at viktig informasjon, som ",[210,551,552],{},"medlemsfordeler"," og ",[210,555,556],{},"partnerskap",", alltid vises korrekt til de riktige målgruppene.",{"title":14,"searchDepth":15,"depth":15,"links":559},[],"2026-03-24T00:00:00.000Z","Jeg har gjennomført en modernisering av prosjektet [SosialInnovasjon](https:\u002F\u002Fsosent.no) for å sikre en raskere og mer stabil brukeropplevelse. Ved å rydde i systemets grunnmur har jeg fjernet hindringer som tidligere skapte visuelle feil og treghet. Resultatet er en profesjonell digital flate hvor informasjon alltid vises korrekt. Dette sparer meg for vedlikehold og gjør det enklere å videreutvikle siden i tråd med bedriftens behov i fremtiden.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fsosial-innovasjon\u002Fmodernisering-for-feilfri-drift-og-enklere-videreutvikling",{"title":524,"description":529},"#### Dagens Aktiviter \n\n* Jeg har skrevet om logikken som styrer artikler, forfattere og arrangementer. Dette betyr at systemet nå automatisk sorterer arrangementer etter dato og kobler riktig forfatter til riktig artikkel, noe som sparer manuelt arbeid og sikrer riktig informasjon.\n* Jeg har lagt inn tekniske sikkerhetsmekanismer (fallbacks) som hindrer at nettsiden oppleves som om den er  tom eller krasjer dersom innholdet bruker litt tid på å laste. Dette gir en rask brukeropplevelse uten avbrudd.\n* Jeg har fjernet store mengder utdatert og ubrukt kode. Samtidig har jeg rettet opp i hvordan systemet gjenkjenner  medlemskap  og  partnerskap , slik at kunden kan legge ut sine medlemmer på nettsiden sin.\n* Ved å rydde i systemets kjerne har jeg sørget for at dataene som flyter gjennom nettsiden er mer nøyaktige. Dette gjør det enklere for foreningen å rulle ut nye artikler i fremtiden uten å støte på uventede feil.\n\n#### Motivasjon & Energi 9 \u002F 10 \n\nDagen har vært så fin den kunne bli, selv om det har vært litt små irriterende med uforutsigbare feil.\n","posts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FModernisering-for-feilfri-drift-og-enklere-videreutvikling","FIrAldsCMGA4H9elcI0XnzzuwziG-Ncc22RBO06P4JA",{"id":569,"title":570,"body":571,"date":603,"description":575,"extension":7,"ingress":604,"meta":605,"navigation":151,"path":606,"seo":607,"sources":14,"status":608,"stem":609,"__hash__":610},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002Fkt-hastighet-og-forbedret-driftssikkerhet.md","Økt hastighet og forbedret driftssikkerhet",{"type":11,"value":572,"toc":601},[573,576,579,598],[96,574,575],{},"Programmet som henter informasjon fra prosjekter, stoppet gjentatte ganger før det ble ferdig. Systemet rapporterte om tidsavbrudd (timeout) og nektet å opprettholde forbindelsen med eksterne tjenester hver gang det nådde side 2 i arbeidslisten. Forsøk på å løse dette ved å gi programmet mer tid eller ved å sette ned arbeidshastigheten manuelt, ga ingen resultater.",[96,577,578],{},"Oppgaven var å finne ut hvorfor programmet gjentok første side kontinuerelig til tross for at jeg ga det bedre arbeidsbetingelser. Jeg måtte identifisere om feilen ikke var kode relatert, eller om det lå en logisk brist i måten programmet utførte sine instrukser på.",[100,580,581,584,587,590],{},[103,582,583],{},"Ved en grundig gjennomgang av hendelsesloggen ble det avdekket at programmet hadde havnet i en uendelig sirkel.",[103,585,586],{},"Programmet fant veien til neste side, men det klarte ikke å legge fra seg den gamle informasjonen. Dette førte til at det ble stående og lese side 2 opp til flere ganger i stedet for å gå videre til side.",[103,588,589],{},"Som en konsekvens av at programmet spurte om nøyaktig det samme flere ganger på kort tid, ble det til slutt blokkert av sikkerhetssystemene.",[103,591,592,593,597],{},"Ved å fjerne parameterne ble instruksjonene endret slik at programmet nå tvinges til å oppdatere informasjonen i minnet hver gang det blar om en side. Jeg satte dørvakten ",[594,595,596],"code",{},"Semaphore",") ned til 5 koblinger samtidig for å unngå sikkerhetssystemene, og endret ventetiden (Timeout) fra 500 sekunder til 120 sekunder for mer effektiv feilhåndtering.",[96,599,600],{},"Ved å rette opp i den interne logikken og justere hastigheten har jeg erstattet et ustabilt program som tidligere løp i ring, med en robust og effektiv prosess som nå beveger seg sikkert mot målet uten manuelt tilsyn. Dette gir virksomheten betydelig verdi gjennom økt driftssikkerhet og eliminering av risiko for uforutsett stans, samtidig som programmet nå fullfører hele oppgaven på en brøkdel av tiden fordi hver side kun hentes en gang. Ved å senke ventetiden har jeg også sørget for at eventuelle feil oppdages umiddelbart fremfor at systemet blir stående i unødvendige venteposisjoner, noe som sammen med den nye dørvakt-funksjonen gjør systemet rigget for fremtidig vekst og større datamengder. Den dokumenterte løsningen fungerer nå som en standard for å unngå lignende feil i fremtiden, noe som sikrer data av høy kvalitet til en lavere kostnad enn før.",{"title":14,"searchDepth":15,"depth":15,"links":602},[],"2026-03-23T00:00:00.000Z","Gjennom en oppretting av systemets logikk har jeg transformert en ustabil prosess til en sikker og selvgående løsning. Ved å eliminere unødvendig sirkelgang og optimalisere arbeidstempoet, leverer programmet nå data på en brøkdel av tiden. For virksomheten betyr dette økt driftssikkerhet, reduserte kostnader og et system som er rigget for fremtidig vekst uten behov for manuelt tilsyn eller dyre avbrudd.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fkt-hastighet-og-forbedret-driftssikkerhet",{"title":570,"description":575},"#### Dagens Aktiviteter\n\n* Undersøkte hvorfor programmet stoppet opp og ga feilmeldinger om tidsavbrudd (timeout) hver gang det nådde side 2 i arbeidslisten.\n* Gjennomførte tester ved å øke ventetiden manuelt og sette ned arbeidshastigheten for å se om det løste forbindelsesproblemene (uten hell).\n* Foretok en grundig teknisk revisjon av loggene som avdekket en logisk brist (uendelig sirkel) der programmet gjentok samme side i stedet for å gå videre.\n* Fjernet overflødige parametere i koden for å tvinge programmet til å oppdatere minnet for hver nye side.\n\nEndret logikken slik at programmet faktisk \"legger fra seg\" gammel informasjon og henter ny.\n\n# Motivasjon & Energi 10 - 10\n\nDagen er så fin den kan bli.\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002Fkt-hastighet-og-forbedret-driftssikkerhet","O8Ev9djcMbtihc_SvKBRzMH58tjuqmM6knvroW-SH0o",{"id":612,"title":613,"body":614,"date":650,"description":618,"extension":7,"ingress":651,"meta":652,"navigation":151,"path":653,"seo":654,"sources":14,"status":655,"stem":656,"__hash__":657},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FIntelligent-filtrering-og-kategorisering-for-å-øke-brukervennlighet.md","Intelligent filtrering og kategorisering for å øke brukervennlighet",{"type":11,"value":615,"toc":648},[616,619,622,645],[96,617,618],{},"Overvåkningssytemet GitHub-prosjekter var ustabilt og ineffektivt. Det ble overbelastet av unødvendige skoleprosjekter, noe som utfordret systemet for å skille prosjekter fra støy.",[96,620,621],{},"Målet var å stabilisere systemet og sikre henting av relevante prosjekter. Utfordringen var å filtrere ut uvelkommende skoleprosjekter, uten at dette påvirket overvåkingen av relevante prosjekter. for å oppnå dette målet, utførte jeg en systematisk  serivice for Github-systemet:",[100,623,624,627,630,633,636,639,642],{},[103,625,626],{},"Jeg laget til et filter, for Github-systemet for å filtrere ut støy basert på en liste med uvelkommede eiere.",[103,628,629],{},"For å unngå at Github-systemet ikke blokkerer forespørslene vi sender, som en konsekvens av for mange samtidige forespørsler, la jeg til et kø system for hver av oppgavene.",[103,631,632],{},"Ved å bruke (asyncio.Semaphore) kontrollerer jeg antall aktive oppgaver, noe som sikrer stabil drift uten avbrudd fra Githubs sikkerhetssystem.",[103,634,635],{},"Senere ble det identifisert at standardinnstillingen for tilkobling (httpx.Timeout(connect=10.0)) avbrøt tunge spørringer før de var fullført.",[103,637,638],{},"Ved å øke tidsbegrensningen til  120 sekunder, ga jeg systemet nødvendig tid til å prosessere omfattende prosjekter uten unødvendige avbrudd.",[103,640,641],{},"Ved overføring til skyen identifiserte jeg en feil som jeg hadde tidligere benyttet datetime.isoformat(), som konverterte datoer til tekst, dette aksepterte ikke databasen.",[103,643,644],{},"Ved å fjerne denne konverteringen og sende informasjonen som rene dato-objekter, sørget jeg for at biblioteket SQLAlchemy kunne lagre dataene korrekt i databasen, uten konflikter.",[96,646,647],{},"Jeg har nå stabilisert systemet til et pålitelig og selvgående system, som kjører uten behov for manuelle avbrudd eller løpende feilsøking. Ved å kombinere stabilitet med logisk sortering, leveres dataene direkte til skylagring, noe som at all prosjektinformasjon er umiddelbart tilgjengelig ved uthenting. For å øke nytteverdien ytterligere har jeg laget et automatisk system for kategorisering med etiketter for backend, frontend og fullstack for hvert prosjekt. Dette forenkler filteringen for besøkende og gjør datasettet langt mer oversiktlig for videre analyse.",{"title":14,"searchDepth":15,"depth":15,"links":649},[],"2026-03-19T00:00:00.000Z","Jeg har transformert et ustabilt overvåkingssystem til en pålitelig og selvgående løsning som fjerner unødvendig støy og sikrer datakvalitet. Ved å automatisere sortering og lagring, leveres nå prosjekter ferdig kategorisert direkte til skyen. Dette fjerner behovet for manuelt vedlikehold og feilsøking, samtidig som det gir besøkende tilgang til relevante data for raskere og mer presise analyser.",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fintelligent-filtrering-og-kategorisering-for-a-oke-brukervennlighet",{"title":613,"description":618},null,"posts\u002Fdev\u002FProject\u002Fportfolio\u002FIntelligent-filtrering-og-kategorisering-for-å-øke-brukervennlighet","Nvi3roW7VsgD8pBQNS9WCksP6dnR_BNGxrQv9wBW2a8",{"id":659,"title":660,"body":661,"date":685,"description":665,"extension":7,"ingress":686,"meta":687,"navigation":151,"path":688,"seo":689,"sources":14,"status":690,"stem":691,"__hash__":692},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FKvalitetssikring-Gjennom-Automatisering.md","Kvalitetssikring Gjennom Automatisering",{"type":11,"value":662,"toc":683},[663,666,669,680],[96,664,665],{},"For at besøkende på nettsiden min raskt skal kunne finne frem til relevante prosjekter, trengte jeg en tydelig kategorisering av teknologien bak hvert prosjekt, slik at det er lettere for besøkende å finne ut hva jeg kan. Å sortere dette manuelt ville vært en ineffektiv bruk av tid og en løsning som ikke ville tåle fremtidig vekst i antall prosjekter.",[96,667,668],{},"Målet var å forbedre denne situasjonen, ved å utvikle et system som automatisk gjenkjenner om et prosjekt er fokusert på det visuelle, logikken bak eller begge deler. Derfor ble min oppgave å modernisere hele dataflyten – fra hvordan informasjonen lagres til hvordan systemet analyserer innholdet i hvert enkelt prosjekt.",[100,670,671,674,677],{},[103,672,673],{},"Jeg utviklet en funksjon som automatisk henter ut den komplette filoversikten for hvert prosjekt direkte fra Github.",[103,675,676],{},"Jeg definerte faste kjennetegn som skiller de ulike teknologitypene fra hverandre.",[103,678,679],{},"Jeg utviklet en logikk markerer prosjektet, så snart et av disse kjennetegnene blir funnet, dette sikrer en enkel, rask og selvgående analyse",[96,681,682],{},"Gjennom denne automatiseringen har jeg fjernet behovet for manuelt vedlikehold, noe som sparer betydelig med tid og sikrer at informasjonen er korrekt. Selv om muligheten til å sortere prosjektene for de besøkende er planlagt i neste fase av designet, er hele det tekniske på plass. Porteføljen fremstår nå som en ryddig og profesjonell oversikt der kategoriseringen er basert på de faktiske tekniske valgene i hvert prosjekt, fremfor manuelle anslag.",{"title":14,"searchDepth":15,"depth":15,"links":684},[],"2026-03-17T00:00:00.000Z","For å gi besøkende en profesjonell og ryddig oversikt over mine personlige\nprosjekter, har jeg utviklet et selvgående system som automatisk kategoriserer\nmine prosjekter, i stedenfor at jeg merker hvert prosjekt manuelt, har jeg\nlaget en løsning som merker prosjektene ved å lese filene. Denne forbedringen\ngjør at jeg sparer tid.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fkvalitetssikring-gjennom-automatisering",{"title":660,"description":665},"#### Dagens Aktiviteter\n\n* Startet arbeidet med å endre hvordan systemet henter og analyserer informasjon for å gjøre porteføljen mer selvgående.\n* Utviklet en funksjon som automatisk henter ut en fullstendig oversikt over alle filer i hvert prosjekt.\n* La til logikk som umiddelbart setter riktig merkelapp på prosjektene basert på filene systemet finner.\n* Kontrollert at den nye metoden fjerner behovet for manuelt vedlikehold og sikrer at all informasjon i porteføljen er korrekt.\n\n#### Motivasjon og energi - 10 \u002F 10\n\nDagen har vært så fin den kan bli\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FKvalitetssikring-Gjennom-Automatisering","fbAYAG4SwSWptCRTi7e3qAjKPQTthwgTuC7j5Rj9yuk",{"id":694,"title":695,"body":696,"date":717,"description":700,"extension":7,"ingress":718,"meta":719,"navigation":151,"path":720,"seo":721,"sources":14,"status":722,"stem":723,"__hash__":724},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FKaos-til-Strukturert-Kontroll.md","Kaos til Strukturert Kontroll",{"type":11,"value":697,"toc":715},[698,701,704,707,712],[96,699,700],{},"Jeg oppdaget at det var utfordrende for leserne å finne frem til de artiklenede var interessert i. Innholdet var usortert, noe som kunne gjøre at brukeropplevelsen var uoversiktlig.",[96,702,703],{},"Målet var å skape en løsning som sorterer artiklene automatisk. Den strategiske utfordringen var å velge den mest stabile metoden:",[96,705,706],{},"Skulle jeg bruke de eksisterende mappene artiklene ligger i eller finne en annen løsning for merking. Valget var avgjørende for fremtidige besøkende.",[100,708,709],{},[103,710,711],{},"Jeg valgte den raskeste løsningen basert på eksisterende mappestrukturen for å sikre en effektiv og stabil utrulling uten unødvendig kompleksitet. Ved å automatisere denne prosessen, fjerner jeg behovet for manuelt arbeid ved hver publisering. Dette sikrer et selvgående system og krever minimalt med vedlikehold.",[96,713,714],{},"Endringen har ført til en forbedring av brukeropplevelsen, da leseren nå umiddelbart ser sammenhengen mellom prosjekt og kompetanseområde. For meg betyr dette økt engasjement på siden og redusert tidsbruk for leseren, som nå slipper å lete etter kontekst. Dette styrker prosjektets troverdighet og profesjonalitet ovenfor alle besøkende.",{"title":14,"searchDepth":15,"depth":15,"links":716},[],"2026-03-16T00:00:00.000Z","For å sikre at mine lesere alltid finner relevant innhold, har jeg utviklet en\nautomatisk sorteringsløsning. Ved å fjerne manuelt rot og automatisere\nkategoriseringen, har jeg skapt en enklere brukeropplevelse som setter din tid\ni fokus. Her er hvordan jeg løste utfordringen!\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fkaos-til-strukturert-kontroll",{"title":695,"description":700},"#### Dagens Aktiviteter\n\n* Uoversiktlig artikkeloversikt som svekket brukeropplevelsen.Valgt løsning: Implementert filtrering basert på eksisterende mappestruktur for maksimal stabilitet\n* Automatisert kategoriseringen for å fjerne manuelt arbeid ved fremtidige publiseringer. Økt profesjonalitet, redusert tidsbruk for leseren og null behov for løpende vedlikehold.\n\n\n#### Motivasjon & Energi 7 \u002F 10\nDagen har vært så fin den kunne bli.\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FKaos-til-Strukturert-Kontroll","Do4MDW_7ehQJTJeswbAoiEELLQ76RdvmrW-3gmUuz4o",{"id":726,"title":727,"body":728,"date":757,"description":732,"extension":7,"ingress":758,"meta":759,"navigation":151,"path":760,"seo":761,"sources":655,"status":655,"stem":762,"__hash__":763},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FOppsett-av-en-mnedlig-data-oppdatering.md","Oppsett av en månedlig data-oppdatering",{"type":11,"value":729,"toc":755},[730,733,740,752],[96,731,732],{},"Applikasjonen krevde manuell henting av nye Github prosjekter. Dette er en rutine som ikke har behov for mennesklig overvåkning, gjør dette til en ineffektiv oppgave.",[96,734,735,736,739],{},"Oppgaven var å automatisere denne prosessen slik at et spesifikt endepunkt på nettsiden blir aktivert automatisk den første hver måned ",[210,737,738],{},"kl 00:00",".",[100,741,742,745],{},[103,743,744],{},"Jeg opprettet en jobb i \"Google Cloud Scheduler\" med en frekvens på 0 0 1 * * Som betyr at denne oppgaven skal kjøres hver første dag i hver måned.",[103,746,747,748,751],{},"for å vertifisere at funksjonaliteten fungerte kjørte jeg en ",[594,749,750],{},"force run"," for å se om Oppgaven klarte å levere en GET-forespørsel til FastAPI-endepunktet.",[96,753,754],{},"Systemet er nå fullstendig automatisk, loggene bekrefter at instruksen blir levert og appen svarer med en 200 OK. Databasen blir nå oppdatert hver første dag, en gang i måneden.",{"title":14,"searchDepth":15,"depth":15,"links":756},[],"2026-03-14T00:00:00.000Z","Denne loggføringen dokumenterer overgangen fra manuelt vedlikehold til en fullstendig automatisert datainnsamling. Ved å automatisere månedlig kjøreplan i skyen, sikrer jeg at oversikten over GitHub-prosjekter holdes oppdatert uten menneskelig innblanding, noe som optimaliserer ressursbruken i prosjektet.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Foppsett-av-en-mnedlig-data-oppdatering",{"title":727,"description":732},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FOppsett-av-en-mnedlig-data-oppdatering","PAjYIXPlplCmfJL9kHlyLh-MldJuv7A9oGaIkOPCrN8",{"id":765,"title":766,"body":767,"date":788,"description":771,"extension":7,"ingress":789,"meta":790,"navigation":151,"path":791,"seo":792,"sources":655,"status":14,"stem":793,"__hash__":794},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FLsning-av-Deployment-feil-i-Google-Cloud-Run.md","Løsning av Deployment-feil i Google Cloud Run",{"type":11,"value":768,"toc":786},[769,772,775,783],[96,770,771],{},"Applikasjonen krasjet under publisering til Google Cloud med feilmeldingen Container failed to start and listen to port 8080. Lokale publiseringer viser seg å fungere, men umiddelbart feilet skymiljøet ved oppstart.",[96,773,774],{},"Oppgaven min var å finne ut hvorfor miljøet krasjet i skyen. Utfordringen bestod i manglende avhengigheter, feil i Pydantic-parsing av miljøvariabler og en uovernsstemmelse i en av av miljø variablene som trigget en exception",[100,776,777,780],{},[103,778,779],{},"Bibliotek fiks - Miljøfilen ble oppdatert til å bruke det nye biblioteket pip-tools for å sikre at biblioteker ble låst og installert rett i miljø-bildet.",[103,781,782],{},"Miljøvariabel-formatering - Endret miljø-instillingene i Google Cloud, ved å fjerne unødvendige instillinger.",[96,784,785],{},"Miljø-boksen er nå pålitelig og ferdigpakket. Applikasjonen startet suksessfullt i Google Cloud. Loggene bekrefter Application startup complete og serverern svarte på den dedikerte porten. Systemet er sikret å ha de nyeste versjonenen ved oppstart av en nytt bilde.",{"title":14,"searchDepth":15,"depth":15,"links":787},[],"2026-03-13T00:00:00.000Z","Denne loggføringen dokumenterer feilsøking og løsning av kritiske oppstartsutfordringer ved publisering av en FastAPI-applikasjon til Google Cloud. Ved å standardisere miljø-boksen (containeren) og rydde i applikasjonens innstillinger (miljøvariabler), ble systemet transformert fra en ustabil tilstand til en pålitelig og produksjonsklar løsning. Fokus har ligget på å sikre at applikasjonen er selvforsynt med riktige verktøy og instrukser for en feilfri oppstart i skyen.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Flsning-av-deployment-feil-i-google-cloud-run",{"title":766,"description":771},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FLsning-av-Deployment-feil-i-Google-Cloud-Run","hIaldOkCEXqF7GQ7xdGJ5DoO-0amF02wLuSyN74dn-Y",{"id":796,"title":797,"body":798,"date":972,"description":973,"extension":7,"ingress":974,"meta":975,"navigation":151,"path":976,"seo":977,"sources":14,"status":978,"stem":979,"__hash__":980},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FAvsluttende-prosjektlogg-Modernisering-og-sikring-av-intranett.md","Avsluttende prosjektlogg - Modernisering og sikring av intranett",{"type":11,"value":799,"toc":970},[800,807,812,838,841,850,853,857,860,870,894,904,908,915,939,942,946,958],[96,801,802,803,806],{},"Dette prosjektet har handlet om å profesjonalisere bedriftens intranett. Ved å rydde opp i ",[210,804,805],{},"ustabil kildekode"," og innføre moderne sikkerhetsstandarder, har vi gått fra en sårbar løsning til en plattform som er klargjort for fremtidig vekst og effektiv drift.",[808,809,811],"h5",{"id":810},"systemgjenoppretting-og-universell-tilgang","Systemgjenoppretting og Universell Tilgang",[96,813,814,815,818,819,822,823,829,830,833,834,837],{},"Etter en automatisk flytting av kodespråk (fra ",[210,816,817],{},"PHP"," til ",[210,820,821],{},"C#"," via ",[165,824,826],{"title":825},"Kunstig intelligens",[210,827,828],{},"KI",") krasjet intranettet for utviklere med plattformen ",[210,831,832],{},"Mac"," eller ",[210,835,836],{},"Linux",". Dette skapte full stans i videreutviklingen.",[96,839,840],{},"Min oppgave var å finne feilen og sørge for at systemet fungerte uavhengig av hvilket operativsystem som brukes som publiserings løsningen.",[100,842,843],{},[103,844,845,846,849],{},"Jeg analyserte den KI-genererte koden og oppdaget at den kun forsto ",[210,847,848],{},"Windows","-stier. Jeg erstattet dette med en universell løsning for filhåndtering og ryddet i logikken slik at koblingen mellom nettsiden og dokumentene ble pålitelig.",[96,851,852],{},"Vi fjernet tekniske skiller mellom ansatte og studenter, ved å fjernet risikoen for fremtidige krasj ved systembytter.",[808,854,856],{"id":855},"fra-åpent-til-sikkert-rollebasert-tilgang","Fra Åpent til Sikkert (Rollebasert tilgang)",[96,858,859],{},"Systemet manglet kontroll på hvem som så hva. Sensitiv intern informasjon og navigasjonslenker var synlig for alle, inkludert studenter. Dette utgjorde en sikkerhetsrisiko og skapte et uoversiktlig arbeidsmiljø.",[96,861,862,863,869],{},"Etablere en sikkerhetsløsning ",[165,864,866],{"title":865},"Role Based Accsess Control \u002F Rollebasert tilgangs kontroll",[210,867,868],{},"RBAC",") som skiller mellom roller og beskytter bedriftens data i alle ledd.",[96,871,872,873,877,878],{},"Jeg flyttet sikkerhetskontrollen fra brukeren til systemets ",[165,874,876],{"title":875},"lukkede kjerne","backend",". Jeg la til en ",[165,879,881,884],{"title":880},"en arbeidsprosess der maskinen går gjennom den samme informasjonen to ganger",[170,882,883],{},"«To-pass algoritme»",[165,885,886,887,893],{}," som håndterer rettigheter i mapper og mapperstrukturer, og brukte en ",[165,888,890],{"title":889},"Den delen av koden som er den eneste kilden til sannhet",[170,891,892],{},"«Singleton-tjeneste»"," for å sikre at sikkerhetssjekken skjer raskt uten å belaste serveren.",[96,895,896,897,903],{},"Vi følger nå internasjonale standarder for personvern ",[165,898,900],{"title":899},"Prinsippet sier at brukere skal bare ha tilgang til det de trenger for å gjøre jobben sin",[170,901,902],{},"«minst priviligum»",". Dette har fjernet teknisk støy for brukerne og tettet sikkerhetshull før de kunne bli utnyttet.",[808,905,907],{"id":906},"redusere-teknisk-etterslep","Redusere teknisk etterslep",[96,909,910,911,914],{},"Systemet var bygget som en helhet hvor alt hang sammen med alt. Små endringer kunne føre til uforutsette feil, og det var umulig å utføre automatisert ",[210,912,913],{},"testing"," for å sjekke om systemet faktisk var friskt.\nMålet mitt var å strukturere Rydde i systemarkitekturen for å gjøre det enklere, tryggere og billigere å vedlikeholde over tid.",[100,916,917],{},[103,918,919,920,926,927,931,932],{},"Jeg separerte bedriftens regler fra den tekniske motoren ved bruk av ",[165,921,923],{"title":922},"Dependency Inversion Principle - Beskytter logikken mot arkitekturen, og arkitekturen mot logikken ",[170,924,925],{},"«DIP-prinsippet»",". Jeg fjernet over 50 linjer med ",[165,928,930],{"title":929},"Ubrukt kode \u002F Duplikate funksjonalitet","overflødig kode"," og innførte det objektivt målesystemet ",[165,933,935,938],{"title":934},"Et Verktøy som måler systemets kvalitet i prosent",[210,936,937],{},"Coverlet"," dette forenkler prosessen med å identifisere systemets kvalitet.",[96,940,941],{},"Vi har redusert det tekniske etterslepet. Vi kan nå koble på nye datakilder eller oppgradere teknologien i fremtiden uten å måtte bygge om alt på nytt. Dette sparer bedriften for tid i fremtidig vedlikehold.",[808,943,945],{"id":944},"erfaring-og-hoved-resultatet","Erfaring og Hoved resultatet",[96,947,948,949,952,953,957],{},"Gjennom denne innsatsen har vi i dag en stabil plattform som flyter raskt uavhengig av brukerens utstyr. Vi har tettet sikkerhetshull ved å innføre prinsippet om ",[170,950,951],{},"minste privilegium",", som beskytter bedriftens data i alle ledd. Den nye ",[165,954,956],{"title":955},"Lego basert arkitektur","modulære arkitekturen"," har redusert vedlikeholds behovet betydelig og transformert vår utviklingskultur fra å styre etter antakelser til å styre etter objektive fakta. Resultatet er en trygg produksjonslinje som leverer kvalitet uten uforutsette avbrudd.",[96,959,960,961,965,966,969],{},"Prosjektet har gitt verdifull innsikt i betydningen av ",[165,962,964],{"title":963},"Lego basert","modulær"," systemutvikling og viktigheten av å bygge sikkerhet inn i selve grunnmuren fremfor å legge det på som et ettertanke. Har erfart ved å bruke objektive måleverktøy kan man styre prosjekter med langt større presisjon. Denne erfaringen har styrket min forståelse for hvordan tekniske valg direkte påvirker bedriftens smidighet ved å bygge systemer som «",[170,967,968],{},"Lego-klosser","» står vi nå langt sterkere rustet når behovene endrer seg i fremtiden.",{"title":14,"searchDepth":15,"depth":15,"links":971},[],"2025-12-31T11:25:24.822Z","Dette prosjektet har handlet om å profesjonalisere bedriftens intranett. Ved å rydde opp i ustabil kildekode og innføre moderne sikkerhetsstandarder, har vi gått fra en sårbar løsning til en plattform som er klargjort for fremtidig vekst og effektiv drift.","Gjennom en omfattende modernisering har vi profesjonalisert intranettet ved å erstatte ustabil kildekode med en legobasert arkitektur. Ved å innføre universell filhåndtering og streng tilgangsstyring har vi fjernet driftsfeil og styrket personvernet. Oppgraderingen gir oss full kontroll over systemets helse, reduserer teknisk etterslep og sikrer en pålitelig plattform som er klargjort for fremtidig vekst og effektiv drift.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Favsluttende-prosjektlogg-modernisering-og-sikring-av-intranett",{"title":797,"description":973},"#### Status\n\nPeriode: **November** – **Desember** 2025\n\nAnsvarlig: **Kristoffer Gjøsund**\n\n**Formål med loggen**\n\nDenne loggen oppsummerer de viktigste aktivitetene, resultatene og læringspunktene fra prosjektperioden. Fokus har vært å transformere intranettet til en stabil, sikker og profesjonell plattform for hele organisasjonen.\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FAvsluttende-prosjektlogg-Modernisering-og-sikring-av-intranett","Xmv5q5kknmYPI0B7wlS9fhg4FQvltk0FSzTU0ZOGsm8",{"id":982,"title":983,"body":984,"date":1029,"description":1030,"extension":7,"ingress":1031,"meta":1032,"navigation":151,"path":1033,"seo":1034,"sources":14,"status":1035,"stem":1036,"__hash__":1037},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FFeilhndtering-i-Komponentbiblioteket.md","Optimalisering for en Tyggere Nettside og Økt Pålitelighet",{"type":11,"value":985,"toc":1027},[986,999,1002,1024],[96,987,988,989,993,994,998],{},"Det ble oppdaget to ukorrektheter i prosjektets ",[165,990,992],{"title":991},"lego-klosser med data","komponent","-",[165,995,997],{"title":996},"Samling av kode","bibliotek"," som skapte en uventet brukeropplevelse. Feilene førte til at nettsiden oppførte seg ustabil for brukeren.",[96,1000,1001],{},"Oppgaven min var å kartlegge de ukorrekthetene og sørge for at komponentene ble pålitelige . Målet var å sikre systemet forsto forskjellen på en vanlig lenke og en nedlastning, samt sørge for at nettsiden ikke krasjer selv om bildeinformasjonen, midlertidig manglet.",[100,1003,1004,1014,1021],{},[103,1005,1006,1007,1013],{},"Jeg endret logikken hvordan systemet kommuniserer med nettleseren. Ved å bytte ut ",[165,1008,1010],{"title":1009},"kode som forteller om noe er sant\u002Fusant",[594,1011,1012],{},"boolinske","-verdier til en logikk som fjerner kommunikasjonen helt når den ikke trengs, stoppet jeg de uønskede effekten av nedlastningsvarslene.",[103,1015,1016,1017,1020],{},"Jeg la til logikk for en sjekk som spør systemet om bilde er tilgjenglig i konteksten, hvis svaret er ",[210,1018,1019],{},"usant",", så hopper systemet elegant over bilde-delen i stedet for å krasje hele siden.",[103,1022,1023],{},"Jeg ryddet opp i den tekniske etterslepet for hvordan data blir levert til komponentene for å redusere feil marginen og sikrer at dataen som brukes er pålitelig og forutsigbar.",[96,1025,1026],{},"Jeg har skapt et mer pålitelig komponentbibliotek som tåller uforutsette datafeil uten at det påvirker kunden. Ved å fjerne uønskede nedlastninger og hindre krasj, har jeg økt kvaliteten på produktet. Dette reduserer antall feilmeldinger for brukere og sparer spotane fiks i fremtiden. Nettsiden fremstår nå som mer forutsigbart, profesjonelt og pålitelig.",{"title":14,"searchDepth":15,"depth":15,"links":1028},[],"2025-12-29T00:00:00.000Z","Det ble oppdaget to ukorrektheter i prosjektets komponent-bibliotek som skapte en uventet brukeropplevelse. Feilene førte til at nettsiden oppførte seg ustabil for brukeren.","Ved å rydde opp i usynlige logikkfeil har jeg gjort nettsiden mer pålitelig og brukervennlig. Jeg har fjernet småfeil som forstyrret kundene, og sørget for at systemet nå tåler manglende data uten å krasje. Dette betyr i praksis et mer profesjonelt digitalt bilde av kunden, færre kundeklager og besparelser i fremtidig tid for vedlikehold, fordi jeg slipper tidkrevende runder med raske nødfikser og kan fokusere på ny verdi.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fsosial-innovasjon\u002Ffeilhndtering-i-komponentbiblioteket",{"title":983,"description":1030},"#### Dagens aktiviteter\n\n* Stoppe uønskede nedlastningsvarsler som forstyrrer brukere.\n* Gjennom gang av hvordan nettsiden er mer påliteleig under panseret.\n* Øke datakvaliteten, for å spare kostbar feilsøking og raske fiks i fremtiden.\n* Oppsummere hvordan en forutsigbar nettside øker tilliten hos sluttbrukeren.\n* Innføring av \"smart-sjekker\" som sørger for at nettsiden forblir oppe, selv når data mangler.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen har vært så fin den kunne bli.\n","posts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FFeilhndtering-i-Komponentbiblioteket","Rle-xGTJnD1LttYlSESFnAIFv-uudG-tJ9_NhuHz9y8",{"id":1039,"title":1040,"body":1041,"date":1074,"description":1045,"extension":7,"ingress":1075,"meta":1076,"navigation":151,"path":1077,"seo":1078,"sources":14,"status":1079,"stem":1080,"__hash__":1081},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FReaktiv-Paginering.md","Sikring av Feilfri Navigasjon og Medlemsinformasjon i Nyhetsarkivet",{"type":11,"value":1042,"toc":1072},[1043,1046,1049,1069],[96,1044,1045],{},"Jeg utviklet et nyhetsarkiv slik at besøkede kunne kunne finne eldre artikler. Under testingen av løsningen, oppdaget jeg at navigasjonen oppførte seg på en uventet måte. Når man trykket på knappen «Neste side», endret sidetallet seg, men artiklene på skjermen forble det samme. Selv om side tallet forandret seg.",[96,1047,1048],{},"Oppgaven var å sikre at innholdet oppdaterte seg når brukere navigerte til neste eller forrige side. For organisasjonen er dette viktig, om besøkende ikke finner artiklene de leter etter, mister brukerene interessen og organisasjonen kan miste trafikk og fremstå som uprofesjonelle. Jeg hadde derfor som en oppgave om å koble sammen logikken, slik at siden alltid viser riktig informasjon til riktig tid.",[100,1050,1051,1058,1061],{},[103,1052,1053,1054,1057],{},"Jeg flyttet logikken for sidebytte til en felles ",[165,1055,992],{"title":1056},"en lego-klosse med data",", dette gir oss full kontroll over side navigeringen og komponentet kan sende tilbake en oppdatering når besøkede reduserer elller øker side telleren.",[103,1059,1060],{},"Det ble installert en lytter som følger med på hvilken knapp som er trykket på, slik at systemet reagerer umiddelbart.",[103,1062,1063,1064,1068],{},"la til ",[165,1065,1067],{"title":1066},"Typesikkerhet er en teknikk for å redusere logiske ukorrektheter og redusere teknisk etterslep","typesikkerhet"," for å rydde opp i hvordan dataene håndteres og sikre at systemet alltid får korrekt informasjon, dette fjerner usikkerhet og skjulte feil i koden.",[96,1070,1071],{},"Besøkede kan nå navigere feilfritt gjennom hele arkivet til organisasjonen, noe som sikrer at innholdet deres blir lest, kunden kan bli trygg på at medlemmene sine får oppdatert informasjon om arbeidet organisasjonen gjør. Over tid vil dette gjøre det enklere og raskere for utviklere å vedlikeholde siden. Systemet er nå en pålitelig løsning som hindrer at organisasjonen fremstår som uprofesjonell på grunn av tekniske mangler.",{"title":14,"searchDepth":15,"depth":15,"links":1073},[],"2025-12-28T00:00:00.000Z","Dette arbeidet handler om å sørge for at organisasjonens digitale identitet virker korrekt. Ved å løse utfordringene med navigasjonen i nyhetsarkivet har jeg sikret at medlemmene faktisk finner informasjonen de leter etter, noe som bygger tillit og profesjonalitet. Samtidig har jeg ryddet i logikken på nettsiden slik at den blir enklere å vedlikeholde. Jeg har redusert teknisk etterslep for å sikre at budskapet når helt frem.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fsosial-innovasjon\u002Freaktiv-paginering",{"title":1040,"description":1045},"#### Dagens aktiviteter\n\n* Finne ut hvorfor nyhetene ikke bytter side når man trykker på knappene.\n* Flytte kontrollen for sidebytte til en felles fil. Dette gjør at nettsiden får bedre kontroll og reagerer riktig hver gang noen prøver å bla i arkivet.\n* Legge inn en funksjonalitet som passer på knappene, slik at nye artikler dukker opp med en gang man trykker.\n* Gå gjennom koden og redusere støy. Dette gjør at systemet får nøyaktig beskjed om hva det skal gjøre, noe som hindrer at nettsiden oppfører uventet eller viser feil innhold.\n* Ved å rydde opp nå, sørger jeg for at det blir mye enklere og raskere å gjøre endringer på siden senere. Dette sparer utviklere for både tid og hodebry.\n\n#### Motivasjon  &  Energi  -  10  \u002F  10\n\nDagen har vært så fin den kunne bli.\n","posts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FReaktiv-Paginering","gjQqPmuFDvFi99yDSDKdanY0e-_jmGM95sOrrsay_Zk",{"id":1083,"title":1084,"body":1085,"date":1128,"description":1129,"extension":7,"ingress":1130,"meta":1131,"navigation":151,"path":1132,"seo":1133,"sources":14,"status":1134,"stem":1135,"__hash__":1136},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FFra-feilmelding-til-vellykket-bygg.md","Trygg og stabil oppstart av nettsidens redaktørpanel",{"type":11,"value":1086,"toc":1126},[1087,1107,1123],[96,1088,1089,1090,1094,1095,1099,1100,1106],{},"Det hadde tidligere blitt laget til et tilpasset ",[165,1091,1093],{"title":1092},"Et publiserings verktøy for bilder og tekst","redaktørpanelt",", dette skulle hjelpe bedriften for å bli mer selvstendig og redusere behovet for teknisk hjelp. Da jeg skulle klargjøre dette systemet for bruk, oppstod det et avbrudd i ",[165,1096,1098],{"title":1097},"Når koden utviklings koden skal oversettes til produksjons kode","kompileringen"," som en konskekvens av systemet manglet digitale identifikasjoner og nøkler for å koble seg trygt til skyen. Jeg forsto at systemet ikke fant de nødvendige tilgangskodene i den lokale miljø-filen kalt ",[165,1101,1103,739],{"title":1102},"En isolert fil som gjemmer sensitive nøkler",[594,1104,1105],{},"**.env**","\nMålet var å få systemet tilgjenglig på nett, uten at dette gikk utover sikkerheten. Oppgaven var å mate bedriftens plattform med disse hemmlige nøklene, på en måte de ikke er offentliggjort.",[100,1108,1109],{},[103,1110,1111,1112,1118,1119,1122],{},"Jeg installerte et hjelpeverktøy kalt ",[165,1113,1115],{"title":1114},"Et hjelpeverktøy i Node JS",[594,1116,1117],{},"dotenv-cli",", som har ansvaret for å finne ",[594,1120,1121],{},".env","-filen. Jeg endret også oppstartskommandoen slik at hjelpeverktøyet henter de sensitive nøklene og verdiene fra miljø filen og overleverer dem direkte til systemet i bygge fasen. Ved å bruke denne metoden sikret jeg at hemmlige nøkler ikke blir offentliggjort, ved å skrive de inn direkte i filen, dette holder systemet trygt for uønskede gjester.",[96,1124,1125],{},"Denne løsningen har sikret at nettsiden og innholdssystemet nå er stabilt og klart til bruk for organisasjonen. Jeg sikret at systemet finner nøklene samtidig som at systemet ikke offentliggjør disse nøklene, dermed beskytter jeg bedriften mot potensielle datainnbrudd og tap rundt dette. Verdien for videre utvikling av prosjektet er at jeg har etablert en ny sikkerhets standard, som gjør at fremtidige utviklere kan sette opp systemet raskt og trygt. Dette reduserer også risikoen for mennesklige feil i fremtiden.",{"title":14,"searchDepth":15,"depth":15,"links":1127},[],"2025-12-24T00:00:00.000Z","Det hadde tidligere blitt laget til et tilpasset redaktørpanelt, dette skulle hjelpe bedriften for å bli mer selvstendig og redusere behovet for teknisk hjelp. Da jeg skulle klargjøre dette systemet for bruk, oppstod det et avbrudd i kompileringen som en konskekvens av systemet manglet digitale identifikasjoner og nøkler for å koble seg trygt til skyen. Jeg forsto at systemet ikke fant de nødvendige tilgangskodene i den lokale miljø-filen kalt **.env**.\nMålet var å få systemet tilgjenglig på nett, uten at dette gikk utover sikkerheten. Oppgaven var å mate bedriftens plattform med disse hemmlige nøklene, på en måte de ikke er offentliggjort.","Ved å sikre  \u003Cabbr title=\"Et publiserings verktøy for bilder og tekst\">redaktørpanelt\u003C\u002Fabbr> mot datainnbrudd har jeg lagt grunnlaget for en trygg og selvstendig drift. Jeg løste feil i \u003Cabbr title=\"Når koden utviklings koden skal oversettes til produksjons kode\">kompileringen\u003C\u002Fabbr> ved å legge til en sikker håndtering av \u003Cabbr title =\"Variabler i et isolert miljø\">miljøvariabler\u003C\u002Fabbr> og sensitive tilgangsnøkler. Gjennom bruk av profesjonelle verktøy hindres lekkasje av konfidensiell data, samtidig som systemet er stabilisert. Dette har etablert en ny standard som forenkler videre utvikling og beskytter bedriftens digitale verdier.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fsosial-innovasjon\u002Ffra-feilmelding-til-vellykket-bygg",{"title":1084,"description":1129},"#### Dagens Aktiviteter\n\n* Oppdaget og analyserte et avbrudd i systemet som hindret redaktørpanelet i å koble seg trygt til skyen.\n* Implementerte verktøyet `dotenv-cli` for å sikre at sensitive passord og ID-nøkler hentes direkte fra en låst fil i stedet for å ligge åpent i koden.\n* Testet at systemet nå starter stabilt og at alle tilkoblinger er krypterte og beskyttet mot uønskede gjester.\n* Dokumenterte metoden som en ny sikkerhetsstandard for prosjektet for å hindre fremtidige menneskelige feil og spare tid ved videre utvikling.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen har vært så fin den kan bli.\n","posts\u002Fdev\u002FProject\u002Fsosial-innovasjon\u002FFra-feilmelding-til-vellykket-bygg","oL6sjY4OvHx47WSOWIrFVLlosLC9Iu7V8Uo8I9J8n6g",{"id":1138,"title":1139,"body":1140,"date":1249,"description":1250,"extension":7,"ingress":1251,"meta":1252,"navigation":151,"path":1253,"seo":1254,"sources":14,"status":1255,"stem":1256,"__hash__":1257},"devPosts\u002Fposts\u002Fdev\u002FDevOps\u002FRessursoptimalisering-i-CICD.md","Fra manuell rutine til selvgående CI\u002FCD prossees",{"type":11,"value":1141,"toc":1247},[1142,1154,1158,1218,1221,1244],[96,1143,1144,1145,1149,1150,1153],{},"Jeg skulle innføre en automatisk rutine av versjonering, Utvikler notater og bygging av nettsiden for prosjektet, slik at prosjektet automatisk kjører rutiner, ved en produksjons klar programvare.I ",[165,1146,1148],{"title":1147},"En sky lagring tjeneste for utviklere hvor kildekoden er lagret.","GitHub"," har man en fast månedlig kvote på ",[210,1151,1152],{},"2000 gratis bygge minutter"," for både offentlige og private prosjekter.",[808,1155,1157],{"id":1156},"oversikt-over-githubs-multiplikator","Oversikt over Githubs Multiplikator.",[1159,1160,1161,1183],"table",{},[1162,1163,1164],"thead",{},[1165,1166,1167,1173,1178],"tr",{},[1168,1169,1170],"th",{},[210,1171,1172],{},"Operativsystem",[1168,1174,1175],{},[210,1176,1177],{},"Multiplikator",[1168,1179,1180],{},[210,1181,1182],{},"Forbruk per minutt",[1184,1185,1186,1197,1207],"tbody",{},[1165,1187,1188,1191,1194],{},[1189,1190,836],"td",{},[1189,1192,1193],{},"1x",[1189,1195,1196],{},"1 minutt",[1165,1198,1199,1201,1204],{},[1189,1200,848],{},[1189,1202,1203],{},"2x",[1189,1205,1206],{},"2 minutt",[1165,1208,1209,1212,1215],{},[1189,1210,1211],{},"macOS",[1189,1213,1214],{},"10x*",[1189,1216,1217],{},"10 minutt",[96,1219,1220],{},"Min oppgave var å løse utfordringen på hvordan jeg kunne bruke de byggeminuttene i Github maksimalt, for å ha en rimlig løsning, både for meg selv og kunden, uten om å betale mer enn nødvendig.",[100,1222,1223,1238,1241],{},[103,1224,1225,1226,1237],{},"Under undersøkingenen av dokumentasjonen om ",[1227,1228,1232,1236],"a",{"href":1229,"rel":1230},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fbilling\u002Fconcepts\u002Fproduct-billing\u002Fgithub-actions",[1231],"nofollow",[165,1233,1235],{"title":1234},"Robot tjeneste, som autoamtiserer manuelt arbeid","GitHub Action"," billing",", oppdaget jeg at mac-maskiner i skyen har en multiplier på 10, som vil si at 1min med bygging koster 10min av bygge kvoten.",[103,1239,1240],{},"Som tabellen over viser at Linux kun har en kostnad på 1x per minutt, besluttet jeg i å kjøre alle prosessene på Linux. Dette er klart det rimligste alternativet som gir mest verdi for meg.",[103,1242,1243],{},"Istedet for at maskinen starter opp hver gang det skjer en liten endring, satte jeg opp systemet til å kun kjøre når koden blir sammenslått til hovedprosjektet. Dette sparer store mengder med tid, da det er ofte behov for mange endringen løpet av et prosjekt.",[96,1245,1246],{},"I stedet for å gjøre alt dette manuelle arbeidet hver gang en ny versjon, lanseres, har jeg laget en prosess som kjører av seg selv på en rask og rimlig måte og jeg sikrer at kvoten på 2 000 bygge minutter varer så lenge som mulig. Dette reduserer unødvendig bruk av ressurser og at jeg har full kontroll på utgiftene knyttet til sky-tjenesten.",{"title":14,"searchDepth":15,"depth":15,"links":1248},[],"2025-12-23T00:00:00.000Z","Jeg skulle innføre en automatisk rutine av versjonering, Utvikler notater og bygging av nettsiden for prosjektet, slik at prosjektet automatisk kjører rutiner, ved en produksjons klar programvare.I GitHub har man en fast månedlig kvote på 2000 gratis bygge minutter for både offentlige og private prosjekter.","Ved å la prosessen fra ferdig kode til publisering gå helt av seg selv, har jeg skapt en moderne løsning som sparer både tid og penger. Jeg har valgt et rimelig alternativ som effektivt forlenger tilgjengelige byggeminutter i \u003Cabbr title=\"Robot tjeneste, som autoamtiserer manuelt arbeid\">GitHub Actions\u003C\u002Fabbr>. Resultatet er et stabilt og selvgående system som reduserer både direkte kostnader og utviklertid ved å fjerne manuelle rutineoppgaver, slik at fokuset heller kan ligge på videreutvikling av selve kjernefunksjonaliteten.\n",{},"\u002Fposts\u002Fdev\u002Fdevops\u002Fressursoptimalisering-i-cicd",{"title":1139,"description":1250},"##### Dagens aktiviteter\n\n* Gjennomgang av \u003Cabbr title=\"En sky lagring tjeneste for utviklere hvor kildekoden er lagret.\">GitHub\u003C\u002Fabbr>s kvote på 2000 bygge-minutter og hvordan jeg kan unngå å gå tom.\n* Avsløring av \"10x-fellen\" – hvorfor jeg velger Linux fremfor Mac for å få 10 ganger mer arbeid for pengene.\n* Hvordan vi sparer tid ved å la maskinene hvile helt til koden er klar for produksjon.\n* Erstatte manuelt rutinearbeid med en selvgående prosess (CI\u002FCD) for versjonering og nettsidebygging.\n* Oppsummering av hvordan jeg kutter utviklingstid.\n\n##### Motivasjon & Energi - 10 \u002F 10\n\nDagen har vært så fin, som det har vært mulig\n","posts\u002Fdev\u002FDevOps\u002FRessursoptimalisering-i-CICD","ZKzpT0F9MUG6m8obSJzigTn2uNQ-E4W8OO0Nlrys0C8",{"id":1259,"title":1260,"body":1261,"date":1249,"description":14,"extension":7,"ingress":1411,"meta":1412,"navigation":151,"path":1413,"seo":1414,"sources":14,"status":655,"stem":1415,"__hash__":1416},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FIntegrasjonsutfordringer-i-Skytjenesten.md","Integrasjonsutfordringer i Skytjenesten",{"type":11,"value":1262,"toc":1409},[1263,1267,1271,1274,1277,1354,1358,1361,1365,1368,1372,1375,1380,1383,1387,1390,1398,1402,1405],[91,1264,1266],{"id":1265},"adresseringslogikk-og-vurdering-av-autentiseringsbehov","Adresseringslogikk og Vurdering av Autentiseringsbehov",[808,1268,1270],{"id":1269},"integrasjon-mellom-klient-og-tjeneste","Integrasjon mellom Klient og Tjeneste",[96,1272,1273],{},"I denne fasen var målet å etablere kommunikasjon mellom Klientsiden og tjenestesiden i Google Cloud. Sende en forespørsel fra klienten som tjenesten kan tolke og respondere på.",[96,1275,1276],{},"Planen var å implementere en standard HTTPS-header for å definere datatypen og autentisere forespørseken ved hjelp av et Cloud-token.",[1278,1279,1283],"pre",{"className":1280,"code":1281,"language":1282,"meta":14,"style":14},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\n  {\n  \"Content-Type\": \"Application\u002Fjson\",\n    \"Authorization\": \"GCLOUD-TOKEN\"\n   }\n","json",[594,1284,1285,1293,1299,1327,1348],{"__ignoreMap":14},[1286,1287,1290],"span",{"class":1288,"line":1289},"line",1,[1286,1291,1292],{"emptyLinePlaceholder":151},"\n",[1286,1294,1295],{"class":1288,"line":15},[1286,1296,1298],{"class":1297},"sMK4o","  {\n",[1286,1300,1302,1305,1309,1312,1315,1318,1322,1324],{"class":1288,"line":1301},3,[1286,1303,1304],{"class":1297},"  \"",[1286,1306,1308],{"class":1307},"spNyl","Content-Type",[1286,1310,1311],{"class":1297},"\"",[1286,1313,1314],{"class":1297},":",[1286,1316,1317],{"class":1297}," \"",[1286,1319,1321],{"class":1320},"sfazB","Application\u002Fjson",[1286,1323,1311],{"class":1297},[1286,1325,1326],{"class":1297},",\n",[1286,1328,1330,1333,1336,1338,1340,1342,1345],{"class":1288,"line":1329},4,[1286,1331,1332],{"class":1297},"    \"",[1286,1334,1335],{"class":1307},"Authorization",[1286,1337,1311],{"class":1297},[1286,1339,1314],{"class":1297},[1286,1341,1317],{"class":1297},[1286,1343,1344],{"class":1320},"GCLOUD-TOKEN",[1286,1346,1347],{"class":1297},"\"\n",[1286,1349,1351],{"class":1288,"line":1350},5,[1286,1352,1353],{"class":1297},"   }\n",[808,1355,1357],{"id":1356},"korrupte-stier","Korrupte Stier",[96,1359,1360],{},"Selv om headerne var korrekt konfigurert, feilet integrasjonen. Utfordringen var ikke sikkerhetsmessig eller dataformatet, mend adresseringen. Ved inspeksjon viste det seg at stien ( URL\u002Fendpoint ) ikke var korrekt formulert. Dette er noe som er typisk at det skjer når man flytter fra et utviklermiljø til et Cloud miljø, som en konsekvens av koblings punktets struktur forandrer seg. Som regel trenger man en ‘\u002F‘ eller må fjerne en ’\u002F’ i stien. Dette gjør at forespørselen aldri kommer til riktig funksjon \u002F i tjenesten.",[808,1362,1364],{"id":1363},"isolasjon-og-feilsøking","Isolasjon og Feilsøking",[96,1366,1367],{},"For å identifisere kilden til hva som var ukorrekt, ble det uført en eliminerings prosess.",[808,1369,1371],{"id":1370},"isolering-av-variabler","Isolering av variabler",[96,1373,1374],{},"Autentiseringen ble fjernet for å sjekke om forespørselen kunne gjennomføres manuelt uten sikkerhetslagret. Da integrasjonen ikke var suksessfull, ble det bekreftet at utfordringen lå med selve adresseringen og token-valideringen.",[1376,1377,1379],"h6",{"id":1378},"korreksjon-av-miljø-variabler","Korreksjon av miljø variabler",[96,1381,1382],{},"Da kilden ble identifisert som en korrupt sti, ble miljøvariabelen for tjenestens URL oppdatert. Dette innebar å sørge for at stien samsvarte nøyaktig med endepunktet i Google Cloud, inkludert korrekt bruk av skråstreker og base url.",[91,1384,1386],{"id":1385},"etablert-kommunikasjon","Etablert Kommunikasjon",[96,1388,1389],{},"Etter denne oppdateringen av miljøvariablen ble forbindelsen mellom klient og tjenesten vellykket.  Det tok litt tid før oppdateringen skjedde eksternt, men kommunikasjonen er nå samløs.",[100,1391,1392,1395],{},[103,1393,1394],{},"Kan dKlienten sender JSON-data med korrekt header til riktig addresse",[103,1396,1397],{},"Tjenesten i Google Cloud mottar forespørselen, validerer autentiseringen og returnerer forventet respons.",[91,1399,1401],{"id":1400},"evaulering","Evaulering",[96,1403,1404],{},"Gjennom løsningsprosessen ble det gjort to arkitektoniske funn. Det ble observert at dataene som vises på klientsiden i realiteten ikke har behov for autentisering. Siden klienten kun har read-only rettigheter, gjør dette at sikkerhetsmodellen kan forenkles betraktelig. Samtidig ble det tydeligere at miljøet endrer karakter fra utviklingsstadiet til produksjon. Håndtering av disse forskjellene krever nøyaktighet i oppsettet av miljøvariabler og en forståelse for hvordan sky-infrastruktur ruter trafikken.",[1406,1407,1408],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":14,"searchDepth":15,"depth":15,"links":1410},[],"Denne artikkelen tar for seg utfordringene som oppstår når en applikasjon\nmigrerer fra et lokalt utviklingsmiljø til en profesjonell tjenestestruktur i\nGoogle Cloud. Gjennom feilsøking av brutte kommunikasjonslinjer mellom klient\nog tjeneste, belyses det av presis URL-adressering og korrekt oppsett av\nmiljøvariabler. Erfaringen gir verdifull innsikt i hvordan produksjonsmiljøer\nkrever en annen tilnærming enn utviklingsstadier, og reiser viktige\narkitektoniske spørsmål rundt behovet for autentisering i leseoperasjoner\nkontra modifisering av data.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fintegrasjonsutfordringer-i-skytjenesten",{"title":1260,"description":14},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FIntegrasjonsutfordringer-i-Skytjenesten","gK2ttQTOPLL4t9hJASw3ie_kxZzvDIL7_6z6UceG8Hw",{"id":1418,"title":1419,"body":1420,"date":1606,"description":1424,"extension":7,"ingress":1607,"meta":1608,"navigation":151,"path":1609,"seo":1610,"sources":14,"status":655,"stem":1611,"__hash__":1612},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FBro-bygging-mellom-miljer.md","Bro bygging mellom miljøer",{"type":11,"value":1421,"toc":1604},[1422,1425,1430,1433,1444,1459,1465,1468,1476,1479,1601],[96,1423,1424],{},"Etter å ha stabilisert applikasjonen lokalt og sikret databasekommunikasjonen med Turso-databasen, har prosjektet nådd en viktig milepæl. Applikasjonen fungerer som forventet i utvikler miljøet og er klar for produksjon, for  å gjøre dette profesjonelt, sikkert og tilgjenglig, besluttes det å flytte applikasjonen til en stabil Cloud som Google Cloud. Plattformen lar oss kjøre containeriserte applikasjoner i et miljø som er driftet av fagkyndige.",[100,1426,1427],{},[103,1428,1429],{},"Dagen startet med en at Cloud run ikke fant de lokale avhengighetene som det interne biblioteket. Etter at denne utfordringen ble løst",[96,1431,1432],{},"Når en applikasjon blir flyttet fra utviklermiljøet til en dataplattform som Google Cloud Run, endre premissene for hvordan koden søker etter sine avhengigheter. Under oppstart i skyen oppstod det en utfordring med at Cloud Run ikke fant de lokale avhengighetene, som det interne biblioteket.",[100,1434,1435,1438,1441],{},[103,1436,1437],{},"Dockercontainer er som en dokumentasjon som beskriver hvordan prosjektet skal kjøres for programmet. Hvis de interne avhengighetene ligger i en kategori som er utenfor applikasjonskoden lokalt, må utvikleren beskrive hvor de avhengighetene ligger.",[103,1439,1440],{},"Lokale referanser som fungerer for et utviklersystem, existerer ikke for andre plattformer sin infrastruktur.",[103,1442,1443],{},"Som alle andre dataplatformer forventer Cloud Run at alle avhengighetene blir installert gjennom en pakkebehandler eller er inkludert i containeres anvisninger.",[96,1445,1446,1447,1450,1451,1454,1455,1458],{},"Det ble konfigurert  en Dockerfile som etablerte et arbeidsområde ",[594,1448,1449],{},"WORKDIR"," inne i containeren.  Slik at alle relative stier har et felles utgangspunkt. For å sikre at Python finner både backend-koden og det interne biblioteket, ble miljøvariabelen ",[594,1452,1453],{},"PYTHONPATH"," konfiguert i Docker-instruksjonene. Ved å instalisere ",[594,1456,1457],{},"PYTHONPATH="," til å inkludere de relevante mappene, kan applikasjonen importere interne moduler uavhengig av hvor de er plassert i den lokale filstrukturen. Dette overstyrerer standard søkestier og veileder systemet til å annerkjenne de interne bibliotekene som gyldige pakker.",[96,1460,1461,1462,1464],{},"Etter at ",[594,1463,1453],{}," og arbeidsomrpdet ble korrekt definert i Docker-konfigurasjonen, ble applikasjonen bygget og lastet opp på nytt. Container imaget ble vertifisert og lagret i Google Clouds arkiv, klart for distribusjon til Cloud Run-instansene. Applikasjonen ble tildelt en unik URL fra Google og backend-tjenesten rapporterte “Healthy\" i status loggene.",[96,1466,1467],{},"Gjennom prosessen med å flytte applikasjonen til Google Cloud Run har jeg fått erfaring om skillet mellom lokalt oppsett og produksjons drift.",[100,1469,1470,1473],{},[103,1471,1472],{},"Jeg har lært at en Docker-container krever en detaljert beskrivelse av miljøet. Stiene eller bibliotekene kan ikke bli vagt beskrevet, dette må beskrives i applikasjonen.",[103,1474,1475],{},"Bruken av miljøvariabler som PYTHONPATH har vist seg å være et godt verktøy for å håndtere filstrukturer uten å måtte skrive om applikasjonslogikken. Dette gir  fleksibilitet med interne biblioteker.",[96,1477,1478],{},"Under finner du Dockerfile som ble brukt for å bygge containeren for Google Cloud Run:",[1278,1480,1484],{"className":1481,"code":1482,"language":1483,"meta":14,"style":14},"language-dockerfile shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","FROM python:3.13-slim\n\n# Installering av arbeidsområdet\nWORKDIR \u002Fcode\n\n# Kopierer fra den lokale mappen til containeren\nCOPY sti-til-mappe\u002Frequirements.txt .\n\n# Installer pakkene\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Kopier alt innholdet fra den lokale Rot-mappen inn i \u002Fcode i containeren\nCOPY . .\n\n# Sett PYTHONPATH så Python finner mappen som en pakke\nENV PYTHONPATH=\u002Fapp:\u002Fapp\u002Fsti-til-mappe\n\n# Kommandoer for å starte applikasjonen\n# 'sti-til-mappe.app' betyr: se i mappen sti-til-mappe, finn filen app.py\n# ':app' betyr: finn applikasjons variabelen i koden inne i den filen\nCMD [\"python\", \"-m\", \"uvicorn\", \"sti_til_mappe.app:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8080\"]\n","dockerfile",[594,1485,1486,1491,1495,1500,1505,1509,1515,1521,1526,1532,1538,1543,1549,1555,1560,1566,1572,1577,1583,1589,1595],{"__ignoreMap":14},[1286,1487,1488],{"class":1288,"line":1289},[1286,1489,1490],{},"FROM python:3.13-slim\n",[1286,1492,1493],{"class":1288,"line":15},[1286,1494,1292],{"emptyLinePlaceholder":151},[1286,1496,1497],{"class":1288,"line":1301},[1286,1498,1499],{},"# Installering av arbeidsområdet\n",[1286,1501,1502],{"class":1288,"line":1329},[1286,1503,1504],{},"WORKDIR \u002Fcode\n",[1286,1506,1507],{"class":1288,"line":1350},[1286,1508,1292],{"emptyLinePlaceholder":151},[1286,1510,1512],{"class":1288,"line":1511},6,[1286,1513,1514],{},"# Kopierer fra den lokale mappen til containeren\n",[1286,1516,1518],{"class":1288,"line":1517},7,[1286,1519,1520],{},"COPY sti-til-mappe\u002Frequirements.txt .\n",[1286,1522,1524],{"class":1288,"line":1523},8,[1286,1525,1292],{"emptyLinePlaceholder":151},[1286,1527,1529],{"class":1288,"line":1528},9,[1286,1530,1531],{},"# Installer pakkene\n",[1286,1533,1535],{"class":1288,"line":1534},10,[1286,1536,1537],{},"RUN pip install --no-cache-dir -r requirements.txt\n",[1286,1539,1541],{"class":1288,"line":1540},11,[1286,1542,1292],{"emptyLinePlaceholder":151},[1286,1544,1546],{"class":1288,"line":1545},12,[1286,1547,1548],{},"# Kopier alt innholdet fra den lokale Rot-mappen inn i \u002Fcode i containeren\n",[1286,1550,1552],{"class":1288,"line":1551},13,[1286,1553,1554],{},"COPY . .\n",[1286,1556,1558],{"class":1288,"line":1557},14,[1286,1559,1292],{"emptyLinePlaceholder":151},[1286,1561,1563],{"class":1288,"line":1562},15,[1286,1564,1565],{},"# Sett PYTHONPATH så Python finner mappen som en pakke\n",[1286,1567,1569],{"class":1288,"line":1568},16,[1286,1570,1571],{},"ENV PYTHONPATH=\u002Fapp:\u002Fapp\u002Fsti-til-mappe\n",[1286,1573,1575],{"class":1288,"line":1574},17,[1286,1576,1292],{"emptyLinePlaceholder":151},[1286,1578,1580],{"class":1288,"line":1579},18,[1286,1581,1582],{},"# Kommandoer for å starte applikasjonen\n",[1286,1584,1586],{"class":1288,"line":1585},19,[1286,1587,1588],{},"# 'sti-til-mappe.app' betyr: se i mappen sti-til-mappe, finn filen app.py\n",[1286,1590,1592],{"class":1288,"line":1591},20,[1286,1593,1594],{},"# ':app' betyr: finn applikasjons variabelen i koden inne i den filen\n",[1286,1596,1598],{"class":1288,"line":1597},21,[1286,1599,1600],{},"CMD [\"python\", \"-m\", \"uvicorn\", \"sti_til_mappe.app:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8080\"]\n",[1406,1602,1603],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":14,"searchDepth":15,"depth":15,"links":1605},[],"2025-12-22T00:00:00.000Z","Denne læringsloggen dokumenterer overgangen fra et utviklingsmiljø til en\nproduksjonsarkitektur på Google Cloud Run. Ved flytting av backend-logikk til\nskyen oppstod det utfordringer knyttet til isolasjon i Docker-containere og\nhåndtering av lokale avhengigheter. Gjennom strategisk bruk av arbeidsområder\n(`WORKDIR`) og manipulering av `PYTHONPATH`, ble applikasjonens søkestier\nsynkronisert for et \"Cloud Native\" miljø. Erfaringen gir teknisk innsikt i\nhvordan man delegerer driftsansvar til sky-infrastruktur samtidig som man\nbeholder kontroll over komplekse interne biblioteksstrukturer.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fbro-bygging-mellom-miljer",{"title":1419,"description":1424},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FBro-bygging-mellom-miljer","pcFhDOa1ZDc7cDXWfDugsh8UnMLWuBvEMjlFueZrlHo",{"id":1614,"title":1615,"body":1616,"date":1665,"description":1620,"extension":7,"ingress":1666,"meta":1667,"navigation":151,"path":1668,"seo":1669,"sources":655,"status":655,"stem":1670,"__hash__":1671},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FDatahndtering-i-skyen.md","Datahåndtering i skyen",{"type":11,"value":1617,"toc":1663},[1618,1621,1629,1632,1640,1643,1654,1657,1660],[96,1619,1620],{},"SQL prosjektet har nådd et stadium der det er klar for lansering, som en konsekvens av dette var ikke det lenger hensisktsmessig løsning å lagre databasen lokalt. Det ble besluttet å migrere til Turso, en skybasert databaseplattform. Valget ble basert på to hovedkriterier .",[100,1622,1623,1626],{},[103,1624,1625],{},"Turso tilbyr en skalerbar modell som passer perfekt for utviklingsprosjekter uten høye drifskostnader.",[103,1627,1628],{},"Som en konsekvens av å bruke Managed Service delegeres ansvaret for datasikkerhet og infrastruktur til fagkynndige. Dette lar meg som utvikler fokusere på applikasjonslogikk framfor databaseadministrasjon.",[96,1630,1631],{},"Overgangen fra lokal SQLite-fil til Turso's libsql system endrer hvordan applikasjonene kommuniserer med dataene sine.",[100,1633,1634,1637],{},[103,1635,1636],{},"Tidligere var det nok å bare ha en relativ sti til databasen. Nå håndterer applikasjonen sikre og strenge tilkoblingsstrenger og Authentiserings Tokens for å få tilgang til databasen i skyen.",[103,1638,1639],{},"Turso bruke libSQL, som kommuniserer over HTTP\u002FWebSockets. Dette krever at det blir brukt en unik driver, som støtter libSQL. Turso sine egen driver (21.12-25) støtter ikke asynkron tilkobling. Som er en konsekvens av at den asynkrone tilkoblingen må justeres fra asynkron tilkobling til synkron tilkobling, for å sikre stabilitet og kompatibilitet med libSQL-driveren i SQLAlchomy",[96,1641,1642],{},"For å gjennomføre migreringen fra lokal databaseplattfrom til sky basert databaseplattfrom ble det tatt tekniske grep",[100,1644,1645,1648,1651],{},[103,1646,1647],{},"Installerte bibliotekenelibsql-client, sqlalchemy-libsql som gjorde det lettere for SQLAlchemy-motoren til å bruke den synkrone libSQL-dialekten og driveren, samløst.",[103,1649,1650],{},"Justerte konfigurasjons-modulen for databasen ved å tilkoble med synkron kode, istedet for asynkron, Dette innebærer å bruke synkron engine, fjerne async og await referanser på selve tilkoblingsdetaljer.",[103,1652,1653],{},"Den sensitive dataen ble implementering i et eget .env-fil for å sikre at sensitiv data ikke ble eksponert",[96,1655,1656],{},"Etter etableringen av den nye infrastrukturen og omstruktureringen av koden, fungerer datakommunikasjonen feilfri, ved hentig av data fra skyen. Ved  å akseptere den synkrone tilkoblingen har jeg oppnådd full kompatibilitet med Tursos økosystem, samtidig som ansvaret for datasikkerheten er flyttet til Tursos infrastruktur.",[96,1658,1659],{},"Gjennom å jobbe med migreringen til Turso, har jeg fått en enda dypereforståelse for SQLAlchemy sin infrastruktur, og begrensninger, samtidig fått en forståelse for deligering av database base ansvar til riktige entiteter. Jeg har også fått en repitisjon av både synkrone og asynkrone tilkoblinger, og forståelsen av å kunne veksle mellom disse basert på tilgjengelig verktøy og driverstøtte.",[96,1661,1662],{},"De neste stegene er å sikre stabil og trygg tilkobling fra koden til databasen under selve produksjonssettingen og opplastning av nye repositorier, for å garantere at delen av tilkoblingen forblir synkron og stabil i det nye miljøet.",{"title":14,"searchDepth":15,"depth":15,"links":1664},[],"2025-12-21T00:00:00.000Z","I overgangen fra utvikling til lansering kreves det ofte et skifte i hvordan\ndata håndteres for å sikre både skalering og sikkerhet. Denne artikkelen\ndokumenterer reisen fra en lokal SQLite-løsning til den skybaserte\ndatabaseplattformen Turso. Gjennom en teknisk gjennomgang belyses viktige\narkitektoniske valg, som overgangen fra asynkron til synkron tilkobling\ngrunnet driverbegrensninger i libSQL, samt implementering av robuste\nsikkerhetstiltak via miljøstyring. Ved å delegere infrastrukturansvaret til en\nManaged Service, legges grunnlaget for en mer stabil og kostnadseffektiv\napplikasjon, samtidig som det gir en dypere innsikt i SQLAlchemys\nfleksibilitet og begrensninger i et moderne sky-miljø.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fdatahndtering-i-skyen",{"title":1615,"description":1620},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FDatahndtering-i-skyen","qP2AcJY9aKQ6Reautj5ZZC7Xr_Pxr1ttIiMkndcl-ug",{"id":1673,"title":1674,"body":1675,"date":1665,"description":1727,"extension":7,"ingress":1728,"meta":1729,"navigation":151,"path":1730,"seo":1731,"sources":14,"status":655,"stem":1732,"__hash__":1733},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FRuntime-diagnostikk-i-Python.md","Runtime-diagnostikk i Python",{"type":11,"value":1676,"toc":1725},[1677,1683,1705,1708,1716,1719,1722],[96,1678,1679,1680],{},"Etter å ha etablert tilkoblingen til Turso-databasen, kom det en ny hindring i APIet som henter github repositoriene. Applikasjonen sendte en 500 error som indikerer på at det er serveren som feilet.  Loggen avslørte følgende teknisk utfordring. ",[594,1681,1682],{},"TypeError: 'language' is an invalid keyword argument for LanguageModel",[96,1684,1685,1686,1692,1693,1696,1697,1700,1701,1704],{},"En ",[165,1687,1689],{"title":1688},"En generell konflikt på serversiden",[594,1690,1691],{},"500 Internal Server Error"," oppstod. Ved å grave dypere inn i loggene ble denne feilen spesifisert med en ",[594,1694,1695],{},"TypeError ","knyttet til objekt-initialiseringen. Den spesifikke feilmeldingen ",[594,1698,1699],{},"language is an invalid keyword argument"," indikerer på at applikasjonen forsøker å sende inn et parameter som LanguageModel- klassen ikke aksepterer. Dette oppsto som en konskevens av å forandre ",[594,1702,1703],{},"LanguageModel","-klassen, uten at instaniseringen av modellen ikke ble oppdatert. Python er et dynamisk språk, da oppdages ikke slike uheld før koden faktisk kjører. Dette førte til at instanseringen av et nytt språk objekt kresjet før det hele tatt fikk instansere objektet.",[96,1706,1707],{},"Før å løse denne konflikten og eliminere 500-feilen, ble det korrigert i parameterene som instanserere de nye Language-objektene",[100,1709,1710,1713],{},[103,1711,1712],{},"Ved å erstatte det utdaterte argumentet language med lang i instansierings prosessen, samsvarte argumentet med det nye argumentet i LanguageModel-klassen.",[103,1714,1715],{},"Ved hjelp av å bruke programvare loggene ble den nøyaktige feilmeldingen identifisert som gjorde det mulig å utførre en målrettet retting uten å påvirke resten av endepunkt logikken.",[96,1717,1718],{},"Rettingen førte til at API-et umiddelbart stabiliserte seg. Ved å synkronisere navngivningen mellom klassedefinisjon og instansieringen, ble datastrømmen fra GitHub til Turso gjenopprettet.",[96,1720,1721],{},"Gjennom denne diagnostiseringen har jeg erfart at moderne ORM-verktøy krever nøyaktighet i instansieringsprosessen. Erfaringen understreker også hvor viktig det er å ha loggingspunkter i koden, spesielt i feilmeldinger, da gode logger forkorter tiden fra diagnose til løsning drastisk. Dette har gitt meg en dypere forståelse for hvordan endringer i en del av arkitekturen krever koordinerte oppdateringer i logikken.",[96,1723,1724],{},"Neste steg er å publisere backend-delen av applikasjonen til en tjeneste som Google Cloud Run. På denne måten kan jeg delegere oppgaven om å kjøre koden til fagkyndige bedrifter med spesialisert server-infrastruktur.",{"title":14,"searchDepth":15,"depth":15,"links":1726},[],"Etter å ha etablert tilkoblingen til Turso-databasen, kom det en ny hindring i APIet som henter github repositoriene. Applikasjonen sendte en 500 error som indikerer på at det er serveren som feilet.  Loggen avslørte følgende teknisk utfordring. TypeError: 'language' is an invalid keyword argument for LanguageModel","I kjølvannet av database-migreringen til Turso oppsto utfordringer i applikasjonens API-logikk, manifestert som en `500 Internal Server Error`. Denne artikkelen dokumenterer diagnostiseringen og rettingen av en \"Breaking Change\" i objekt-instansieringen, der en uoverensstemmelse mellom klasse-definisjon og parameter-kall i Python førte til systemstans. Ved å bruke målrettet logging for å synkronisere navngivningen i `LanguageModel`, ble datastrømmen mellom GitHub og Turso gjenopprettet. Erfaringen gir verdifull innsikt i behovet for nøyaktighet i dynamiske språk og moderne ORM-verktøy, og markerer overgangen til neste fase: Profesjonalisering av driften gjennom deployment til Google Cloud Run.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fruntime-diagnostikk-i-python",{"title":1674,"description":1727},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FRuntime-diagnostikk-i-Python","pfIgpRa1n6JGE8irqrHeu_Q6loNRuGGWinO5LWrBpLk",{"id":1735,"title":1736,"body":1737,"date":1774,"description":1775,"extension":7,"ingress":1776,"meta":1777,"navigation":151,"path":1778,"seo":1779,"sources":14,"status":1780,"stem":1781,"__hash__":1782},"devPosts\u002Fposts\u002Fdev\u002FDevOps\u002FFra-Global-Forbirring-til-Lokal-Kontroll.md","Automatisert Infrastruktur for Isolerte miljøer (CI\u002FCD) Prosesser",{"type":11,"value":1738,"toc":1772},[1739,1750,1753,1769],[96,1740,1741,1742,1744,1745,1749],{},"Under oppstarten av arbeidsmiljøet for et prosjekt oppstod det en situasjon der ",[594,1743,836],{},"-operativ systemet ikke klarte å finne riktig ",[165,1746,1748],{"title":1747},"forkortet :venv  - Et miljø som er isolert mot andre miljøer","Virtuelt miljø",". Dette hindret systemet å lese de nødvendige konfigurasjonsfilene, noe som førte til at utviklingsverktøyet ikke var pålitelig, som det skulle være. Jeg hadde et behov for at maskinen skulle vite nøyaktig hvor den skulle lete for å finne prosjektets virtuelle miljø, uten at jeg manuelt måtte gripe inn.",[96,1751,1752],{},"Målet mitt var å bygge et virtuelt miljø og automatisere rutinen ved å koble opp mot den spesifikke miljøet.",[100,1754,1755,1766],{},[103,1756,1757,1758,1761,1762,1765],{},"Ved å bruk av kommandoen ",[594,1759,1760],{},"mkdir -p ~\u002F.local\u002Fbin",", laget jeg  en fysisk destinasjon for lokale verktøy og snarveier. Dette gjorde det mulig for systemet å se og koble seg opp mot korrekt virtuelt miljø. Jeg vertifiserte deretter koblingen med kommando ",[594,1763,1764],{},"which \u003Cabbr title=\"Teknologi for å skrive kode\">python\u003C\u002Fabbr>"," som forteller brukeren hvilken kode miljø som er aktivt i øyblikket, med dette sikret jeg at alt pekte på den riktige  versjonen slik at jeg kunne installere riktige oppskrifter for hjelpe filer.",[103,1767,1768],{},"Ved å automatisere rutinen å koble seg opp mot det virtuelle miljøet, vertifiserte jeg at systemet kunne finne prosjektets python programvare.",[96,1770,1771],{},"Dette tiltaket sørger for at det virtuelle miljøet er stabil og et selvgående system som nå prioriterer riktig virtuelt miljø helt automatisk. Dette skaper en reproduserbar og sikker programvarekjøring. Ved å automatisere denne rutinen å koble seg opp mot verktøyet automatisk, reduseres det tidsbruken på å koble seg opp mot den virtuelle miljøet, uten å kunne å koble seg opp mot det virtuelle miljøet.",{"title":14,"searchDepth":15,"depth":15,"links":1773},[],"2025-12-19T00:00:00.000Z","Under oppstarten av arbeidsmiljøet for et prosjekt oppstod det en situasjon der Linux-operativ systemet ikke klarte å finne riktig Virtuelt miljø. Dette hindret systemet å lese de nødvendige konfigurasjonsfilene, noe som førte til at utviklingsverktøyet ikke var pålitelig, som det skulle være. Jeg hadde et behov for at maskinen skulle vite nøyaktig hvor den skulle lete for å finne prosjektets virtuelle miljø, uten at jeg manuelt måtte gripe inn.","Dagens arbeid har fokusert på å løse kritiske utfordringer med miljøkonfigurasjon i Linux. Ved å etablere en fast struktur for lokale verktøy og automatisere koblingen mot \u003Cabbr title=\"forkortet :venv  - Et miljø som er isolert mot andre miljøer\">Virtuelt miljøer\u003C\u002Fabbr>, har jeg fjernet behovet for manuell intervensjon ved oppstart. Dette sikrer en stabil, selvgående og reproduserbar arbeidsflyt. Resultatet er et mer pålitelig system som prioriterer riktig programvare automatisk, noe som reduserer tid og risiko for feil.\n",{},"\u002Fposts\u002Fdev\u002Fdevops\u002Ffra-global-forbirring-til-lokal-kontroll",{"title":1736,"description":1775},"#### Dagens Aktiviteter\n\n* Identifiserte at operativsystemet ikke fant det \u003Cabbr title=\"forkortet :venv  - Et miljø som er isolert mot andre miljøer\">Virtuelt miljøet\u003C\u002Fabbr>, noe som hindret tilgang til nødvendige konfigurasjonsfiler og gjorde verktøyene upålitelige.\n* Opprettet en fysisk destinasjon for lokale verktøy ved hjelp av kommandoen `mkdir -p \\~\u002F.local\u002Fbin` for å sikre at systemet har et fast punkt å lete etter verktøy i.\n* Etablerte en fast struktur som gjør at maskinen automatisk finner og kobler seg til riktig virtuelt miljø uten manuelt arbeid.\n* Kontrollerte koblingen med `which python` for å bekrefte at systemet bruker riktig versjon og at installasjon av nødvendige avhengigheter skjer i korrekt miljø.\n* La til  en selvgående rutine for oppkobling som sikrer en stabil, reproduserbar og sikker programvarekjøring.\n* Reduserte tidsbruk og fjernet behovet for manuell intervensjon ved hver oppstart av prosjektet.\n\n#### Motivasjon & Energi   10  \u002F  10\n\nDagen er så fin den kan bli\n","posts\u002Fdev\u002FDevOps\u002FFra-Global-Forbirring-til-Lokal-Kontroll","ofdRFvDaNf2_fTF7N710l_FD5lgEd_73m1rRNxgxoeU",{"id":1784,"title":1785,"body":1786,"date":1947,"description":14,"extension":7,"ingress":1948,"meta":1949,"navigation":151,"path":1950,"seo":1951,"sources":14,"status":655,"stem":1952,"__hash__":1953},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FFra-rdata-til-skreddersydd-JSON.md","Fra rådata til skreddersydd JSON",{"type":11,"value":1787,"toc":1945},[1788,1792,1796,1803,1814,1818,1821,1825,1828,1832,1911,1914,1918,1921,1925,1928,1932,1935,1943],[91,1789,1791],{"id":1790},"bruk-av-pyndantic-for-en-robust-source-of-truth","Bruk av Pyndantic for en robust “Source of Truth”",[808,1793,1795],{"id":1794},"ekkoet-fra-api-responsen","Ekkoet fra API-responsen",[96,1797,1798,1799,1802],{},"Etter at utfordringen med asynkron innlastning (",[594,1800,1801],{},"MissingGreenlet",") ble løst, oppstod det en ny situasjon i presentasjonslaget. Selv om dataene nå var tilgjengelige, innehold JSON-responsen duplikate data. API-et returnerer både",[100,1804,1805,1808],{},[103,1806,1807],{},"Rå relasjonsdata fra databasen",[103,1809,1810,1811,739],{},"Bearbeidede data som er genert av Pydantic sin ",[594,1812,1813],{},"computed_property",[808,1815,1817],{"id":1816},"single-source-of-truth","Single Source of Truth",[96,1819,1820],{},"Det var kun den bearbeidede dataen som skulle returneres. Å sende rådataen i tillegg skapte forvirring for endepunktet og  økte duplikasjon i API-et. Det er en standard praksis å vise tillit til bibliotek som Pyndantic og at modellen er robust nok til å transformere dataen korrekt, uten lekasje i den underliggende databasestrukturen.",[808,1822,1824],{"id":1823},"ekskludering-av-rådata-i-pyndantic-modellen","Ekskludering av rådata i Pyndantic modellen",[96,1826,1827],{},"For å rydde den duplikate responsen, valgte jeg å følge standarden i Pydantic modellen, ved å ekskludere Feltet som peker mot tabellen. Ved å markere relasjonsfeltet med exclude = True, sikret jeg at dataene er tilgjenelige for den interne logikken, men skjult for sluttbrukeren.",[1376,1829,1831],{"id":1830},"teknisk-implementering","Teknisk implementering",[1278,1833,1837],{"className":1834,"code":1835,"language":1836,"meta":14,"style":14},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","  class GithubModel(BaseModel):\n      \n    #   Initialize methods and database\n\n    lang_assosiations: List[LanguageAssociationModel] = Field(..., exclude= True)\n\n    @computed_field\n    @property\n    def languages(self) -> List[Dict[str, str | int]]:          \n      languages: List[Dict[str, str | int]] = []\n\n      for assec in self.lang_assosiations:\n        if assec.language.id == assec.lang_id and self.repo_id == assec.repo_id:\n          languages.append({\"language\": assec.language.language, \"bytes\": assec.code_bytes})\n      return languages\n","python",[594,1838,1839,1844,1849,1854,1858,1863,1867,1872,1877,1882,1887,1891,1896,1901,1906],{"__ignoreMap":14},[1286,1840,1841],{"class":1288,"line":1289},[1286,1842,1843],{},"  class GithubModel(BaseModel):\n",[1286,1845,1846],{"class":1288,"line":15},[1286,1847,1848],{},"      \n",[1286,1850,1851],{"class":1288,"line":1301},[1286,1852,1853],{},"    #   Initialize methods and database\n",[1286,1855,1856],{"class":1288,"line":1329},[1286,1857,1292],{"emptyLinePlaceholder":151},[1286,1859,1860],{"class":1288,"line":1350},[1286,1861,1862],{},"    lang_assosiations: List[LanguageAssociationModel] = Field(..., exclude= True)\n",[1286,1864,1865],{"class":1288,"line":1511},[1286,1866,1292],{"emptyLinePlaceholder":151},[1286,1868,1869],{"class":1288,"line":1517},[1286,1870,1871],{},"    @computed_field\n",[1286,1873,1874],{"class":1288,"line":1523},[1286,1875,1876],{},"    @property\n",[1286,1878,1879],{"class":1288,"line":1528},[1286,1880,1881],{},"    def languages(self) -> List[Dict[str, str | int]]:          \n",[1286,1883,1884],{"class":1288,"line":1534},[1286,1885,1886],{},"      languages: List[Dict[str, str | int]] = []\n",[1286,1888,1889],{"class":1288,"line":1540},[1286,1890,1292],{"emptyLinePlaceholder":151},[1286,1892,1893],{"class":1288,"line":1545},[1286,1894,1895],{},"      for assec in self.lang_assosiations:\n",[1286,1897,1898],{"class":1288,"line":1551},[1286,1899,1900],{},"        if assec.language.id == assec.lang_id and self.repo_id == assec.repo_id:\n",[1286,1902,1903],{"class":1288,"line":1557},[1286,1904,1905],{},"          languages.append({\"language\": assec.language.language, \"bytes\": assec.code_bytes})\n",[1286,1907,1908],{"class":1288,"line":1562},[1286,1909,1910],{},"      return languages\n",[96,1912,1913],{},"Dette gjør at Pundantic filtrerer språk informasjonen. Den tar inn databasestrukturen (Eager Loading), utforer transforasjonen, og leverer kun den ferdige bearbeidede listen med språknavn tilbake til endepunktet.",[91,1915,1917],{"id":1916},"skreddersydd-api-respons","Skreddersydd API-respons",[96,1919,1920],{},"Ved å bruke exclude-True ble JSON-outputen fra API-et nøyaktig slik som frontenden hadde behov for. All duplikat data detaljer er fjernet fra responsen. Resultatet er et rent og forutsigbart grensesnitt hvor informasjonen som deles er begrenset til det som er nødvendig for frontenden til å utføre sine oppgaver.",[91,1922,1924],{"id":1923},"arkitektonisk-modenhet","Arkitektonisk modenhet",[96,1926,1927],{},"Ved å følge bibliotek-standarder og bruke innebygde funksjonalitet, oppnår man med det vi kaller for en robust løsning som er enklere å vedlikeholde.",[91,1929,1931],{"id":1930},"seperation-of-consern","Seperation of Consern",[96,1933,1934],{},"Gjennom denne prosessen har det tydliggjort at bearbeiding av data er en ren backend oppgave. Ved å forenkle komplekse relasjoner, til strukturert data før de sendes over nettverket. Opprettholder vi et skille mellom lagene i applikasjonen",[100,1936,1937,1940],{},[103,1938,1939],{},"Backend håndterer databaselogikk, asynkrone relasjoner og transformerer rådata til strukturert data.",[103,1941,1942],{},"Frontend Presenterer dataen for brukeren, uten håndtere komplekse databaselogikk og rådata.",[1406,1944,1603],{},{"title":14,"searchDepth":15,"depth":15,"links":1946},[],"2025-12-18T00:00:00.000Z","Etter å ha overvunnet asynkrone utfordringer i backend, oppstår ofte nye\nutfordringer som “Hvordan presentere komplekse datastrukturer på en ryddig og\neffektiv måte?” Denne loggen utforsker fenomenet \"Ekkoet fra API-responsen\",\nder duplikasjoner av data skaper støy i kommunikasjonen mellom backend og\nfrontend. Ved å utnytte Pydantic sin funksjonalitet for ekskludering av felt\nog computed properties, demonstreres en overgang til en \"Single Source of\nTruth\"-modell. Artikkelen belyser viktigheten av Separation of Concerns, der\nbackend tar det fulle ansvaret for datatransformasjon for å levere et\nskreddersydd og profesjonelt grensesnitt som avlaster frontenden.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Ffra-rdata-til-skreddersydd-json",{"title":1785,"description":14},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FFra-rdata-til-skreddersydd-JSON","RPelYEMFw9X7tNsjRWpuQ13xxDKyujKRbPv0ngZkZvk",{"id":1955,"title":1956,"body":1957,"date":1947,"description":14,"extension":7,"ingress":2154,"meta":2155,"navigation":151,"path":2156,"seo":2157,"sources":14,"status":655,"stem":2158,"__hash__":2159},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FJakten-p-Rampenissen.md","Jakten på Rampenissen",{"type":11,"value":1958,"toc":2151},[1959,1964,1968,1974,2040,2044,2047,2058,2135,2139,2142,2149],[1960,1961,1963],"h3",{"id":1962},"eliminering-av-ulovlig-lazy-loading-i-sqlalchemy","Eliminering av ulovlig Lazy Loading i SQLAlchemy",[91,1965,1967],{"id":1966},"rampenisser-med-asynkrone-relasjoner","Rampenisser med asynkrone relasjoner",[96,1969,1970,1971,739],{},"Under utvikling av API-endepunkter for å hente ut repositories og deres tilhørende språkdata, blir det benyttet av SQLAlchomey sin måte å hente ut databaserekorder. Da Pyndantic-modellen skulle validere og mappe dataene, oppsto utfordringen om ",[594,1972,1973],{},"sqlalchemy.exc.MissingGreenlet",[1278,1975,1977],{"className":1834,"code":1976,"language":1836,"meta":14,"style":14},"\nasync def select_repositories(self) -> Sequence[RepositoryModel]:\n  # Velge modelen som skulle hentes\n  QUERY = select(RepositoryModel).options(\n\n  # Koble opp assosiasjons modellen\n    selectinload(RepositoryModel.lang_assosiations)\n\n  # Vente på at serveren kjører Statement\n   repo = await self.session.execute(QUERY)\n\n   # Returnere alle databaserekorder\n   return repo.scalars().all()\n",[594,1978,1979,1983,1988,1993,1998,2002,2007,2012,2016,2021,2026,2030,2035],{"__ignoreMap":14},[1286,1980,1981],{"class":1288,"line":1289},[1286,1982,1292],{"emptyLinePlaceholder":151},[1286,1984,1985],{"class":1288,"line":15},[1286,1986,1987],{},"async def select_repositories(self) -> Sequence[RepositoryModel]:\n",[1286,1989,1990],{"class":1288,"line":1301},[1286,1991,1992],{},"  # Velge modelen som skulle hentes\n",[1286,1994,1995],{"class":1288,"line":1329},[1286,1996,1997],{},"  QUERY = select(RepositoryModel).options(\n",[1286,1999,2000],{"class":1288,"line":1350},[1286,2001,1292],{"emptyLinePlaceholder":151},[1286,2003,2004],{"class":1288,"line":1511},[1286,2005,2006],{},"  # Koble opp assosiasjons modellen\n",[1286,2008,2009],{"class":1288,"line":1517},[1286,2010,2011],{},"    selectinload(RepositoryModel.lang_assosiations)\n",[1286,2013,2014],{"class":1288,"line":1523},[1286,2015,1292],{"emptyLinePlaceholder":151},[1286,2017,2018],{"class":1288,"line":1528},[1286,2019,2020],{},"  # Vente på at serveren kjører Statement\n",[1286,2022,2023],{"class":1288,"line":1534},[1286,2024,2025],{},"   repo = await self.session.execute(QUERY)\n",[1286,2027,2028],{"class":1288,"line":1540},[1286,2029,1292],{"emptyLinePlaceholder":151},[1286,2031,2032],{"class":1288,"line":1545},[1286,2033,2034],{},"   # Returnere alle databaserekorder\n",[1286,2036,2037],{"class":1288,"line":1551},[1286,2038,2039],{},"   return repo.scalars().all()\n",[91,2041,2043],{"id":2042},"rampenissen-lazy-loading","Rampenissen, Lazy Loading",[96,2045,2046],{},"Denne ukorrektheten oppstår som en konsekvens av at Pyndantic forsøkte å hente ut navnet på språket før relasjonen var lastet inn i minnet. I en asynkron sesjon tillater ikke SQLAlchemy slike rampestreker, da dette krever et synkront databasekall som blokkerer den asynkrone event-loopen. Dette resulterer til en krasj fordi driveren mangler kontekst for å utføre operasjon asynkront.",[96,2048,2049,2050,2053,2054,2057],{},"Elimineringen av Rampenissen og sikre at Pyndantic hadde en robust tilgang til satte data, ble databaseforespørselen utvidet. Det ble implementert en dypere nesting i selectinload-strukturen. Ved å koble på ",[594,2051,2052],{},".selectinload(LanguageAssosiationModel.language))"," på den eksisterende relasjonen, instrueres SQLAlchomy til å hente språket fra ",[594,2055,2056],{},"LanguageAssosiationModel"," i samme operasjon.",[1278,2059,2061],{"className":1834,"code":2060,"language":1836,"meta":14,"style":14},"# Revidert kode\nasync def select_repositories(self) -> Sequence[RepositoryModel]:\n  # Velge modelen som skulle hentes\n  QUERY = select(RepositoryModel).options(\n\n  # Koble opp assosiasjons modellen\n  selectinload(RepositoryModel.lang_assosiations)\n    \n  #Hente språket fra LanguageAssosiationModel\n  .selectinload(LanguageAssosiationModel.language))\n\n  # Vente på at serveren kjører Statement\n  repo = await self.session.execute(QUERY)\n\n  # Returnere alle databaserekorder\n  return repo.scalars().all()\n",[594,2062,2063,2068,2072,2076,2080,2084,2088,2093,2098,2103,2108,2112,2116,2121,2125,2130],{"__ignoreMap":14},[1286,2064,2065],{"class":1288,"line":1289},[1286,2066,2067],{},"# Revidert kode\n",[1286,2069,2070],{"class":1288,"line":15},[1286,2071,1987],{},[1286,2073,2074],{"class":1288,"line":1301},[1286,2075,1992],{},[1286,2077,2078],{"class":1288,"line":1329},[1286,2079,1997],{},[1286,2081,2082],{"class":1288,"line":1350},[1286,2083,1292],{"emptyLinePlaceholder":151},[1286,2085,2086],{"class":1288,"line":1511},[1286,2087,2006],{},[1286,2089,2090],{"class":1288,"line":1517},[1286,2091,2092],{},"  selectinload(RepositoryModel.lang_assosiations)\n",[1286,2094,2095],{"class":1288,"line":1523},[1286,2096,2097],{},"    \n",[1286,2099,2100],{"class":1288,"line":1528},[1286,2101,2102],{},"  #Hente språket fra LanguageAssosiationModel\n",[1286,2104,2105],{"class":1288,"line":1534},[1286,2106,2107],{},"  .selectinload(LanguageAssosiationModel.language))\n",[1286,2109,2110],{"class":1288,"line":1540},[1286,2111,1292],{"emptyLinePlaceholder":151},[1286,2113,2114],{"class":1288,"line":1545},[1286,2115,2020],{},[1286,2117,2118],{"class":1288,"line":1551},[1286,2119,2120],{},"  repo = await self.session.execute(QUERY)\n",[1286,2122,2123],{"class":1288,"line":1557},[1286,2124,1292],{"emptyLinePlaceholder":151},[1286,2126,2127],{"class":1288,"line":1562},[1286,2128,2129],{},"  # Returnere alle databaserekorder\n",[1286,2131,2132],{"class":1288,"line":1568},[1286,2133,2134],{},"  return repo.scalars().all()\n",[91,2136,2138],{"id":2137},"evaluering-refleksjon","Evaluering & Refleksjon",[96,2140,2141],{},"Statusen på situasjonen er løst, men implementeringen av dypere \"Eager Loading\" medførte en ny utfordring i presentasjonslaget. Ved å hente ut hele relasjonsstien, ble JSON-objektet i API-responsen mer komplisert med doble definisjoner av språkdata. Dette er en direkte konsekvens av at SQLAlchemy nå henter hele relasjonsstien, som inneholder både LanguageModel-entiteten og dataene som behandles av Pydantic-modellen.",[96,2143,2144,2145,2148],{},"Det har blitt observert at når man bruker ",[594,2146,2147],{},"computed properties"," i Pydantic for å forenkle grensesnittet på en robust måte, må man ekskludere de underliggende relasjonsfeltene for å unngå redundans i API-responsen. Selv om det er teknisk korrekt å hente all data, må det evalueres om datastrukturen bærer på teknisk gjeld fra databasens interne relasjonslogikk. Dette demonstrerer at løsningen på en backend-utfordring ofte krever en tilsvarende justering i API-kontrakten for å opprettholde en ryddig datastrøm til frontend.",[1406,2150,1603],{},{"title":14,"searchDepth":15,"depth":15,"links":2152},[2153],{"id":1962,"depth":1301,"text":1963},"I moderne asynkron webutvikling kan samspillet mellom database og API-modeller\nby på uventede utfordringer, her omtalt som \"rampenisser\". Denne loggen\ndokumenterer feilsøkingen av en s`qlalchemy.exc.MissingGreenlet`-feil, utløst\nav ulovlig Lazy Loading i en asynkron sesjon. Ved å navigere fra en enkel\nspørring til en dypere, nøstet Eager Loading-struktur, belyses ikke bare den\ntekniske løsningen, men også de påfølgende konsekvensene for API-kontrakten.\nGjennom en analyse av Pydantics computed properties og SQLAlchemys\nrelasjonsstier, utforskes balansen mellom å hente komplette data og å unngå\nteknisk gjeld i presentasjonslaget.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fjakten-p-rampenissen",{"title":1956,"description":14},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FJakten-p-Rampenissen","WRdKH_nsV8aFQenT9WjIIGFMDxdmWl34RLfV3z3xH2w",{"id":2161,"title":2162,"body":2163,"date":2288,"description":2167,"extension":7,"ingress":2289,"meta":2290,"navigation":151,"path":2291,"seo":2292,"sources":14,"status":655,"stem":2293,"__hash__":2294},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FSikring-av-Referanseintegritet.md","Sikring av Referanseintegritet",{"type":11,"value":2164,"toc":2286},[2165,2168,2171,2175,2183,2186,2190,2197,2222,2229,2233,2244,2252,2272,2275,2278,2281,2284],[96,2166,2167],{},"Etter vellykket  henting av repositories og tilhørende språk-data, oppstod det en utfordring under opprettelsen av relasjonene i assosisjonstabellen. Utfordringen manifisterte seg som en krasj i lagrings-laget når applikasjonen forsøkte å binde sammen språk-entiteter med de respektive repositoriene.",[96,2169,2170],{},"Utfordringen oppsto som en konsekvens av at applikasjonen prøvde å koble sammen prosjekter og språk i feil rekkefølge. Den forsøkte å registrere koblingen mellom dem i en oversiktsliste før selve prosjektet og språket var ferdig opprettet og hadde fått sine egne \"ID-kort\" i systemet. Siden systemet har strenge regler for at alt som kobles sammen må eksistere fra før, oppsto det en krasj. Det blir som å prøve å skrive en kontrakt mellom to personer som ennå ikke er registrert i folkeregisteret – systemet nekter å godta koblingen fordi partene den viser til, offisielt sett ikke finnes ennå.",[808,2172,2174],{"id":2173},"tidligere-utfordrende-vrtdo","Tidligere utfordrende vrtdo.",[96,2176,2177,2178,2182],{},"Etter vellykket ",[165,2179,2181],{"title":2180},"Asynchronous - en måte å kjøre flere operasjoner samtidig","asynkron"," henting av repositories og tilhørende språk-data, oppstod det en utfordring under opprettelsen av relasjonene i assosiasjonstabellen. Utfordringen manifesterte seg som en krasj i lagrings-laget når applikasjonen forsøkte å binde sammen språk-entiteter med de respektive repositoriene.\nEtter vellykket asynkron henting av prosjekter og tilhørende språk-data, oppstod det en utfordring under opprettelsen av relasjonene i assosiasjonstabellen. Utfordringen manifesterte seg som en krasj i lagrings-laget når applikasjonen forsøkte å binde sammen språk-entiteter med de respektive prosjektene.",[96,2184,2185],{},"Denne feilen oppsto fordi applikasjonen prøvde å koble sammen prosjekter og språk i feil rekkefølge. Den forsøkte å registrere koblingen i en oversiktsliste før selve prosjektet og språket var ferdig opprettet og hadde fått sine egne \"ID-kort\" i systemet. Siden systemet har strenge regler for at alt som kobles sammen må eksistere fra før, oppsto det en krasj. Det blir som å prøve å skrive en kontrakt mellom to personer som ennå ikke er registrert i folkeregisteret – systemet nekter å godta koblingen fordi partene den viser til, offisielt sett ikke finnes ennå.",[91,2187,2189],{"id":2188},"tidligere-utfordrende-design","Tidligere utfordrende design",[96,2191,2192,2193,2196],{},"I det tidligere designet for ",[594,2194,2195],{},"new_assoc_record"," opererte metoden med rå ID-er for både repository og språk.",[1278,2198,2200],{"className":1834,"code":2199,"language":1836,"meta":14,"style":14},"def new_assoc_record(self, repo: int, lang: int, code_bytes: int):\n  # Her brukes rå ID-er som kanskje ikke eksisterer i databasen ennå\n  association_obj = LanguageAssosiationModel(repo_id = repo.repo_id, lang_id = language.id, code_bytes = code_bytes)\n  self.session.add(association_obj)\n",[594,2201,2202,2207,2212,2217],{"__ignoreMap":14},[1286,2203,2204],{"class":1288,"line":1289},[1286,2205,2206],{},"def new_assoc_record(self, repo: int, lang: int, code_bytes: int):\n",[1286,2208,2209],{"class":1288,"line":15},[1286,2210,2211],{},"  # Her brukes rå ID-er som kanskje ikke eksisterer i databasen ennå\n",[1286,2213,2214],{"class":1288,"line":1301},[1286,2215,2216],{},"  association_obj = LanguageAssosiationModel(repo_id = repo.repo_id, lang_id = language.id, code_bytes = code_bytes)\n",[1286,2218,2219],{"class":1288,"line":1329},[1286,2220,2221],{},"  self.session.add(association_obj)\n",[96,2223,2224,2225,2228],{},"Dette skapte en risiko for ",[594,2226,2227],{},"IntegrityError","-krasj, spesielt i et asynkront miljø hvor rekkefølgen av operasjoner ikke er garantert. Hvis metoden ble kalt før objektene var fullstendig opprettet, ville forsøket på å bruke ugyldige fremmednøkler føre til systemstans.",[91,2230,2232],{"id":2231},"smidigere-løsning-med-orm-objekter","Smidigere løsning med ORM-objekter",[96,2234,2235,2236,2238,2239,553,2242,739],{},"For å løse utfordringen med manglende identifikatorer, laget jeg metoden ",[594,2237,2195],{}," på nytt. I stedet for å operere med rå tall-ID-er, tar metoden nå imot komplette instanser av ",[594,2240,2241],{},"RepositoryModel",[594,2243,1703],{},[96,2245,2246,2247,2251],{},"Ved å knytte selve modellobjektene sammen, overlates håndteringen av avhengigheter til systemets innebygde ",[165,2248,2250],{"title":2249},"(Unit of Work) - en måte å håndtere transaksjoner og endringer i en database på","transaksjonshåndtering",". Dette sikrer at koblingen først lagres når de relaterte objektene har fått gyldige ID-er, noe som fjerner bruddet på integritetsreglene.",[1278,2253,2255],{"className":1834,"code":2254,"language":1836,"meta":14,"style":14},"  def new_assoc_record(self, repo: RepositoryModel, lang: LanguageModel, code_bytes: int) -> None:\n    association_obj = LanguageAssosiationModel(repository = repo, language = lang, code_bytes = code_bytes)\n    self.session.add(association_obj)\n",[594,2256,2257,2262,2267],{"__ignoreMap":14},[1286,2258,2259],{"class":1288,"line":1289},[1286,2260,2261],{},"  def new_assoc_record(self, repo: RepositoryModel, lang: LanguageModel, code_bytes: int) -> None:\n",[1286,2263,2264],{"class":1288,"line":15},[1286,2265,2266],{},"    association_obj = LanguageAssosiationModel(repository = repo, language = lang, code_bytes = code_bytes)\n",[1286,2268,2269],{"class":1288,"line":1301},[1286,2270,2271],{},"    self.session.add(association_obj)\n",[96,2273,2274],{},"Etter at jeg omgjorde funksjonen, ble integritetsbruddene fjernet. Ved å integrere logikken direkte i arbeidsflyten, sikres det at relasjonene opprettes i riktig rekkefølge. Dette har resultert i en pålitelig prosess der koblinger mellom prosjekter og språk lagres stabilt.",[96,2276,2277],{},"Erfaringen bekrefter at operasjoner med rå fremmednøkkel-ID-er i et asynkront miljø medfører en stor risiko for tekniske feil. Arbeidet har gitt en dypere forståelse for hvordan rekkefølgen i en database fungerer; selv om dataene hentes samtidig, må de lagres korrekt for at koblingene skal være gyldige. Ved å bruke hele modellobjekter som argumenter, har jeg sørget for at systemet tåler tidsavvik og alltid finner riktig informasjon.",[96,2279,2280],{},"Verdien av mitt arbeid med denne oppdateringen ligger i overgangen fra en sårbar håndtering av data til en selvgående prosess som jeg har utviklet. Ved å sikre at systemet nå alltid kontrollerer informasjonen før den lagres, har jeg fjernet en feilkilde som tidligere førte til systemstans og mangelfulle rapporter. Mitt grep sørger for at jeg har fjernet risikoen for feilaktige data, slik at informasjonen som vises alltid stemmer med virkeligheten.",[96,2282,2283],{},"Konklusjonen er at den nye løsningen fungerer som en intelligent oppdateringsmekanisme som hindrer at samme informasjon lagres flere ganger. Dette fjerner behovet for utfordrende feilretting senere og sikrer at databasen holder seg ryddig over tid. Ved å løse problemet på denne måten har jeg redusert teknisk rot og fjernet fremtidig tidsbruk knyttet til reparasjon av data. Jeg har bygget et fundament som tåler vekst, noe som gir en direkte besparelse i form av spart arbeidstid og full tillit til det systemet leverer. Dette er helt avgjørende for at jeg kan garantere en stabil og forutsigbar drift.",[1406,2285,1603],{},{"title":14,"searchDepth":15,"depth":15,"links":2287},[],"2025-12-17T00:00:00.000Z","Denne artikkelen er en fortsettelse på Sikring av Unikhet og Datakontrakt og utforsker løsningen på integritetsfeil i et asynkront datasystem. Ved å analysere krasj i persistenslaget knyttet til mange-til-mange-relasjoner, belyses risikoen ved manuell håndtering av fremmednøkler før databaseinitialisering. Gjennom en refaktorering fra rå ID-styring til bruk av ORM-ens \"Unit of Work\"-mønster og objektbaserte assosiasjoner, demonstreres det hvordan man sikrer atomær lagring og referanseintegritet i komplekse relasjonsdatabaser.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fsikring-av-referanseintegritet",{"title":2162,"description":2167},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FSikring-av-Referanseintegritet","JsmCfBO8iYpVm9va4Y3tuDQqcytA0DwtD_XuL1VNlKs",{"id":2296,"title":2297,"body":2298,"date":2325,"description":2302,"extension":7,"ingress":2326,"meta":2327,"navigation":151,"path":2328,"seo":2329,"sources":14,"status":2330,"stem":2331,"__hash__":2332},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FErfaringer-med-assembly-konflikter-og-mappehierarki.md","Erfaringer med assembly-konflikter og mappehierarki",{"type":11,"value":2299,"toc":2323},[2300,2303,2306,2320],[96,2301,2302],{},"Bedriftens sentrale programvareoppsett opplevde tekniske konflikter som hindret systemet i å bli ferdigstilt og tatt i bruk. Ulike deler av systemet snakket forbi hverandre, noe som førte til feilmeldinger og stans i hele produksjonslinjen for programvaren. For organisasjonen betydde dette uforutsigbarhet og risiko for forsinkelser i leveranser.",[96,2304,2305],{},"Hovedmålet var å fjerne de tekniske blokkeringene og sikre at systemet kunne bygges feilfritt hver gang. Dette krevde en dypere analyse av hvordan filene i prosjektet var organisert, for å fjerne duplikater og sikre at alle komponenter fant hverandre i systemstrukturen.",[100,2307,2308,2311,2314,2317],{},[103,2309,2310],{},"Gjennomførte en gjennomgang av hvordan systemet genererer sine egne startfiler for å isolere kilden til de gjentakende feilmeldingene.",[103,2312,2313],{},"Identifiserte at en for dyp og uoversiktlig mappestruktur skapte forvirring for systemets interne søkeverktøy.",[103,2315,2316],{},"Flyttet sentrale styringsfiler til et mer logisk og standardisert nivå for å sikre korrekte baner og stabil referansehåndtering.",[103,2318,2319],{},"Testet ut ulike strategier for å deaktivere unødvendige autogenererte filer som skapte støy i byggeprosessen.",[96,2321,2322],{},"Ved å rydde opp i prosjektets grunnmur har vi nå oppnådd en 100% stabil og forutsigbar byggeprosess. Alle tekniske konflikter er fjernet, noe som betyr at utviklingstiden kan brukes på verdiskapende funksjonalitet fremfor spontane tekniske fikser. Vi har redusert tekniske etterslepet betydelig ved å innføre et standardisert oppsett som er mindre sårbart for feil, dette sikrer at bedriften har en tryggere og mer effektiv digital produksjon i tiden fremover.",{"title":14,"searchDepth":15,"depth":15,"links":2324},[],"2025-12-16T00:00:00.000Z","Ved å rydde opp i prosjektets grunnmur har vi fjernet tekniske konflikter som hindret stabil drift og ferdigstillelse. Gjennom en logisk omorganisering av systemets filer har vi oppnådd en forutsigbar byggeprosess uten feilmeldinger. Dette reduserer teknisk etterslep og sikrer at utviklingstiden brukes på verdiskaping fremfor feilretting. Resultatet er en trygg produksjonslinje som leverer høy kvalitet uten uforutsette avbrudd.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Ferfaringer-med-assembly-konflikter-og-mappehierarki",{"title":2297,"description":2302},"#### Dagens Aktiviteter\n\n* Identifisert og fjernet systemfeil som hindret programvaren i å starte korrekt, noe som sikrer uavbrutt fremdrift i prosjektet.\n* Reorganisert systemets interne mappestruktur for å fjerne forvirring i automatiserte prosesser, som resulterer i en raskere og mer pålitelig vei fra koding til ferdig produkt.\n* Implementert et standardisert rammeverk som forhindrer at duplikate filer og tekniske konflikter oppstår på nytt.\n* Fjernet skjulte svakheter i systemarkitekturen som kunne ført til kostbar nedetid og uforutsette feil ved fremtidige oppdateringer.\n* Sikret at systemets interne komponenter nå har korrekte \"veibeskrivelser\" til hverandre, noe som gjør det enklere og billigere å vedlikeholde løsningen over tid.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen er så fin den kan bli\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FErfaringer-med-assembly-konflikter-og-mappehierarki","01PZkCLGe67DU_KxmaBsdHRNP-BjwY42Z6JjeYyWyK8",{"id":2334,"title":2335,"body":2336,"date":2444,"description":2445,"extension":7,"ingress":2446,"meta":2447,"navigation":151,"path":2448,"seo":2449,"sources":14,"status":14,"stem":2450,"__hash__":2451},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FSikring-av-Unikhet-og-Datakontrakt.md","Sikring av Unikhet og Datakontrakt",{"type":11,"value":2337,"toc":2441},[2338,2346,2354,2361,2375,2379,2382,2385,2393,2400,2426,2432,2438],[96,2339,2340,2341,2345],{},"Applikasjonen klarte å laste ned prosjekter fra Github, men feilet i å lagre de unike kode språkene til en dedikert språk-tabell. Denne tabellen er viktig for å sikre at språk data lagres effektivt. Feilen indikerte at lagringen av selve språk-",[165,2342,2344],{"title":2343}," Samling av data","objekt","ene sviktet.",[96,2347,2348,2349,2353],{},"Funksjonaliteten for å hente de lagrede prosjektene krasjer som en konsekvens av at ",[165,2350,2352],{"title":2351},"Object-Relational Mapping - er en teknikk som bygger en bro mellom to forskjellige måter å organisere informasjon ","ORM","'en ikke klarte å å fullføre opprettelsene når dataen skulle opprettes.",[96,2355,2356,2357,739],{},"Etter at applikasjonen har hentet prosjektene og språkene, feilet forsøket på å opprette assosiasjoner mellom prosjektene og språkene i ",[165,2358,2360],{"title":2359},"en tabell som lagrer relasjoner mellom prosjekter og språk","assosiasjons-tabellen",[100,2362,2363,2366,2369,2372],{},[103,2364,2365],{},"Jeg identifiserte, feilsøkte og løste de tre separate, men relaterte, ukorrekthetene i ORM- og datatilgangslagene.",[103,2367,2368],{},"Sikret unik og pålitlig lagring av språkobjektene",[103,2370,2371],{},"Korrigerte Mange-til-mange assosiasjonen mellom språk og prosjekter",[103,2373,2374],{},"Sikret at objektet som blir hentet ut av Repository-tabellen er pålitlige og fullstendige, og at de ikke krasjer ORM-et som en konsekvens av ufullstendige relasjonsdata.",[1960,2376,2378],{"id":2377},"stabilisering-av-språkpersistens","Stabilisering av Språkpersistens",[96,2380,2381],{},"Det ble identifisert at språkobjektene aldri ble korrekt lagret i databasen. Selve koden for lagring av språkene krasjet før de ble lagret, noe som forhindret alle påfølgende operasjoner. For å isolere utfordringen og verifisere resten av datalastingens flyt, ble den defekte kodeseksjonen midlertidig kommentert ut.",[96,2383,2384],{},"For å sikre en unik og pålitelig lagring av språk, ble følgende logikk lagt til",[100,2386,2387,2390],{},[103,2388,2389],{},"En sjekk ble lagt til som først forsøkte å hente ut språket bassert på navnet fra databasen.",[103,2391,2392],{},"Dersom språket allerede fantes, ble språk objektet instansert og lagt til sesjonen, dersom språket ikke fantes i databasen, ble det instansert og lagt til i databasen.",[96,2394,2395,2399],{},[165,2396,2398],{"title":2397},"Et typesikkert bibliotek for datavalidering og innstilling av data i Python, dette reduserer risiko marginen.","Pydantic","-modellen ble grundig revidert for å sikre full integritet med databasestrukturen.",[100,2401,2402,2415,2418],{},[103,2403,2404,2405,2409,2410,2414],{},"Modellen ble omstrukturert fra Pydantic ",[165,2406,2408],{"title":2407},"Versjon 1","V1"," → ",[165,2411,2413],{"title":2412},"Versjon 2","V2",", for å dra nytte av forbedringer i datavalidering og ytelse, og for å sikre at den nøyaktig reflekterer de dataene som hentes fra ORM-kontrakten.",[103,2416,2417],{},"Modellen ble oppdatert til å inkludere de nødvendige dataene, for en komplett representasjon av det hentede objektet.",[103,2419,2420,2421,2425],{},"Alle Klassemedlemmene som ikke var en del av datautvekslingen ble fjernet fra modellen. For å sikre at datakontrakten mellom ORM-laget og ",[165,2422,2424],{"title":2423},"Application Programming Interface, et bindeledd mellom ulike programvarekomponenter","API","-svaret var komplett, pålitelig og fri for forstyrrende elementer.",[96,2427,2428,2429,2431],{},"To av de tre utfordringene i databaselaget er nå løst, og arbeidet har bekreftet viktigheten av presis arkitektur. Lagring av unike språkobjekter er stabilisert ved hjelp av en pålitelig \"Get or Create\"-strategi, som effektivt forhindrer ",[594,2430,2227],{},"-krasj og sikrer dataintegriteten. Samtidig er feil ved henting av data eliminert gjennom en grundig revisjon av Pydantic-modellene. Disse modellene fungerer nå som en nøyaktig refleksjon av dataene fra ORM-kontrakten, noe som er kritisk da ufullstendige modeller eller fremmede klassemedlemmer ellers vil krasje valideringen ved datahenting.",[96,2433,2434,2435,2437],{},"Denne feilsøkingen har validert viktigheten av “Get or Create”-logikk for data som skal være unike, for å forhindre ",[594,2436,2227],{},"-krasj og sikre dataintegriteten. Det ble markert hvor viktig det er at Pydantic-modeller er en nøyaktig refleksjon av den underliggende ORM-strukturen. Ufullstendige Pydantic-modeller eller modeller med fremmede klassemedlemmer vil krasje valideringen når data hentes.",[96,2439,2440],{},"Til tross for disse forbedringene gjenstår det fortsatt en krasj i assosiasjonstabellen, og dette er det neste fokuset for å fullføre stabiliseringen av systemet. Erfaringen fra denne feilsøkingen har tydeliggjort at både pålitelig logikk for unike data og streng samsvar mellom Pydantic-modeller og den underliggende ORM-strukturen er helt nødvendig for en stabil drift.",{"title":14,"searchDepth":15,"depth":15,"links":2442},[2443],{"id":2377,"depth":1301,"text":2378},"2025-12-15T00:00:00.000Z","Applikasjonen klarte å laste ned prosjekter fra Github, men feilet i å lagre de unike kode språkene til en dedikert språk-tabell. Denne tabellen er viktig for å sikre at språk data lagres effektivt. Feilen indikerte at lagringen av selve språk-objektene sviktet.","Arbeidet med å stabilisere databaselaget har ført til viktige utbedringer i håndteringen av prosjekt- og språkdata. Ved å legge til en `Get or Create`-strategi og oppgradere \u003Cabbr title =\"Et typesikkert bibliotek for datavalidering og innstilling av data i Python, dette reduserer risiko marginen.\">Pydantic\u003C\u002Fabbr>-modeller til \u003Cabbr title=\"Versjon 2\">V2\u003C\u002Fabbr>, er lagring av unike språkobjekter og datahenting nå sikret mot `IntegrityError` og valideringskrasj. To av tre hovedfeil er løst, mens gjenstående arbeid fokuserer på å rette en krasj i assosiasjonstabellen for å sikre full systemintegritet.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fsikring-av-unikhet-og-datakontrakt",{"title":2335,"description":2445},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FSikring-av-Unikhet-og-Datakontrakt","XKUxDzxPT70tqc2Pj1cTUE03Q83PT-GZHzQsu2iNODM",{"id":2453,"title":2454,"body":2455,"date":2687,"description":14,"extension":7,"ingress":2688,"meta":2689,"navigation":151,"path":2690,"seo":2691,"sources":14,"status":14,"stem":2692,"__hash__":2693},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FLsning-av-APScheduler--og-Database-Utfordring-med-FastAPI-lifespan-og-Standardiserte-Prinsipper.md","Løsning av APScheduler- og Database Utfordring med FastAPI lifespan og\nStandardiserte Prinsipper\n",{"type":11,"value":2456,"toc":2683},[2457,2461,2465,2468,2472,2475,2478,2482,2485,2488,2492,2500,2503,2653,2657,2660,2664,2667,2671,2674,2678,2681],[1960,2458,2460],{"id":2459},"håndtering-av-livssyklus-svikt","Håndtering av Livssyklus-svikt",[1960,2462,2464],{"id":2463},"scheduler-og-database-initialiseringssvikt","Scheduler- og Database initialiseringssvikt",[96,2466,2467],{},"Slik som det er Identifisert i den tidligere loggen, ble APSchedule-logikken for periodisk synkronisering definert, men loggmeldingene bekrefter at funksjonaliteten har den samme utfordringen som Databasen at de ikke ble initiert ved oppstart. Dette indikerer på at livssyklus logikken, ikke blir initiert ved oppstart av FastAPI-Applikasjonen, som er en konsekvens av caching-dataene aldri blir oppdatert.",[91,2469,2471],{"id":2470},"migrere-til-lifespan-context-mananger","Migrere til  lifespan context mananger",[96,2473,2474],{},"Dette sikrer at både APScheduler og databasen blir korrekt initialisert, starte jobbene ved startup  av livssyklusen og rydde opp under nedstengningen av applikasjonen.",[96,2476,2477],{},"Oppgaven min er å  migrere FastAPI-Applikasjonens livssyklus,  til den moderne FastAPI V2.",[91,2479,2481],{"id":2480},"redusere-teknisk-gjeld-i-hoved-applikasjonen","Redusere Teknisk gjeld i hoved-applikasjonen",[96,2483,2484],{},"Dette sikrer at applikasjonens prinsipper blir fulgt, og sikrer at applikasjonen kan være mest mulig lese- og vedlikeholds vennlig.",[96,2486,2487],{},"Handling",[91,2489,2491],{"id":2490},"migrering-til-lifespan-context-manger","Migrering til Lifespan Context Manger",[100,2493,2494,2497],{},[103,2495,2496],{},"Den utdaterte @app.on_event-definasjonen ble fjernet fra det asynkrone kallet. Den nye lifespan-metoden ble definert som en asynkron context mananger. Den definerte lifespan funksjonen ble lagt til som et parameter i initialiserings prosessen.",[103,2498,2499],{},"En try\u002Fexcept-blokk ble implementert. Den asynkrone motoren ble brukt til å kjøre den synkrone DDL-kommandoen via await conn.run_sync(). Dette sikrer integeriteten til tabellopprettelsen.",[96,2501,2502],{},"Etter Instanseringen av databasene, startet APScheduler",[1278,2504,2506],{"className":1834,"code":2505,"language":1836,"meta":14,"style":14},"\n# Python - FastApi V2\n\n# Imports...\n\n@asynccontext\nasync def lifespan_function(app:FastAPI):\n  try:\n    #  Database Initialization\n    async with DB_INSTANCE.engine.begin() as conn:\n      await conn.run_sync(BASE.metadata.create_all)\n        \n  except Exception as e:\n    raise e\n\n  await DB_INSTANCE.connection\n\n  #  Scheduler Start up \n  SCHEDULER = AsyncIOScheduler()\n  SchedulerConfig().configure_jobs(SCHEDULER)\n  SCHEDULER.start()\n  \n  yield\n\n  SCHEDULER.shutdown()\n\n#  Initialize FastAPI app.\n\napp = FastAPI(lifespan=lifespan_function)\n\n",[594,2507,2508,2512,2517,2521,2526,2530,2535,2540,2545,2550,2555,2560,2565,2570,2575,2579,2584,2588,2593,2598,2603,2608,2614,2620,2625,2631,2636,2642,2647],{"__ignoreMap":14},[1286,2509,2510],{"class":1288,"line":1289},[1286,2511,1292],{"emptyLinePlaceholder":151},[1286,2513,2514],{"class":1288,"line":15},[1286,2515,2516],{},"# Python - FastApi V2\n",[1286,2518,2519],{"class":1288,"line":1301},[1286,2520,1292],{"emptyLinePlaceholder":151},[1286,2522,2523],{"class":1288,"line":1329},[1286,2524,2525],{},"# Imports...\n",[1286,2527,2528],{"class":1288,"line":1350},[1286,2529,1292],{"emptyLinePlaceholder":151},[1286,2531,2532],{"class":1288,"line":1511},[1286,2533,2534],{},"@asynccontext\n",[1286,2536,2537],{"class":1288,"line":1517},[1286,2538,2539],{},"async def lifespan_function(app:FastAPI):\n",[1286,2541,2542],{"class":1288,"line":1523},[1286,2543,2544],{},"  try:\n",[1286,2546,2547],{"class":1288,"line":1528},[1286,2548,2549],{},"    #  Database Initialization\n",[1286,2551,2552],{"class":1288,"line":1534},[1286,2553,2554],{},"    async with DB_INSTANCE.engine.begin() as conn:\n",[1286,2556,2557],{"class":1288,"line":1540},[1286,2558,2559],{},"      await conn.run_sync(BASE.metadata.create_all)\n",[1286,2561,2562],{"class":1288,"line":1545},[1286,2563,2564],{},"        \n",[1286,2566,2567],{"class":1288,"line":1551},[1286,2568,2569],{},"  except Exception as e:\n",[1286,2571,2572],{"class":1288,"line":1557},[1286,2573,2574],{},"    raise e\n",[1286,2576,2577],{"class":1288,"line":1562},[1286,2578,1292],{"emptyLinePlaceholder":151},[1286,2580,2581],{"class":1288,"line":1568},[1286,2582,2583],{},"  await DB_INSTANCE.connection\n",[1286,2585,2586],{"class":1288,"line":1574},[1286,2587,1292],{"emptyLinePlaceholder":151},[1286,2589,2590],{"class":1288,"line":1579},[1286,2591,2592],{},"  #  Scheduler Start up \n",[1286,2594,2595],{"class":1288,"line":1585},[1286,2596,2597],{},"  SCHEDULER = AsyncIOScheduler()\n",[1286,2599,2600],{"class":1288,"line":1591},[1286,2601,2602],{},"  SchedulerConfig().configure_jobs(SCHEDULER)\n",[1286,2604,2605],{"class":1288,"line":1597},[1286,2606,2607],{},"  SCHEDULER.start()\n",[1286,2609,2611],{"class":1288,"line":2610},22,[1286,2612,2613],{},"  \n",[1286,2615,2617],{"class":1288,"line":2616},23,[1286,2618,2619],{},"  yield\n",[1286,2621,2623],{"class":1288,"line":2622},24,[1286,2624,1292],{"emptyLinePlaceholder":151},[1286,2626,2628],{"class":1288,"line":2627},25,[1286,2629,2630],{},"  SCHEDULER.shutdown()\n",[1286,2632,2634],{"class":1288,"line":2633},26,[1286,2635,1292],{"emptyLinePlaceholder":151},[1286,2637,2639],{"class":1288,"line":2638},27,[1286,2640,2641],{},"#  Initialize FastAPI app.\n",[1286,2643,2645],{"class":1288,"line":2644},28,[1286,2646,1292],{"emptyLinePlaceholder":151},[1286,2648,2650],{"class":1288,"line":2649},29,[1286,2651,2652],{},"app = FastAPI(lifespan=lifespan_function)\n",[91,2654,2656],{"id":2655},"make-it-right-reduksjon-av-teknisk-gjeld","Make it right - Reduksjon av Teknisk Gjeld",[96,2658,2659],{},"Både lifespan funksjonaliteten, middelware instansene ble trukket ut av hovedapplikasjonen. Disse elementene ble plassert i en dedikert konfigurasjonsklasse for FastAPI. Dette er en robust metode som sikrer separasjon av ansvar (SRP), da hovedapplikasjon nå kun har ansvar for å instansiere applikasjonen og definere endepunkter, mens konfigurasjonsklassen, håndterer tverrgående funksjonalitet.",[808,2661,2663],{"id":2662},"status-for-oppstart-av-apscheduler-og-database-instansen","Status for Oppstart av APScheduler og Database Instansen",[96,2665,2666],{},"Utfordringen som handlet om oppstart av Scheduler og database instansen, er nå løst i app.py. Refaktorereringen sikret at det ble lettere å vedlikeholde og forstå hovedapplikasjonen enn tidligere.",[808,2668,2670],{"id":2669},"resultat-status-læringsutbytte","Resultat, Status & Læringsutbytte",[96,2672,2673],{},"Denne feilsøkingen har krystallisert viktigheten av å bruke korrekt dokumentasjon for bibliotek versjon man bruke i en applikasjon, det har også vært merkbart hvor viktig det er å bruke applikasjonens context mananger for all ressurskontroll. Dette er viktig for å garantere at tredjepartsverktøy som APScheduler og databasesystemer initialisereres og stenges ned pålitelig.",[808,2675,2677],{"id":2676},"bruk-av-standardiserte-prinsippene","Bruk av Standardiserte Prinsippene.",[96,2679,2680],{},"Prosessen demostrerte den praktiske verdien av SRP i en mikrotjenestearkitektur. Ved å flytte konfigurasjonsdetaljer ut av hovedapplikasjonsfilen, reduserer teknisk gjeld og fremtidig utvikling forenkles betraktelig.",[1406,2682,1603],{},{"title":14,"searchDepth":15,"depth":15,"links":2684},[2685,2686],{"id":2459,"depth":1301,"text":2460},{"id":2463,"depth":1301,"text":2464},"2025-12-11T00:00:00.000Z","En feil ble identifisert der både `APScheduler` og databaseinitialisering\nfeilet under FastAPI-applikasjonens oppstart, som følge av bruk av utdaterte\nlivssyklushendelser. Løsningen krevde en migrering til den moderne `lifespan`\ncontext manager , som sikret at synkron DDL `conn.run_sync()` og\nScheduler-kontroll `SCHEDULER.start()`\u002F`shutdown()` ble utført pålitelig.\nDette understreker viktigheten av korrekt dokumentasjon og context managers\nfor ressurskontroll. I tillegg ble prosjektet refaktorert i tråd med Single\nResponsibility Principle (SRP), ved å flytte konfigurasjonslogikk ut av\nhovedapplikasjonsfilen. Dette reduserte teknisk gjeld og sikret at\napplikasjonen er mer vedlikeholdsvennlig for fremtidig utvikling.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Flsning-av-apscheduler-og-database-utfordring-med-fastapi-lifespan-og-standardiserte-prinsipper",{"title":2454,"description":14},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FLsning-av-APScheduler--og-Database-Utfordring-med-FastAPI-lifespan-og-Standardiserte-Prinsipper","1pzAjSSxhbh5Y9vKOzmqzSnkyyyLSEoQD9TWljqps-Q",{"id":2695,"title":2696,"body":2697,"date":2721,"description":2701,"extension":7,"ingress":2722,"meta":2723,"navigation":151,"path":2724,"seo":2725,"sources":14,"status":2726,"stem":2727,"__hash__":2728},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FEtablering-av-Test-Coverage-i-NET-via-Coverlet-for-kvalitetsikring.md","Objektiv kvalitetssikring og optimalisert ressursbruk gjennom automatisert rapportering",{"type":11,"value":2698,"toc":2719},[2699,2702,2716],[96,2700,2701],{},"Utviklingsmiljøet manglet et system for å måle og visualisere hvor stor del av den digitale løsningen som faktisk ble kontrollert av tester. Dette skapte blindsoner i utviklingsprosessen. Uten objektive data var det umulig å vurdere den faktiske risikoen for feil eller størrelsen på teknisk etterslep, noe som gjorde bedriften sårbar for uforutsette utfordringer i drift.\nMålet var å etablere en automatisert målingsmekanisme som gir full innsikt i systemets kvalitet. Oppgaven innebar å implementere verktøy som genererer konkrete rapporter over testdekning. Disse rapportene skal fungere som et styringsverktøy for ledelsen og utviklerne, slik at ressurser kan målrettes mot de delene av applikasjonen som har høyest risiko.",[100,2703,2704,2707,2710,2713],{},[103,2705,2706],{},"Gjennomførte en grundig analyse av prosjektoppsettet for å identifisere hvorfor måledata ikke ble generert.",[103,2708,2709],{},"Identifiserte og La til  manglende komponenter i systemets instruksjonsfiler som er nødvendige for å kunne lese testresultatene korrekt.",[103,2711,2712],{},"Koblet sammen testverktøyene med prosjektet slik at hver testkjøring nå automatisk produserer forståelige dekningsgrader i prosent.",[103,2714,2715],{},"Tilrettela for at utviklingsteamet kan se svakheter og utestet kode i sanntid, noe som forenkler arbeidet med å forbedre systemet.",[96,2717,2718],{},"Ved å fjerne de tekniske blindsonene har vi nå fått et objektivt og målbart bevis på systemets kvalitet. Dette har resultert i en betydelig mer profesjonell utviklingsprosess der risiko kan identifiseres og håndteres før den når brukerne. Dette øker driftssikkerhet og gir en målrettet ressursbruk, da vi nå kan prioritere forbedringer basert på fakta fremfor antakelser. Resultatet er et mer pålitelig produkt, redusert teknisk risiko og et utviklingsteam som har verktøyene de trenger for å levere stabil programvare i takt med bedriftens behov.",{"title":14,"searchDepth":15,"depth":15,"links":2720},[],"2025-12-09T00:00:00.000Z","Ved å fjerne tekniske blindsoner har vi etablert et målesystem som gir full innsikt i den digitale løsningens kvalitet. Gjennom automatisert rapportering har vi gått fra antakelser til faktabasert styring, noe som sikrer målrettet ressursbruk og høy driftssikkerhet. Denne oppgraderingen reduserer faren for uforutsette feil og gir bedriften et pålitelig produkt som er klargjort for stabil leveranse i takt med forretningens behov.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fetablering-av-test-coverage-i-net-via-coverlet-for-kvalitetsikring",{"title":2696,"description":2701},"#### Dagens Aktiviteter\n\n* Etablert et nytt målesystem som gir full oversikt over hvor godt den digitale løsningen er testet, noe som fjerner usikkerhet rundt systemets faktiske tilstand.\n* Implementert automatiserte rapporter som gir ledelsen og teamet et objektivt beslutningsgrunnlag for å prioritere ressurser der risikoen for feil er størst.\n* Fullført integrasjon av verktøy som fanger opp svakheter i koden før de når sluttbrukerne, noe som reduserer faren for uforutsette driftsavbrudd.\n* Lagt til rette for visuelle tilbakemeldinger i sanntid, som gjør at teamet kan jobbe raskere og mer målrettet med feilretting og forbedringer.\n* Sikret at vi nå har målbare bevis på systemets kvalitet, noe som gir økt trygghet for at programvaren vi leverer er stabil og pålitelig.\n* Gått fra antakelser til fakta i kvalitetsarbeidet, slik at vi kan bruke utviklingstiden der den skaper størst verdi for bedriften.\n\n#### Motivasjon & Energi   10  \u002F  10\n\nDagen er så fin den kan bli\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FEtablering-av-Test-Coverage-i-NET-via-Coverlet-for-kvalitetsikring","-L0pyBrTlwWhwk-qReBoR8gdDr631B7hdCGUDhD5olI",{"id":2730,"title":2731,"body":2732,"date":2845,"description":2846,"extension":7,"ingress":2847,"meta":2848,"navigation":151,"path":2849,"seo":2850,"sources":14,"status":655,"stem":2851,"__hash__":2852},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FFeilsking-av-SQLAlchomy-Persistering--FastAPI-Livssyklus.md","Feilsøking av SQLAlchomy Persistering & FastAPI Livssyklus",{"type":11,"value":2733,"toc":2843},[2734,2745,2748,2752,2755,2774,2778,2781,2784,2816,2820,2827,2830,2834,2841],[96,2735,2736,2737,2740,2741,2744],{},"Som det ble dokumentert i den tidligere loggen (datert 06-12-25), ble det identifisert en feil i FastAPI-applikasjonen.\nDatabase objektene  ble opprettet gjennom ",[210,2738,2739],{},"SQLAlchemy ORM",", men alikavel ble de ",[210,2742,2743],{},"ikke pålitelig lagret ved applikasjonsstart",". Dette kompromitterte det vedvarende caching-laget og forhindret at systemet ble operatvt. Dette peker mot en ukorrekt implementasjon av oppstartslogikken i Fast-API's livssyklushendelse",[96,2746,2747],{},"målet vil sikre at SQLAlchemy korrekt oppretter og presisterer alle nødvendige databasetabeller før FastAPI starter å behandler innkommende forespørsler. Dette er en essensiell del av programmeringen for å sikre at caching-laget er funksjonell.",[91,2749,2751],{"id":2750},"refaktorering-løsning-fastapi-livssyklus","Refaktorering & Løsning FastAPI-livssyklus",[96,2753,2754],{},"Siden livssyklusen til FastAPI er Asynkron, ble det etablert en asynkron livssyklus for FastAPI-applikasjonen ved bruk av",[1278,2756,2758],{"className":1834,"code":2757,"language":1836,"meta":14,"style":14},"\n  @app.on_event(\"startup\") # Deperached in FlaskAPI v2\n  async def livssyklus_oppstart(app:FlaskAPI):\n\n",[594,2759,2760,2764,2769],{"__ignoreMap":14},[1286,2761,2762],{"class":1288,"line":1289},[1286,2763,1292],{"emptyLinePlaceholder":151},[1286,2765,2766],{"class":1288,"line":15},[1286,2767,2768],{},"  @app.on_event(\"startup\") # Deperached in FlaskAPI v2\n",[1286,2770,2771],{"class":1288,"line":1301},[1286,2772,2773],{},"  async def livssyklus_oppstart(app:FlaskAPI):\n",[808,2775,2777],{"id":2776},"håndteringen-av-presisteringsfeilen","Håndteringen av Presisteringsfeilen",[96,2779,2780],{},"Det etablert en felles kjerne, for å håndtere den modulære database-logikken. Dette innebar import av variabelen som inneholdt declarative_base og Driver-klassen. Denne strukturen er essensiell i applikasjonen for å kunne instansiere hele SQLAlchemy-applikasjonen fra ett sentralt punkt.",[96,2782,2783],{},"Inne i livssyklusen til FastAPI ble det etablert en try except-blokk, for å prøve å starte opp en context mananger av Databasen. Der alle tabellene, ble definert og klar gjort for å ta i mot data.",[1278,2785,2787],{"className":1834,"code":2786,"language":1836,"meta":14,"style":14},"\n  try:\n    async with SQLACHOMYDRIVER_INSTANCE.engine.begin() as conn:\n      await conn.run_sync(BASE.metadata.create_all)\n  except Exception as ex:\n    # Do Something when an exception occurs\n",[594,2788,2789,2793,2797,2802,2806,2811],{"__ignoreMap":14},[1286,2790,2791],{"class":1288,"line":1289},[1286,2792,1292],{"emptyLinePlaceholder":151},[1286,2794,2795],{"class":1288,"line":15},[1286,2796,2544],{},[1286,2798,2799],{"class":1288,"line":1301},[1286,2800,2801],{},"    async with SQLACHOMYDRIVER_INSTANCE.engine.begin() as conn:\n",[1286,2803,2804],{"class":1288,"line":1329},[1286,2805,2559],{},[1286,2807,2808],{"class":1288,"line":1350},[1286,2809,2810],{},"  except Exception as ex:\n",[1286,2812,2813],{"class":1288,"line":1511},[1286,2814,2815],{},"    # Do Something when an exception occurs\n",[808,2817,2819],{"id":2818},"mislykket-persistering","Mislykket Persistering",[96,2821,2822,2823,2826],{},"Førsøket på å sikre databasepersistering mislyktes. Databasetabellene ble ikke opprettet pålitelig ved applikasjonsstart. Dette er en konsekvens av at den implementerte livssyklyshendelsen ",[594,2824,2825],{},"@app.on_event('start-up')"," har blitt forkastet i moderne versjoner av FastAPI og var ikke lenger pålitelig for DDL-logikk. Den moderene metoden er nå å definere en funksjon og bruke lifespan context.",[96,2828,2829],{},"Dette understreker nødvendigheten av å følge med på rammeverkets utvikling. Bruken av den utdaterte @app.on_event førte til en feil i initialiseringsfasen.",[91,2831,2833],{"id":2832},"asynkron-ddl-og-feilhåndtering","Asynkron DDL og Feilhåndtering",[96,2835,2836,2837,2840],{},"Læringen bekrefter at den korrekte asynkrone DDL-kommandoen ",[594,2838,2839],{},"await conn.run_sync(BASE.metadata.create_all)",", var korrekt, men at det var plassert i feil container. Løsningen på dette er å bruke lifespan contextmananger for å pålitelig håndtere asynkrone ressurser som ( database-initering og tilkoblingspooler) i FastAPI.",[1406,2842,1603],{},{"title":14,"searchDepth":15,"depth":15,"links":2844},[],"2025-12-07T00:00:00.000Z","Som det ble dokumentert i den tidligere loggen (datert 06-12-25), ble det identifisert en feil i FastAPI-applikasjonen.\nDatabase objektene  ble opprettet gjennom SQLAlchemy ORM, men alikavel ble de ikke pålitelig lagret ved applikasjonsstart. Dette kompromitterte det vedvarende caching-laget og forhindret at systemet ble operatvt. Dette peker mot en ukorrekt implementasjon av oppstartslogikken i Fast-API's livssyklushendelse","En feil ble identifisert der SQLAlchemy ORM-tabeller ikke ble pålitelig\npersistert ved oppstart av FastAPI-applikasjonen. Utfordringen var å sikre at\nsynkron DDL-logikk (create\\_all) ble utført i det asynkrone miljøet. Aksjonen\ninvolverte implementering av den korrekte asynkrone kommandoen\n(conn.run\\_sync), men forsøket mislyktes. Konsekvensen av dette ble sporet til\nbruken av den forkastede (deprecated) livssyklushendelsen.\n@app.on\\_event('startup'). Dette understreker  læringen om nødvendigheten av å\nfølge med på rammeverkets utvikling, for robust håndtering av asynkrone\nressurser og databaseinitiering i FastAPI.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Ffeilsking-av-sqlalchomy-persistering-fastapi-livssyklus",{"title":2731,"description":2846},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FFeilsking-av-SQLAlchomy-Persistering--FastAPI-Livssyklus","Xx85HlD9832AGm66CPucSFF4nGghK3qp-8kMZ2m4ob4",{"id":2854,"title":2855,"body":2856,"date":2975,"description":2976,"extension":7,"ingress":2977,"meta":2978,"navigation":151,"path":2979,"seo":2980,"sources":655,"status":655,"stem":2981,"__hash__":2982},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FImplementering-av-Vedvarende-Caching-med-SQLAlchemy-og-SQLite.md","Implementering av Vedvarende Caching med SQLAlchemy og SQLite",{"type":11,"value":2857,"toc":2973},[2858,2884,2887,2899,2902,2907,2910,2921,2924,2932,2936,2945,2949,2952,2960,2964,2967,2970],[96,2859,2860,2861,2864,2865,2868,2869,2872,2873,2876,2877,2880,2881,2883],{},"API-responsen for henting av Github repository data i FastAPI applikasjonen viste en ",[210,2862,2863],{},"uakseptabel høy latens",", dette er en direkte konsekvens av ",[210,2866,2867],{},"asynkrone kall til Github REST API",", der henting og formatering av data tok ",[210,2870,2871],{},"estimert O","(",[210,2874,2875],{},"n",") ",[210,2878,2879],{},"tid",", hvor ",[210,2882,2875],{}," er antall repositories. Denne tidskompleksiteten var ugunstig for brukeropplevelsen og skalerbarheten.",[96,2885,2886],{},"Eliminering av den direkte avhengigheten til Github API for forespørsler og redusere responstiden. Dette gjorde at oppgaven ble todelt.",[100,2888,2889,2896],{},[103,2890,2891,2892,2895],{},"Etablere et ",[210,2893,2894],{},"databaselag"," som er bassert på SQLAlchomy, med  SQLite driver, for å lagre den formaterte Github-informasjonen, slik at NUXT-applikasjonen kan hente data med minimal ventetid.",[103,2897,2898],{},"Migrere all tilleggsinformasjon  som videoer og demo-lenker direkte inn i den nye databasen for å sikre enhetlig datalagring og eliminere sekundære kall.",[96,2900,2901],{},"Jeg gjorde følgende handlinger for å implementere vedvarende caching:",[100,2903,2904],{},[103,2905,2906],{},"De nødvendige avhengighetene for SQLAlchemy som ORM ble importert og\nDatabase-modellene ble bygget for å sikre riktig datastruktur og relasjoner.",[96,2908,2909],{},"For å sikre en robust database arkitektur, ble det implementert fem database\nmodeller, for å lagre og koble informasjonen med hverandre.",[100,2911,2912,2915,2918],{},[103,2913,2914],{},"En for å lagre repositorydata (Primær-tabell),",[103,2916,2917],{},"En for å lagre de unike programmeringsspråkene,",[103,2919,2920],{},"En for å lagre informasjon om bidragytere.",[96,2922,2923],{},"Det ble også laget to assosiasjonstabeller for å håndtere relasjonene mellom dataen som var kommet inn.",[100,2925,2926,2929],{},[103,2927,2928],{},"En for å assosiere kodespråkene med repositories,",[103,2930,2931],{},"En for å assosiere bidragsytere med repositories.",[91,2933,2935],{"id":2934},"datainnlastning-og-periodisk-synkronisering","Datainnlastning og Periodisk Synkronisering",[96,2937,2938,2939,2944],{},"Det tidskrevende O(n)-kallet til Github ble utført i et kontrollert miljø en gang for å hente de nødvendige dataene. Disse rådataene ble deretter formatert og lagret i de nydesignede databasetabellene. ",[1227,2940,2943],{"href":2941,"rel":2942},"https:\u002F\u002Fpypi.org\u002Fproject\u002FAPScheduler\u002F",[1231],"APSchedule"," ble valgt for å sette opp periodiske jobber. Disse jobbene kjører daglig mellom kl 02:00 og 05:00 , et tidspunkt valgt som en konsekvens av lavest forventede trafikktrykk. Dette sikrer at databasen holdes oppdatert uten å påvirke front-end ytelsen.",[808,2946,2948],{"id":2947},"status-oppdatering-og-feilidentifisering","Status oppdatering og FeilIdentifisering",[96,2950,2951],{},"Backend-caching-infrastrukturen er fullført og klar for konsum, men det gjenstår å koble til NUXT-applikasjonen. Dette er det siste steget som skal gjøres etter at de Identifiserte feilene har blitt fikset. Under testingen oppsto det to feil i FastAPI-applikasjonen",[100,2953,2954,2957],{},[103,2955,2956],{},"Databasene har blitt opprettet, men tabellene ble ikke pålitelig lagret ved\noppstart",[103,2958,2959],{},"APScheduler-loggikken for periodisk synkronisering har blitt definert, men loggmeldingene bekrefter at funksjonaliteten ikke ble initiert ved oppstart. Dette indikerer på at scheduler-logikken ikke blir presistert i FastAPI-applikasjonens livssyklus.",[808,2961,2963],{"id":2962},"orm-forståelse-og-presisering-av-livssyklus","ORM-forståelse og Presisering av Livssyklus",[96,2965,2966],{},"Prosjektet har gitt en dypere innsikt i SQLAlchomy ORMs funksjonalitet og arkitektur. Spesielt ble viktigheten av å sette opp en universell OMR-struktur som er kompatibel med flere database-drivere som ( SQLite, PostgresSQL, MariDB, o.l) understreket.",[96,2968,2969],{},"Feilidentifseringen har synliggjort rollen til Startup og Shutdown-hendelser i FastAPI, spesielt ved integrering av databasemodeller og tredjeparts planleggere (APScheduler)",[96,2971,2972],{},"Jeg forstår nå hvordan SQLAlchomy ORMen fungerer, og lært å sette opp en unviersell SQLAlchomy ORM, som kan brukes på flere database drivere.",{"title":14,"searchDepth":15,"depth":15,"links":2974},[],"2025-12-06T00:00:00.000Z","API-responsen for henting av Github repository data i FastAPI applikasjonen viste en uakseptabel høy latens, dette er en direkte konsekvens av asynkrone kall til Github REST API, der henting og formatering av data tok estimert O(n) tid, hvor n er antall repositories. Denne tidskompleksiteten var ugunstig for brukeropplevelsen og skalerbarheten.","En ytelsesutfordring ble identifisert der API-responsen for GitHub-data førte\ntil uakseptabel høy latens (**O**(**n**)-kompleksitet) i FastAPI. For å løse\ndette ble det initiert et prosjekt for å implementere et vedvarende\ndatabaselag basert på SQLAlchemy (med SQLite-driver), målet var å cache\neksterne data og eliminere sekundære kall. Backend-infrastrukturen er nå\nfullført, inkludert detaljert relasjonsdesign og en APScheduler-basert\nsynkroniseringsmekanisme for lavtrafikkperioder. Status: Til tross for\nvellykket arkitektur, ble det under testing avdekket to feil knyttet til\ndatabasepersistering ved oppstart og APScheduler-integrasjon i\nFastAPI-livssyklusen. Prosessen har gitt dyp faglig læring i universell\nORM-oppsett og viktigheten av korrekt håndtering av applikasjonens\nStartup-hendelser.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fimplementering-av-vedvarende-caching-med-sqlalchemy-og-sqlite",{"title":2855,"description":2976},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FImplementering-av-Vedvarende-Caching-med-SQLAlchemy-og-SQLite","zoD8_6qKVEXImEf7b20GJ71RvMOAXfx5jRPA5rxV15Q",{"id":2984,"title":2985,"body":2986,"date":3025,"description":2990,"extension":7,"ingress":3026,"meta":3027,"navigation":151,"path":3028,"seo":3029,"sources":14,"status":655,"stem":3030,"__hash__":3031},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FHvorfor-jeg-mtte-forkaste-Unit-Testing-for--verifisere-serverens-API-kontrakt.md","Hvorfor jeg måtte forkaste Unit Testing for å verifisere serverens\nAPI-kontrakt\n",{"type":11,"value":2987,"toc":3023},[2988,2991,2995,2998,3006,3010,3013,3017,3020],[96,2989,2990],{},"For å sikre dataflyten mellom den interne logikken og de eksterne API-endepunktene, var det et strategisk valg å implementere Tester, som er essensielt for å garantere at systemet var robust nok til å håndtere korrekt kommunikasjon og datakontrakter med tredjepartstjenestene.",[91,2992,2994],{"id":2993},"utarbeiding-av-robust-teststrategi-som-vertifiserer-pålitligheten-til-koden","Utarbeiding av Robust Teststrategi, som Vertifiserer Pålitligheten til koden.",[96,2996,2997],{},"Denne teststrategien inkluderte to funksjoner",[100,2999,3000,3003],{},[103,3001,3002],{},"At serveren sendte gyldig forespørsler til det eksterne API-et",[103,3004,3005],{},"At backend-logikken mottok dataene fra API-et",[91,3007,3009],{"id":3008},"flere-typer-teststrategier","Flere Typer Teststrategier?",[96,3011,3012],{},"Første forsøk var å isolere og bekrefte logikken i tjenestene som håndterte API-kallene. Det ble insett etter par timer at Unit Testingen som involverte mocking av den eksterne API-avhengigheten, ikke bekreftet målet om faktiske live-kontakten. Strategien ble korrigert til å bruke Integrasjonstesting ( teste-host ). Dette tillot meg å kjøre en full, end-to-end test mot API endepunktet uten å mocke selve kommunikasjonen.",[91,3014,3016],{"id":3015},"unittesting-til-integrasjonstesting","Unittesting til integrasjonstesting",[96,3018,3019],{},"Ved å bytte til Integrasjonstesting oppnådde jeg en robust testdekning som garanterte at hele kommunikasjonskjeden var funksjonell. Dette reduserer risikoen for feil i produksjon betydelig.",[96,3021,3022],{},"Gjennom å teste Apiene lærte jeg at det finnes flere typer tester, enn å validere intern logikk, men også å validere samspillet mellom systemkomponenter (Integrasjonstesting).",{"title":14,"searchDepth":15,"depth":15,"links":3024},[],"2025-12-04T00:00:00.000Z","Å bygge en robust applikasjon krever mer enn bare å teste intern logikk det\nhandler om å validere samspillet mellom komponentene. Da jeg skulle sikre\ndataflyt mellom server og eksterne API-endepunkter, startet jeg med Unit\nTesting. Jeg innså imidlertid raskt at denne metoden, med sin bruk av mocking,\nikke bekreftet den faktiske nettverkskommunikasjonen. Dette krevde en\nstrategisk endring. Denne historien dykker ned i “hvorfor” jeg valgte å\nkorrigere kursen til Integrasjonstesting for å oppnå en testdekning som\ngaranterte en funksjonell, ende-til-ende kommunikasjonskjede.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fhvorfor-jeg-mtte-forkaste-unit-testing-for-verifisere-serverens-api-kontrakt",{"title":2985,"description":2990},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FHvorfor-jeg-mtte-forkaste-Unit-Testing-for--verifisere-serverens-API-kontrakt","9AD86WVtipI9yx-czQFmLB8PTbMWBu6SXpDs1rp7t34",{"id":3033,"title":3034,"body":3035,"date":3025,"description":14,"extension":7,"ingress":3101,"meta":3102,"navigation":151,"path":3103,"seo":3104,"sources":14,"status":655,"stem":3105,"__hash__":3106},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FSikring-av-Non-blokkerende-IO.md","Sikring av Non-blokkerende I\u002FO",{"type":11,"value":3036,"toc":3098},[3037,3041,3056,3060,3068,3072,3075,3078,3082,3085,3089,3092],[1960,3038,3040],{"id":3039},"pontensiell-stopp","Pontensiell stopp",[96,3042,3043,3044,3047,3048,3051,3052,3055],{},"Den underliggende logikken i base klassen inneholdt et ",[210,3045,3046],{},"synkront I\u002FO-kall",". Dette hadde et ",[210,3049,3050],{},"pontensiale"," for å utgjøre en stopp i applikasjonen da det var ",[210,3053,3054],{},"pontensielt mulig å forårsake trådblokkering"," som hindrer serveren i å håndtere andre innkommende API-forespørsler effektivt.",[91,3057,3059],{"id":3058},"migrering-til-asynkrone-kall","Migrering til ASynkrone Kall",[100,3061,3062,3065],{},[103,3063,3064],{},"Det må legges til asynkront funksjons kall til funksjonen som håndterer det asynkrone kallet.",[103,3066,3067],{},"Applikasjonen må integrere et tredjepartsbibliotek for å håndtere asynkrone kall",[91,3069,3071],{"id":3070},"gjennomfør-bare-tiltak-for-eliminering-av-io-blokkeringen","Gjennomfør bare Tiltak for Eliminering av I\u002FO Blokkeringen",[96,3073,3074],{},"Definisjon av Asynkron Signatur & Implementering av Await",[96,3076,3077],{},"Den eksisterende funksjonen i Base klassen ble omdefinert med nøkkelordet async def for å tillate ikke-blokkerende operasjoner, mens underklassene fikk en implementering av nøkkelordet await. Dette sikrer at alle kallene til funksjonen nå er ikke-blokkerende og fullt asynkront",[91,3079,3081],{"id":3080},"integrering-av-asynkrone-verktøy","Integrering av Asynkrone Verktøy",[96,3083,3084],{},"Det nødvendige asynkrone tredjepartsbiblioteket ble integrert for å erstatte den synkrone I\u002FO-funksjonaliteten.",[91,3086,3088],{"id":3087},"eliminering-av-blokkering","Eliminering av Blokkering",[96,3090,3091],{},"Den pontensielle blokkeringen i API-laget ble eliminert. Gjennom migreringen til asynkrone kall grigjør applikasjonen nå tråden for å håndtere andre forespørsler mens I\u002FO operasjonen pågår. Dette sikrer at gjennomstrømmningen ikke lenger er kompromittert av de underliggende base klasse-kallet.  Alle underklasser ble oppdatert med et await-kall, som bekrefter at den asynkrone kjeden fra API-et ned til base funksjon er ikke-blokkerende og operasjonell.",[96,3093,3094,3095],{},"Migreringen understreker nødvendigheten av å benytte asynkrone kall framfor synkrone kall i applikasjoner med flere API-endepunkter og forventninger om høy gjennomstrømning. Dette bekrefter at i en asynkron arkitektur kan selv ett enkelt synkront kall i en base klasse være en risiko for en stopp som kompromitterer den generelle systemskalerbarheten. Dette poengterer viktigheten av å velsekundære biblioteker som støtter ",[594,3096,3097],{},"non-blokkerende I\u002FO",{"title":14,"searchDepth":15,"depth":15,"links":3099},[3100],{"id":3039,"depth":1301,"text":3040},"En sårbarhet ble identifisert der den underliggende logikken i Base Class benyttet et synkront I\u002FO-kall. Dette hadde potensial til å forårsake trådblokkering i det asynkrone API-laget. For å løse dette ble Base Class-funksjonen refaktorert med `async def` og `await` i underklassene, samt integrering av et asynkront tredjepartsbibliotek. Resultatet var en eliminering av flaskehalsen, noe som bekrefter den kritiske viktigheten av non-blokkerende I\u002FO for å oppnå robust systemskalerbarhet i asynkrone arkitekturer.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fsikring-av-non-blokkerende-io",{"title":3034,"description":14},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FSikring-av-Non-blokkerende-IO","d8ake4-wj4Webv31zF96SAcgE9LWpvLGXo6bRUTQJvM",{"id":3108,"title":3109,"body":3110,"date":3145,"description":14,"extension":7,"ingress":3146,"meta":3147,"navigation":151,"path":3148,"seo":3149,"sources":14,"status":3150,"stem":3151,"__hash__":3152},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FMigrering-fra-Ustandardisert-Logikk-til-SQLAlchamy-ORM.md","Omgjøring fra Ustandardisert Logikk til SQLAlchamy ORM",{"type":11,"value":3111,"toc":3143},[3112,3116,3119,3126,3140],[91,3113,3115],{"id":3114},"flytting-til-biblioteket-sqlalchomy","Flytting til biblioteket SQLAlchomy",[96,3117,3118],{},"Systemets måte å kommunisere med databasen på var utdatert. Selv om det fungerte, var det ikke et pålitelig system. Dette gjorde det vanskelig å vedlikeholde koden og økte risikoen for feil hver gang jeg skulle gjøre endringer eller legge til ny funksjonalitet.",[96,3120,3121,3122,3125],{},"Målet mitt var å bygge om denne grunnmuren ved hjelp av bransjestandarden ",[210,3123,3124],{},"SQLAlchemy",". Oppgaven handlet om å profesjonalisere hvordan data lagres og hentes, slik at systemet ble pålitelig, lettere å forstå for andre utviklere, og klar for fremtidig vekst.",[100,3127,3128,3131,3134,3137],{},[103,3129,3130],{},"Jeg skilte de tekniske databaseoppgavene fra selve forretningslogikken. Dette betyr at om vi endrer på databasen, påvirker det ikke resten av systemet.",[103,3132,3133],{},"Jeg laget en felles mal for hvordan jeg legger til, leser eller sletter informasjon, som sikrer lik praksis i hele løsningen.",[103,3135,3136],{},"Jeg satte opp nye, trygge «koblingspunkter» mot databasen som håndterer trafikken mer effektivt.",[103,3138,3139],{},"Jeg sørget for at dataene i databasen alltid stemmer overens med slik systemet forventer å se dem, som reduserer sjansen for logiske feil.",[96,3141,3142],{},"Jeg har nå fjernet teknisk rot og sitter igjen med en ryddigere og mer stabil plattform. Dette reduserer behovet for å vedlikeholde koden og gjør det tryggere å rulle ut nye oppdateringer. Systemet er nå også klargjort for automatiserte tester, for å sikre at funksjonaliteten gir et ønsket resultat.",{"title":14,"searchDepth":15,"depth":15,"links":3144},[],"2025-12-01T00:00:00.000Z","Jeg har modernisert datalaget ved å legge til biblioteket **SQLAlchemy** og gå fra en ustandardisert logikk over til en \u003Cabbr title=\"Object-Relational Mapping. En programmeringsteknikk som lar deg kommunisere med en relasjonsdatabase ved hjelp av Objekt orientert kode\">**ORM**\u003C\u002Fabbr>-basert struktur. Ved å etablere \u003Cabbr title=\"Data Access Object er et designmønster som brukes for å skille forretningslogikk fra datatilgang\">DAO-lag\u003C\u002Fabbr> som skiller databaseoperasjoner fra forretningslogikken, har jeg forbedret kodekvaliteten og vedlikeholdbarheten betydelig. Omgjøringen innebar et oppsett av Motor- og økt instanser samt definisjon av modeller. Resultatet er en ryddigere arkitektur som sikrer robust databaselogikk og følger moderne Python-standarder for profesjonell utvikling.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fmigrering-fra-ustandardisert-logikk-til-sqlalchamy-orm",{"title":3109,"description":14},"#### Dagens Aktiviteter\n\n* Erstattet utdatert databaselogikk med en moderne bransjestandard for å sikre et pålitelig og fremtidsrettet system.\n* Skilte tekniske databaseoppgaver fra systemets forretningslogikk, noe som gjør løsningen modulær og reduserer risikoen for følgefeil ved fremtidige endringer.\n* Forenklet malen for håndtering av informasjon \u003Cabbr title=\"Create, Read, Update & Delete. De fire grunnleggende operasjonene for å håndtere data i databaser.\">CRUD\u003C\u002Fabbr>, som sikrer lik praksis i hele koden og gjør den enklere for andre utviklere å forstå.\n\nModernisering av tilkoblinger: Etablerte nye og sikre koblingspunkter mot databasen for mer effektiv trafikkflyt og høyere stabilitet.\n\nImplementering av logiske modeller: Definerte objektorienterte modeller som sørger for at dataene alltid samsvarer med systemets krav, noe som minimerer faren for logiske feil.\n\nKvalitetssikring og testforberedelse: Fjernet teknisk gjeld og klargjorde arkitekturen for automatiserte tester, slik at fremtidige oppdateringer kan rulles ut med høyere trygghet.\n\n#### Motivasjon & Energi 10 \u002F 10\n\nDagen er så fin den kan bli !\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FMigrering-fra-Ustandardisert-Logikk-til-SQLAlchamy-ORM","9keyYckcdSQ60g1hsyTcyetbUpgsHeWZKW6FPgpYxN8",{"id":3154,"title":3155,"body":3156,"date":3231,"description":3160,"extension":7,"ingress":3232,"meta":3233,"navigation":151,"path":3234,"seo":3235,"sources":14,"status":3236,"stem":3237,"__hash__":3238},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FSikring-av-DIP-gjennom-Prosjektstrukturell-Separering.md","Sikring av forretningskritisk logikk og etablering av fundament for raskere utvikling",{"type":11,"value":3157,"toc":3229},[3158,3161,3164,3175,3178,3226],[96,3159,3160],{},"Systemets oppbygning var preget av en sammenvevd struktur der kjernefunksjonaliteten var låst til spesifikke tekniske verktøy og eksterne biblioteker. Dette skapte en teknisk blokkering som gjorde det umulig å utføre automatiserte tester. For bedriften innebar dette økt risiko for feil ved oppdateringer, tregere utviklingstid og manglende innsyn i systemets faktiske helsetilstand.",[96,3162,3163],{},"Hovedmålet var å fjerne de strukturelle hindringene for å muliggjøre kvalitetssikring og testing. Dette krevde en fullstendig omorganisering av hvordan systemet er bygget opp, slik at forretningslogikken blir uavhengig av tekniske detaljer. Oppgaven var tredelt:",[100,3165,3166,3169,3172],{},[103,3167,3168],{},"Omstrukturere prosjektet .",[103,3170,3171],{},"Klargjøre for automatiserte tester .",[103,3173,3174],{},"Flytte funksjonalitet til riktige områder .",[96,3176,3177],{},"Jeg utførte oppgaven gjennom følgende handlinger.",[100,3179,3180,3183,3215,3223],{},[103,3181,3182],{},"Konverterte systemet fra en uoversiktlig og sammenkoblet modell til en moderne flerlagsløsning.",[103,3184,3185,3186,3190,3191,3197,3198,3197,3204,553,3209,739],{},"Opprettet fire ",[165,3187,3189],{"title":3188},"prosjekter","spesialiserte områder"," for henholdsvis ",[165,3192,3194],{"title":3193},"Systemets arbeids regler",[210,3195,3196],{},"forretningslogikk",", ",[165,3199,3201],{"title":3200},"Systemets arkitektur",[210,3202,3203],{},"teknisk infrastruktur",[165,3205,3207],{"title":3206},"En automatisk prosess som vertifiserer at logikken fungerer",[210,3208,913],{},[165,3210,3212],{"title":3211},"Det visuelle grensesnittet for en bruker",[210,3213,3214],{},"brukergrensesnitt",[103,3216,3217,3218,3222],{},"Sørget for at ",[165,3219,3221],{"title":3220},"Bedriftens kjerneoppgaver","domenet"," nå står på egne ben, slik at vi kan bytte ut tekniske komponenter i fremtiden uten å risikere at forretningslogikken går i stykker.",[103,3224,3225],{},"Fjernet de tekniske sperrene som tidligere hindret oss i å skrive og kjøre tester på systemet.",[96,3227,3228],{},"Gjennom denne strukturelle forbedringen har vi fjernet  den største blokkeringen for videre utvikling og kvalitetssikring av systemet. Ved å separere forretningslogikken fra den tekniske infrastrukturen, har vi skapt en løsning som er langt mer pålitelig, lettere å vedlikeholde og klar for fremtidig vekst. Dette betyr i praksis at vi nå kan innføre automatiserte tester som fanger opp feil før de når brukerne, noe som reduserer risikoen for nedetid og sparer bedriften for betydelige vedlikeholdskostnader over tid. Vi har gått fra en låst struktur til en fleksibel plattform som er rigget for sikker og effektiv digital utvikling.",{"title":14,"searchDepth":15,"depth":15,"links":3230},[],"2025-11-27T00:00:00.000Z","Ved å modernisere systemets grunnmur har vi fjernet blokkeringer som tidligere hindret oss i å videreutvikle løsningene våre effektivt. Gjennom en strategisk omorganisering har vi skilt kjerneoppgaver fra den tekniske teknologien, noe som gir en pålitelig plattform, som reduserer vedlikeholdskostnader. Oppgraderingen gir oss full kontroll over systemets helse og klargjør oss for digital vekst og raskere leveranser.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fsikring-av-dip-gjennom-prosjektstrukturell-separering",{"title":3155,"description":3160},"#### Dagens Aktiviteter\n\n* Konverterte systemet fra en låst og uoversiktlig modell til en fleksibel flerlagsløsning, noe som fjerner risikoen for at tekniske endringer ødelegger forretningslogikken.\n* Opprettet spesialiserte områder for forretningsregler og infrastruktur, som gjør systemet langt mer robust og enklere å vedlikeholde over tid.\n* Fjernet de tekniske sperrene som tidligere hindret kvalitetssikring, slik at vi nå kan innføre automatiserte tester for å fange opp feil før de når sluttbrukerne.\n* Frigjorde bedriftens kjernefunksjonalitet fra avhengigheter til spesifikke tekniske verktøy, noe som gjør det mulig å oppgradere teknologien uten å måtte bygge om hele systemet.\n* Lagt fundamentet for raskere utvikling og færre feilrettinger i fremtiden, som i praksis betyr reduserte vedlikeholdskostnader og kortere vei fra idé til ferdig løsning.\n* Klargjort systemet for full kontroll og innsyn i systemhelsen, som gir bedriften trygghet på at tjenestene alltid leverer som forventet.\n\n#### Motivasjon & Energi   10  \u002F  10\n\nDagen er så fin den kan bli\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FSikring-av-DIP-gjennom-Prosjektstrukturell-Separering","l7miFi6zD24sBush8cxveMASszUsfJ2y4RN2-DhJatw",{"id":3240,"title":3241,"body":3242,"date":3269,"description":3246,"extension":7,"ingress":3270,"meta":3271,"navigation":151,"path":3272,"seo":3273,"sources":14,"status":3274,"stem":3275,"__hash__":3276},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FHvorfor-Enkel-On-Sjekk-kan-Vre-den-Riktige-Lsningen.md","Sikring av datakvalitet og en feilfri brukeropplevelse",{"type":11,"value":3243,"toc":3267},[3244,3247,3250,3261,3264],[96,3245,3246],{},"Systemet som håndterer bedriftens dataflyt og navigasjonslenker, produserte duplikater i de registrerte filene. Dette førte til at informasjonen som ble lagret ikke var unik, dette skapte rot i datagrunnlaget og forstyrret den tiltenkte flyten i systemet. For brukerne ville dette bety en uforutsigbar opplevelse og risiko for feilinformasjon.",[96,3248,3249],{},"Målet var å garantere at hver eneste lenke og underseksjon kun registreres én gang. Oppgaven innebar å finne grunnen til at systemet tillot duplikater, og implementere en funksjonalitet som automatisk sørger for at informasjonen som lastes inn er unik og korrekt strukturert.",[100,3251,3252,3255,3258],{},[103,3253,3254],{},"Jeg gjennomførte en systematisk gjennomgang av innholdstjenesten for å finne kilden til feilen.",[103,3256,3257],{},"Fant det spesifikke punktet i prosessen der data blir sortert og kontrollert mot brukertilganger.",[103,3259,3260],{},"La til en funksjonalitet som kontrollerer en opplysning allerede eksisterer før den får lov til å bli lagret.",[96,3262,3263],{},"Vurdering av effektivitet: Jeg gjorde en grundig vurdering av løsningens ytelse. Selv om det finnes mer avanserte metoder for enorme datamengder, valgte jeg en løsning som er optimal for vårt nåværende behov. Dette sikrer en stabil drift uten å bruke unødvendige ressurser på overflødig komplekse systemer.",[96,3265,3266],{},"Gjennom denne utbedringen har vi styrket dataintegriteten, som har forbedret brukeropplevelsen, da ansatte og studenter ikke lenger møter forvirrende duplikater i systemet. Ved å velge en løsning som er skreddersydd for våre nåværende datamengder, har vi oppnådd en kostnadseffektiv stabilisering av driften uten å innføre unødvendig kompleksitet. Samtidig har arbeidet gitt oss en klar plan for hvordan vi skal videreutvikle sikkerhetsmekanismene dersom datamengden øker i fremtiden, noe som gjør virksomheten rustet for digital vekst.",{"title":14,"searchDepth":15,"depth":15,"links":3268},[],"2025-11-25T00:00:00.000Z","Ved å utbedre logiske feil i bedriftens dataflyt, har vi i dag styrket informasjonskvaliteten og fjernet tekniske hindringer som skapte unødvendig tidsbruk for ansatte og studenter. Gjennom en målrettet og kostnadseffektiv stabilisering av systemet har vi ikke bare sikret en mer pålitelig brukeropplevelse her og nå, men også lagt et solid mur for fremtidig digital vekst.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fhvorfor-enkel-on-sjekk-kan-vre-den-riktige-lsningen",{"title":3241,"description":3246},"#### Dagens Aktiviteter \n\n* Utbedret en feil i tilgangsstyringen som unødvendig blokkerte ansatte fra deres arbeidsverktøy, noe som har eliminert ventetid og frustrasjon.\n* Rettet en svakhet i systemet som skapte duplikate lenker og rot i datagrunnlaget, slik at all informasjon nå er unik og til å stole på.\n* La til en ny funksjonalitet som filtrer dataen slik at data som legges inn i systemet alltid er korrekt strukturert.\n* Gjennomført en analyse av systemets ytelse og valgt en løsning som gir stabil drift uten å øke kostnadene eller kompleksiteten i systemet\n* Etablert en plan for hvordan sikkerhetsmekanismene skal håndtere økte datamengder i fremtiden, slik at bedriften er rustet for videre vekst.\n\n#### Motivasjon & Energi   10  \u002F  10 \n\nDagen er så fin den kan bli\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FHvorfor-Enkel-On-Sjekk-kan-Vre-den-Riktige-Lsningen","zo7OuQo8JgWgvgR9r6jn_xMfdbDdl-OlD9e945Vgt2Y",{"id":3278,"title":3279,"body":3280,"date":3328,"description":3329,"extension":7,"ingress":3330,"meta":3331,"navigation":151,"path":3332,"seo":3333,"sources":14,"status":3334,"stem":3335,"__hash__":3336},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FMake-it-Work-til-Make-it-Right.md","Fra \"Make it Work\" til \"Make it Right\"",{"type":11,"value":3281,"toc":3326},[3282,3290,3300,3303,3314],[96,3283,3284,3285,3289],{},"Prosjektet hadde et preg av et økende vedlikeholdsetterslep som følge av å følge prinsippet om ",[165,3286,3288],{"title":3287},"Et utviklings prinsipp som prioriterer funksjonalitet først, deretter kodekvalitet og til slutt ytelse","\"Make it work, make it right, make it fast\""," i startfasen. Systemet fungerte, men manglet strukturen som kreves for stabil drift over tid. Oppbyggingen skapte en risiko der små endringer kunne føre til uforutsette feil, noe som kan risikere å bremse fremdriften.",[96,3291,3292,3293,553,3296,3299],{},"Målet var å transformere systemet fra en sårbar struktur til en fleksibel og moderne arkitektur. Jeg skulle separere ulike ansvarsområder slik at ",[210,3294,3295],{},"forretningsregler",[210,3297,3298],{},"datalagring"," var uavhengige av hverandre, noe som sikrer at fremtidige utvidelser kan gjøres raskere og rimligere.",[96,3301,3302],{},"For å oppnå dette har jeg gjennomført følgende tiltak:",[100,3304,3305,3308,3311],{},[103,3306,3307],{},"Flyttet håndteringen av data bort fra kjernevirksomheten i koden, slik at hver del nå har et isolert og klart ansvarsområde.",[103,3309,3310],{},"Innførte universelle grensesnitt (\"plug-and-play\") mellom modulene, som fjerner behovet for spesialtilpasninger i hovedlogikken.",[103,3312,3313],{},"Begrenset tilgangen til interne prosesser for å hindre at endringer i én del av systemet utilsiktet ødelegger for en annen.",[96,3315,3316,3317,3321,3322,739],{},"Denne moderniseringen har transformert kildekoden til en pålitelig plattform med umiddelbare gevinster for videre drift. Ved å redusere kompleksiteten i hovedfilen med over 50 linjer har vi senket fremtidige vedlikeholdskostnader og lagt til rette for raskere opplæring av nye medarbeidere. Systemet er nå klargjort for en effektiv videreutvikling, som betyr at vi kan koble på nye ",[165,3318,3320],{"title":3319},"f.eks moderne databaser","datakilder"," uten ombygginger av kjernefunksjonaliteten. Samtidig har denne grundige gjennomgangen avdekket og korrigert skjulte logikkfeil før lansering, noe som sikrer en stabil brukeropplevelse og reduserer behovet for feilretting etter ",[165,3323,3325],{"title":3324},"Lansering","utrulling.",{"title":14,"searchDepth":15,"depth":15,"links":3327},[],"2025-11-24T00:00:00.000Z","Prosjektet hadde et preg av et økende vedlikeholdsetterslep som følge av å følge prinsippet om \"Make it work, make it right, make it fast\" i startfasen. Systemet fungerte, men manglet strukturen som kreves for stabil drift over tid. Oppbyggingen skapte en risiko der små endringer kunne føre til uforutsette feil, noe som kan risikere å bremse fremdriften.","Gjennom en målrettet modernisering har vi fjernet vedlikeholdsetterslep og driftsrisiko i systemet. Ved å skille forretningsregler fra datalagring og innføre universelle grensesnitt, har vi skapt en fleksibel arkitektur. Dette reduserer feilmarginer og forenkler opplæringen av nye ansatte, samtidig som koden er kortere. Systemet er nå en pålitelig plattform som sikrer både rimeligere og raskere videreutvikling.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fmake-it-work-til-make-it-right",{"title":3279,"description":3329},"#### Dagens Aktiviteter\n\n* Korrigere navigasjonsstiene som ble avdekket under refaktoreringen for å sikre at brukeropplevelsen er så stabil som mulig.\n* Verifisere at den nye modulløsningen (isolasjon av data og forretningslogikk) fungerer nøyaktig som før, uten at funksjonalitet har gått tapt i flytteprosessen.\n* Skrive en kort veiledning for hvordan de nye \"plug-and-play\"-koblingene fungerer, slik at fremtidige utviklere vet hvordan de legger til nye datakilder (f.eks. JSON\u002FDatabase).\n* Arkivere den gamle hovedfilen og oppdatere dokumentasjonen som viser den nye, reduserte filstørrelsen og den modulære strukturen.\n* Fjerne eventuelle kommenterte kodesnutter eller gamle CSV-funksjoner som nå er erstattet av den dedikerte tjenesten.\n\n#### Motivasjon & Energi   10  \u002F  10\n\nDagen er så fin den kan bli.\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FMake-it-Work-til-Make-it-Right","mqZqQOaen1VK82rpDV70vDX0LxQi1ra8TN8Uelhrx6o",{"id":3338,"title":3339,"body":3340,"date":3387,"description":3388,"extension":7,"ingress":3389,"meta":3390,"navigation":151,"path":3391,"seo":3392,"sources":14,"status":3393,"stem":3394,"__hash__":3395},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FStrategisk-Migrering-av-IO-tunge-Endepunkter-og-Sikring-av-Asynkron-Ytelse.md","Modernisering av GitHub-koblingen",{"type":11,"value":3341,"toc":3385},[3342,3349,3352,3355,3382],[96,3343,3344,3345,3348],{},"Jeg satt med en \"hybrid\" løsning der det meste av systemet var moderne og raskt, men koblingen mot GitHub hang igjen i et utdatert system (",[210,3346,3347],{},"Flask","). Jeg tok en besluttning om  å utsette denne oppgraderingen, for å forenkle og fokusere på en oppgradering om gangen, men dette førte til at satt jeg igjen med en bremset brukeropplevelse.",[96,3350,3351],{},"Målet var å fjerne all \"ventetid\" i koden, slik at systemet kan håndtere flere forespørsler samtidig uten å stoppe opp. Oppgaven besto av å flytte GitHub-koblingen fra det utdaterte rammeverket og over til det moderne rammeverket.",[96,3353,3354],{},"For å løse dette gjorde jeg tre ting:",[100,3356,3357,3360,3371],{},[103,3358,3359],{},"Jeg laget til et digital filter som automatisk sjekker at dataene fra GitHub er riktige og lager dokumentasjon selv. Dette hindrer at feilmeldinger og lager dokumentasjon automatisk.",[103,3361,3362,3363,3366,3367,3370],{},"Jeg byttet ut det utdaterte verktøyet for nettsøk (",[210,3364,3365],{},"requests",") med et moderne nettsøk (",[210,3368,3369],{},"httpx","), som har flere forespørsler om gangen.",[103,3372,3373,3374,3377,3378,3381],{},"Jeg brukte AI-verktøy som ",[210,3375,3376],{},"Copilot"," & ",[210,3379,3380],{},"Gemini",", som et verktøy for å sparre med under utviklingen., for å sikre at koden følger standarden i bransjen.",[96,3383,3384],{},"Det utdaterte systemet nå helt fjernet. Løsningen tåler nå langt flere samtidige brukere, og brukerene slipper å vente på data. Fordi koden nå er ryddig og dokumentert, vil fremtidige endriger gå raskere og jeg har fjernet behovet for etterarbeid og bygget en mur som er klar for å vokse.",{"title":14,"searchDepth":15,"depth":15,"links":3386},[],"2025-11-23T00:00:00.000Z","Jeg satt med en \"hybrid\" løsning der det meste av systemet var moderne og raskt, men koblingen mot GitHub hang igjen i et utdatert system (Flask). Jeg tok en besluttning om  å utsette denne oppgraderingen, for å forenkle og fokusere på en oppgradering om gangen, men dette førte til at satt jeg igjen med en bremset brukeropplevelse.","Jeg har byttet ut en utdatert bibliotek med en moderne løsning. Dette fjerner køer i systemet og gjør at nettsiden nå kan håndtere flere brukere samtidig uten at det blir utfordrende. Ved å rydde opp i støy og bruke AI-verktøy for sparring, har jeg redusert fremtidige vedlikehold og gjort plattformen rask. Resultatet er en stabil og mur som er klar for vekst og økt traffik.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fstrategisk-migrering-av-io-tunge-endepunkter-og-sikring-av-asynkron-ytelse",{"title":3339,"description":3388},"\n##### Dagens Aktiviteter\n\n* Ryddet bort utdatert teknologi (Flask) som skapte kø i systemet. Dette fjerner unødvendig ventetid for besøkede.\n* Laget et filter (Pydantic) som passer på at all data er riktig. Dette sikrer kvaliteten på dataen som kommer inn og reduserer feilmeldinger for brukerne og utviklere.\n* Byttet ut det gamle søkeverktøyet med et moderne søkeverktøy (httpx). Systemet kan nå håndtere mange forespørsler samtidig i stedet for å lage en kø.\n* Brukte Copilot og Gemini som sparrings partnere digitale eksperter for å sikre at koden følger standardene i bransjen.\n* Designet systemet slik at det dokumenterer seg selv. Dette gjør at fremtidige endringer går raskere og blir rimligere å gjennomføre.\n\n####  Motivasjon & Energi 10 \u002F 10\nDagen er så fin den kan bli !\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FStrategisk-Migrering-av-IO-tunge-Endepunkter-og-Sikring-av-Asynkron-Ytelse","WXXS_gToEkLveVzZpOHAoRcHlmxVDhkxhSb0b7-15Yw",{"id":3397,"title":3398,"body":3399,"date":3461,"description":3462,"extension":7,"ingress":3463,"meta":3464,"navigation":151,"path":3466,"seo":3467,"sources":14,"status":655,"stem":3468,"__hash__":3469},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FArkitektonisk-Migrering-fra-Flask-til-FastAPI-for-Asynkron-Ytelse.md","Modernisering av bindeledd for å øke ytelse og stabilitet",{"type":11,"value":3400,"toc":3459},[3401,3416,3419,3422,3456],[96,3402,3403,3404,3409,3410,3415],{},"Da prosjektet vokste, ble det tydelig at den eksisterende arkitekturen basert på ",[165,3405,3407],{"title":3406},"Et eldre og mer tradisjonelt teknologi-verktøy (rammeverk) som ofte brukes til enklere nettsider, men som kan bli tregt når mange ting skjer samtidig.",[210,3408,3347],{}," ikke lenger klarte å holde tritt med kravene til effektivitet. Applikasjonen fungerte primært som et bindeledd mot eksterne tjenester som ",[165,3411,3413],{"title":3412},"En skybasert tjeneste som lagrer kode og prosjektdata. I dette tilfellet fungerte GitHub som den eksterne datakilden systemet måtte hente informasjon fra.",[210,3414,1148],{},", og den tradisjonelle metoden for å håndtere data førte til at hele systemet ble stående og vente på svar. Dette skapte en kø som begrenset systemets kapasitet og resulterte i en tregere opplevelse for sluttbrukerne etter hvert som datamengden økte.",[96,3417,3418],{},"Min oppgave var å gjennomføre en teknisk modernisering ved å oppgradere til et verktøyet som støtter moderne IT standarder for håndtering av flere oppgaver samtidig. Målet var ikke bare å øke hastigheten på datahenting, men også å utvikle en mer pålitelig og typesikker grunnmur som ville redusere fremtidige vedlikehold og  gjøre løsningen klar for å vokse.",[96,3420,3421],{},"For å løse dette utførte jeg følgende tiltak:",[100,3423,3424,3440,3448],{},[103,3425,3426,3427,3429,3430,3434,3435,3439],{},"Jeg oppgraderte verktøyet, fra ",[210,3428,3347],{}," til verktøyet FastAPI. Dette innebar et skifte fra en eldre standard ",[165,3431,3433],{"title":3432},"Web Server Gateway Interface er en eldre standard som lar koden håndtere en og en oppgave samtidig","WSGI","  til et mer moderne standard ",[165,3436,3438],{"title":3437},"Asynchronous Server Gateway Interface, en moderne standard som lar koden håndtere mange oppgaver samtidig","ASGI",". Denne oppgraderingen gjør det mulig for å håndterer opp til flere forespørsler samtidig.",[103,3441,3442,3443],{},"Jeg valgte å beholde eksisterende strukturen midlertidig og utsatte bruken av verktøyet ",[165,3444,3446,739],{"title":3445},"Et verktøy som automatisk sjekker at dataene i systemet er korrekte og har riktig format.",[210,3447,2398],{},[103,3449,3450,3451,3455],{},"Ryddet i prosjektets biblioteker og installerte verktøyet ",[165,3452,3454],{"title":3453},"En moderne og rask motor som kreves for å kjøre applikasjoner som håndterer mange oppgaver samtidig","Uvicorn"," som er optimalisert for den moderne standarden.",[96,3457,3458],{},"Oppgraderingen fjernet kø-problematikken helt. Resultatet er et system som kan håndtere langt flere forespørsler med de samme ressursene, noe som gir økt pålitelighet og lavere driftsrisiko. Den viktigste erfaringen var verdien av en trinnvis metodikk; ved å prioritere ytelse først, fikk jeg bekreftet at det arkitektoniske valget fungerte før koden ble videreutviklet.",{"title":14,"searchDepth":15,"depth":15,"links":3460},[],"2025-11-22T00:00:00.000Z","Da prosjektet vokste, ble det tydelig at den eksisterende arkitekturen basert på Flask ikke lenger klarte å holde tritt med kravene til effektivitet. Applikasjonen fungerte primært som et bindeledd mot eksterne tjenester som GitHub, og den tradisjonelle metoden for å håndtere data førte til at hele systemet ble stående og vente på svar. Dette skapte en kø som begrenset systemets kapasitet og resulterte i en tregere opplevelse for sluttbrukerne etter hvert som datamengden økte.","Da den økte datamengde skapte kø og treghet i systemet, ble løsningen en teknisk modernisering av selve motoren for nettsiden. Ved å gå over til moderne standarder for å håndtere flere forespørsler samtidig, ble resultatet et raskere, mer stabilt system som er laget for fremtidig vekst.\n",{"star":3465},"#### Dagens aktiviteter\n\n* Gjennomførte et arkitektonisk skifte ved å oppgradere applikasjonen fra \u003Cabbr title=\"Et tekonologi-verktøy\">rammeverket\u003C\u002Fabbr> \u003Cabbr title=\"Et mikro verktøy for programmeringsspråket Python\">\"**Flask**\u003C\u002Fabbr> til \u003Cabbr title=\"Et mikro verktøy for programmeringsspråket Python\">**FastAPI**.\u003C\u002Fabbr>\n* Erstattet den eldre standarden \u003Cabbr title= \"Web Server Gateway Interface er en eldre standard som lar koden håndtere en og en oppgave samtidig\">WSGI\u003Cabbr> med den moderne \u003Cabbr title=\"Asynchronous Server Gateway Interface, en moderne standard som lar koden håndtere mange oppgaver samtidig\">ASGI\u003C\u002Fabbr>, som gjør det mulig for systemet å utføre mange oppgaver samtidig.\n* Installerte og konfigurerte \u003Cabbr title=\"En moderne og rask motor som kreves for å kjøre applikasjoner som håndterer mange oppgaver samtidig\">Uvicorn\u003C\u002Fabbr>, en rask motor spesielt utviklet for å drive moderne og samtidige web-applikasjoner.\n* Gjennomførte en fullstendig rens av prosjektets biblioteker og avhengigheter for å sikre en lett og stabil installasjon.\n* Valgte en kontrollert utrulling ved å beholde eksisterende datastrukturer midlertidig. Dette ble gjort for å verifisere at ytelsen økte som forventet før videre strukturelle endringer gjøres med Pydantic.\n* Bekreftet at den nye arkitekturen fjernet tidligere kø-problematikk og økte systemets kapasitet betydelig.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen er så fin den kan bli !\n","\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Farkitektonisk-migrering-fra-flask-til-fastapi-for-asynkron-ytelse",{"title":3398,"description":3462},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FArkitektonisk-Migrering-fra-Flask-til-FastAPI-for-Asynkron-Ytelse","iW6fWZSWABLxkDuet38b24NJF9TKwIMv-OjgjREaKtE",{"id":3471,"title":3472,"body":3473,"date":3461,"description":3551,"extension":7,"ingress":3552,"meta":3553,"navigation":151,"path":3554,"seo":3555,"sources":14,"status":655,"stem":3556,"__hash__":3557},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FHndtering-av-Blokkerende-Kode-i-FastAPI.md","Håndtering av Blokkerende Kode i FastAPI",{"type":11,"value":3474,"toc":3549},[3475,3500,3504,3524,3528,3531,3535,3538,3546],[96,3476,3477,3478,3481,3482,3484,3485,3487,3488,3491,3492,3495,3496,3499],{},"Etter den første migreringsfasen til FastAPI, ble  ",[210,3479,3480],{},"Announcement endepunktet","  igjen i det eldre Flask rammeverket, som en konsekvens av at Flask-rammeverket er et sykront (",[210,3483,3433],{},")-rammeverk det skapte forskjell fra det nye (",[210,3486,3438],{},")-",[210,3489,3490],{},"rammeverket"," ",[210,3493,3494],{},"FastAPI",". Dermed fungerte ikke ",[594,3497,3498],{},"announcements"," endepunktet slik som forventet.",[91,3501,3503],{"id":3502},"migrering-av-announcement-endepunkt","Migrering av Announcement Endepunkt",[100,3505,3506,3517],{},[103,3507,3508,3509,3512,3513,3516],{},"Jeg konverterte den gamle ",[210,3510,3511],{},"synkron\u002FFlask logikken"," til å bruke ",[210,3514,3515],{},"Pydantic Modellen",". Dette sikrer typesikkerhet og automatisk validering, som er et kjennetegn ved FastAPI.",[103,3518,3519,3520,3523],{},"La inn ruting i hovedfilen: Implementere FastAPIs ruting (",[594,3521,3522],{},"@app.get",") i hovedapplikasjonen for å erstatte den gamle Flask-rutingen, og dermed fullføre migrasjonen.",[808,3525,3527],{"id":3526},"håndtering-av-blokkerende-kode","Håndtering av Blokkerende Kode",[96,3529,3530],{},"For å integrere den eksisterende, synkrone I\u002FO-logikken i Announcement-endepunktet uten å blokkere FastAPIs event-loop, ble endepunktfunksjonen definert uten nøkkelordet async (def i stedet for async def). FastAPI gjenkjenner dette og kjører automatisk den synkrone koden i en separat trådpulje. Dette tillot en rask og sikker migrering av den gamle koden, samtidig som det bevarte den asynkrone ytelsen for resten av applikasjonen.",[808,3532,3534],{"id":3533},"løsning-med-hybrid-arkitektur","Løsning med Hybrid Arkitektur",[96,3536,3537],{},"Migreringen av Announcement-endepunktet er fullført. Applikasjonen kjører på en ASGI-arkitektur, men funksjonaliteten er fortsatt synkron kode og kjøres i FastAPIs trådpulje.",[100,3539,3540,3543],{},[103,3541,3542],{},"Strategisk Synkronitet - Funksjonaliteten i announcement-endepunktet ble bevisst beholdt som synkron kode (def).",[103,3544,3545],{},"Trådpulje-gevinst - Takket være FastAPIs design, kjøres den sykrone koden automatisk i en seperat trådpulje. Dette hindrer koden fra å blokkere FastAPIs primære, asynkrone event-loop, slik at applikasjonen bevarer sin gjennomstrømning",[96,3547,3548],{},"Lærdommen er verdien av å velge gradvis migreringsstrategi og utnytte rammeverkets innebygde mekanismer. Forståelse for at synkron, blokkerende I\u002FO-kode kan integreres i et ASGI-rammeverk, forutsatt at den kjøres i en trådpulje for å sikre at event-loopen forblir fri.",{"title":14,"searchDepth":15,"depth":15,"links":3550},[],"Etter den første migreringsfasen til FastAPI, ble  Announcement endepunktet  igjen i det eldre Flask rammeverket, som en konsekvens av at Flask-rammeverket er et sykront (WSGI)-rammeverk det skapte forskjell fra det nye (ASGI)-rammeverket FastAPI. Dermed fungerte ikke announcements endepunktet slik som forventet.","Denne loggen dokumenterer en strategisk migrering for å løse en hybrid\narkitektur forårsaket av at Announcement-endepunktet var igjen i det synkrone\nFlask (WSGI)-rammeverket etter en større refaktorering. Målet var å integrere\ndette endepunktet i den nye, asynkrone FastAPI (ASGI)-strukturen uten å\nblokkere ytelsen.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fhndtering-av-blokkerende-kode-i-fastapi",{"title":3472,"description":3551},"posts\u002Fdev\u002FProject\u002Fportfolio\u002FHndtering-av-Blokkerende-Kode-i-FastAPI","QDst-tZYsSHRb2FwbGKlSi3-8ED7ckajZp5NvPUpwZY",{"id":3559,"title":3560,"body":3561,"date":3610,"description":3565,"extension":7,"ingress":3611,"meta":3612,"navigation":151,"path":3613,"seo":3614,"sources":3615,"status":3616,"stem":3617,"__hash__":3618},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FImplementasjon-av-Topass-Algoritme-for-Hierarkisk-Autorisasjon.md","Styrket informasjonssikkerhet",{"type":11,"value":3562,"toc":3608},[3563,3566,3569,3589,3600],[96,3564,3565],{},"Nettsiden viser innhold fra CSV-baserte datalister med komplekse hierarkier (foreldre-barn-relasjoner som også er kalt for content-nodes). Tidligere manglet systemet en pålitelig metode for å kontrollere at brukere kun så det innholdet de faktisk hadde rettighet til, spesielt når tilgangen var avhengig av hvor i trestrukturen informasjonen lå.",[96,3567,3568],{},"Målet med dette arbeidet var å omstrukturere innholdsfiltreringen for å implementere en pålitelig rollebasert tilgangskontroll som ivaretar logikken i et hierarki. Jeg var oppmerksom på om at tilgangen automatisk skulle arves fra foreldrekategorier til underliggende dokumenter, samtidig som at vi måtte garantere at ingen dokumenter ble utilgjengelige ved en feil. Det var avgjørende å bygge fullstendige navigasjonsstier dynamisk fra rådataene og samtidig sikre et ryddigere skille mellom den generelle sikkerhetslogikken og de spesifikke dataoperasjonene for å forenkle fremtidig vedlikehold og revisjon.",[96,3570,3571,3572,3578,3579,3588],{},"For å løse disse kravene la jeg til en ",[165,3573,3575],{"title":3574},"en prosess innen informatikk for å besøke hver node i en tre-datastruktur en gang",[594,3576,3577],{},"Tree Traversal"," algoritme i samarbeid med ",[210,3580,3581,3582,3587],{},"Claude 3.5 Sonnet (",[1227,3583,3586],{"href":3584,"rel":3585},"https:\u002F\u002Fwww.geeksforgeeks.org\u002Fdsa\u002Ftree-traversals-inorder-preorder-and-postorder\u002F",[1231],"1",")",".\nølgende tiltak ble gjennomført:",[100,3590,3591,3594,3597],{},[103,3592,3593],{},"I algoritmens første fase omdannes flate dokumentlister til en logisk trestruktur i systemets minne for å kartlegge alle relasjoner.",[103,3595,3596],{},"I andre fase utføres selve tilgangssjekken på øverste nivå i treet, hvor tilgang automatisk rulles ut til alle barneelementer dersom forelderen er godkjent.",[103,3598,3599],{},"Jeg la inn en spesifikk sjekk for elementer som ikke ble fanget opp av den automatiske arven, for å sikre at ingen legitime dokumenter blir stående utenfor strukturen.",[96,3601,3602,3603,3607],{},"Gjennomføringen har resultert i en løsning som effektivt tetter tidligere sikkerhetshull og sikrer at brukere uten tilgang ikke har innsyn lenger i sensitiv navigasjonsdata, dette reduserer virksomhetens risiko for lekasjer. Ved å ta i bruk denne metodikken følger prosjektet nå Prinsippet om ",[165,3604,3606],{"title":3605},"Prinsippet sier at brukere skal bare ha de nødvendige tilgangene de trenger for å gjøre jobben sin","«minste privilegium»",", som styrker bedriftens evne til å overholde strenge krav til personvern og datasikkerhet. Denne investeringen i systemarkitekturen fjerner manuelle feilkilder og sikrer at ansatte alltid har korrekt tilgang til nødvendig beslutningsgrunnlag uten avbrudd. Resultatet er en pålitelig plattform som er rimeligere å drifte over tid og som danner en trygg grunnmur for fremtidig håndtering av komplekse datasett i hele organisasjonen.",{"title":14,"searchDepth":15,"depth":15,"links":3609},[],"2025-11-21T00:00:00.000Z","Jeg har utviklet en løsning for rollebasert tilgangskontroll i hierarkiske datalister. Ved å bruke en « \u003Cabbr title = \"En prosess som går gjennom dataen to ganger for å bli ferdig med jobben\">*to-pass-algoritme*\u003C\u002Fabbr>» arves rettigheter korrekt i trestrukturer, mens sensitive data skjermes etter prinsippet om \u003Cabbr title =\"Prinsippet sier at brukere skal bare ha de nødvendige tilgangene de trenger for å gjøre jobben sin\">*minste privilegium*\u003C\u002Fabbr>. Arbeidet reduserer manuelle feilkilder, tetter sikkerhetshull og sikrer uavbrutt tilgang til innhold. Dette gir en stabil grunnmur for bedriftens datasikkerhet.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fimplementasjon-av-topass-algoritme-for-hierarkisk-autorisasjon",{"title":3560,"description":3565},"1. [Tree Traversal](https:\u002F\u002Fwww.geeksforgeeks.org\u002Fdsa\u002Ftree-traversals-inorder-preorder-and-postorder\u002F)\n","#### Dagens aktiviteter\n\n* Utviklet en modul som omdanner flate lister til en logisk trestruktur i systemets minne. Dette gir full kontroll over informasjonsrelasjoner og fjerner teknisk risiko knyttet til uoversiktlige datasett.\n* Programmert logikk for automatisk rettighetsarv, slik at tilgang gitt på hovednivå automatisk flyter ned til alle underliggende dokumenter. Dette sikrer en effektiv og feilfri brukeropplevelse.\n*\n* Skilt ut sikkerhetslogikken fra de tekniske dataoperasjonene. Dette forenkler fremtidig vedlikehold og gjør det betydelig lettere å dokumentere etterlevelse overfor revisorer.\n* Ferdigstilt filtreringslogikk som sikrer at brukere kun har innsyn i data de er autorisert for. Dette tetter tidligere sikkerhetshull i navigasjonsdata og reduserer virksomhetens operasjonelle risiko for datalekkasjer.\n* Etablert en robust teknisk grunnmur for håndtering av komplekse datasett, noe som gjør løsningen mer pålitelig og rimeligere å drifte over tid.\n\n#### Motivasjon & Energi 10 \u002F 10\n\nDagen er så fin den kan bli.\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FImplementasjon-av-Topass-Algoritme-for-Hierarkisk-Autorisasjon","NEI4TGHiUDC6Xjs9dTygsdxnx6WltkYmpRLnmwAxFaw",{"id":3620,"title":3621,"body":3622,"date":3654,"description":3626,"extension":7,"ingress":3655,"meta":3656,"navigation":151,"path":3657,"seo":3658,"sources":3659,"status":3660,"stem":3661,"__hash__":3662},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FLring-om-Servertrygghet-og-Least-Privilege.md","Sikring av sensitive URL-stier og forbedring av systemets tilgangskontroll",{"type":11,"value":3623,"toc":3652},[3624,3627,3630,3633,3649],[96,3625,3626],{},"Det ble oppdaget en sårbarhet knyttet til tilgangsstyring på nettsiden. Navigasjonslenker som skulle skjermes var eksponert for brukere. Dette var en konsekvens av at det ikke har vært lagt inn et filter for å filtrere vekk dataen i backend. Dette utgjorde en lekasje av intern informasjon om systemets struktur.",[96,3628,3629],{},"Min oppgave var å finne ut hvorfor denne informasjonen ble lekket og vurdere risikoen opp mot anerkjente sikkerhetsstandarder og lage en løsning som sikrer at bedriftens interne data forblir skjulte for brukere uten tilgang.",[96,3631,3632],{},"Jeg undersøkte hvordan dataene ble hentet ut og oppdaget at sikkerhetskontrollen ble gjort for sent i prosessen (hos brukeren istedenfor på serveren).",[100,3634,3635,3638,3646],{},[103,3636,3637],{},"Jeg fant ut av at det manglet en filtrering i øyblikket da dataen ble hentet ut av systemtes underliggende filer.",[103,3639,3640,3641,739],{},"Jeg sammenlignet dagens praksis med prinsippet om ",[165,3642,168,3644,173],{"title":3643},"ingen skal se mer enn det som er strengt nødvendig for å utføre jobben sin",[170,3645,951],{},[103,3647,3648],{},"Jeg utarbeidet en logikk for sikre at de stiene ble fjernet før den nådde brukerensskjerm",[96,3650,3651],{},"Arbeidet resulterte i en styrking av systemets sikkerhet og integritet. Ved å legge til en funksjonalitet hvor jeg kan filtrere ut stie fra brukerens øyner, dette er noe som reduserer risikoen for målrettede angrep mot interne systemer. Vi har ikke bare laget en løsning som fjerner unødvendig støy for de besøkende på nettsiden, men vi følger nå beste praksis for personvern og datasikkerhet. Dette beskytter bedriftens interne arkitektur og sikrer at systemet oppleves som trygt og profesjonelt for sluttbrukeren.",{"title":14,"searchDepth":15,"depth":15,"links":3653},[],"2025-11-20T00:00:00.000Z","For å beskytte bedriftens interne informasjon har jeg utviklet en sikkerhetsløsning som sikrer at brukere kun ser data de har rettmessig tilgang til. Ved å flytte filtreringen til serveren i tråd med prinsippet om \u003Cabbr title=\"Prinsippet sier at brukere skal ha bare tilgang til det de trenger for å gjøre jobben sin\">*minste privilegium*\u003C\u002Fabbr>, har vi tettet lekkasjer av systemets struktur. Tiltaket fjerner unødvendig støy, styrker motstandskraften mot angrep og sikrer at våre systemer nå opererer profesjonelt og etter beste praksis.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Flring-om-servertrygghet-og-least-privilege",{"title":3621,"description":3626},"1. [Minst Privilegium](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fentra\u002Fidentity-platform\u002Fsecure-least-privileged-access)\n","#### Dagens Aktiviteter\n\n* Avdekket en sårbarhet på nettsiden der sensitiv informasjon om bedriftens interne systemoppbygging var synlig for uvedkommende.\n* Kartla hvorfor informasjonen ble lekket, og identifiserte at sikkerhetssjekken ble utført hos brukeren i stedet for i systemets lukkede kjerne.\n* Vurdert dagens løsning opp mot Prinsippet om «*minste privilegium*». Dette sikrer at vi nå jobber etter internasjonale standarder som sier at ingen skal se mer informasjon enn det som er strengt nødvendig for å gjøre jobben sin.\n* Utarbeidet en plan for å flytte filtreringen av data til systemets bakside (backend). Dette sikrer at sensitive interne lenker blir fjernet før de når brukerens skjerm, noe som effektivt tetter sikkerhetshullet.\n* Dokumentert hvordan tiltaket beskytter bedriftens digitale verdier, reduserer risikoen for målrettede angrep, og skaper en ryddigere og mer profesjonell opplevelse for våre brukere.\n\n#### Motivasjon & Energi   10  \u002F  10\n\nDagen er så fin den kan bli i øyblikket.\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FLring-om-Servertrygghet-og-Least-Privilege","3NvUq0W-ilfvwFIvnsA5Ei0Ul3aIWnJtoaGMKMf8tGo",{"id":3664,"title":3665,"body":3666,"date":3716,"description":3717,"extension":7,"ingress":3718,"meta":3719,"navigation":151,"path":3720,"seo":3721,"sources":14,"status":3722,"stem":3723,"__hash__":3724},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FDynamisk-RBAC-Navigasjon-med-Statisk-CSV.md","Dynamisk RBAC-Navigasjon med Statisk CSV",{"type":11,"value":3667,"toc":3714},[3668,3684,3694,3697,3711],[96,3669,3670,3671,3675,3676,3683],{},"Systemet vårt benytter en sentral oversikt (en ",[165,3672,3674],{"title":3673},"Comma Separated Values","CSV","-fil ved bruk av ",[1227,3677,3680],{"href":3678,"rel":3679},"https:\u002F\u002Fjoshclose.github.io\u002FCsvHelper\u002Fgetting-started\u002F#reading-a-csv-file",[1231],[594,3681,3682],{},"CsvHelper",") for å styre innholdslister og hovedmenyer. Utfordringen var at denne listen var statisk; alle brukere så de samme lenkene og menyvalgene, uavhengig av hvilke rettigheter de faktisk hadde i systemet. Dette skapte en uoversiktlig brukeropplevelse og potensielle sikkerhetsspørsmål, da brukere kunne se navigasjonsstier de ikke hadde tillatelse til å besøke.",[96,3685,3686,3687,3693],{},"Målet var å designe og skape en intelligent løsning som automatisk kobler menyoversikten sammen med brukernes rettighetsnivå (",[165,3688,3690],{"title":3689},"RolleBasert Tilgangskontroll",[210,3691,3692],{},"\"RBAC","). Oppgaven var å skape en dynamisk navigasjon som filtrerer bort utilgjengelig innhold, slik at hver enkelt bruker kun presenteres for de lenkene og funksjonene de faktisk har tilgang til å bruke.",[96,3695,3696],{},"For å løse dette har jeg utviklet en ny tjeneste som fungerer som et filter mellom datakilden og brukerflaten:",[100,3698,3699,3702,3705,3708],{},[103,3700,3701],{},"Jeg satte opp en løsning i som leser den sentrale oversikten og tolker innholdet systematisk.",[103,3703,3704],{},"Selve kontrollen av rettigheter er lagt til en egen, skjermet modul. Dette sikrer at sikkerhetsreglene er adskilt fra resten av systemet for enklere vedlikehold.",[103,3706,3707],{},"Systemet bryter ned hver enkelt sti i navigasjonen og verifiserer den mot brukerens unike rettighetsprofil.",[103,3709,3710],{},"Kun de godkjente delene av oversikten blir satt sammen på nytt og sendt videre til brukerens skjerm.",[96,3712,3713],{},"Vi har nå fått en skreddersydd og sikker brukeropplevelse der systemet automatisk tilpasser seg både ansattes og studentens ansvarsområde. Ved å fjerne utilgjengelige lenker før de i det hele tatt når brukerens skjerm, har vi fjernet unødvendig støy og styrket bedriftens sikkerhet. Samtidig har vi lagt til rette for en mer kostnadseffektiv drift den nye løsningen er bygget slik at vi i fremtiden kan endre tilgangsnivåer eller legge til nytt innhold uten behov for tidkrevende omprogrammeringer. Resultatet er et profesjonelt verktøy som øker både ansattes og studentens effektivitet.",{"title":14,"searchDepth":15,"depth":15,"links":3715},[],"2025-11-18T00:00:00.000Z","Systemet vårt benytter en sentral oversikt (en CSV-fil ved bruk av CsvHelper) for å styre innholdslister og hovedmenyer. Utfordringen var at denne listen var statisk; alle brukere så de samme lenkene og menyvalgene, uavhengig av hvilke rettigheter de faktisk hadde i systemet. Dette skapte en uoversiktlig brukeropplevelse og potensielle sikkerhetsspørsmål, da brukere kunne se navigasjonsstier de ikke hadde tillatelse til å besøke.","Vi har innført en intelligent navigasjonsløsning som automatisk tilpasser menyer etter brukernes rettigheter. Ved å filtrere bort utilgjengelig innhold har vi fjernet støy og styrket sikkerheten for ansatte og studenter. Den nye strukturen sikrer en profesjonell brukeropplevelse og forenkler vedlikehold, da vi nå kan oppdatere tilgangsnivåer uten omprogrammering. Resultatet er et verktøy som øker effektiviteten i organisasjonen betraktelig.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fdynamisk-rbac-navigasjon-med-statisk-csv",{"title":3665,"description":3717},"#### Dagens Aktiviteter\n\n* Konstruert en ny tjeneste som automatisk fjerner utilgjengelige lenker fra systemets menyer, slik at ansatte og studenter kun ser det de har tillatelse til.\n* Implementert en logikk som går gjennom hver enkelt sti i navigasjonen og bekrefter at den samsvarer med godkjente tilgangsnivåer.\n* Etablert en oversiktlig og sentralisert metode (JSON) for manuell tildeling av brukertilganger, noe som gir full kontroll og enkel administrasjon av rettigheter.\n* Skilt ut selve \"dørvakt-funksjonen\" i en egen modul for å sikre at fremtidige oppdateringer av regelverket kan gjøres raskt og trygt uten å påvirke resten av systemet.\n* Verifisert at systemet nå bygger opp en ryddig og skreddersydd oversikt for hver enkelt bruker, noe som reduserer digital støy og øker effektiviteten i hverdagen.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen er så fin den kan bli.\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FDynamisk-RBAC-Navigasjon-med-Statisk-CSV","nqbTUncljYLx7vLIxZwL3ZePg8pNayQXdpNmz8mOlUw",{"id":3726,"title":3727,"body":3728,"date":3758,"description":3732,"extension":7,"ingress":3759,"meta":3760,"navigation":151,"path":3761,"seo":3762,"sources":14,"status":3763,"stem":3764,"__hash__":3765},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FTestbarhet-av-Role-Based-Access-Control--funksjonallitet.md","Redusert risiko og lavere vedlikeholdskostnader",{"type":11,"value":3729,"toc":3756},[3730,3733,3736,3739,3750,3753],[96,3731,3732],{},"Systemets funksjon for tilgangsstyring var organisert på en måte som blandet foretningslogikken med infrastruktur. Dette bruddet på prinsippet om klare ansvarsforhold som gjorde det utfordrende å vertifisere sikkerhetslogikken isolert, som øker risiko for feil ved fremtidige endringer og gjorde det vanskelig å etablere automatiske kontroller som bekrefter at systemet fungerer som planlagt.",[96,3734,3735],{},"Målet var å separere ansvarsområdene i systemet for å sikre at reglene kan kontrolleres uavhengig av tekniske lagringsløsninger mens oppgaven var å øke systemets pålitelighet og bygge et rammeverk for effektiv og automatisert kvalitetssikring.",[96,3737,3738],{},"Jeg har ryddet i systemets oppbygging.",[100,3740,3741,3744,3747],{},[103,3742,3743],{},"Skilt ut logikken for tilgangskontroll slik at denne kan kontrolleres uten å påvirke resten av infrastrukturen.",[103,3745,3746],{},"Sørget for at systemet kan simulere ulike sikkerhetsscenarioer uten å være avhengig av eksterne filer.",[103,3748,3749],{},"Utviklet testrutiner som umiddelbart gir svar på om logikken fungerer korrekt.",[96,3751,3752],{},"Vi har nå en pålitelig og forutsigbar arkitektur som gir både økt trygghet  og integeritet for at tilgangsstyringen fungerer nøyaktig som planlagt – også når vi gjør endringer i fremtiden. Ved å fjerne de tekniske koblingene har vi redusert tiden det tar å kontrollere og vedlikeholde systemet.",[96,3754,3755],{},"Denne fremgangsmåten sikrer at vi følger anerkjente standarder for systemarkitektur, noe som er direkte koblet til økt motstandsdyktighet mot feil. Ved å prioritere rene ansvarsforhold har vi lagt til rette for en mer kostnadseffektiv videreutvikling og en betydelig høyere grad av vedlikeholdbarhet over tid.",{"title":14,"searchDepth":15,"depth":15,"links":3757},[],"2025-11-14T00:00:00.000Z","Vi har styrket systemets grunnmur ved å skille forretningslogikk fra infrastruktur. Tidligere sammenkobling gjorde sikkerhetskontroll vanskelig og økte risikoen for feil. Ved å rydde i arkitekturen og innføre automatiserte testrutiner, har vi skapt en løsning som er enkel å verifisere. Resultatet er en pålitelig arkitektur som sikrer korrekt tilgangsstyring, reduserer vedlikeholdstiden og klargjør prosjektet for trygg videreutvikling.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Ftestbarhet-av-role-based-access-control-funksjonallitet",{"title":3727,"description":3732},"#### Dagens aktiviteter\n\n* Identifisert og kartlagt svakheter i nåværende tilgangsstyring, med fokus på å skille virksomhetens regler fra tekniske avhengigheter.\n* Gjennomført en omfattende opprydding i systemets oppbygging for å sikre klare ansvarsforhold mellom sikkerhetslogikk og infrastruktur.\n* Skilt ut logikken for tilgangskontroll slik at denne kan kontrolleres og oppdateres uavhengig av resten av systemet.\n* Tilrettelagt for simulering av ulike sikkerhetsscenarioer uten behov for eksterne filer, noe som gjør kontrollarbeidet betydelig raskere.\n* Implementert nye rutiner som gir umiddelbare svar på om sikkerhetslogikken fungerer korrekt, noe som styrker systemets integritet.\n* Bekreftet at den nye arkitekturen følger anerkjente standarder for økt motstandsdyktighet mot feil og enklere fremtidig vedlikehold.\n\n#### Motivasjon & Energi 10 \u002F 10\n\nDagen har vært så fin den kunne bli\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FTestbarhet-av-Role-Based-Access-Control--funksjonallitet","tl5AwJ_g7VDiWDHa8SfcPqvBXZSMGNDOxoZRHPScHLg",{"id":3767,"title":3768,"body":3769,"date":3799,"description":3773,"extension":7,"ingress":3800,"meta":3801,"navigation":151,"path":3802,"seo":3803,"sources":14,"status":3804,"stem":3805,"__hash__":3806},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FStrategisk-Dokumentasjon-Fr-Videreutvikling.md","Økt gjennomføringsevne gjennom strukturert kunnskapsdeling",{"type":11,"value":3770,"toc":3797},[3771,3774,3777,3794],[96,3772,3773],{},"Prosjektet manglet en kilde til prosjekt informasjon, noe som vil skape store utfordringer ved utvidelse av teamet. Mangelen på oversikt gjorde opplæringen unødvendig lang, og skapte en betydelig risiko for misforståelser av systemets kjernefunksjonaliteter.",[96,3775,3776],{},"Målet var å minimere tiden det tar fra en ny medarbeider starter til de kan skape verdi, samt sikre at kritisk kunnskap ikke er låst til enkeltpersoner. Oppgaven var å etablere et intuitivt og tilgjengelig dokumentasjonsbase som kunne minimere opplærings tiden for de nye medarbeiderne.",[100,3778,3779,3782,3785,3788,3791],{},[103,3780,3781],{},"Jeg desinget og la til en strukturert dokumentasjonsbase",[103,3783,3784],{},"En oversikt som definerer prosjektets verdi og overordnede mål.",[103,3786,3787],{},"En steg-for-steg guide som sikrer at nye ressurser kommer raskt i gang.",[103,3789,3790],{},"En forenklet oversikt over systemets oppbygging for umiddelbar navigasjon.",[103,3792,3793],{},"En plan for vedlikehold av dokumentasjonen for å sikre langsiktig relevans.",[96,3795,3796],{},"Prosjektet har nå en klar dokumentasjonsbase som sikrer at nye medarbeidere blir raskt selvgående og produktive. Ved å prioritere å dele informasjon har vi fjernet dødtid, lagt til rette for at nye medarbeidere kan produsere mer effektivt enn før.",{"title":14,"searchDepth":15,"depth":15,"links":3798},[],"2025-11-11T00:00:00.000Z","Mangel på sentral informasjon og lang opplæringstid utgjorde en risiko for prosjektet. Ved å designe en strukturert dokumentasjonsbase med klare guider, systemoversikt og vedlikeholdsplaner, har vi transformert hvordan nye medarbeidere onboardes. Resultatet er et intuitivt rammeverk som fjerner dødtid og sikrer at nødvendig kunnskap er tilgjengelig for alle. Nå blir nye ressurser raskt selvgående, noe som øker teamets totale verdiskaping.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fstrategisk-dokumentasjon-fr-videreutvikling",{"title":3768,"description":3773},"#### Dagens aktiviteter\n\nFor å sikre at teamet effektiv vokser og redusere oppstartstiden for nye medarbeidere, har dagen blitt brukt til følgende hovedaktiviteter\n\n* Definert og dokumentert prosjektets kjernefunksjonalitet og forretningsverdi. Dette sikrer at alle medarbeidere har en felles forståelse av de viktige målene.\n* Utviklet en steg-for-steg-veiledning for nye ressurser. Aktiviteten fokuserte på å fjerne tekniske barrierer slik at nye medarbeidere blir raskere selvgående.\n* Etablert en forenklet visuell oversikt over prosjektets oppbygging. Dette tiltaket er direkte rettet mot å minimere navigasjonstid og forebygge misforståelser i arbeidet.\n* Gjennomgått og forenklet eksisterende dokumentasjon for å fjerne unødvendig sjargong, slik at informasjonen er intuitiv for alle målgrupper.\n* Utarbeidet en plan for løpende oppdatering av dokumentasjonsbasen for å sikre at dokumentasjonen forblir relevant og verdiskapende over tid.\n\n#### Energi og motivasjon - 10 \u002F 10\n\nDagen har vært så fin den kunne bli !\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FStrategisk-Dokumentasjon-Fr-Videreutvikling","9YGX3dRd1uO-mwI8ASbQEvX_ioJBpK97KLeZnTRENEk",{"id":3808,"title":3809,"body":3810,"date":3844,"description":3814,"extension":7,"ingress":3845,"meta":3846,"navigation":151,"path":3847,"seo":3848,"sources":14,"status":3849,"stem":3850,"__hash__":3851},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FJSON-Deserialization-Correctly.md","Løsning av kommunikasjonsfeil og korrekt klargjøring av tilgangskontroll",{"type":11,"value":3811,"toc":3842},[3812,3815,3818,3825,3836,3839],[96,3813,3814],{},"Systemet har en Rollebasert tilgangskontroll som har ansvaret for å skjerme informasjon for uvelkommende brukere. Ved oppstart oppsto det en feil der instruksjonslisten ikke lot seg lese korrekt inn i systemet. Dette hindret tjenesten fra å lagre tilgangsreglene i minnet, noe som førte til at hele applikasjonen stoppet opp for å ivareta sikkerheten.",[96,3816,3817],{},"Oppgaven min var å feilsøke for å finne ut grunnen til at instruksjonslisten og mottakeren i systemet ikke lenger kommuniserte på samme språk. Som en konsekvens av at de to systemene er avhengig av hverandre for at sikkerhets laget skal fungere, var målet mitt å korrigere feilene slik at systemet kunne vertifisere tilganger og sikre en normal oppstart.",[96,3819,3820,3821,3824],{},"Jeg gjennomførte en systematisk feilsøkingsprosess i sikkerhetstjenesten for å identifisere hvorfor de tilgangsreglene ikke ble akseptert av systemet. Ved dykke ned i koden oppdaget jeg at kilden til utfordringen var en manglende klargjøring av klassen ",[594,3822,3823],{},"AccessService"," som skulle ta imot dataene.",[100,3826,3827,3833],{},[103,3828,3829,3830,3832],{},"Jeg sikret for at systemet nå oppretter en ny og klar instans av ",[594,3831,3823],{}," klassen før selve innlastingen av reglene begynner.",[103,3834,3835],{},"Ved å sikre at klassen var klargjort i tide, kunne systemet korrekt overføre verdiene fra instruksjonslisten til de interne egenskapene i koden uten avbrudd.",[96,3837,3838],{},"Instruksjonslisten blir lest riktig, sikkerhetskontrollen skjermer informasjon for brukere uten tilgang, og alle tilgangsregler er trygt lagret i systemets minne. Dette har fjernet avbruddene ved oppstart og sørget for at alle ansatte kan logge inn og gjøre jobben sin uten avbrudd i systemet. Ved å fikse dette har vi fjernet risikoen for at andre blir låst ute fra systemet, noe som forenkler hverdagen til kollegaer og studenter.",[96,3840,3841],{},"Gjennom dette arbeidet har jeg erfart at det ikke holder å bare fortelle systemet at en klasse finnes; man må faktisk gjøre den klar og åpne den før man kan fylle den med informasjon. Denne innsikten har gitt oss en velfungerende sikkerhetskontroll som er selve muren i bedriftens trygghet. Det betyr at vi nå har en oppskrift for fremtiden som garanterer at informasjon alltid er beskyttet og at systemet forblir stabilt.",{"title":14,"searchDepth":15,"depth":15,"links":3843},[],"2025-11-10T00:00:00.000Z","Da en feil i den rollebaserte tilgangskontrollen hindret systemet å starte, ble sikkerheten prioritert foran drift. Ved å identifisere en manglende klargjøring av `AccessService`-klassen, fikk jeg rettet kommunikasjonssvikten som hindret innlasting av tilgangsreglene. Resultatet er en stabil og trygg innlogging for kollegaer og studenter, der en pålitelig sikkerhetskontroll nå sikrer en uavbrutt arbeidshverdag og trygghet for alle.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fjson-deserialization-correctly",{"title":3809,"description":3814},"#### Dagens Aktiviteter\n\n* Analyserte hvorfor systemet stoppet opp og hvorfor JSON-data med instruksjonslisten ikke ble lest inn i minnet.\n* Gjennomførte en feilsøkings prosess for å finne ut hvorfor sikkerhetslaget hindret verifisering av tilganger.\n* Oppdaget at klassen `AccessService` ikke var klargjort (instansiert) før dataene ble forsøkt overført.\n* Endret koden slik at en ny instans av `AccessService` opprettes før innlastingen av regler starter.\n* Bekreftet at verdier fra instruksjonslisten nå flyter uavbrutt til de interne egenskapene i koden.\n* Sikret at sikkerhetskontrollen fungerer som den skal, slik at ansatte og studenter igjen kan logge inn uten utfordringer.\n* Etablert en stabil metode for fremtidig håndtering av klasser og data som sikrer vedvarende systemstabilitet.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen har vært så fin den kunne bli\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FJSON-Deserialization-Correctly","F7yXnRLlbSvOjQwyp2e_j9fIw-3GFIM2L6cLkEWnLUc",{"id":3853,"title":3854,"body":3855,"date":3844,"description":3859,"extension":7,"ingress":3885,"meta":3886,"navigation":151,"path":3887,"seo":3888,"sources":14,"status":3889,"stem":3890,"__hash__":3891},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FKritisk-Logikkfeil-i-Tilgangssjekken.md","Forbedre flyt og tryggere styring av systemtilganger",{"type":11,"value":3856,"toc":3883},[3857,3860,3863,3866,3877,3880],[96,3858,3859],{},"Systemets rollebasert tilgangs kontroll (RBAC) hadde en logikkfeil som gjorde den altfor streng. Når ansatte hadde fått tillatelse til flere kategorier ved hjelp av en \"samlenøkkel\" (stjerne-symbolet *), forsto ikke systemet instruksjonen. Selv om de ansatte var godkjente i systemet og skulle hatt tilgang, ble de nektet å åpne tillate filer og verktøy. Ansatte mistet tid fordi de ble stående foran en ei side de egentlig hadde tilgang til.",[96,3861,3862],{},"Målet mitt var å finne ut hvorfor  tilgangslogikken ikke forsto sine egne instruksjoner når det ble brukt samletegn. Oppgaven ble å rette denne logikken slik at sikkerhetslaget skjermer innholdet for brukere uten spesifikke roller. Dette handler om å sikre at de ansatte får gjort jobben sin uten tekniske hindringer, samtidig som bedriften har kontroll på hvem som har tilgang til hva.",[96,3864,3865],{},"Jeg gjennomførte en systematisk feilsøkningsprosess for å finne ut hvorfor systemet ikke kjente igjen rollene som var lagt inn.",[100,3867,3868,3871,3874],{},[103,3869,3870],{},"Ved å sammenligne hvordan tilgangene var skrevet i konfigurasjonsfilen med hvordan systemet leste dem, oppdaget jeg en liten skrivefeil. Det var lagt inn et ekstra tegn i filstiene som gjorde at mønsteret ikke stemte overes med rollen.",[103,3872,3873],{},"Jeg fjernet de unødvendige tegnene fra alle stiene i instruksjonsfilen.",[103,3875,3876],{},"Etter rettingen kontrollerte jeg at systemet nå klarte å koble sammen samletegnet med de riktige mappene slik at sikkerhetsreglene ble fulgt som planlagt.",[96,3878,3879],{},"Den rollebaserte tilgangskontrollen fungerer som planlagt. Ansatte og studenter blir ikke avbrutt med tekniske feil når de påner mapper og filer de har rettigheter til å se. Ved å fikse denne logikken har vi fjernet unødvendig tidsbruk, slik at alle kan bruke tiden sin på jobb isteden for motstand fra systemet.",[96,3881,3882],{},"Gjennom arbeidet har jeg fått en innsikt som gjør bedriften tryggere og mer effektiv i fremtiden. Det har blitt erfart at selv et lite tegn på avveie i systemets instruksjonsbok kan skape utfordringer. For at sikkerheten skal være både streng og smidig, må informasjonen som legges inn være nøyaktig og følge samme mal hver gang. Det er også erfart at vi må rydde bort all informasjon med en gang den kommer inn i systemet. Dette hindrer at små feil får tilgang til å stanse funksjoner som pålogging og tilgang.",{"title":14,"searchDepth":15,"depth":15,"links":3884},[],"Ved å rette en logikkfeil i systemets tilgangskontroll har vi fjernet tekniske hindringer som tidligere låste ute ansatte med tilgang. Feilen førte til unødvendig avbrudd i arbeidet. Gjennom en systematisk opprydding har vi sørget for at sikkerheten er både streng og sikker. Dette sikrer at de ansatte får gjort jobben sin effektivt, samtidig som bedriften har full kontroll på dataene. Arbeidet gir oss en mer stabil og forutsigbar drift i fremtiden.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fkritisk-logikkfeil-i-tilgangssjekken",{"title":3854,"description":3859},"#### Dagens Aktiviteter\n\n* Gjennomførte en systematisk analyse for å finne grunnen til at ansatte ble utelukket fra mapper og verktøy de rettmessig skulle ha tilgang til.\n* Identifiserte og rettet en logikkfeil i tilgangsstyringen som gjorde sikkerhetsreglene unødvendig strenge og til hinder for arbeidet.\n* Ryddet opp i feilaktige tegn og uoverensstemmelser i systemets oppsett for å sikre at roller og rettigheter blir gjenkjent korrekt.\n* Kontrollerte at rettelsene fungerer etter hensikten, slik at ansatte og studenter nå kan jobbe uten tekniske avbrytelser.\n* Fjernet rot i systemet, noe som sparer organisasjonen for tapt arbeidstid og frustrasjon.\n* Utarbeidet innsikt om viktigheten av nøyaktige data og faste maler for å sikre en stabil og forutsigbar drift i fremtiden.\n\n#### Motivasjon & Energi   10  \u002F  10\n\nDagen er så fin den kan bli\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FKritisk-Logikkfeil-i-Tilgangssjekken","Ha5KcpVOWZ4bcXfnJyTkVBQ0BjDqy-zKg6zDtJVMovo",{"id":3893,"title":3894,"body":3895,"date":3932,"description":3899,"extension":7,"ingress":3933,"meta":3934,"navigation":151,"path":3935,"seo":3936,"sources":3937,"status":3938,"stem":3939,"__hash__":3940},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FSingleton-som-Grunnlag-for-Skalerbar-Rollehndtering.md","Sikring av Data og Brukertilganger",{"type":11,"value":3896,"toc":3930},[3897,3900,3910,3916,3927],[96,3898,3899],{},"Bedriften hadde behov for å styrke sikkerheten og kontrollen rundt hvem som har tilgang til sensitivt innhold i systemet våres. Uten et rollebasert  system var det utfordrende å skille studenter fra ansatte på en trygg og oversiktlig måte etter hvert som organisasjonen vokser. Dette skapte risiko for at feil brukere hadde tilgang til skjermet informasjon.",[96,3901,3902,3903,3906,3907,3909],{},"Målet var å samle alle tilgangsregler i en felles oversiktlig fil som ",[210,3904,3905],{},"JSON",", slik at sikkerheten er enkel å styre  og  systemet er bygget for å vokse. Dette ville sikre at de fordelte rollene kun får se den informasjonen som er nødvendig for deres spesifikke rolle og ingenting annet. Oppgaven min ble å innføre denne løsningen for rettighetsstyring (",[210,3908,868],{},"), slik bedriften har kontroll på hvem som ser hva.",[96,3911,3912,3913,739],{},"For å løse dette på en rask og fremtidsrettet måte, valgte jeg en metode som sørger for at systemet alltid har en rask tilgang til reglene uten å belaste serveren unødvendig, dette kalles for ",[210,3914,3915],{},"Singleton-tjeneste",[100,3917,3918,3921,3924],{},[103,3919,3920],{},"Jeg inkluderte sikkerhets sjekken i oppstarten, for å sjekke hvem som har tilgang en gang. Dette betyr at  systemet trenger å sjekke hvem som har tilgang en gang, noe som sparer tid og ressurser hver gang en bruker logger seg inn.",[103,3922,3923],{},"Jeg vertifiserte løsningen mot bransje standarden (via Google Gemini) for å sikre at vi følger de nyeste sikkerhetsstandardene for moderne IT-systemer.",[103,3925,3926],{},"Ved å bygge løsningen rett inn i systemets kjerne, har jeg sørget for koden er enkel å vedlikeholde for andre utviklere i fremtiden.",[96,3928,3929],{},"Systemet har nå en fungerende og sikker tilgangskontroll som sjekkes automatisk hver gang under oppstart av systemet, som gir bedriften kontroll på hvem som ser hva fra første oppstart. Ved å bruke en oversiktlig fil som JSON ble løsningen ferdigstilt og satt i drift raskt, som sparer tid i utviklings fasen. Vi har sikret at hver rolle ser kun det som er nødvendig på nettsiden, dette minimerer risikoen for datalekkasjer og jeg har identifisert at filen må oppdateres manuelt ved stor vekst, dette er en perfekt og rimlig løsning for prosjektets nåværende fase, som en konsekvens av at  det gir bedriften tryggheten til å videre utvikle.",{"title":14,"searchDepth":15,"depth":15,"links":3931},[],"2025-11-07T00:00:00.000Z","For å øke sikkerheten har jeg lagt til en ny løsning for tilgang til systemet. Ved å skille tydelig mellom ansatte og studenter, sikrer vi at sensitiv informasjon ikke kommer på avveie. Systemet er nå organisert slik at rettigheter tildeles automatisk og effektivt ved pålogging. Dette fjerner manuelle feilkilder, sparer tid i den daglige driften og gir bedriften en trygg og profesjonell grunnmur for videre vekst.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fsingleton-som-grunnlag-for-skalerbar-rollehndtering",{"title":3894,"description":3899},"1. **Google Gemini (AI-modell)**: Breftende for bransjestandard og læringsverktøy\n2. [Unntak for synkron I\u002FO i Singleton-initialisering](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Faspnet\u002Fcore\u002Ffundamentals\u002Fbest-practices?view=aspnetcore-8.0).\n3. [Prinsipp for Single Responsibility (SRP).](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSingle-responsibility_principle)\n","#### Dagens Aktiviteter\n\n* Utviklet en løsning som skiller mellom ansatte og studenter for å sikre at brukere kun har tilgang til informasjon relevant for deres rolle.\n* Opprettet en JSON-basert oversikt over alle tilgangsregler for å forenkle styringen og fremtidig vekst.\n* Lagt til en ressurseffektiv tjeneste i systemets kjerne som gir rask tilgang til sikkerhetsreglene uten å belaste serveren unødvendig.\n* Integrert sikkerhetssjekken direkte i oppstartsprosessen. Dette sparer tid og ressurser ved at systemet kun trenger å verifisere tilgangskonfigurasjonen én gang.\n* Gjennomført teknisk kontroll av løsningen mot gjeldende bransjestandarder (ved bruk av Google Gemini) for å sikre moderne sikkerhetskrav.\n* Identifisert nåværende fordeler ved JSON-løsningen (rask utrulling og lav kostnad) samt dokumentert behovet for manuell oppfølging ved stor organisatorisk vekst.\n\n#### Motivasjon & Energi 10 \u002F 10\n\nDagen har vært så fin den kunne bli.\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FSingleton-som-Grunnlag-for-Skalerbar-Rollehndtering","C4WRac2ZB4AD7AMF8PWzl9aEyKPrkEGcAkuIgt5oS1o",{"id":3942,"title":3943,"body":3944,"date":4008,"description":14,"extension":7,"ingress":4009,"meta":4010,"navigation":151,"path":4011,"seo":4012,"sources":14,"status":4013,"stem":4014,"__hash__":4015},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fportfolio\u002FIntegrasjon-av-TinaCloud.md","Separering av kode og innhold i et moderne prosjekt",{"type":11,"value":3945,"toc":4006},[3946,3950,3968,3971,3974,3992,3995,4003],[91,3947,3949],{"id":3948},"prosjektanalyse","Prosjektanalyse",[96,3951,3952,3953,3957,3958,3962,3963,3967],{},"For å forenkle innholdsstyringen i porteføljen min, la jeg til et redaktør panel kalt ",[165,3954,3956],{"title":3955},"Headless Content Management System er uavhengig av visuell teknologi som brukes på nettsiden","TinaCMS",". Utfordringen lå i prosjektets struktur, hvor ",[165,3959,3961],{"title":3960},"visuelle teknologien"," nettsiden "," lever i en undermappe som Dette skapte synkroniserings utfordringer med ",[165,3964,3966],{"title":3965},"Tina Cloud er bindleddet som kontrollerer og kobler sammen redaktørpanelet med innholdet","Tina Cloud",", som i utgangspunktet ikke klarte å lese innholdsgrenen hvor dokumentasjonen og tekstene lagres.",[96,3969,3970],{},"Målet var å etablere en effektiv og feilfri flyt mellom redaktørpanelet og selve kildekoden til nettsiden. Dette krevde oppsettsmetode for hvordan panelet tolker mappestrukturen min. I tillegg måtte jeg sikre at alle filer, bilder og ressurser ble lastet korrekt, selv om de ligger lagret i ulike undermapper i prosjektet.",[96,3972,3973],{},"Jeg utførte en systematisk feilsøking og rekonfigurering:",[100,3975,3976,3979,3986,3989],{},[103,3977,3978],{},"Jeg bekreftet først at digitale \"nøkler og adgangskort\" fungerte som de skulle. Dette gjorde jeg for å avklare om utfordringene skyldtes manglende tilgang, eller om det var selve koblingen til riktig mappe i GitHub som var utfordringen.",[103,3980,3981,3982,3985],{},"I oppsettet hos leverandøren la jeg inn stien til konfigurasjonsfilene. Dette tvinger ",[165,3983,3984],{"title":3956},"bindeleddet"," å lete på riktig sted i prosjektet.",[103,3987,3988],{},"Jeg korrigerte stien for den såkalte \"publicFolder\". Dette løste utfordringen med brutte bildelenker i redaktørpanelet ved å peke systemet direkte til mappen hvor bildene faktisk ligger lagret.",[103,3990,3991],{},"Underveis identifiserte og skilte jeg ut urelaterte tilkoblingsfeil som ikke hadde med selve panelet å gjøre. Dette sikret at feilsøkingen forble fokusert, effektiv og målrettet.",[96,3993,3994],{},"Det som har blitt lagt til har resultert i en pålitelig arkitektur som følger en struktur som tåler vekst. Ved å konfigurere systemet for underkataloger er løsningen nå fleksibel nok til å tåle fremtidige strukturelle endringer uten behov for omfattende rekonfigurering. Dette danner et grunnlag for videre vekst i prosjektet.",[96,3996,3997,3998,4002],{},"Gjennom å dedikere en gren i github for dokumentasjon og innholdsproduksjonen, har jeg etablert en effektiv arbeidsflyt basert på prinsippet om en ",[165,3999,4001],{"title":4000},"Dette prinsippet handler om å skille innholdet fra kodebasen","\"Decoupled Workflow\"",". Dette gir en trygghet i utviklingsløpet, da innhold nå kan redigeres uten risiko for å påvirke eller ødelegge den underliggende applikasjonslogikken.",[96,4004,4005],{},"Til slutt har arbeidet løftet den tekniske kvaliteten i hele prosjektet. Ved å fjerne feilmeldinger i konsollen og optimalisere ressurslastingen, sikres en rask og stabil brukeropplevelse i redaktørpanelet. Resultatet er en plattform hvor alle visuelle ressurser fungerer intakt, og hvor skillet mellom teknologi og innhold er fullstendig optimalisert.",{"title":14,"searchDepth":15,"depth":15,"links":4007},[],"2025-11-05T00:00:00.000Z","Ved å skille nettsidens tekniske kode fra selve tekstene, har jeg utviklet et system som er både enklere å vedlikeholde og tryggere å bruke. Denne loggen beskriver hvordan jeg løste utfordringer med mappestrukturer for å sikre at bilder og innhold alltid flyter feilfritt. Resultatet er en stabil plattform som er kalr for fremtidig vekst og enklere samarbeid.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fportfolio\u002Fintegrasjon-av-tinacloud",{"title":3943,"description":14},"#### Dagens Aktiviteter\n\n* Integrerte \u003Cabbr title=\"Headless Content Management System er uavhengig av visuell teknologi som brukes på nettsiden\">TinaCMS\u003C\u002Fabbr> for å forenkle styringen av dokumentasjon og innhold.\n* Bekreftet at digitale \"nøkler og adgangskort\" fungerte korrekt for å utelukke autentiseringsfeil.\n* Løste utfordringer med at \u003Cabbr title=\"Den visuelle teknologien\">nettsiden\u003C\u002Fabbr> ligger i undermapper ved å definere nøyaktige stier for konfigurasjonsfiler hos \u003Cabbr title=\"Tina Cloud er bindeleddet som kontrollerer og kobler sammen redaktørpanelet med innholdet\">leverandøren\u003C\u002Fabbr>.\n* Korrigerte banen for \"publicFolder\", som fikset brutte bildelenker og sørget for at alle ressurser vises korrekt i panelet.\n* Identifiserte og skilte ut urelaterte tilkoblingsfeil for å sikre en målrettet og effektiv prosess.\n* Dedikerte en egen gren i GitHub for dokumentasjon, som muliggjør en \u003Cabbr title=\"Dette prinsippet handler om å skille innholdet fra selve kodebasen\">\"Decoupled Workflow\"\u003C\u002Fabbr> der innhold kan redigeres uten risiko for kildekoden.\n* Fjernet feilmeldinger i konsollen og optimaliserte ressurslastingen for en raskere og mer stabil brukeropplevelse.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen er så fin den kan bli !\n","posts\u002Fdev\u002FProject\u002Fportfolio\u002FIntegrasjon-av-TinaCloud","IyRBioQB7EgVJ-lNK9co963sxQmgMWcGwfGvRnHHq3c",{"id":4017,"title":4018,"body":4019,"date":4061,"description":4062,"extension":7,"ingress":4063,"meta":4064,"navigation":151,"path":4065,"seo":4066,"sources":14,"status":4067,"stem":4068,"__hash__":4069},"devPosts\u002Fposts\u002Fdev\u002FProject\u002Fintranett\u002FBrekraftig-Stihndtering-etter-kritisk-API-krasj-00.md","Gjenoppretting av intranett og sikring av universell systemtilgang",{"type":11,"value":4020,"toc":4059},[4021,4029,4039,4042,4056],[96,4022,4023,4024,2409,4026,4028],{},"Bedriftens intranett krasjet ved innlogging på nettsiden under testing etter at systemet ble flyttet fra kodespråket ",[210,4025,817],{},[210,4027,821],{}," ved hjelp av AI-generert kode. Den halv automatiske flyttingen skapte hindringer som gjorde nettsiden utilgjengelig, og videre utviklingsarbeidet stanset. Dette betydde stopp i produksjon for bedriften.",[96,4030,4031,4032,3197,4035,553,4037,739],{},"Min oppgave var å feilsøke den AI-genererte koden, finne årsaken til at nettsiden krasjet og få nettsiden klar til videreutvikling, så raskt som mulig. Samtidig skulle jeg sikre at systemet hadde støtte for ",[210,4033,4034],{},"MacOS",[210,4036,848],{},[210,4038,836],{},[96,4040,4041],{},"Da denne feilen kun rammet utviklere på visse datasystemer, gjennomførte jeg en feilsøking for å sikre at intranettet var stabilt for alle.",[100,4043,4044,4047,4050,4053],{},[103,4045,4046],{},"Jeg analyserte den AI-genererte koden for å finne ut hvorfor den fungerte på Windows, men sviktet på andre datasystemer.",[103,4048,4049],{},"Jeg erstattet den ustabile koden med en universell løsning som automatisk gjenkjenner riktig filsti, uavhengig av hvilket datasystem den ansatte bruker.",[103,4051,4052],{},"Jeg bygde om logikken for hvordan systemet finner filer, slik at koblingen mellom nettsiden og dokumentene nå er pålitelig og feilfri.",[103,4054,4055],{},"Jeg rettet opp i svakhetene fra den automatiske flyttingen for å hindre at lignende krasj skjer i fremtiden.",[96,4057,4058],{},"Systemet ble fikset, og alle datasystemer fikk tilgang igjen. Ved å fjerne denne tekniske utfordringen, har jeg spart bedriften for fremtidige driftsstans og sørget for at utviklere kan jobbe uforstyrret videre uten forsinkelser.",{"title":14,"searchDepth":15,"depth":15,"links":4060},[],"2025-11-03T00:00:00.000Z","Bedriftens intranett krasjet ved innlogging på nettsiden under testing etter at systemet ble flyttet fra kodespråket PHP → C# ved hjelp av AI-generert kode. Den halv automatiske flyttingen skapte hindringer som gjorde nettsiden utilgjengelig, og videre utviklingsarbeidet stanset. Dette betydde stopp i produksjon for bedriften.","Da en lynrask teknologiovergang lammet bedriftens intranett, ble det produksjonsstans. Ved å utbedre svakheter i AI-generert kode, ble systemet transformert fra en ustabil kilde til feil til en pålitelig, plattformuavhengig løsning. Resultatet er et feilfritt arbeidsverktøy for alle ansatte, uavhengig av operativsystem, slik at utviklingsteamet nå kan jobbe effektivt uten frykt for nye driftsstans.\n",{},"\u002Fposts\u002Fdev\u002Fproject\u002Fintranett\u002Fbrekraftig-stihndtering-etter-kritisk-api-krasj-00",{"title":4018,"description":4062},"#### Dagens Aktivitet\n\n* Fant ut hvorfor systemet sviktet for utviklere på Mac og Linux, selv om det fungerte på Windows.\n* Innledet matematiske uttrykk: Erstattet den ustabile koden med en universell løsning som automatisk finner riktig sti til filer, uavhengig av hvilken datasystem utvikleren bruker.\n* Ryddet opp i logikken for dokumenthåndtering for å sikre at systemet nå er pålitelig og feilfritt. Ved å fjerne svakhetene har jeg hindret fremtidige krasj og sørget for at utviklingsteamet kan jobbe videre uten kostbare forsinkelser.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen var så fin den kunne bli !\n","posts\u002Fdev\u002FProject\u002Fintranett\u002FBrekraftig-Stihndtering-etter-kritisk-API-krasj-00","PEYaysTorJggRT83uymoj7x96MVXTqBKvVxXa3b2seM",{"id":4071,"title":4072,"body":4073,"date":4124,"description":4125,"extension":7,"ingress":4126,"meta":4127,"navigation":151,"path":4128,"seo":4129,"sources":14,"status":4130,"stem":4131,"__hash__":4132},"devPosts\u002Fposts\u002Fdev\u002FDevOps\u002FKompetanseheving-i-CMS-utvikling-.md","Raskere Nettsideutvikling med Stabilt Redaktørpanel",{"type":11,"value":4074,"toc":4122},[4075,4093,4096,4119],[96,4076,4077,4078,4082,4083,4087,4088,4092],{},"Jeg skulle sette opp et redaktørpanelt ",[165,4079,4081],{"title":4080},"Et verktøy for å redigere nettsideinnhold","Tina CMS"," for en nettside, Utfordringen var at dette systemet ikke var laget spesielt for ",[165,4084,4086],{"title":4085},"En samling gjenbrukbar legoklosser og regler som utviklere bruker som grunnmur.","rammeverk","et ",[165,4089,4091],{"title":4090},"Et verktøy for å utvikle interaktive brukeropplevelser på nett.","Vue.js"," og det var første gang jeg skulle sette opp redaktørpanelet for dette rammeverket.",[96,4094,4095],{},"Målet med besluttningen av å velge redaktørpanelet framfor kompliserte databaser var å kunne effektivt sette opp en landings side, og spare verdiful utviklingstid. Ferdige løsninger som dette forenkler lagringen av data direkte i Github. Min oppgave var å finne ut nøyaktig hvordan jeg skulle installere det på riktig måte slik at redaktørpanelet var stablit.",[100,4097,4098,4106,4113,4116],{},[103,4099,4100,4101,739],{},"Jeg undersøkte offisielle veiledningene hos ",[1227,4102,4105],{"href":4103,"rel":4104},"https:\u002F\u002Ftinacms.io",[1231],"tinacms.io",[103,4107,4108,4109,4112],{},"Siden det manglet en oppskrift for rammerverket jeg hadde, brukte jeg ",[165,4110,828],{"title":4111},"Kunstig Intelligens"," som støtte. Dette gjorde at jeg fant de riktige verktøyene, raskere enn ved å manuelt lete på nettet.",[103,4114,4115],{},"Jeg vurderte ulike løsningsforslag for å koble systeme sammen. Målet var å finne den løsningen som var enklest å vedlikeholde over tid, noe som reduserer behovet for teknisk oppfølging over tid.",[103,4117,4118],{},"Jeg sjekket at installasjonen var pålitelig og sikker. Dette minimerer risikoen for nedetid og behovet for teknisk brukerstøtte og feilretting etter lansering.",[96,4120,4121],{},"Redaktørpanelet ble vellykket lagt til. Løsningen gir kunden en enkel og stabil løsning for å drive nettsiden sin selv. Min genvinst er at jeg har fått ny kunnskap,for åp redusere utviklingstiden og øke kvaliteten for kunden i fremtiden.",{"title":14,"searchDepth":15,"depth":15,"links":4123},[],"2025-09-10T22:00:00.000Z","Jeg skulle sette opp et redaktørpanelt Tina CMS for en nettside, Utfordringen var at dette systemet ikke var laget spesielt for rammeverket Vue.js og det var første gang jeg skulle sette opp redaktørpanelet for dette rammeverket.","Denne loggen dokumenterer hvordan vi ved å velge et ferdig redaktørpanel som \u003Cabbr title=\"Et verktøy for å redigere nettsideinnhold\">Tina CMS\u003C\u002Fabbr> har spart betydelig utviklingstid sammenlignet med å bygge en egen database. Ved å kombinere offisiell dokumentasjon med moderne \u003Cabbr title = \"Kunstig Intelligens\">KI\u003C\u002Fabbr>-verktøy, har jeg etablert en stabil løsning for \u003Cabbr title=\"Et verktøy for å bygge interaktive brukeropplevelser på nett\">Vue.js\u003C\u002Fabbr> som kunden enkelt kan styre selv. Arbeidet har resultert i en gjenbrukbar metode som sikrer høyere kvalitet og langt raskere leveranse i alle fremtidige prosjekter.\n",{},"\u002Fposts\u002Fdev\u002Fdevops\u002Fkompetanseheving-i-cms-utvikling",{"title":4072,"description":4125},"#### Dagens Aktiviteter\n\n* Besluttet å bruke et ferdig redaktørpanel for å spare tid.\n* Leste offisiell dokumentasjon for å unngå feilkoding.\n* Brukte \u003Cabbr title = \"Kunstig Intelligens\">KI\u003C\u002Fabbr> for å finne riktig oppsett for Vue.js raskere.\n* Valgte den løsningen som er lettest å vedlikeholde i fremtiden.\n* Sjekket at alt var stabilt og sikkert før ferdigstillelse.\n* Installert og klargjort redaktørpanelet for kunden.\n\n#### Motivasjon & Energi - 10\u002F10\n\nDagen har vært så fin den kunne bli. Hodet ble litt sliten løpet av dagen.\n","posts\u002Fdev\u002FDevOps\u002FKompetanseheving-i-CMS-utvikling-","9I-yRldrswsZjDtECiONdnY2MdckbwSfee-ZhB0jezM",{"id":4134,"title":4135,"body":4136,"date":4170,"description":4171,"extension":7,"ingress":4172,"meta":4173,"navigation":151,"path":4176,"seo":4177,"sources":14,"status":4178,"stem":4179,"__hash__":4180},"devPosts\u002Fposts\u002Fdev\u002FRD\u002FTeknisk-referanselogCMS-arkitektur-og-11ty-implementasjon.md","Investering i Undersøkelser, Reduserer Stress",{"type":11,"value":4137,"toc":4168},[4138,4146,4161],[96,4139,4140,4141,4145],{},"I dag hadde jeg behov for å videre utvikle kunnskapen min innen ",[165,4142,4144],{"title":4143},"Content Management System - Den delen av nettsiden hvor kunden logger inn og skriver tekst og laster opp media selvstendig uten teknisk hjelp","CMS panel",", dette var en konsekvens av at vi fikk en oppgave fra lederen våres om å lage til et CMS panel som skulle brukes for en kunde.",[100,4147,4148,4155,4158],{},[103,4149,4150,4151,4154],{},"Jeg satte av tid til å lese fagstoff og dokumentasjonen for ",[594,4152,4153],{},"11ty","- rammeverket.",[103,4156,4157],{},"For å få en praktisk innsikt analyserte jeg eksisterende kode og gjorde en undersøkelse  av ulike redaktørpanel verktøy, kostnadseffektive løsninger til avanserte systemer.",[103,4159,4160],{},"Jeg sammenlignet de ulike verktøyene for å se hvilken som var enklest å bruke og best for dette prosjektet.",[96,4162,4163,4164,4167],{},"Jeg fikk kjennskap for hvordan 11ty og andre redaktørpaneler fungerer og fant flere løsninger. Jeg var spesielt oppmerksom på ",[165,4165,4081],{"title":4166},"Et moderne redaktørpanel som lar deg se endringene du gjør på nettsiden."," som en lovende løsning. Ved å tette kunnskapshullet reduserte jeg stressnivået mitt. Jeg har nå en oversikt over ulike redaktørpanelløsninger som passer for alt fra små til store budskjetter, noe som gjør meg mer fleksibel og effektiv i fremtidige prosjekter. Det ble besluttet å gå for 11ty som rammeverk. I prossen valgte jeg å fokusere litt extra å Tina CMS, da dette dekket et behov for enkelhet med et pent brukergrensesnitt på toppen. Jeg har nå dokumentert kunnskap om 11ty og er i gang med implementeringen basert på det valgte rammeverket.",{"title":14,"searchDepth":15,"depth":15,"links":4169},[],"2025-09-09T22:00:00.000Z","I dag hadde jeg behov for å videre utvikle kunnskapen min innen CMS panel, dette var en konsekvens av at vi fikk en oppgave fra lederen våres om å lage til et CMS panel som skulle brukes for en kunde.","I dag har jeg investert tid til å bli kjent med verktøyene for å bygge enkle redaktørpanelt som er enkle for kunden å bruke. Ved å tette kunnskapshullene mine har jeg ikke bare fjernet unødvendig stress, men også skaffet oss en oversikt over løsninger som eksisterer. Dette sikrer at vi leverer produkter, som er gjennomtenkte og reduserer ressurs bruken.\n",{"tags":4174},[4175],"dev-journey","\u002Fposts\u002Fdev\u002Frd\u002Fteknisk-referanselogcms-arkitektur-og-11ty-implementasjon",{"title":4135,"description":4171},"#### Dagens Aktiviteter\n\n* Jeg har brukt tid på å forstå hvordan \u003Cabbr title=\"Et verktøy som bygger raske nettsider med innhold fra redaktørpaneler\">`11ty`\u003C\u002Fabbr>- \u003Cabbr title = \"Et verktøy som brukes av utviklere for å utvikle nettsider effektivt\">rammeverket\u003C\u002Fabbr> fungerer.\n* Jeg har studert koding som andre har laget før, for å forstå faget i praksis.\n* Jeg har undersøkt mange ulike \u003Cabbr title=\"Delen av nettsiden hvor kunden logger inn og skriver tekst og laster opp media selvstendig uten teknisk hjelp\">`redaktørpaneler`\u003C\u002Fabbr>. Jeg sjekket alt fra de billigste til de dyreste løsningene.\n* Jeg har målt de ulike verktøyene opp mot hverandre for å se hvem som er enklest å bruke og best for lommeboken til prosjektet.\n* Jeg oppdaget \u003Cabbr title =\"Et moderne redaktørpanel som lar deg se endringene (som tekst og media) du gjør på nettsiden\">Tina CMS\u003C\u002Fabbr>, som er et veldig fint og enkelt verktøy som jeg utforsket ekstra nøye.\n* Som en konsekvens av at jeg forstår mer, føler jeg meg mye tryggere og mindre stresset på jobben.\n* Teamet har tatt en besluttning for å bruke 11ty som hovedverktøy som en konsekvens av at vi ble introdusert for dette først.\n* Nå som planleggingen er ferdig, har jeg begynt å faktisk lage nettsiden med den nye kunnskapen min.\n\n#### Motivasjon & Energi - 10 \u002F 10\n\nDagen har vært så fin den kunne bli.\n","posts\u002Fdev\u002FRD\u002FTeknisk-referanselogCMS-arkitektur-og-11ty-implementasjon","p25bnAKvQnP58RePcDHsg8fyjoyrYdmpkTkjACD9uDI",[4182,4214,4256,4322],{"id":4183,"title":4184,"body":4185,"date":4008,"description":14,"extension":7,"ingress":4207,"meta":4208,"navigation":151,"path":4209,"seo":4210,"sources":14,"status":4211,"stem":4212,"__hash__":4213},"personalPosts\u002Fposts\u002Fpersonal\u002FMentalt-vedlikehold\u002FInvestering-i-Langsiktig-Problemlsningsevne.md","Investering i Langsiktig Problemløsningsevne",{"type":11,"value":4186,"toc":4205},[4187,4191,4194,4197,4202],[91,4188,4190],{"id":4189},"gjennomgang-av-arbeidsdag","Gjennomgang av arbeidsdag",[96,4192,4193],{},"Etter en periode med intensiv koding over 365 dager, hadde jeg møtt et punkt i min kreative og problemløsende kapasitet. Dette indikerte på et behov for en  omstrukturering av arbeidsdagen for å unngå redusert kvalitet og mental utmattelse.",[96,4195,4196],{},"Målet med dagen var å gi hjernen et bevisst skifte i fokus for å restarte den kreative kapasiteten.",[100,4198,4199],{},[103,4200,4201],{},"Jeg la bort kompliserte koder og brukte dagen på enkle praktiske oppgaver, som møter,  og helse. Jeg ga hjernen en pause fra problemløsningen",[96,4203,4204],{},"Etter som dagen hadde gått hadde jeg fått ny energi av den selv pleien, noe som er en faktor for å opprettholde ytelse over tid.",{"title":14,"searchDepth":15,"depth":15,"links":4206},[],"For å unngå feil og utbrenthet, tok jeg et valg om å bytte ut koding med enkle praktiske oppgaver i dag. Dette var som en omstart av hjernen. Ved å hvile den kreative delen, sikrer jeg at jeg jobber  raskere og bedre i morgen. Dette er en smart investering i egen helse som hindrer kostbar nedetid og sørger for at prosjektet holder stø kurs videre.\n",{},"\u002Fposts\u002Fpersonal\u002Fmentalt-vedlikehold\u002Finvestering-i-langsiktig-problemlsningsevne",{"title":4184,"description":14},"#### **Dagens Aktiviteter**\n\n* Tok en bevisst pause fra koding for å unngå mental utmattelse og sikre kvalitet i fremtidig arbeid.\n* Prioriterte selvpleie for å opprettholde ytelse over tid.\n* Håndterte forfallende oppgaver som krever mindre hjernekapasitet.\n* ar bevisst på når hodet ble slitent og energien var tom, for å kunne jobbe bedre over tid.\n\n#### **Motivasjon** & **Energi** - **3** \u002F **10**\n\nDagen har vært så fin den kunne bli, men opplevde lav energi.\n","posts\u002Fpersonal\u002FMentalt-vedlikehold\u002FInvestering-i-Langsiktig-Problemlsningsevne","52d_7RD--J1EEeiFE2_PssVTgzXPo4RPJu269opNNZU",{"id":4215,"title":4216,"body":4217,"date":4248,"description":14,"extension":7,"ingress":4249,"meta":4250,"navigation":151,"path":4251,"seo":4252,"sources":14,"status":4253,"stem":4254,"__hash__":4255},"personalPosts\u002Fposts\u002Fpersonal\u002FMentalt-vedlikehold\u002FInvestering-i-Meditasjon-Arbeidsflyt.md","Investering i Meditasjon & Arbeidsflyt",{"type":11,"value":4218,"toc":4246},[4219,4223,4226,4229,4240,4243],[91,4220,4222],{"id":4221},"_48-timers-venting-og-overvåkning","48-timers venting og Overvåkning",[96,4224,4225],{},"Etter to år med høyt press og full dedikasjon til faget, merker jeg at energien min er veldig lav. Ideene har stoppet opp, både kvaliteten og fremdriften i arbeidet er merkbart redusert, som en konsekvens av at hode trenger hvile.",[96,4227,4228],{},"Oppgaven min var å forstå hvorfor arbeidsflyten ble redusert, og løse dette med å finne en måte for å få tilbake energien og kreativiteten på, slik jeg kunne bli produktiv igjen",[100,4230,4231,4234,4237],{},[103,4232,4233],{},"Jeg tok en bevisst beslutning om å koble helt av i 56 timer.",[103,4235,4236],{},"Jeg fjernet det indre presset og lot tankene vandre fritt uten om å tvinge de frem.",[103,4238,4239],{},"Konkrete tiltakt jeg har valgt for å forebygge dette har jeg besluttet å sette av 10 min 2-3 ganger om dagen for å «slippe energien fri og koble ut».",[96,4241,4242],{},"Pausen resulterte i en omstart. Energien kom automatisk tilbake og jeg er klar for å ta på meg nye oppgaver. Jeg har nå et konkret verktøy 10-min meditasjon som gjør at jeg kan levere stabilt over tid uten å gå tom.",[96,4244,4245],{},"Ved at jeg bruker meditasjon som et verktøy, sikrer jeg at jeg leverer stabilt og med kvalitet selv i perioder hvor tempoet er høyt. Jeg forebygger også risikoen for langvarig utbrenthet, som sparer bedriften og kunden for uforutsette forsinkelser og kostnader. En uthvilt utvikler løser ikke bare utfordringene raskere, men utvikleren reduserrer feil marginen for å ta ukorrekte besluttninger.",{"title":14,"searchDepth":15,"depth":15,"links":4247},[],"2025-12-02T00:00:00.000Z","For å sikre at jeg leverer arbeid av kvalitet og unngår feil, har jeg i dag investert i nødvendig restitusjon og nye verktøy for stressmestring. Ved å ta grep før batteriene ble helt flate, har jeg beskyttet meg selv, min bedrift og kunder mot uforutsette stopp og sikret at jeg kan jobbe raskere og mer presist i tiden som kommer. Dette er en investering i stabil fremdrift som sparer både bedriften og kunden for fremtidige kostnader.\n",{},"\u002Fposts\u002Fpersonal\u002Fmentalt-vedlikehold\u002Finvestering-i-meditasjon-arbeidsflyt",{"title":4216,"description":14},"#### Dagens Aktiviteter\n\n* Jeg innså at etter to år med hardt arbeid var energien tom og kreativiteten stoppet opp.\n* Jeg Investerte tid på å forstå hvorfor ting gikk saktere, slik at jeg kunne løse utfordringen i stedet for å bare presse på.\n* Jeg tok en bevisst pause på 56 timer for å tømme hodet og fjerne alt indre press.\n* Ved å la tankene vandre fritt, fikk jeg energien tilbake og ble klar for nye arbeidsoppgaver.\n* Jeg har bestemt meg for å bruke 10 minutter med meditasjon 2–3 ganger daglig for å holde energien jevn.\n* Jeg har lagt en plan som reduserer sjansen for feil og sikrer at jeg leverer gode resultater, selv når det er mye å gjøre.\n* Ved å ta grep nå, har jeg spart bedriften og kunden for uforutsette stopp og fremtidige kostnader.\n\n#### Motivasjon & Energi - 1 \u002F 10\n\nDagen har vært så fin den kan bli, men jeg ser at energien min er borte.\n","posts\u002Fpersonal\u002FMentalt-vedlikehold\u002FInvestering-i-Meditasjon-Arbeidsflyt","znbk5EPbN_C-HQFAubOuRhQYnFgp-NZCtQuogxLMVJI",{"id":4257,"title":4258,"body":4259,"date":2325,"description":14,"extension":7,"ingress":4315,"meta":4316,"navigation":151,"path":4317,"seo":4318,"sources":14,"status":4319,"stem":4320,"__hash__":4321},"personalPosts\u002Fposts\u002Fpersonal\u002FOS\u002Flinux\u002FHndtering-av-Electron-regresjon-i-Garuda-Linux.md","Håndtering av Electron-tilbakerulling i Garuda-Linux",{"type":11,"value":4260,"toc":4313},[4261,4265,4275,4278,4281,4307],[91,4262,4264],{"id":4263},"korrupt-brukergrensesnitt-i-vs-code","Korrupt Brukergrensesnitt i VS Code",[96,4266,4267,4268,4274],{},"Etter en oppdatering av programmet VS Code i mitt Garuda operativsystem, oppsto det en uforutsett feil som deaktiverte hovedmenyen. Dette gjorde det umulig å navigere i prosjekter eller bruke vanlige menyvalg. feilsøkingen viste at det var en konflikt mellom VS Code og skrivebordsmiljøet ",[165,4269,4271],{"title":4270},"Det visuelle miljøet på maskinen (knapper, menyer og vinduer).",[594,4272,4273],{},"KDE-Plasma",", spesifikt knyttet til hvordan grafikken i menyene blir tegnet.",[96,4276,4277],{},"Siden dette er mitt primære arbeidsverktøy for prosjekter, var målet å bringe systemet tilbake til en fungerende versjon så raskt som mulig. Oppgaven var å finne feilen og installere en stabil versjon av programmet, uten å risikere tap av data eller endre på andre deler av maskinen.",[96,4279,4280],{},"For å løse situasjonen effektivt utførte jeg følgende tiltak:",[100,4282,4283,4286,4289],{},[103,4284,4285],{},"Jeg bekreftet raskt at feilen kun gjaldt VS Code og ikke hele maskinen. Selv om feilen oppsto etter en systemoppdatering, var utfordringen koblet til selve programpakken.",[103,4287,4288],{},"Jeg forsøkte først å tvinge programmet til å tegne menyene på en annen måte inne i innstillingene, men da dette ikke ga ønsket resultat, prioriterte jeg en mer effektiv løsning.",[103,4290,4291,4292,4298,4299,4302,4303,4306],{},"Jeg benyttet verktøyet ",[165,4293,4295],{"title":4294},"Et verktøy som lar deg velge nøyaktig hvilken tidligere versjon av et program du vil installere.",[594,4296,4297],{},"downgrade"," for å manuelt installere den tidligere ",[594,4300,4301],{},"versjonen 1.106",". Ved å bruke kommandoen ",[594,4304,4305],{},"sudo downgrade visual-studio-code-bin"," fikk jeg installert versjonen som fungerte feilfritt med systemet mitt.",[96,4308,4309,4310,4312],{},"VS Code fungerer igjen. Ved å velge en målrettet nedgradering fremfor en full gjenoppretting av hele maskinen, ble feilen fisket med minimal nedetid. Den viktigste erfaringen er at i et aktivt utviklingsmiljø er en rask tilbakestilling ofte bedre enn dyp feilsøking hvis målet er å komme raskt i gang med arbeidet igjen. Jeg har nå bekreftet at ",[594,4311,4297],{}," er et effektivt verktøy for å håndtere slike konflikter i et Linux-basert system.",{"title":14,"searchDepth":15,"depth":15,"links":4314},[],"En oppdatering av utvikler verktøyet \u003Cabbr title =\"Et redigerings verktøy for programmering\">`VS Code`\u003C\u002Fabbr> skapte en feil i menyene som stoppet alt arbeid. I stedet for tidkrevende feilsøking, valgte jeg strategisk å rulle tilbake  til forrige stabile versjon med linux verktøyet \u003Cabbr title=\"Et verktøy som lar deg velge nøyaktig hvilken tidligere versjon av et program du vil installere.\">`downgrade`\u003C\u002Fabbr>. Dette gjenopprettet arbeidsflyten raskt og fjernet nedetid uten risiko for datatap. Beslutningen var å prioritere rask fremdrift fremfor unødvendig detaljfokus.\n",{},"\u002Fposts\u002Fpersonal\u002Fos\u002Flinux\u002Fhndtering-av-electron-regresjon-i-garuda-linux",{"title":4258,"description":14},"#### Dagens Aktiviteter\n\n* Finne årsaken til at menyene i programmet VS Code forsvant.\n* Gjenopprette arbeidsverktøyet raskest mulig.\n* Utføre en trygg tilbakestilling av en spesifikk programvarepakke.\n\n#### Motivasjon & Energi - 10\u002F10\n\nDagen har vært så fin den kunne bli.\n","posts\u002Fpersonal\u002FOS\u002Flinux\u002FHndtering-av-Electron-regresjon-i-Garuda-Linux","ZAM0peQngeUXBJkXgLXGEUNN1AArnL2c66s8N0DshTk",{"id":4323,"title":4324,"body":4325,"date":717,"description":14,"extension":7,"ingress":4391,"meta":4392,"navigation":151,"path":4393,"seo":4394,"sources":4395,"status":4396,"stem":4397,"__hash__":4398},"personalPosts\u002Fposts\u002Fpersonal\u002FOS\u002Flinux\u002FTerminering-av-unskede-virtuelle-monteringspunkter-i-Garuda-Linux.md","Fjerning av «spøkelses-disker»",{"type":11,"value":4326,"toc":4389},[4327,4331,4339,4342,4344,4386],[91,4328,4330],{"id":4329},"fjerning-av-spøkelses-disker-og-optimalisering-av-oppstart","Fjerning av «spøkelses-disker» og optimalisering av oppstart",[96,4332,4333,4334,4338],{},"I mitt nåværende oppsett med operativsystemet Garuda, oppdaget jeg en merkelig feil. Systemet viste flere lagringsdisker i oversikten som ikke eksisterte i virkeligheten – såkalte «spøkelses-disker». Jeg mistenkte at dette skyldtes ",[165,4335,4337],{"title":4336},"et verktøy som lager egne små arbeidsområder på maskinen","Docker",", og at disse ble koblet til automatisk ved oppstart uten at jeg hadde bruk for dem.",[96,4340,4341],{},"Målet var å stoppe denne automatiske handlingen for å hindre at maskinen monterte disse falske diskene ved oppstart. Dette ble gjort for at oversikten over lagringsplass ble korrekt og at systemet ikke brukte unødvendige ressurser på tjenester som ikke var i bruk.",[96,4343,3421],{},[100,4345,4346,4356,4366,4376],{},[103,4347,4348,4349,4355],{},"Jeg undersøkte hvilke tjenester som kjørte i det skjulte. Ved å bruke kommandoen ",[165,4350,4352],{"title":4351},"En kommando som lister opp alle aktive pakker (containere) som kjører på maskinen akkurat nå.",[594,4353,4354],{},"docker ps",", oppdaget jeg at tre ulike containere fra to tidligere prosjekter sto og kjørte virtuelt uten at de ble brukt aktivt.",[103,4357,4358,4359,4365],{},"For å frigjøre systemressurser umiddelbart, stoppet jeg de inaktive prosessene manuelt med kommandoen ",[165,4360,4362],{"title":4361},"Stopper en spesifikk prosess som kjører i bakgrunnen.",[594,4363,4364],{},"docker stop",". Dette avsluttet koblingen mellom de virtuelle arbeidsområdene og systemets filoversikt.",[103,4367,4368,4369,4375],{},"Jeg kjørte en grundig rengjøring med kommandoen ",[165,4370,4372],{"title":4371},"En kraftig oppryddingskommando som sletter alt som er ubrukt fra Docker.",[594,4373,4374],{},"docker system prune",". Dette slettet midlertidige filer og rester som skapte rot i listene over disker, slik at de falske stasjonene forsvant.",[103,4377,4378,4379,4385],{},"For å være sikker på at utfordringen ikke oppstår igjen ved neste oppstart, deaktiverte jeg selve tjenesten helt med kommandoen ",[165,4380,4382],{"title":4381},"En instruks til operativsystemet om at et program ikke skal starte av seg selv når PC-en slås på.",[594,4383,4384],{},"sudo systemctl disable --now",". Dette endret maskinens innstillinger slik at Docker-motoren forblir avslått frem til jeg selv velger å starte den manuelt.",[96,4387,4388],{},"Resultatet ble at de falske «spøkelses-diskene» forsvant umiddelbart. Nå starter maskinen opp helt rent, og jeg kan manuelt koble til de diskene jeg faktisk trenger. erfaringen jeg sitter igjen med var at bakgrunnstjenester kan påvirke systemets visuelle oversikt, og at det er lurt å deaktivere tunge verktøy man ikke bruker daglig.",{"title":14,"searchDepth":15,"depth":15,"links":4390},[],"Etter observasjoner av spøkelsesdisker i Garuda, ble det identifisert at automatiske \u003Cabbr title = \"et verktøy som lager egne små arbeidsområder på maskinen\">Docker\u003C\u002Fabbr>-prosesser genererte uønskede virtuelle lag ved systemoppstart. Ved å identifisere aktive containere og deaktivere både Docker-tjenesten og dens socket-enhet, ble systemet tilbakestilt til en tilstand med full manuell kontroll over diskmontering.\n",{},"\u002Fposts\u002Fpersonal\u002Fos\u002Flinux\u002Fterminering-av-unskede-virtuelle-monteringspunkter-i-garuda-linux",{"title":4324,"description":14},"Offisiell dokumentasjon : [docs.docker.com](https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fmanage-resources\u002Fpruning\u002F)","#### Dagens Aktiviteter\n\n* Finne årsaken til at systemet viser \"falske\" disker.\n* Stoppe tunge programmer som kjører uten at de trengs.\n* Endre innstillinger slik at jeg selv bestemmer når verktøyene skal starte.\n\n#### Motivasjon & Energi 10 \u002F 10\n\nDagen er så fin den kan bli.\n","posts\u002Fpersonal\u002FOS\u002Flinux\u002FTerminering-av-unskede-virtuelle-monteringspunkter-i-Garuda-Linux","su-18lccVYic6As0EmbUFji2i0VFSh73mdujCboqEV4",1776004035130]