Basic personligt

Daniel Brahneborgs blogg

Dags för nästa nivå

Tidigare i höstas konstaterade jag att det inte kommer bli någon masterexamen för min del. Att sluta plugga kändes däremot inte aktuellt, att lära sig nya saker är alldeles för kul. En idé jag funderat på ganska länge är att komplettera med mer matte, för att åtminstone komma upp i en kandidat där. Examina i flera ämnen är kul. Tyvärr skulle det kräva både en rejäl repetition av derivator och integraler, samt fler kurser om det. Jag kanske hamnar där förr eller senare ändå, men just nu kändes det inte speciellt lockande.

En av lärarna på testkursen jag gick i våras pratade under en rast om konceptet industridoktorand, och jag lyckades aldrig riktigt släppa det. Min uppfattning om forskarutbildning var innan dess att det krävde att man var anställd som lärare på ett universitet, samtidigt som man gjorde vad man nu mer behövde göra. Nog för att det är kul att prata om saker som jag tycker är intressanta, men det är ett ganska stort steg därifrån till att vara någon typ av någorlunda pedagogisk lärare.

Tydligen finns en annan lösning, och det är att bli just industridoktorand. Ens normala jobb krymper då till 20%, medan forskarutbildningens fyra år tar de övriga 80%, så totalt är det ett projekt på fem år. Tricket som gör att man inte även får en lönesänkning på 80% (det vore en smula suboptimalt) är att man fokuserar kurser och forskning på områden som arbetsgivaren har nytta av. Företagets produkter kan bli bättre, man kan hålla interna seminarier för sina kollegor, och så vidare. I en del fall sker även viss sponsring från någon stiftelse.

Många mail senare är det därför exakt det jag ska göra, med start nu vid nyår. Det återstår viss formalia, men nu finns tillräckligt många påskrivna papper och dokumenterade planer för att risken att det inte ska bli av ska vara försumbar. De närmaste åren kommer därmed bestå av kurser, en väldig massa läsande, skrivande av några vetenskapliga artiklar, diskuterande, resande, och en del annat. Därefter, vilket alltså blir någon gång i början på år 2022, kan jag använda titeln doktor. Ämnet är datavetenskap, området någonstans mellan test och nätverk. Jag kommer börja med ett testrelaterat problem, så får jag se vad som händer sedan. Eftersom jag har gått senaste kurserna på MDH i Västerås är det där jag kommer ha mina handledare.

När jag började på universitetet i Umeå 1989 visste jag ungefär vad jag skulle göra fram till 1993. Det är lite samma situation nu, men med en signifikant skillnad. Nu vet jag, efter NaNoWriMo, magisteruppsatsen och de kurser jag gått sedan dess, att mycket av det jag kommer lära mig är saker jag varken vet att de finns eller ens kan föreställa mig. Både om datavetenskap i sig, men kanske ännu mer om andra ämnen och hur jag själv fungerar och vad jag tycker är kul och intressant. Jag vet att de där sekundära insikterna alltid kommer, men också att de alltid är oförutsägbara. Numera är de min drog, och jag ska få jaga dem i fem år framåt.

Jobbigt? Tja, kanske. Ordet “förmodligen” ligger nog närmare sanningen, men jag föredrar total förnekelse på just den punkten. Skitkul? Definitivt.

pixelstats trackingpixel

November 18th, 2016 Posted by Daniel Brahneborg | blogg | no comments

Ingen masterexamen

När jag började på min magisteruppsats för ungefär två år sedan, hade jag framför allt två alternativ. Antingen gjorde jag klart den så den blev godkänd före sista juni 2015, eller så gjorde jag en kandidatuppsats först. Efter en sådan skulle den magister jag började på 1989 vara körd, men skulle kunna byggas på till en magister eller master efteråt med lite fler kurser och ytterligare en uppsats. Där och då kändes det första alternativet mest lockande, så jag inte skulle behöva köra uppsats-racet fler gånger än nödvändigt. Få en treårig examen med fyra års kurser i ryggen? Nej tack.

