Inlägg

Inlägg som kwame har skrivit i forumet
Av kwame

Hade gärna fått höra om ljudnivån. Jag hade tidigare en asus zenbook via jobbet (är utvecklare).

Den lät som ett kärnkraftverk 24/7 fick ha den flera meter ifrån mig och trots det störde sig både jag och mina kollegor på den. Bytte sedan ut den mot en dell xps för att slippa oljudet.

Av kwame

På mitt jobb har vi seniora utvecklare från indien för en bra bit under 550kr/timme, så rent spontant låter 550kr för juniora utvecklare väldigt dyrt. Tror det är väldigt svårt att få någon att nappa på juniora remote överhuvudtaget.

Tar man in konsulter beror det på resursbrist och då behöver man att de är självgående och levererar från start som ovanstående skriver. Det är ingenting man får från juniora och framförallt inte remote. Man betalar dyrt för att lära upp någon annan, det är något man bara vill investera i anställda.

Av kwame
Skrivet av leafbranch:

Har haft tinnitus sen jag var ung, nu säker 20-25år. Ofta varierande och för det mesta kan jag tänka bort det.
Jag har utsatt min hörsel extremt men fåtal gånger under min livstid. Smällare (inomhus) var nog det värsta jag upplevt även smällt i nacken/huvud ordentligt.
Däremot ändrar sig tinnitus ljudet beroende på om jag spänner/vinklar nacken. Någon annan som har samma?

Jävlar vad sjukt. Inte tänkt på det, men direkt jag når max-läget i tiltning av nacken så tjuter det enormt högt i det örat som jag tiltar åt. Känns nästan som tinnitusen är borta efter man gjort så några gånger och hör vad högt de egentligen kan låta.

Skrivet av ToddTheOdd:

Det här har ju inte med din tinnitus att göra men passa verkligen på att kontrollera ditt blodtryck om du inte har gjort det. Märker man inte av om det är högt men så kan det ge en stroke/hjärnblödning som det blev i mitt fall så jag blev liggandes på sjukhus i 4 månader och då var helt förlamad på högra sidan. Bättre nu efter 3 år men kolla upp det.

Tack för tipset. Tråkigt att höra att det blev så illa för dig! Men skönt att det är bättre nu iaf.. Ska göra det. Ser att ett av symptomen för högt blodtryck är "Lätt för att få huvudvärk".
Jag har kört hård styrketräning i > 20 år. Dock senaste åren har jag inte kunnat ta i mitt max i t.ex. marklyft/knäböj då jag får extrem huvudvärk av det och blir väldigt yr/svartnar för ögonen Kanske ligger något i det.

Av kwame

Stressrelaterad tinnitus?

Hej där!

För cirka 6 veckor sedan vaknade jag upp med tinnitus vilket jag haft konstant sen dess. Har inte blivit utsatt för några höga ljud de senaste åren, och hade en lugn hemmakväll dagen innan jag vaknade upp med tinnitus. Så känns som det inte är relaterat till det iaf.

Om jag inte missuppfattat det helt fel så får man oftast tinnitus pga hörselnedsättningar/ålder - så jag gjorde nyligen ett hörseltest där jag hade perfekt hörsel. Dock märkte hon att jag hade tinnitus då jag tryckte flera gånger då det inte var något ljud överhuvudtaget.

Så jag börjar fundera över om det kanske kan vara stresserelaterad tinnitus? Jag känner mig inte särskilt stressad i vardagen, men jobbar som utvecklare och har ganska mycket ansvar på mina axlar (särskilt senaste tiden) så kanske är mer stressad än vad jag egentligen känner av?

Någon här som haft tinnitus X antal veckor och sedan att det magiskt gått över? Vad var orsaken för er isåfall? Hoppas innerligt att detta är något temporärt och inte något jag behöver ha resten av livet. Även om jag lite accepterat det. Tips mottages gärna.

Av kwame

Bästa lagliga IPTV

Hej där!

Jag är med i styrelsen i min bostadsrättförening och vi har en samlingslokal där vi tänkt införskaffa IPTV till så man kan kolla på lite sport/film/tv.

