4. draw.wtf
Anton har släppt sitt hobbyprojekt draw.wtf vilket leder in på diskussioner kring programmering som kreativt utlopp, att släppa saker innan det är “perfekt” och hur det är att jobba med TypeScript på både frontend och backend. Dessutom en hel del om Therése ångestdrivna utveckling och liten historia om en minnesläcka.
Om du gillar podden blir vi väldigt glada för en liten recension i iTunes eller en prenumeration på Spotify. Följ oss och säg hej på @asdfpodden på Instagram eller Twitter (Anton, Therése) <3
Länkar
Transkribering
Transkriberingen är gjord av nån "AI-grej". Du kan förbättra den genom
att klicka precis här :)
Du får börja idag.
Ja.
Hej och välkomna till ASDF, vår podd idag.
Jag vet inte hur man gör. Är du bra på att rita, Anton?
Jag är väl leds på att rita.
Men jag gissar på att du frågar för att jag typ släppte mitt ritaspel igår.
Ah, du gjorde ändå din koppling.
Ja, faktiskt.
Så nej, jag är faktiskt helt väl leds på att rita.
Jag har däremot ett TED-talk, tror jag att det är,
sparat som en flik där det är typ så här
"Alla kan rita".
För att jag har någon typ av ambition
att jag ska lära mig rita någon gång i livet.
Så den där fliken som levt där gick kanske två månader.
Och tydligen ska den vara skitbra.
Alla så här, folk som har tittat på den har sagt liksom att
"Ja, nu kan jag ändå rita lite grann".
Och det blir ändå rätt snyggt.
Men jag har skjutit upp det.
Så att, ja nej jag kan inte rita så bra.
Jag tänker att du är duktig på att rita. Du har ju en bra ritar-aura.
Jag är värdelös på att rita. Jag är så fruktansvärt dålig på att rita.
Jag har inga vinklar, jag kan inte rita av saker, ingen perception överhuvudtaget.
Jag skiljer allt på avrytningsfel.
Det ska jag också börja göra, helt enkelt.
Precis, jag kan inte göra raka sträck, ingenting.
Men det blir en sån... man kan ju träna på det.
Jag vet att det är många som är väldigt duktiga på att rita som kan bli lite för närvarande av att man säger "men du kan ju rita, du är så bra på det".
Det ligger ju ofta ganska många timmars träning bakom att kunna rita.
Ja, alltså svaret är verkligen, det är lite som med mycket tänker jag.
Du kan ju sjunga, visst att man kan vara bättre med sångröst men det är också väldigt mycket träning.
Ja, du kan ju bättre förutsättningar för någonting, absolut.
men att bara säga att du bara kunde det en dag.
Det är ju lite som spottar dem i ansiktet.
Ja, lite så.
Det tar vi också i luft.
Du bara kan ju programmera.
Ja.
Om folk visste hur många timmar.
Ångest.
Det ligger bakom mina programmeringskunskaper.
Vad jävlar.
Varje for loop.
Varje for loop.
Hela logikprocessen innan jag fattar den.
Det var mycket hat mot en labba
som alltid var klädd i brunt på universitetet.
Alltså det var...
Undrar om han lyssnar på podden nu,
känner han till sig själv som personen som alltid klädde i brunt då?
Jag vet inte.
Tänk om någon aldrig tänker på att de alltid har samma färg på sig.
Nej.
Alltså jag skulle ju kunna vara en sån person, tänker jag.
Men jag kör ju mycket svart.
Precis, men jag kör ju också mycket svart.
Men svart är mer så här, det händer.
Men brun, det är ändå liksom, det är inte en färg som bara finns där alltid
Nej, det känns mer som att man sökt upp den färgen.
Precis. Det är inte så att du hittar bruna Manchesterbyxor på alla ställen.
Kanske på Söder, jag vet inte.
Nej, inte omöjligt.
Men jag håller med. Det ligger så sjukt mycket tanke,
eller tanke, sjukt mycket ångest, som du uttryckte det,
bakom allt man kan egentligen.
Och sen ändå landar man i det, när vi pratade om våra mentala modeller, eller vi löste problemen för något avsnitt sen.
Och du drar dig i snören. Det är där man landar i slut. År av ångest, sen drar man i snören.
Ja, men det är också kul. För jag vet att vi har ju pratat tidigare om vad som driver oss att koda.
För mig är det fortfarande mycket ångest och rädslan att misslyckas och att inte klara av det.
Jag finner kanske inte riktigt glädjen i det på samma sätt.
För din motivation är ju snarare att du tycker det är så jävla kul.
Ja, så är det definitivt. Jag tycker att det är väldigt kreativt.
Det är ju det kreativa utloppet jag har, skulle jag säga.
Jag tror att jag är en ganska kreativ person, trots att jag inte kan rita.
Det har liksom blivit att programmeringen är min kreativa utlopp.
Det är därför jag bygger HV-projekt och tycker att det är kul att göra det på fritiden fast jag är goda på jobbet.
På jobbet tycker jag inte alls att det är samma kreativa utlopp som när man gör det privat.
Jag pratade med min terapeuta om det.
Om man inte får prata om sin terapeuti-podd så måste du klippa bort det.
Jag pratade med min terapeuta om det och han sa "Jag tror egentligen att du är en väldigt kreativ människa men du är för trött så det blir inget."
Det är ju intressant ändå.
Ja.
Kreativitet är nog ändå, jag tror att programmering är nog ganska kreativt när man bygger saker.
Kanske inte liksom hur skriver jag den här for loopen bäst.
Alltså på den makronivån men på en liten högre nivå eller på en liten större nivå.
Då tror jag att det är väldigt mycket mer kreativt än vad många tänker.
Ja, men det tror jag också. Absolut.
Speciellt om man kommer på någonting och vill bygga någonting som bara är roligt.
För att se om någonting funkar. Det behöver inte ens funka bra.
Det är bara att få ut någonting och se vad som händer.
Mitt problem ofta i det där när jag försöker göra det är att jag fastnar i att det måste vara perfekt.
Ja, men exakt.
Jag måste använda den här tekniken korrekt.
Och jag måste göra det. Återigen att man fastnar i den här att allting måste vara så jävla smart.
För att jag vill inte skämmas för det eller få skit för att jag är en dålig utvecklare.
Så då fastnar jag i det och då tar jag ändå själv och suger ur glädjen ur att göra det.
Så kreativiteten dör tror jag.
Ja, där har jag nog också varit ganska mycket.
Men jag tror att jag blir mycket bättre på att släppa det.
Och då även släppa saker.
Och det vi pratar om senast nu är mitt drita spel som jag släppte i går, typ, föregår eller något.
Vad bra du har hört koll på dagarna nu.
Nej, det är totalt kaos i dess tider. Alltså jag vet inte ens om det är dag eller natt för nu i tiden.
Men jag tänker, vi kan ju prata lite grann om det här kanske. Jag tänker att det är ganska ointressant.
Jag tänker att det är ganska intressant.
Ja, och innan det här så ska jag bara se till att min dator inte exploderar av att det är massa saker som kör i bakgrunden.
- Jo, men vi kan väl snacka lite grann då, återfack.
- Mm. - Som sagt, kanske lite ointressant.
Men vi märker vart vi landar.
Och jag tror jag förklarade i förra avsnitt vad det är,
men i korthet är det väl typ "Rita, gissa".
Alltså det spelet, fast alla ritar,
och den som gissar är liksom en maskininlärningsmodell istället.
Som då ger en poäng baserad på hur väl den känner igen det man ska rita.
Så man får typ en "Rita en delfin", och sen ritar alla,
och samma 20 sekunder på sig tror jag, det är inställt på.
Och sen när det är klart så skickar jag till maskinen i lägetmodellen
som spottar ut sig en procentsats
och då får man en poäng som är baserad på den procentsatsen.
Och här pratar du ju också då om frustrationen hos personer som faktiskt kan rita bra
men som alltid får dåliga poäng.
Ja, vi kan börja med liksom maskinen i lägetmodellen.
Alltså den är ju, jag började bygga det här för, undrar om det är exakt ett år sedan idag.
exakt ett år sedan idag. Jag kollade första committen i repot häromdagen. Jag tror att det var exakt ett år sedan idag som jag skrev det som första
committen. Och då byggde jag det väldigt ihophackat så att säga. Jag hade inte alls tänkt att vara långsiktig eller någonting utan bara testade lite olika saker.
Och jag kan ingenting om maskininlärning överhuvudtaget. Så jag testade först och så här, okej men hur svårt är det? Det kan inte vara så svårt.
Jag tänker att alla som håller på med maskinlärning, de kan ju bara det, så att säga.
Jag googlade lite grann och hittade lite guider på hur man gör.
Testade och görade det. Det blev helt värdelöst.
Riktigt, riktigt dåligt. Det fick liksom inga resultat överhuvudtaget i stort sett.
Det svårt kan det vara.
Exakt.
Datasättet jag hittade var också på, det är ett open source-datasätt som någon forskningsrapport var gjord på.
där de gjorde att man ritade någonting och sen fick man se en bild på det man ritade.
Alltså, du fick en riktig bild på det du hade ritat.
Och det de hade då var att de hade ritat av en massa bilder och sen så spottade de ur den bild som var mest lik den du ritade.
Men det datasättet fanns och hade ganska mycket bra bilder att träna på.
Så det var liksom delfiner och elefanter och bilar och vad fan det mer kan vara.
Men väldigt mycket enkla streckbilder.
Och sen slutade med att jag använde Azure's Custom Vision,
som är en tjänst de har för just att träna maskininlärning mot bilder, typ.
Och då kan det vara att man liksom tränar att man ska känna igen någonting eller liknande.
Och det är väl det jag gör också, fast jag tänger lite på det, så att säga.
Okej, men för jag då som har ännu sämre koll på maskininneheter,
men du har ditt projekt och där du integrerar den här Azure Vision.
Mm.
Sa vi det?
Azure Custom Vision.
Ja, alltså jag och namn är liksom det kört.
Och sen så har du den här bilddatabasen som du tog med,
la in den i Azure Custom Vision och låta den träna
och det kommer spotta ut sig i ditt projekt eller funkar liksom?
Ja, alltså i den första varianten, den som jag byggde för typ i år sedan då.
Då funkar det så att jag laddar ner alla de här bilderna.
Så jag har liksom flera gigabyte med ritade bilder på min dator.
Som jag fortfarande inte har tagit bort, upptäckt det häromdagen.
Sen gjorde jag så att jag skrev ett litet Node-skript
som laddar upp de här bilderna och taggade dem mot då Azure's Custom Vision API.
Så att den laddar upp bilderna och taggar dem med vad det är för något.
För jag hade liksom namnet, eller de kommer ju taggade från det datasättet jag laddade ner.
Men sen gjorde jag om det till API-anrop.
Så den laddar upp allting och då får jag upp ett GUI där man helt enkelt ser alla bilder, vad de är taggade som och sen kan man då klicka på typ "train".
Och sen finns det lite inställningar, typ om den ska vara kompakt för att man ska kunna exportera den eller inte, eller om det är flera taggar per bild eller en tagg per bild.
Så det är väldigt användarvänligt, väldigt straightforward.
Och sen är det typ som du säger att den spottar ut sig i en modell.
Och sen så spottar den då ut sig i ett API som du kan testa det här mot.
Så att första varianten gick direkt mot det API-et.
Så att när man spelade så gick jag mot API-et, jag laddade upp bilden som man hade ritat.
Och sen liksom svarade API-et med en procentsats.
Så det är ju extremt enkelt att använda.
API-et är inte supersnabbt, vilket jag märkte när jag gjorde det här, för att det tog ganska lång tid när jag skulle räkna ut alla bilder.
Och sen var det inte så stabilt byggt heller, vilket inte hjälpte direkt.
Och sen finns det lite rate limit på den och grejer, vilket gjorde att var man 10-pash så tog det typ 20 sekunder att räkna ut alla grejer, vilket var lite segt.
Men det funkar ändå. Och den här varianten körde jag ändå. Den var skriven i ett väldigt, väldigt basic Node-skript.
och sen React och sånt.
Men det var typ en engångsjobb?
Hur menar du?
Jag menar du tog de här bilderna och laddade upp dem och fick en modell och sedan var modellen klar.
Det som ändras är om du vill ha ett annat datasätt av bilder eller utöka det.
Exakt, exakt. Så det engångsjobbet var att jag körde skripten och laddade upp allting och sedan tränade modellen.
Hur lång tid tog det att träna?
Nej, det tar inte så lång tid att träna. Alltså nu laddar jag inte upp jättemycket bilder.
Säg att jag laddade upp kanske 3000 bilder, fördelade på 50 olika motiv.
Så det är också lite därför modellen inte är så bra.
Vilket gör det lite svårt själv.
För ju fler bilder man har desto mer träffsäker blir modellen såklart.
Korv eller ben?
Korv eller ben? Ah, nu är jag med.
Ja, med den här grejen när man hade två varmkorvar eller två ben på stranden typ.
Exakt.
Och så skulle maskininlärningsmodeller veta om det var korv eller ben.
Ja, det finns ju väldigt mycket roliga sådana här.
Silicon Valley-serien, alltså tv-serien, de släppte ju någonting som hette typ "Hot Dog or Not".
Mm.
Som bedömde om någonting var en hot dog eller inte.
Ja, precis.
Vilket är väldigt, väldigt kul.
Men precis som du säger så liksom modellen, den levde där liksom.
Sen jag tror att jag valde just 3000 tror jag var för att gratisgränsen går där.
Och jag kände, jag tänker inte betala för det här.
Så att den landade liksom där.
Och sen så, om man gick upp en nivå då blev det liksom att API-ropen började kosta och grejer och sånt där.
Och det orkar man liksom inte riktigt med.
Och den här versionen av spelet var också så att det fanns bara ett rum, eller hur man ska förklara.
Alltså man kunde liksom bara spela en grupp samtidigt.
Man gick in på en URL för att se vad alla ritade och en annan URL för att rita.
Och sen låg den och snurrade när det här spelet var igång hela tiden i bakgrunden.
Så man behövde aldrig göra något själv utan den låg och snurrade.
Men som sagt, den var inte så stabil.
Så då och då var jag tvungen att gå in på Heroku, det är hostar-servern.
Eller backenden.
Och starta om den, för att den hade hängt sig på några vänster.
Klienten ligger på Netlify också.
Vilket är väldigt, väldigt trevligt.
typ favorittjänst jag känner till för tillfället.
Fungerar så jävla bra.
- Ja, jag har faktiskt inte använt Netlify, tror jag.
- Nej, det är alltså för att hosta statiska sidor,
plus att de har en massa grejer som typ så här,
serverlösta funktioner och typ,
om du vill ha ett formulär som skickar data,
då lägger du bara på ett attribut på det formuläret i HTMLn
och så löser Netlify det.
- Ja.
- Typ.
- Släppte inte de något nyligen om att de
Gjorde du massa bra saker gratis eller lade till saker?
Vet inte, de har ju väldigt generösa gratisalternativ.
Så jag betalar ju ingenting, jag kan köra tio sajter på Netlify, betalar ingenting.
Jag gillar också det där avsnittet börjar bli lite så här, hur kan man komma undan gratis på alla tjänsterna?
För betala vill vi inte göra.
Jag kan också säga att jag körde gratisvarianten på Heroku.
Vilket då är att den går ner i så här viloläge, typ, efter en halvtimme i sin aktivitet.
Så att när man skulle spela den här så var man tvungen att vänta en minut innan servern startade upp.
Vilket också var lite drygt.
Men sen då, för...
Kan det vara en tre månad sen eller nåt, typ.
Så tittade jag på FunFunFunctions stream på Twitch.
Han har väl en stor YouTube-kanal, men han har också bostad över att streama live på Twitch.
Och då frågade han folk om vilka hobbyprojekt man hade. Jag bara "Äh, vafan, jag kan ju länka mitt!"
Oerhört fula rita-gissa-spel.
Och sen spelade han det på stream, vilket var
rätt kul. Bra för bekräftelsebehovet, så att man fick se beskärda delar. Man bara "Oh, nice! Folk tycker det är kul!"
Vilket då gjorde att jag tänkte att "Fan, jag kanske ska testa att skriva om det, för jag tycker att det är ett roligt projekt."
Alltså det är liksom en rolig grej att bygga.
Så då beslöt jag mig för att, okej, jag bygger om hela skiten från grunden.
- Såklart. - För det tycker jag är vettigt att göra.
Jag tänkte så här, maskinilärningen kan jag ju låta vara. Den spar väl liksom.
Men back-end och front-end skulle bygga om.
Så att, sagt och gjort så byggde jag om allting så att back-enden är i nestjs nu.
Inte att blanda ihop med nextjs.
- Det här har vi varit inne på förut. - Det här har vi varit inne på förut.
Men det är alltså Nest som är ett...
-Ett näste. -Ett näste, ja. Och inte nästa.
-Solklart. -Oerhört solklart.
Vi länkar såklart i beskrivningen också, om man vill gå in och titta.
Och det är liksom ett Node-ramverk för att skriva typ "The Wrapper Express".
Eller man kan wrappa fler grejer, men by default så "Wrapper Express".
Och kör med TypeScript. Och jag tycker det är sjukt nice för att skriva websocketgrejer
och API-prylar och så här.
Det ger väldigt mycket boilerplate och en struktur som är väldigt enkel att utveckla saker i.
Så jag tänkte att okej, jag skriver backen i det.
Och sen så tänker jag att om jag skriver fronten i React,
tänker att det kan ju inte bara vara React, så tänker jag att vi testar TypeScript också.
Ja, såklart.
Och även Overmind.
Oj, titta! Vilket uttal!
Oerhört bra uttal. Förstår man inte den referensen kan man lyssna på.
Var det typ förra avsnittet? Nej, förra förra avsnittet. Avsnitt två tror jag.
Ja.
Det kommer nog följa med oss ett tag.
Det kommer nog följa med oss ett tag.
Det kan jag få känna.
Och Overmind, nej jag ska fan säga, Overmind.
Overmind är då för statehantering.
Och är man nyfiken på hur den funkar så har vi ett helt avsnitt där jag typ pratar om det, nästan.
Men jag tänkte att i alla fall React i fronten.
Jag tänkte att det är ganska nice att kunna dela TypeScript interfaces och enums och allt vad det heter, typer heter det kanske, mellan backend och frontend.
Och det fungerade faktiskt jäkligt bra. Så alla typer som jag hade i backenden importerade jag till frontenden genom att sätta upp en project reference som det heter i TypeScript.
som är ganska nytt tydligen.
Så att den kan importera det och det blir inget strul.
Förutom då som jag märkte sen när jag deployar det här.
Då stödjer inte Create React App, Project References,
när man deployar, endast av någon anledning.
Fråga mig inte varför, det finns GitHub issues som jag har varit och lagt mig i.
Eller snarare, snarare liksom typ, ventilerat min frustration i.
Lagt lite ved på.
Jag vet inte exakt varför det inte funkar, men det är någonting. Det funkar lokalt, men det funkar inte när det är deployad.
Så har du löst det då? Har du bara dödat det för deploy?
Jag kopierade över alla filer, helt enkelt. Det var lösningen.
Just nu så ligger allt dubbliserat, vilket är mycket, mycket sämre.
För då kan jag göra något i backen, så glömmer jag ändra ifrån den, så bla bla bla.
Såklart.
Men i övrigt så tycker jag fan, efter det här projektet så är jag ändå lite typeskrift frälst för fronten.
Du är ju inte övertygad. Jag tror att vi kanske touchade på det här förut också, men du är ju en typeskrift hatare.
Jag skulle inte kalla dig en hatare. Jag skulle fortfarande säga att jag förstår absolut att det har sin plats och varför det är bra.
Däremot ger det mig mest glädje att koda det. Kanske inte.
Du skulle aldrig lägga in det i ett hobbyprojekt?
Jo, för jag har ju hobbyprojekt för att av ångest lära mig saker, så det skulle jag absolut göra.
Men man hamnar ju i många konstiga situationer, det här funkar inte för det här, det här funkar inte för det här,
och här måste du sätta typ en unknown.
Och om man skulle börja rota i det här så skulle man säkert förstå varför.
förstå varför. Mitt största problem är att jag inte har orkat rota i det, för då kommer man till ett väldigt specifikt problem
och då säger jag så här "ha, shit, okej" då googlar jag på det och så kommer det upp liksom tio bloggartiklar på varför det funkar så
men jag vet ju fortfarande inte riktigt hur typescript fungerar så de här bloggposterna hjälper mig ju inte hela vägen.
Nej, jag förstår, jag förstår.
Så att det handlar väl snarare om att jag borde ta tag i att faktiskt lära mig det men det har jag inte orkat göra än.
Men jag ser ju poängen med typning.
Jag tror att det som jag inte gillar med typningen är att jag
började med JavaScript, jag kom ju från C++ Java och började med JavaScript och bara
"Det här är ju nice, allt är kaos, jag älskar kaos!"
Och då tror jag att TypeScript strukturerar upp saker igen och det är ju skitbra men det är inte riktigt lika skönt.
Vi återkommer alltid till att JavaScript matchar kanske din mentala modell lite bättre.
Vad sa du nu?
JavaScript matchar kanske din mentala modell lite bättre.
Precis så är det ju.
Det här med att dra i trådar och se vad som kommer ut.
Exakt.
Helt plötsligt kommer ett jävla undefined och så allting går sönder.
Det är det som alla får ta, tänker jag.
Ja, men sen så att jag tycker faktiskt att Type-C funkar väldigt bra, till skillnad mot andra.
Men jag tycker ju om den här biten speciellt. Säg att du skapar någonting som jag gjorde nyligen
var att man skapar utifunktioner till exempel. Då har du en väldigt specifik utifunktion
som kräver en väldigt specifik typ in. Det är skitbra att i sådana fall definiera och säga
att jag vill ha in det här för då kommer det här hända. Men får inte jag det här interfacet eller typen
då kommer det gå sönder. Det är ett jättebra sätt att dokumentera saker på.
Så det ser absolut fördelar.
Ja, exakt. Tittar man på backen till exempel, för WebSocket-delen så kör jag Socket.io, vilket funkar väldigt bra.
Socket.io är egentligen bara en wrapper kring native WebSocket som gör väldigt mycket grejer enklare.
Men där skickar man ju meddelanden genom att köra en metod som heter emit till exempel.
Och den metoden har jag liksom "wrappat"
Jag har liksom "wrappat" den metoden
i en annan metod som jag har skrivit en signatur på som är att
Okej, jag måste skicka in
min typade
meddelande typ
Så att jag har liksom spesat att det här är de meddelande jag skickar
för att kunna liksom sen plocka upp dem på y-fronten
Så då kan jag liksom bara använda den metoden och så länge jag använder den då vet jag att jag alltid kommer ha med
den här typade
Vilken meddelande som skickas liksom.
Ja, du vet vad du får in och det är superpraktiskt. Jag ser det ju liksom, absolut.
Så jag tycker det funkar extremt bra. Men jag är ju också sån dig, ibland hamnar man där, man ska göra någonting lite konstigt och man bara "Vad fan är det som händer?"
Och så spottar typeskrifter ut någon felmedia som man inte fattar någonting av.
Ja, och det är så långt och man bara "Vart börjar det än?"
Det landade i att om jag säger att den här funktionen ska returnera det här, då är den helt plötsligt nöjd.
Den gick från femte error-meddelande till att jag får tillbaka en Annie.
Den bara "Okej".
Ja, men det är så det är lite.
Jag har ju påslagit nu att by default, jag tror att det heter strict mode om jag minns rätt,
som gör att den defaultar inte till Annie, utan den defaultar till error.
Vilket har varit ganska skönt, eftersom jag inte är så van med typescript.
Jag sätter inte "an" överallt.
Jag glömmer inte bort att typa för att den kommer klaga.
Så länge den inte kan "införa" på svenska.
Så länge den inte kan "införa" vilken typ det är, då måste den sätta en typ.
Härleda. Härleda, skitbra. Där kom det.
Oj, det satt lång tid.
Jag tycker ändå att det är ganska nice att göra saker ordentligt när jag sitter med TypeScript.
Jag gillar så här, den här parametern in vill jag ha den här typen, de här.
Så jag vill inte heller sätta any överallt, för då ser jag verkligen ingen poäng med att ha TypeScript.
För ska jag ha det, då måste du fylla en funktion.
Men sen så kommer man ibland till sådana här när,
okej, den här funktionen returnerar en array
med två saker i sig.
Det första är en typ av någonting
och det andra är en array av de typerna.
Och hur definierar jag vad den ger tillbaka då?
Det har jag ingen aning om.
Och om TypeScript inte klagar då,
då låtsas jag bara som att jag inte har märkt det
och går vidare med livet.
Ja, jag förstår. Jag tycker det är helt rätt.
Man ska inte, när man tänker att det här kan vara ett jättejobbigt problem, då går man vidare.
Men det funkar så länge.
Det funkar, ingen har sagt någonting. Så då behöver vi inte öppna den på andorras ask.
Exakt, exakt. Sen, jag hostar fortfarande på Heroku, jag hostar fortfarande på Netlify.
Nu har jag bumpat upp till Herokus betalvariant, så jag betalar den 7 dollar i månaden tror jag,
-Är det nåt? -Jävlar!
-Det splurgar ordentligt. -Karantäntiderna.
Exakt! Karantänhoppningen går ut över en tjänster i stället.
När jag släppte första versionen av det här, när jag började testa med kompisar-
-då märkte jag att minnesavändningen steg ganska snabbt.
Ganska snabbt upp i över 512 MB
Som var
gränsen på den här gratisvarianten eller på betalvarianten jag körde liksom
Och då började jag ju swappa grejer så här råkar det ju bra på det här, den dödar inte tjänsten eller den cappar det inte utan den går ner på swap istället
Så att den kan liksom fortsätta men det går mycket mycket långsammare
Swappar betyder att den skriver disk
Istället för
RAM-minnet
tror jag
Om jag inte är helt ute och cyklar
Nej, jag killisar
Men jag bara "Vad fan är det för levet?"
Och så tänkte jag, just det, jag har ju faktiskt ingen databas, utan jag har ju allting i en memory.
Så hela min state-hantering i backen var i stort sett att jag hade ett objekt som heter games.
Där jag så fort det kom in ett nytt spel, då lade jag till grejer i den.
Och så fort jag skulle rita linjer, då lade jag till dem i det och så vidare.
Ja, och det har du ju sagt att du trodde som sagt att det var minnesproblemet, men var det minnesläckarna då?
Nej, alltså jag skrev ju om det så att jag har en databas nu. Så nu kör jag liksom MongoDB för databasen.
Det är ganska vettigt att jag har en databas. Det är ganska vettigt att kunna gå in och titta och det är lite kul för jag vill kunna liksom att dra lite statistik och grejer.
Alltså typ visa såhär att de är samma gånger när du spelat eller samma gånger när ert snitt och lite sådana grejer.
Och det är lite enklare att ha det i databasen bara.
Men sen släppte jag det och när jag releasade i fredags, söndag eller vad då, då slutade,
också att jag fixade databasen, testade aldrig, av minnskullighet men jag var fixade.
Utan jag bara, ja, nu är det löst.
Testing in production.
Väldigt, väldigt mycket testing in production.
Så jag vet inte riktigt hur jag tänkte. Jag tänkte bara att det är uppenbart att det är det där.
Det var det inte.
Så när jag släppte det och skrev lite på Twitter och lite här och där
så var det faktiskt folk som gick in och skapade spel och spelade och den stack ju iväg i taket ganska snabbt.
Så jag har liksom gått in lite då och då och bara "restart".
"Restart lite då och då för att liksom bara sätta ner den igen"
Det gick liksom ändå, det tog ändå kanske två timmar eller något när folk spelade
För att den skulle gå ut i taket
Och jag bara "Okej men det är inte så poppis"
Så jag gick in och restart lite då och då
Och funderade såhär, vad fan är problemet?
Sen igår tänkte jag att okej, men nu tar jag tag i det
Nu måste jag lösa den här skiten
Så jag började googla hur man löser minnesläckor i Node, bla bla bla
Hittade ett npm-paket som heter Node/Memwatch tror jag
som var skitgammalt, typ sista Comitten från åtta år sedan.
Jävlar!
Ja, exakt. Men det var väldigt, väldigt mycket forkat.
Och det fanns en ny variant som Airbnb hade, som var liksom samma, fast den var den senaste Comitten för kanske en månad sedan.
Och jag bara "ah, score".
Så körde ner det, testade lite grann och så där. Man kunde få ut liksom totala heap-användningen.
Heapen är väl då, alltså hur mycket min är du använder.
och loggade den lite grann när jag baserade så här, när jag spelade så går det upp.
Och jag bara, vad fan är det som händer?
Sen hittade jag en till metod där man kunde mäta mellan olika punkter,
som var skitnice. Då fick du se så här, du satte en start och så satte du en end-funktion så här ihop.
Och vi startade började med att mäta och sen vi end-slutade med att mäta,
och så fick du ut ett resultatobjekt och då kunde man logga liksom där, och så hade den en så här
before 45 MB, after 53 MB.
Och då såg jag att den steg ju då fortfarande för varje steg jag tog, eller för varje spel som spelades.
Så att det var ju väldigt mycket, det är lite så här console log debugging på det här.
Men jag har liksom inga bättre alternativ.
Det slutade med att jag tog den här, stoppade start och endanropen på olika ställen i min applikation.
Alltså där jag gjorde olika saker.
Och såg vart erroren ökar.
Du sparar någonting som du inte borde spara.
Exakt.
Och först tänkte jag så här, okej, men det kanske har någonting att göra med alla sträck som folk ritar.
Det var det inte.
För de kastade jag bort.
Så det var nice.
Men sen visade det sig att det var på ett specifikt ställe som det hände.
Och det var när man räknade ut poängen.
Och här är också en skillnad från den första varianten jag byggde.
För det jag upptäckte var att det här Azure Custom Vision tillåter dig att exportera hela din modell.
Så det jag gjorde var att jag laddade ner hela den modellen och sedan körde jag TensorFlow.js.
TensorFlow är ju då ett bibliotek för maskininlärning.
Och den kunde då ladda in den här modellen så att jag kör modellen lokalt istället.
Istället för att göra API-anropen till Azure Custom Vision.
För det första så går det ju hundra gånger snabbare.
Tidigare hade jag ett state i fronten där det stod "calculating"
Då man väntade ofta 20 sekunder på att den kalkylatade
Statet finns kvar, men det syns aldrig längre
För att det går så jävla snabbt att räkna ut nu
Men då visade det sig också väldigt mycket så här att
Det här var väldigt mycket stack overflow, copy/paste, programmering i hur jag fick den här att funka
Vi har en klass som helt enkelt
Tar in indatat som jag får och sen så gör den om det till
Den typ ritar ut det på en fake canvas-objekt, för man ritar på canvas i frontenden.
Så då ritar jag ut det på en fake canvas i backenden för att få till en till bild, istället för bara att ha massa data.
Och sen så från den canvasen exporterar jag ut det till någon annan datatyp, kommer inte ihåg exakt var det är just nu.
Kanske dat64 heter det.
Ja, jag är lite borta nu känner jag.
Ja, men det är så här då.
Vi börjar om.
Du tar det från fronten, plockar bak dig backen,
som också ritar upp det på en canvas för att du ska se vad du håller på med,
för att du ska kunna få en bild du kan spara som data.
I stort sett. I fronten har jag ett litet bibliotek
som "wrappar" canvasen för att kunna rita.
Så det som den spottar ut är att vi ritade ett streck
från den här punkten till den här punkten,
som var så här brett i den här färgen.
Nu finns det bara en bredd och en färg, men det är stödigt för att göra med fler grejer.
Och den datan som jag får ut är ju bara liksom, den kan jag bara återanvända för att rita ut det
genom biblioteket igen så att säga.
Det är inte bilddata, rådata som jag skickar.
Men det är typ linjer, algebra?
Ja, precis. Jag sparar ner varje streck man ritar av för sig.
Och det är just för att jag ska kunna skicka det till, via backenden, skicka ut det till en
en dashboard eller en rumsbild där man ser allas ritningar så att man kan se alla sträck i realtid när de ritas.
Så eftersom jag gör det här så har jag inte bilddatat i backenden, men det jag gör är att jag kör upp en låtsas canvas i backenden
som jag sedan använder sambibliotek på för att rita ut den här bilden.
Och sedan från canvasen exporterar jag bilddatat.
Och bilddatat stoppar jag då in i något som i TensorFlow kallas för en tensor.
Nu är vi väldigt på tunn is för mig, för jag har ingen aning.
Det här är kanske en stor anledning, jag hade min släckan.
Så det man gör är att jag stoppar in den här bilddatan i något som heter en tensor.
Tensor är typ någon typ av Lego-block, Lego-grej i TensorFlow som man bygger saker med.
Matar in den i en modell som jag då har laddat från den exporterade modellen från Azure Custom Vision
och utspottar den sig sannolikheter på att det här är olika saker då.
Vilket blir ett poäng i min typ.
Ja, saker.
Det var väldigt mycket saker där.
För mig är TensorFlow väldigt mycket saker.
Det är liksom den abstraktionsnivån jag ligger på.
Jag har inte ens en abstraction, det är sådär. TensorFlow, det är sådär machine learning och data och grejer, jag fattar ingenting, det får vara där borta.
Så jag är med.
Det är bra, och det är också ganska intressant egentligen.
Inte vad maskininlärning säger, men att det är exakt vad jag gör.
Men det visar sig att där, när jag gör uträkningen så växer det med ungefär två megabyte.
För varje bild jag betygsätter.
Som det typ 10 personer spelar.
Ja, då växer det med 20 MB i ramanvändning varje gång jag kör.
Så ja, det var inte jättebra.
Så då började jag googla lite grann.
Och det visade sig att så är det.
För att den här Tensorn, en anledning till att jag tog upp den är för att
den hanteras inte av Tensorflowjs.
av sig själv. Så att om jag inte gör någonting med den, då kommer den leva för evigt.
Ah, så du måste däda den?
Exakt. Och det man gör är att man anropar en metod som heter dispose, som i alla minneshanteringsspråk.
Men sen finns det även en, för att slippa göra det här manuellt, så finns det en metod som heter tf, som är TensorFlow, som är ramverket, punkt tidy.
Och sen skickar man in en funktion där som man vill köra.
Och alla tensor som man skapar där i, i Tidy, det minneshanteras.
Så en vanlig hederlig städning helt enkelt.
Exakt. Så nu gör jag en liten blandning.
För det gick inte riktigt att bara köra Tidy, för den klarar inte av async-grejer.
Så i Tidy gör jag lite grejer, och sen utanför den,
utanför den, så det enda jag gör där är att plocka ut den sista
sannolikheten som jag får ut av procentsatsen.
Och sen dör jag det manuellt, den tensor som jag plockar ut
av den datan ur.
Shit alltså, man är så bortskämd med att inte behöva städa
efter sig själv.
Ja, gud. Jag har inte minneshanterat på flera år.
Nej, inte jag heller. Det är så här, när man satt i minnesträsket
i C++, det var då jag bara så här, "Nej, det här är inte för mig."
Så det har den nog släppt. Vilken resa.
Ja, det var lite spännande faktiskt. Det var intensiva timmar igår kväll, över typ tre öl tror jag innan jag lyckades hitta det här.
Men fan vad glad jag var när jag lyckades lösa det.
Ja, det förstår jag. Satan vilka jävla slut på resan. Slutar lyckligt liksom.
Ja, det slutade väldigt lyckligt.
Så nu ligger den uppe, och nu tror jag...
Min svändning, jag har kollat lite grann nu.
Ser ganska bra ut.
Du har inte behövt starta om.
Jag har inte behövt starta om någonting, det har inte gått upp någonting.
Nej.
Så att den lever.
Och funkar och mår bra, liksom.
Så ja, jag tror typ att jag stannar där.
Det finns inte jättemycket mer att säga.
Vill man veta mer så pingar ni på Twitter så kan jag...
...prata väldigt, väldigt länge om saker.
Särskilt om Overmind.
Overmind, ja. Härligt.
Men om inte du känner att du har någon mer fråga, eller vill gräva ner dig i Draw.wtf, som spelet heter. Jag är nog i Sarens.
Nej, det är ju Urlend du har också.
Ja, precis. Vill man spela det så finns det på Draw.wtf.
Och det ligger uppe.
Jag tänker att jag håller uppe.
Jag tycker att det är fan ett av de roligaste projektet jag byggt, tror jag.
Så att det får leva. Jag betalar som sagt 7 dollar i månaden för att ha det igång, och det får du fan leva.
Det kan jag stå isär.
Han startar snart också en Patreon.
Nej, men från mitt perspektiv är det ett skitkul spel att spela.
Så det tycker jag absolut att ni ska testa och köra.
Här skulle jag också vilja slänga in en bild på Anton som har försökt att rita en delfin en gång.
Jag ska se om jag hittar den och kan lägga upp den.
Men för att det är ändå mycket glädje skulle jag säga.
Det är väldigt mycket glädje, det är det.
Det är roligt för att man inte hinner rita så bra på 20 sekunder.
För det andra så är det ganska svårt att rita på dator eller touch på telefonen.
Ja, och sen kan man också se skillnaden. Jag ritar på trackpad och en annan på en touchtelefon.
Det kan göra ganska stor skillnad. Rita med mus vet jag inte om det ganska går.
Det är jävligt svårt. Och sen som sagt, inte den bästa maskininlärarmodellen.
Nej.
Vilket hjälper inte heller.
Vi kan avsluta med att lite grejer jag funderar på att göra i framtiden.
För jag tänker att jag ska försöka bygga vidare på det.
Det jag skulle vilja göra är typ att man kan göra lite inställningar själv
om man skulle vilja spela längre omgångar.
Så att du får rita i en minut.
Så att man kan ställa in de där grejerna själv.
Det finns typ stöd för att skicka in egna inställningar nu
men det går inte via fronten.
Men sen funderar jag också på att testa att bygga ut det.
Jag funderar på att testa att bygga en pro-variant som kostar typ en dollar.
Som låser upp någonting. Jag har ingen aning vad.
Men mycket för att lära mig saker så behöver jag ofta projekt.
Så nu skulle jag kanske vilja lära mig att integrera Stripe som är en betallösning.
Eller liksom integrera någon betallösning.
Eller liksom bygga och använda hantering själv från grunden.
Med ett API-överklänt.
Absolut, jag förstår den grejen. Jag bara gillar det omvända i att...
För att man ska kunna betala för något.
Ehh... som vi kommer på sen.
Ja, jag vet inte. Jag kan väl träna lite fler bilder.
Så istället för 50 olika motiv får man 100 motiv.
Om man betalar en dollar.
Eller så kanske man får ut motiv som du har ritat.
Ja, exakt.
Man kanske kan få...
Vi kan ju bygga någon tjänst där man liksom kan skicka de ritade bilderna som vikort till kompisar.
Nu hörde jag det. Jag älskar sådana här idiotiska grejer.
Och sen får man betala en dollar för det. Det är perfekt.
Ja, annars om ni har idéer så kan ni tagga eller twitta Anton.
Ja, gör det. Jag finns på @Avnton med ett W efter A1.
Ja, jag finns fortfarande på @tcomstadius.
Men jag är ju, alltså vår skillnaden i vår aktivitet på Twitter är enorm.
För mig går det väldigt mycket i vågor. Nu är jag inne i en Twitter-period.
Och sen kan jag vara dött i tre månader också.
Jag är mer en sån... Vad säger man i så här spel? Jag campar mycket.
Ja, du är en lurker.
Nej, men så ibland så får jag feeling och så drar jag en tweet om något dåligt programmeringsskämt eller ångest på jobbet.
Ja, men det är ju kvalitet.
Nu tycker jag inte att vi ska dra ut på det så mycket mer.
Nej det ska vi inte.
Vi blir superglada om man ger oss en liten betyg i iTunes eller recension.
Och annars säger vi vad som.
Okej, tack så mycket. Hej!
Bye bye!
[Outromusik]