Jag fick min magisterexamen, och fortsatte plocka kurser för att nå upp till en masterexamen. Det är ett år mer, så det var ett lagom steg uppåt. Kurser kom och gick, och nu till våren skulle det bara vara uppsatsen kvar. Eftersom jag gjort en “stor” (dvs 30 hp) uppsats skulle det nu räcka med en “liten” på 15 hp. Jag skulle tills dess ha tillräckligt med poäng, och tillräckligt stor andel både av de gamla och nya poängen inom datavetenskap på avancerad nivå. Lugna puckar. Då skulle jag ha nått taket inom universitetsvärldens grundutbildning, samma nivå som “master” internationellt, och som en civilingenjör. En magister är ett lite underligt mellanting.

Nu är det ansökningsperiod för vårterminen, så jag började söka runt på antagning.se för att hitta vilken kurskod jag skulle söka. Inga träffar, bara masteruppsatser på 30 hp. Kollade runt på några universitet, men hittade inga 15-poängare där heller. Mailade några lärare från tidigare kurser, och hamnade till slut hos en studievägledare som avslöjade att min plan inte fungerade. För att ta ut en masterexamen får man inte återanvända någonting från tidigare examen, och den går bara att nå från en kandidat. Eftersom en master är på 2 år, skulle det innebära totalt 6 års studier för en 5-årig examen. Min magister (= 4 år) räknades alltså som likvärdig med en kandidat (= 3 år). Det lämnas som en uppgift åt läsaren att gissa hur många svärord jag tänkte, nivån på min kränkthet osv, när jag fick reda på detta. En ledtråd kan fås genom att googla på “Grahams number”.

Lyckligtvis så finns andra vägar jag kan gå för att levla upp, men detaljerna kring det tänker jag vänta med att avslöja tills alla formalia är klara. Just nu känns det väldigt bra i alla fall.

pixelstats trackingpixel

October 5th, 2016 Posted by Daniel Brahneborg | blogg | no comments

USA-resor på gång

Efter två vändor till Kalifornien 1995 har jag faktiskt aldrig varit tillbaka i USA. Det blev en vecka i Montreal (vilket i praktiken är USA fast lägre risk för rån och folk pratar helst franska, väldigt bisarrt) för några år sedan, men det är allt. Så kom en kund och ville ha support på plats, så om två veckor är det dags att ändra på det där. Ovanligt hög “hoppsan, nu är det visst på riktigt”-känsla när flygbiljetten var beställd, underligt nog. Det ska hur som helst bli kul att återse Silicon Valley igen, om än bara för några dagar.

Till och från ägnar vi dessutom en del tid åt att planera en resa till den där tidszonen i augusti 2017. Då kommer nämligen en total solförmörkelse svepa lite diagonalt över USA. Den kommer in över Oregon, och fortsätter sedan österut. Ett år kvar, lugna puckar. Tills Janne berättade häromveckan att hotellen börjar fyllas på redan nu. Jahapp. Jag kollar på kartan, och börjar googla efter hotell i de städer som ligger mest i mitten av banan. Oh, Salem! Nej, fullt överallt. Dallas (nej, inte den i Texas)? Fullt. Något enstaka hotell för 400 dollar natten här och där, men så kul ska vi nog inte ha. Det fanns ett gulligt Bed&Breakfast i rätt område, men de hade ingen onlinebokning. Jag mailade, och fick svar att alla deras rum var bokade den natten sedan flera år tillbaka. Om man tog med sig ett eget tält hade de plats i sin trädgård, ungefär. Lite charmigt, så dit borde man kanske ta sig någon annan gång. I kategorin “för dyrt” fanns ett rum på Shilo Inns, som ligger direkt vid kusten. Tänk känslan att stå där när skuggan kommer farande över vattnet.

Efter en lång förmiddag med flera personer som googlar för fullt, hittades i alla fall ett hotell med lediga rum till rimliga priser. Förmodligen är det läge att boka flyg dit snart också, fast det är ju mer flexibelt. Man kanske måste åka dit en dag tidigare, buhu liksom. Känner jag det där landet rätt så kommer det finnas evenemang, sightseeings och annat ungefär överallt ändå. När det är knökfullt med folk som uppenbarligen planerat det här i minst ett år har det ju viss potential att bli ballt. Det jag vet redan nu, är att jag definitivt inte ska försöka fota. Kanske området och sånt, men inte själva solen. Det finns det andra som har bättre utrustning för. Jag vill bara njuta av synen. För att inte tala om glädjen av det faktum att jag har personer i min närhet som vill vara med.