Känner att IPTV är den smidigaste lösningen - men vad finns det egentligen att välja på för lagliga laternativ?
Eller är det främst jättarna Telia och Telenor? Antar att alla alternativ som erbjuder > 10 000 kanaler anses olagliga?

Mvh

Av kwame
Skrivet av Kingbaldr:

Ja, jag är supernöjd med den skyddade miljön och vad det innebär för hur Apple kan utforma den totala upplevelsen. Jag är utvecklare mot iOS och jag har alltid varit nöjd med hur Apple utfört kodgranskning, osv innan de släpper in en uppdatering i butiken.

Kodgranskning? Det utför dom absolut inte.
De har inte tillgång till din kodbas. De har bara tillgång till själva appen och det är vad dom testar av innan den kommer in i App Store. Fungerar exakt likadant för Android (Google play store).

Av kwame

Gällande ditt exbjobb kan jag rekommendera deployment via Azure. Det är vanligt i yrkeslivet så fint att ha på ditt CV. Jag använde det själv vid mitt exjobb utan någon tidigare kunskap kring det.

Inte särskilt dyrt, och du kan sätta upp en prototyp för exjobbet helt gratis.

Frontend levereras via Azure static web app / web app.
Backend finns flertalet olika databastyper att välja på (https://azure.microsoft.com/en-us/products/category/databases)

Går även ha ditt repo via Azure och sätta upp pipelines som deployar till din web/backend vid förändringar i repot. Väldigt smidigt.

Av kwame

De flesta BRF:er är ju anslutna till HSB.
Då kan man använda deras system. Ser ut som skit, men duger gott åt en BRF.
https://www.hsb.se/sydost/medlem/bostadsrattsforening/med-bra...

Samma sak för att ladda upp mötesprotokoll från styrelsemöten och dyl, lagras upp till 99 år.

Av kwame

Nej. Normalt sett har man UX-designers som gör design som sedan frontend-utvecklaren kan utgå ifrån.
Jag hade då inte klarat av att göra design då jag inte har någon som helst känsla för det - vilket nog är vanligt bland de flesta programmerare. Är man duktig och brinner för båda bitarna så kan man nog få en roll som gäller både och dock.

Av kwame

Nog bra att skriva vilken rank du är, oftast inte kul att hamna med folk på betydligt sämre/bättre nivå

Av kwame
Skrivet av Lasagno:

Har gått igen grunderna i Python, då Python ska ha låg tröskel - har ej tittat på OOP än. Vilket var enkelt att förstå. Grynderna sitter dock inte när det ska sys ihop, har helt klart lagt ner för få antal timmar. Några tips? Antar att nästa steg blir att titta på OOP.

Jag hade lärt mig ett språk bra först - och sedan gått vidare med något annat paradigm.
Så kör vidare med Python - bygg något riktigt, som du tycker känns kul.

https://codefinity.com/blog/Python%20Projects%20for%20Beginne...

Här har du lite nybörjarprojekt. Inte ovanligt att man i plugget får göra spel t.ex. tic tac toe, miniräknare eller ordbehandlare likt notepad.

Av kwame

Använder du TypeScript?

Propdrilling är oftast inget problem.

const Parent = () => { return <Child1 props={props} /> type Child1Props = { .... massa props } const Child1 = (props: Child1Props) => { const onChange = () => {...} return <Child2 onChange={onChange} {...props} /> } type Child2Props = Child1Props & { onChange: () => void } const Child2 = ({onChange, ...rest}: Child2Props) => { return ( <Button onClick={() => onChange} /> <OtherComponent {...rest} /> ) }

Generellt ska du i de flesta fall använda prop drilling.
Context ska du använda främst när du vill dela state i hela applikationen.

T.ex. om du har egen autentisering så wrappar man hela applikationen.
Sedan så har context t.ex. en hook:

const {user} = useAuth() som ger dig tillgång till den inloggade användarens information oavsett vart du är.

const AnyComponent = () => { const {user} = useAuth() .... } const App = () => { return ( <AuthProvider> <MyApp/> </AuthProvider> ) }

En annan sak du bör läsa på om är hur renderingen fungerar i React.
Ändrar du state i en "förälder" så kommer alla "barn" också renderas om.

Därav vill man oftast isolera saker ned i så små bitar som möjligt.

Tänk att du har en stor lista som är tung att rendera. Sedan har du en knapp för att öppna en dialog (för att lägga till nya element i listan). Här ändrar du state via att sätta openDialog till true - varav hela listan och dess underliggande element renderas om.

const MyHugePersonnelList = () => { const [personnel, setPersonnel] = useState([]) const [openDialog, setOpenDialog] = useState(false) return ( <> <Dialog open={openDialog} onAdded={(newPersonnel) => setPersonnel([...personnel, newPersonnel])} /> <Button onClick={() => setOpenDialog(true)}> Add personnel</Button> <HeavyList rows={rows} /> </> ) }

Detta löser man via att göra om knappen till en egen komponent.

type AddPersonnelButtonProps = { onAdded: (personnel: Personnel) => void } const AddPersonnelButton = ({onAdded}: AddPersonnelButtonProps) => { const [showDialog, setShowDialog] = useState(false) return ( <> <Dialog open={openDialog} onAdded={onAdded} /> <Button onClick={() => setOpenDialog(true)}> Add personnel</Button> </> ) } const MyList = () => { const [rows, setRows] = useState([]) return ( <> <AddPersonnelButton onAdded={(personnel) => setRows([...rows, personnel])} /> <HeavyList rows={rows} /> </> ) }

Av kwame

Testa inspektera sidan i 3440 x 1440 samt 4k, allt blir vänsterställt då.

Av kwame

Jag hade testat lite olika saker praktiskt och hittat det som du finner mest intressant.
Det som är intressant på pappret är inte alltid lika kul i praktiken.

Jag läste Datavetenskap på Universitetet och trodde att "Datasäkerhet" skulle vara en av de roligaste kurserna. När vi väl satte igång praktiskt så visade det sig vara en av de tråkigare kurserna jag läste, och absolut ingenting jag skulle vilja arbeta med.

Av kwame

Testa programmera lite. Känn efter om det verkar vara något du har en fallenhet för.
Har du det och tycker det är kul - kör.

Tycker inte åldern är ett något större problem, du har fortfarande ca 20 år kvar i yrkeslivet - vilket är en lång tid.
Jag har bara jobbat 2 år men känner mig redan som en kompetent utvecklare. Älskar jobbet betydligt mer än vad jag trodde att jag skulle göra. Yrkeslivet är mycket roligare än när jag väl pluggade.

Av kwame

Dag 9, Uppgift 1
Språk: TypeScript

Får se om jag hoppar på del 2 senare.

const { readFileSync} = require('fs') const findCurrentDiff = (input: number[]) => input.reduce((acc: number[], curr: number, index: number) => { if(index === input.length - 1) return acc acc.push(input[index+1] - curr) return acc }, [] as number[]) const findDiffs = (input: number[], diffs: number[]): number[] => { const currentDiff = findCurrentDiff(input) if(currentDiff.every((number: number) => number === 0)) return diffs if(diffs.length === 0) diffs.push(currentDiff[currentDiff.length - 1]) else diffs.push(currentDiff[currentDiff.length - 1] + diffs[diffs.length - 1]) return findDiffs(currentDiff, diffs) } export const solver = (input: number[][]) => input.reduce((sum, line) => { const diffs = findDiffs(line, []); return sum + line[line.length - 1] + diffs[diffs.length - 1]; }, 0); const input = readFileSync('testInput.txt', 'utf-8') .split('\n') .map((line: string) => line.split(' ')) .map((line: string[]) => line.map((word: string) => parseInt(word))) console.log(solver(input))

Dold text
Av kwame

Dag 8, Uppgift 1
Språk TypeScript

const {readFileSync} = require('fs') type NodeChild = { left: string, right: string } const START_NODE = 'AAA' const FINAL_NODE = 'ZZZ' const generateNodes = (input: string[]) => { const nodes = new Map<string, NodeChild>() for(let i=1; i<input.length; i++) { const [parent, child] = input[i].split('=') const [left, right] = child.split(',') nodes.set(parent.replace('=', '').trim(), { left: left.replace('(', '').trim(), right: right.replace(')', '').trim() }) } return nodes } const solver = (input: string[]) => { console.time('solver') const instructions = input[0] const NodesMap = generateNodes(input) let path: string | null = null let i=0 while(path !== FINAL_NODE) { const nodeChild: NodeChild = i === 0 ? NodesMap.get(START_NODE)! : NodesMap.get(path || '')! const currentInstruction: string = instructions[i % instructions.length] path = currentInstruction === 'L' ? nodeChild?.left : nodeChild?.right i++ } console.timeEnd('solver') return i } const input = readFileSync('testInput.txt', 'utf8') .split('\n') .map((line: string) => line.trim()) .filter((line: string) => line.length > 0) console.log(solver(input))

Dold text

Dag 8, Uppgift 2
Språk: TypeScript

import { findPathSteps, generateNodes, getLcmFromArray } from "./utils" const {readFileSync} = require('fs') const START_NODE = 'AAA' const FINAL_NODE = 'ZZZ' const solver = (input: string[]) => { const instructions = input[0] const {nodes} = generateNodes(input, START_NODE) return findPathSteps(START_NODE, nodes, instructions, (path: string | null) => path === FINAL_NODE) } const FIRST_NODE_CHAR = 'A' const LAST_NODE_CHAR = 'Z' const solver2 = (input: string[]) => { const instructions = input[0] const {nodes, nodesEndingWithA} = generateNodes(input, FIRST_NODE_CHAR) return getLcmFromArray(nodesEndingWithA.reduce((acc: number[], curr: string) => { acc.push(findPathSteps(curr, nodes, instructions, (path: string | null) => path?.endsWith(LAST_NODE_CHAR) ||false)) return acc }, [])) } const input = readFileSync('testInput.txt', 'utf8') .split('\n') .map((line: string) => line.trim()) .filter((line: string) => line.length > 0) console.log(solver(input)) console.log(solver2(input))

Utils

type NodeChild = { left: string, right: string } export const findPathSteps = (startNode: string, nodes: Map<string, NodeChild>, instructions: string, isFound: (path: string | null) => boolean) => { let path: string | null = null let i = 0 for(i; !isFound(path); i++) { const nodeChild: NodeChild = i === 0 ? nodes.get(startNode)! : nodes.get(path || '')! const currentInstruction: string = instructions[i % instructions.length] path = currentInstruction === 'L' ? nodeChild?.left : nodeChild?.right } return i } export const generateNodes = (input: string[], findNodesStartingWith: string) => { const nodes = new Map<string, NodeChild>() const nodesEndingWithA: string[] = [] for(let i=1; i<input.length; i++) { const [parent, child] = input[i].split('=') const [left, right] = child.split(',') const parentToAdd = parent.replace('=', '').trim() nodes.set(parentToAdd, { left: left.replace('(', '').trim(), right: right.replace(')', '').trim() }) if(parentToAdd.endsWith(findNodesStartingWith)) { nodesEndingWithA.push(parentToAdd) } } return {nodes, nodesEndingWithA} } export function getLcmFromArray(arr: number[]) { let currentLcm = arr[0]; for (let i = 1; i < arr.length; i++) { currentLcm = lcm(currentLcm, arr[i]); } return currentLcm; } function gcd(a: number, b: number) { if (!b) { return a; } return gcd(b, a % b); } function lcm(a: number, b: number) { return (a * b) / gcd(a, b); }

Dold text
Av kwame
Skrivet av Pelegrino:

Är nyfiken på hur du läser in filerna. Gör det själv i JS men tycker det är den osmidiga delen.

Här får du den biten Sista biten är bara att splitta på '|' så får du vinster i arr[0] och dina kort i arr[1] (som jag gör i getWins)

const parseLine = (line: string) => { const newLine = line.split(':') // Plockar bort "Card 1" eftersom den hamnar i newLine[0] så returnerar jag allt till höger. return newLine[1].trim() } const file = readFileSync('testInput.txt', 'utf-8') .split('\n') .map((line: string) => parseLine(line))

Dold text
Av kwame

Del 2 kändes som rekursion passade bra på, så körde på det.
Inte den mest effektiva lösningen dock

Dag 4 (Del 1 och 2)
Språk: TypeScript

const AmoutOfWinsMap = new Map<number, number>() const getWins = (line: string, index: number) => { if(AmoutOfWinsMap.has(index)) { return AmoutOfWinsMap.get(index) || 0 } const [winningNumbers, actualNumbers] = line.split('|') const winningNumbersArray = winningNumbers.split(' ') const actualNumbersArray = actualNumbers.split(' ') const intersection = winningNumbersArray.filter((number: string) => parseInt(number) && actualNumbersArray.includes(number)) const wins = intersection.length AmoutOfWinsMap.set(index, wins) return wins } const part1 = (input: string[]) => { return input.reduce((acc: number, curr: string, index) => { const wins = getWins(curr, index) if(wins === 0) return acc const lineSum = Math.pow(2, wins-1) return acc + lineSum }, 0) } const countTotalCards = (allLines: string[], index: number) : number => { if(index >= allLines.length - 1) return 1 const wins = getWins(allLines[index], index) if(wins === 0) return 1 let totalCards = 1 for(let i=1; i<=wins; i++) { if(index + i < allLines.length){ totalCards += countTotalCards(allLines, index + i); } } return totalCards } const part2 = (input: string[]) => { return input.reduce((acc: number, curr: string, index: number) => { const wins = countTotalCards(input, index) return acc + wins }, 0) }

Dold text
Av kwame

Dag 2 var ju väldigt enkel jämfört med Part 2 på dag 1..

Jag lyckades inte få till den. Någon som hittar mitt fel?

Dag 1:
Språk: TypeScript

När jag kikar igenom andras lösningar så känns min ganska så ekvivalent med kodes lösning högre upp.
line.replace(number, `${number}${numbersMap.get(number)!.toString()}${number}`)

Blir ju egentligen mer eller mindre samma resultat som att köra ['nine' = 'n9e'] osv...
Ger rätt resultat på test-input men inte den riktiga.

const numbersMap = new Map<string, number>([ ['one', 1], ['two', 2], ['three', 3], ['four', 4], ['five', 5], ['six', 6], ['even', 7], ['eight', 8], ['nine', 9] ]) const parseLintPart2 = (line: string) => { for (const number of numbersMap.keys()) { if(line.includes(number)) { line = line.replace(number, `${number}${numbersMap.get(number)!.toString()}${number}`) } } return line } const solver = (input: string[], part: number) => input.reduce((acc, line) => { const newLines = part === 1 ? line : parseLintPart2(line) const numbers: number[] = [] for(const char of newLines) { if(Number(char)) numbers.push(parseInt(char)) } if(numbers.length >= 1) { acc += (numbers[0] * 10) + numbers[numbers.length - 1] } return acc }, 0)

Dold text

Dag 2:
Språk: TypeScript

import { parseInput } from "../parseInput" const blueRegex = /(\d+)\sblue/g; const redRegex = /(\d+)\sred/g; const greenRegex = /(\d+)\sgreen/g; const getMaxColor = (line: string, colorRegex: RegExp) => { const matches = [...line.matchAll(colorRegex)]; return matches.length > 0 ? Math.max(...matches.map(match => parseInt(match[1]))) : 0; } const getMaxColors = (line: string) => { return { maxBlue: getMaxColor(line, blueRegex), maxRed: getMaxColor(line, redRegex), maxGreen: getMaxColor(line, greenRegex) }; } const part1 = (input: string[]) => input.reduce((acc, line, index) => { const {maxBlue, maxRed, maxGreen } = getMaxColors(line) if(maxBlue <= 14 && maxRed <= 12 && maxGreen <= 13) { acc += index + 1 } return acc }, 0) const part2 = (input: string[]) => input.reduce((acc, line, index) => { const {maxBlue, maxRed, maxGreen } = getMaxColors(line) const product = maxBlue * maxRed * maxGreen return acc + product }, 0) const parsedInput = parseInput('part1') console.log(part1(parsedInput)) console.log(part2(parsedInput))

Dold text