Ja, det är fullt rimligt att lägga pengar på en sådan här resa, för något som egentligen bara pågår i knappt två minuter. Vad det totala timpriset skulle bli kommer jag däremot inte räkna ut. Nästa gång (2019-07-02) krävs en kryssning en bra bit ut i Stilla Havet. Förvisso skulle det också vara kul, men en aning besvärligare. Därefter USA igen 2024, och sedan Island 2026.

pixelstats trackingpixel

October 3rd, 2016 Posted by Daniel Brahneborg | blogg | no comments

Experimentet som inte bevisade relativitetsteorin

De som har läst om relativitetsteorin på fysiken kanske kommer ihåg Michelsons experiment på 1880-talet, där han mätte ljusets hastighet i två olika riktningar för att mäta hur snabbt jorden rörde sig genom etern. Han fick samma hastighet åt alla håll, alltså är relativitetsteorin sann. Typ så.

Tyvärr var det inte riktigt så enkelt. Att mäta ljusets hastighet på 1880-talet gick ju inte, det fanns inte i närheten av tillräckligt bra precision i den tekniska utrustningen. Istället skickade han ljuset i två olika riktningar, lät de mötas genom en halvgenomskinlig spegel, och undersökte om interferensmönstret ändrades. Eftersom ljus är vågor, skulle en ändring i hastighet när man roterade på hela apparaten göra att vågorna från ena hållet skulle komma lite tidigare eller senare än förut, vilket skulle göra att våg+våg skulle bli annorlunda.

Problemet är då att eftersom ljuset måste åka fram och tillbaka i respektive riktning, går det först aningen snabbare, och därefter aningen långsammare (om det där med etern stämde). På grund av algebra så blir summan trots allt inte noll, men vansinnigt liten. Därför måste experimentet göras i en källare under ett klimatkontrollerat hus, för att undvika skillnader i temperatur osv. Det måste också utföras uppe på en bergstopp, helst ute i det fria, för att undvika risken för att etern “fastnar” mellan husens väggar eller liknande. Lite “good luck, have fun” över det där.

Dessutom formulerades (jag funderade på att skriva “uppfanns”, för att ge alla som vet någonting om någonting ett totalt psykbryt) relativitetsteorin inte förrän 20 år senare. Vad den skulle ha krävt för precision eller liknande för att bli bevisad, visste Michelson därför inte. Till att börja med skulle vilket värde som helst som inte var noll varit signifikant, och dessutom struntade han i att ta hänsyn till att kanske även solen rör sig genom etern, vilket skulle gett en sådan där fram-och-tillbaka-grej till. Nya tester tre och sex månader senare hade varit extremt intressant, något han inte gjorde.

Ungefär där kommer man till nästa nivå av protest, nämligen att det varken då eller nu går att bevisa en vetenskaplig teori. Det går att ge den stöd om den gör tillräckligt bra förutsägelser, men det är allt. Bevisa dem? Nope. Det enda man kan göra är att försöka falsifiera dem. Ju sämre det går, desto bättre är teorin. Denna ganska strikta syn formulerades av Karl Popper 1934, vilket var flera decennier efter att relativitetsteorin ifråga publicerades. Principen fanns säkerligen även tidigare, men kanske inte lika tydligt.

Det är inte utan att vetenskapshistoria är lite kul.

pixelstats trackingpixel

September 14th, 2016 Posted by Daniel Brahneborg | blogg | no comments

Språkkurs?

Jag skulle gärna vilja kunna prata fler språk, och sedan en tid tillbaka står tyska högst upp på önskelistan. Visserligen läste jag det i två år i gymnasiet, men de kunskaperna är borta sedan länge. Inte för att jag vet när jag ska ha tid med att lära mig ett nytt språk, men det är ett annat problem.

Den större frågan är om det går att hitta en lämplig kurs/metod/program/app överhuvudtaget. På gymnasiet var det ett fokus på grammatik på full OCD-nivå, och med ett dåligt detaljminne gick det därför inte så bra. Jag provade programmet Rosetta Stone ett tag, men utan tillräckligt perfekt uttal och annat kom jag inte så långt.

Visst, jag förstår också att en viss nivå av korrekt grammatik behövs förr eller senare. Men kan det inte få vänta lite? Det går att förstå mänskliga språk även med ganska stora fel i ordföljd, böjningar osv. Efter tillräckligt många meningar är jag övertygad om att det där reder ut sig ändå, eftersom man då får en rejäl databas med fraser att hämta uttryck från. Ett ex lärde sig skillnaden på “en plan” och “ett plan” via filmerna om Jönssonligan. Inga “durch für gegen”-ramsor necessary. Antalet situationer där det inte går att lista ut av sammanhanget vad som menas när enbart grammatiken är lite skev, känns väldigt begränsat. Det går alltid att fråga i så fall.

Om mitt mål till att börja med helt enkelt är att kunna turista på ett vettigt sätt i ett tyskspråkigt land utan att behöva använda sambon som tolk, inte att jobba som korrekturläsare på Die Welt, vart vänder jag mig då? Det går ju alltid att flytta till typ Berlin och köra “French Café” (eller i det här fallet kanske German Bierstube)-metoden, men det känns lite onödigt besvärligt.

pixelstats trackingpixel

August 31st, 2016 Posted by Daniel Brahneborg | blogg | no comments

Ny disk

Jahapp, då är hårddisken på servern som kör RSS/Ping utbytt. I början gick det ganska bra, eftersom det fanns lediga kablar för både ström och SATA, och datorn sedan bootade fint. Den har två partitioner, och båda är backupade till en annan dator. Lite fdisk, mkfs och “rsync -av”, så var grunden klar. In i nya diskens /etc/fstab för att ändra vilka partioner som skulle användas, men så var det ju det där med Grub. Jag hatar Grub.

Jag googlade ganska mycket, och kom fram till att den “grub-install” och eventuellt en “update-grub” skulle räcka. Stäng av, ut med gamla diskens sata-kabel, omstart. Grub går igång, men stannar omedelbart med ett “error 21″. Väldigt hjälpsamt. Tydligen betydde det att den inte hittade den disk den ville ha.

Mer googling, utan resultat. Lite väl många träffar var svar av typen “men den där distributionen är ju mer än ett ÅR gammal, varför kör du sådana antika saker?”. Tröttsamt. Nya försök, fortfarande error 21. Vid något tillfälle gick inte Grub igång alls, men det löste sig när jag kopplade bort några diskar som ändå inte användes längre. Att köra chroot först, för att på det sättet tvinga Grub att bara se den nya disken, funkade inte. Inte ens med några “mount –bind” för /dev och sånt. Den letade fortfarande efter den gamla disken.

Grub har en konfigurationsfil som börjar med en stor “automatgenererad, ändra inte i den här”-varning. Alltså ändrade jag i den, och la till ett entry som sa att den skulle boota med samma kernel och grejer som vanligt, men med nya disken som root-partition. Det funkade faktiskt. Grub kom då från gamla disken, men hela filsystemet låg på den nya. En ny grub-install, reboot med gamla disken urkopplad igen, och tada! Grub gick igång från den nya disken, hittade sin konfigfil, och fick igång Linux.

Gamla disken hade fått läsfel, så MySQL-databaserna fick jag skapa om från backuper, men sedan var allt igång igen. Det hela tog bara fyra timmar, hurra. Jag gillar verkligen inte hårdvara.

Att alla diskar monterades via UUID var förresten en väldigt bra idé. Tack vare det kunde jag koppla in och ur diskar hur jag ville, utan att monteringspunkterna ändrades. Om disken hette /dev/sda eller /dev/sde spelade ingen roll, för det namnet användes ju inte ändå.

pixelstats trackingpixel

August 21st, 2016 Posted by Daniel Brahneborg | blogg | no comments

Teknisk utveckling?

Kan Moore’s Law vara vänlig att börja fungera igen? På sätt och vis är det skönt när inte klockfrekvenser och minnesstorlekar flerdubblas varje år, så man inte behöver bry sig om att köpa nya datorer i tid och otid, men nu börjar det bli besvärligt.

Jag gillar min lilla elvatums MacAir, men skärmens upplösning är patetisk (1366*768). Så kom Apple med en ny MacBook nyss, som både var ungefär lika stor, märkbart lättare, bättre upplösning, men till och med långsammare cpu mot den jag har. En satans massa pengar för i praktiken bara några fler pixlar? Nope. Någon gång i höst skulle det möjligen kunna komma en ny MacBook Pro, men vad det skulle innebära återstår att se.

Så gick fodralet till min surfplatta sönder lite extra mycket idag. Tyvärr är plattan tre år gammal, så det finns inga nya skydd att köpa längre. Kanske dags att uppgradera till en nyare modell? Nej, för de plattor som finns i samma storlek har ungefär samma specar. Någon cpu-kärna till, någon tiondels gigahertz mer, men samma batteri och upplösning. Kortläsare, men utan trådlös laddning. Meh.

Vibrationen på min mobil verkar ha slutat fungera, men där har det inte heller hänt så mycket. Nu när jag testade en gång till för säkerhets skull, funkade det klockrent. Vaffan? Samtidigt har den börjat göra slut på batteriet lite väl snabbt, men eftersom batteriet inte är utbytbart är det inte så mycket att göra åt. Dvs mobilen som helhet funkar, men en uppgradering till någonting med en märkbar förbättring här och där skulle vara välkommet. Samtidigt krävs ett mikroskop för att hitta några relevanta skillnader mellan min nuvarande LG G3 och årets G5.

Nu ska jag googla “ilandsproblem”.

pixelstats trackingpixel

June 26th, 2016 Posted by Daniel Brahneborg | blogg | no comments

Matte och pedagogik

Det där med att när ens senaste verktyg är en hammare så ser alla problem ut som spikar, är någonting jag försöker upphöja till konstform. Min senaste hammare, om någon mot förmodan har missat det, är testning. Eller faktiskt mer och mer, de matematiska modeller som ligger bakom, där testning är en tillämpning av dem. Mer specifikt: grafteori och kombinatorik.

Om ens program implementerar en statemaskin kan man använda state och edge coverage för att se hur stor del av programmets logik man testar. Om de olika delarna av indatat är oberoende av varandra kan man använda base choice (man börjar med neutrala värden på allt, och så vrider man på en ratt i taget) för att metodiskt säkerställa att alla värden hanteras korrekt. Där det finns beroenden kan man istället använda combinatorial testing, där man väljer ut en minimal delmängd av “alla med alla med alla”.

Det som slog mig häromdagen är att det här är ju faktiskt exakt så som bra instuderingsuppgifter fungerar. Först får man en enkel grundsituation. Sedan ändrar man till imperfekt. Periodisering över två år istället för allt på en gång. En matris där bara en rad kan transformeras bort. En justering i taget, klockren base choice. En av de saker som jag felrapporterade med ekonomiboken jag läste förra våren var att när de gick igenom aktier och emissioner, var övningarna på både nyemission och fondemission samtidigt, vilket gjorde att jag aldrig fick bra koll på dem (och därmed inte godkänt på just den delen på tentan).

När base choice-testerna är klara, kan man då gå vidare till combinatorial, och skruva på fler parametrar i taget. Att en eventuell tenta på slutet innehåller nya kombinationer gör då ingenting, eftersom man ändå har gått igenom alla relevanta varianter. Historia å andra sidan lämpar sig förmodligen bättre för state/edge-coverage på dess mindmap-graf.

Frågan blir då: hur mycket av det här är redan undersökt? Alldeles för många av de övningsuppgifter jag har sett under åren känns mest som exploratory testing, a.k.a. “klicka sig runt på måfå”. Är en sådan här mer matematiskt baserad lista på övningar använd någonstans? Finns det några forskningsresultat? Det finns ju viss risk för vidare studier i mitt liv, så jag har ju gott om tillfälle att testa det här på mig själv om inte annat.

pixelstats trackingpixel

June 24th, 2016 Posted by Daniel Brahneborg | blogg | no comments

Studier

Ju mer jag tittar på och förstår av min lista på avklarade kurser, desto mer förvirrad blir jag. Både ämnen, nivåer och antal är så knäppa att jag borde skämmas. Att nivåerna helt har ändrats mellan när jag började plugga och nu, gör det i och för sig inte enklare. När jag började plugga fanns nivåerna A-E, som var och en representerade en termin. För en fyraårig magisterexamen skulle man då ha 30 poäng (dvs en termin) på varje nivå mellan A och D, plus lika mycket till av andra ämnen. Jag har länge trott att av de återstående 120 poängen ska 60 poäng vara inom ett sidoämne, matte i mitt fall, och 60 poäng helt valfritt (hej finska, evolutionsbiologi osv).

Så tittar jag på mina kurser, och där ser det väldigt annorlunda ut. 30 poäng A-data i och för sig, heja mig. Fast sedan bara 21 poäng B. Hur har jag då fått behörighet till massa kurser på högre nivå? Sedan har jag 60 jäkla poäng på C-nivå. Därefter blir det fint igen med 30 poäng på D-nivå, plus 30 poäng för D-uppsatsen. Nackdelen med alla de där C-poängen, är att jag då bara hann med 45 poäng matte, nästan allt på A-nivå. Det är inte alls samma sak som 60 poäng varav hälften A och hälften B. SÅ mycket matte kan jag i alla fall.

Numera har de ändrat lite, så att A-C räknas som grundnivå, dvs upp till en kandidatexamen, och D-E är avancerad nivå för magister och master. Som tur var så räknades 3 av C-kurserna nu som avancerade, vilket gjorde att jag faktiskt har just 30 poäng på avancerad nivå istället för bara 7,5.

För den masterexamen som jag siktar på att nå fram till någon gång nästa år, behövs utöver magisterexamen 15 poäng till på avancerad nivå och 15 poäng uppsats/exjobb, samt 30 poäng valfritt. Vårens kurs i testning gav mig 7,5 poäng, och 22,5 poäng av de där 30 jag har nu jobbat ihop (affärsredovisning, Androidprogrammering, evolutionsbiologi). Att jag kommer ha 216 poäng data av 300 gör förhoppningsvis ingenting, eftersom det inte gjorde något att jag hade nästan 180 poäng av 240 för magistern.

Problemet är det där med matten. Jag har länge tänkt att eftersom jag alltid har sagt att programmering och matte är samma sak, och jag redan har massa mattepoäng, borde en mattekandidat vara ett överkomligt nästa steg. Tyvärr skulle det alltså kräva 22,5 poäng B-kurser, 15 poäng C-kurser och 15 poäng C-uppsats innan jag var klar. De övriga 90 poängen kan jag återanvända från mina andra kurser, vilket är väldigt praktiskt. På kvartsfart, med en kurs på 7,5 poäng per termin, har jag då att göra i 5 terminer, plus en för uppsatsen (som jag antar inte skulle kräva ett helt år). Tre år är lång tid, för något jag trodde skulle vara nästan gratis. Fan också.

Edit: Med samma logik som för datapoängen kanske det skulle räcka med 15 poäng B-matte, men det är ändå 4 hela terminer plus ett exjobb.

Hade jag varit lite intelligentare och mer strategisk, skulle jag ha valt bort hälften av de där poängen i C-data och lagt dem på B-matte stället. Jag hade fortfarande haft tillräckligt med poäng för en dataexamen, men då hade det räckt med 30 poäng C-matte för att få ihop en kandidat nu. Någon får gärna uppfinna en tidsmaskin så jag kan åka tillbaka till 1990 och visa det här blogginlägget för mig själv.

Alternativet att sluta plugga efter masterexamen är inte med på skalan. Det finns minst två alternativ till, men vilka de är får vänta till ett senare inlägg.

Edit 2: Efter en kontroll på antagning.se såg jag att jag faktiskt hade läst en C-kurs i matte också, “Abstrakt Algebra”. Med bara 7.5 poäng på B-nivå i ryggen, plus att den kursen nu dessutom ligger på avancerad nivå, hamnade den på listan med kurser jag hoppade av.

pixelstats trackingpixel

June 18th, 2016 Posted by Daniel Brahneborg | blogg | no comments

Multitrådad statemaskin

Statemaskiner (ja, det heter säkert “tillståndsmaskiner” på svenska, men datorer ska prata engelska och det där ordet blir alldeles för svenskt) har länge varit ett av mina favoritverktyg för att implementera komplexa beteenden. En sådan består av ett antal tillstånd varav ett är det man startar i. Varje indata gör att man flyttar till ett annat tillstånd. Indatat kan vara ett tecken, en händelse som en nytt inkommande data, eller något annat. I varje tillstånd vet man exakt vilket indata som är giltigt, och när indatat tar slut är det enkelt att veta om sekvensen var ok genom att kolla om tillståndet man är i är godkänt som sluttillstånd.

I en multitrådad värld blir det lite mer komplicerat. Till att börja med krävs en mutex, så att man inte får flera trådar som pillar på statemaskinens fält samtidigt. Lämpligen har man då en handle_event(), som kollar vilket tillstånd man är i och uppdaterar maskinen till dess nya tillstånd, allt inom en låst mutex.

I vissa övergångar ska det hända någonting. Socketar ska öppnas eller stängas, data ska hämtas eller skickas iväg, eller vad det nu är. Inga problem, det är ju bara att lägga in det i handle_event? Nej, för vissa saker kan ta lång tid att utföra. Om det görs av handle_event, kommer det ske i den tråd som triggade eventet, och låsa den tråden så att den inte kan göra någonting annat.

Istället kan man då ha en loop i en separat tråd, som bara anropar statemaskinens run() tills den har nått ett sluttillstånd. Eventet “connect” flyttar maskinen till tillståndet “do_connect”, och när run() körs nästa gång, kommer den utföra uppkopplingen. När den är klar, går den vidare till tillståndet “connected”. På det sättet görs uppkopplingen bara en gång, och av rätt tråd. Å andra sidan gör det att andra trådar som vill skicka något event till den här statemaskinen kommer stanna tills uppkopplingen är klar, och så är vi tillbaka ungefär där vi började. Fast bara nästan.

Här kan man använda asynkrona funktioner istället, som antingen kan polla med jämna mellanrum eller få en callback från när de är klara. När anropet är gjort, stannar man i ett väntetillstånd tills dess att callbacken kommer. Frågan är vad man gör i den tråden under tiden. Den kan ju inte anropa run() hela tiden, för då har vi en busywait som stjäl cpu i onödan.

Den enklaste lösningen på detta är en “condition variable”. Statemaskinens tråd (den som anropar run-funktionen) hänger då på en sådan när den inte har något bättre för sig. När det kommer ett nytt event, avslutas handle_event med att väcka den som väntar på variabeln (dvs run-tråden). Det listiga är att anropet som gör att run-tråden börjar vänta, samtidigt släpper maskinens mutex, för annars skulle ju de andra trådarna inte komma in i handle_event. Efteråt är mutexen låst i run-tråden igen. I handle_event får man då: lock, update state, signal cond, unlock.

I run är det lockande att göra ungefär likadant: lock, check state, do stuff, kanske wait on cond, unlock. Symmetriskt och bra. Tyvärr fungerar det inte, eftersom det där “do stuff” kan resultera i ett man postar något event tillbaka till sig själv. Det går inte, eftersom maskinens lås redan är taget. Alltså flyttar man allt “do stuff” till efter “unlock”. Låset är då taget bara under den tid det tar att tilldela en variabel eller två, och sannolikheten blir exakt noll att låset är inblandat i någon form av deadlock.

En annan lösning, om huvuddelen av ens event kommer via sockets, är att använda något som libevent. Istället för att hänga på en cond, hänger man då i epoll eller liknande. Tyvärr går det inte att hänga i epoll och på en cond samtidigt, så för att handle_event ska kunna väcka huvudtråden använder man en intern pipe. Huvudtråden väntar på sina vanliga sockets och den här pipen, och om andra trådar vill att maskinen ska vakna så skriver de en byte på pipen efter att ha uppdaterat maskinens tillstånd. Maskinen vaknar då, läser det nya datat, gör det som behövs för dess nya tillstånd, och så hänger den igen.

pixelstats trackingpixel

June 5th, 2016 Posted by Daniel Brahneborg | blogg | no comments

« Äldre |