Kartan · Del två · Maskinen · Kapitel 15 av 18
Hur den vakar
PåståendetMaskinen vakar varje natt och säger bara till när något har ändrats, så dess tystnad måste göras pålitlig.
Servrar har ingen människa som sitter vid dem. För att få något att hända vid samma tid varje dag skriver du två små filer åt operativsystemets schemaläggare. Den ena är en timer: den säger när. Den andra är en tjänst (service): den säger vad. Schemaläggaren här är den som är inbyggd i modern Linux, kallad systemd, och filerna kallas enheter (units).11deploy/vss.timer och deploy/vss.service.
När
Varje dag klockan 22:30, sedan de sista europeiska och amerikanska börserna har stängt och kurserna har lagt sig. Om maskinen var avstängd klockan 22:30 kör timern jobbet så snart maskinen är tillbaka, i stället för att hoppa över dagen.22OnCalendar=*-*-* 22:30:00; Persistent=true.
Vad
Nattkörningen läser in ägarens fil, hämtar dagens kurser, räknar fram den fasta uppsättningen nyckeltal, jämför varje kurs med de nivåer som redan är skrivna för det bolaget, skriver rapporten, skriver en rad per bolag i körningsdatabasen och genererar sedan översiktssidan. Sidgenereringen körs sist och är ordnad så att körningen ändå är en framgång om den misslyckas: rapporten och databasraden kommer först, och ett misslyckande att rita sidan loggas som en varning, inte som ett misslyckande för natten.33Översiktssidan 'åker med i samma enhet efter att rapporten och databasraden skrivits och kan inte bryta körningen'.
Vad den inte kan röra
Körningen är inhägnad av operativsystemet, inte bara av sin egen kod. Den ser hela systemet som skrivskyddat. Den ser ägarens hemkatalog som skrivskyddad. De enda två mappar den får skriva i är datamappen och rapportmappen. Den kan inte få några nya behörigheter när den väl startat, och den avbryts om den körs längre än femton minuter.44ProtectSystem=strict; ProtectHome=read-only; ReadWritePaths= bara data- och rapportmapparna; NoNewPrivileges=true; TimeoutStartSec=15min. Det här är den första väggen från kapitel 14, dragen av en annan hand: även om koden hade ett fel som försökte skriva ett beslut i ägarens fil skulle operativsystemet vägra.
De två utgångarna
En körning slutar på ett av två sätt, och varje sätt ger ett olika ljud.
- Framgång. Direkt efter att körningen slutförts skickar ett separat enradsskript en enda, tom förfrågan till en yttre övervakningstjänst. Den bär inget bolagsnamn, ingen kurs, ingen rapport, inget maskinnamn: en förfrågan till en ogenomskinlig adress, som betyder "körningen skedde". Om själva den förfrågan misslyckas räknas körningen ändå som en framgång; en misslyckad signal får inte förvandla en bra natt till en dålig.55ExecStartPost=- pingskriptet; bindestrecket i början betyder att dess misslyckande inte får enheten att misslyckas. Skriptets egen kommentar: 'VAD SOM LÄMNAR MASKINEN: en HTTP GET till ett ogenomskinligt UUID. Ingen ticker, ingen kurs, ingen rapport, inget värdnamn, ingen kropp.'
- Misslyckande. Om körningen avslutas med ett fel eller avbryts för att den körts för länge startar schemaläggaren en andra enhet vars enda uppgift är att meddela. Den enheten kör ett vanligt skalskript, avsiktligt inte programmets eget språk, eftersom det som gick sönder kan vara programmets egen miljö. Skriptet skickar ett meddelande till ägarens telefon som säger vilken enhet som stannade och vad det betyder, med de sista åtta raderna ur loggen.66OnFailure=vss-failure@%n.service; deploy/vss-notify-failure.sh. Hjärtslagsmodulen: 'Det är avsiktligt en vanlig curl i ett skalskript och INTE det här paketet: felet som rapporteras kan mycket väl VARA det här paketet.'
Lägg märke till asymmetrin. Framgång är tyst på telefonen. Ägaren vill inte ha ett meddelande varje natt som säger att ingenting hände; ett meddelande som alltid kommer är ett meddelande som slutar läsas. Framgång ger sitt ljud någon annanstans, till en observatör vars uppgift är att märka om ljudet uteblir. Det är dödmansgreppet, längre ner.
Veckokörningen
Screenern körs enligt samma mönster, på lördagsmorgnar klockan 08:00, på fredagens avstämda kurser, med en fyratimmarsgräns och ett strängare stängsel: mappen med ägarens fil är över huvud taget inte skrivbar för den. Den enda raden är beslutet "den schemalagda screeningen tar aldrig in ett bolag" skrivet på schemaläggarens språk.77deploy/vss-screen.timer: Sat 08:00; tjänstens skrivskyddade konfigurationsmapp, i projektbeskrivningen kallad 'E93 på en rad'. Uppmätt 2026-08-31: omkring 38 minuter, 3 495 förfrågningar om grunddata, noll strypningar. En tredje timer, klockan 09:30 varje dag, tillhör dödmansgreppet.
Vad kön skickar
Ett fjärde jobb, kön, körs vardagar klockan 22:50 och får ta upp till 60 minuter. Den håller ett sextiotal värderade namn mot sina linjer och skickar ett telefonmeddelande bara när något har ändrats. Det finns fem sorter. TITTA: en titta-linje har korsats, så värdera namnet ordentligt nu. UNDER MBP: kursen ligger under marginalkursen, vilket är information. SÄLJ: en säljlinje eller bull-värdet har nåtts. SPÄRR: ett spärrdatum har passerat. UTSIKT: utsikten har ändrats. En rapport ensam är inte längre ett meddelande. När en rapport kommer ut hämtas den och läses två gånger av en modell, bolaget värderas om på sina fyra senaste kvartal, och resultatet jämförs med bolagets egen förra avläsning. Ett meddelande går bara om värdet har rört sig 10 procent eller mer, en regel har utlösts, prognosen har sänkts, eller en rubrik signalerar en vinstvarning, en ändrad prognos, att vd eller finanschef lämnar, ett bud eller en avnotering. Annars står det "läst: inget har ändrats" i rapporten.
Enheterna, med ord
vss.timer startar vss.service klockan 22:30 varje dag och tar igen om den missats. Tjänsten är engångs (one-shot), kör nattkommandot i en sandlåda som bara är skrivbar i data- och rapportmapparna, pingar den yttre observatören vid framgång och startar vss-failure@vss.service vid misslyckande. vss-screen.timer startar vss-screen.service på lördagar klockan 08:00 med konfigurationsmappen skrivskyddad. vss-checkin.timer startar vss-checkin.service klockan 09:30 varje dag. Två senare jobb åker med nattkörningen. vss-mfn.timer hämtar klockan 22:40 varje ny nordisk rapport från de senaste 45 dagarna för ett bolag i kön, så att dokumentet redan ligger på disken när nästa jobb tittar. vss-queue.timer kör vss queue vardagar klockan 22:50: varje bolag som har värderats, ett sextiotal, hålls mot sin titta-linje, sin marginalkurs (information), sina säljlinjer och dagen då dess spärr släpper, och nya rapporter och rubriker kontrolleras. Körningen får ta upp till 60 minuter. Den skickar ett meddelande bara när något har ändrats sedan natten före, och det finns fem sorter: TITTA (en titta-linje korsad), UNDER MBP (information), SÄLJ (en säljlinje eller bull-värdet), SPÄRR (ett spärrdatum passerat) och UTSIKT (utsikten har ändrats). En rapport ensam är inte längre ett meddelande: den hämtas och läses två gånger av en modell (vss/reportread.py), bolaget värderas om på sina fyra senaste kvartal och jämförs med sin egen förra avläsning (vss/outlook.py), och ett meddelande går bara om värdet har rört sig 10 procent eller mer, en regel har utlösts, prognosen har sänkts, eller en rubrik signalerar en vinstvarning, en ändrad prognos, att vd eller finanschef lämnar, ett bud eller en avnotering. Ett bolag som ligger kvar i sin zon sägs en gång, inte varje natt. vss-failure@.service är en mall: namnet på den misslyckade enheten fylls i och skickas till notifieringsskriptet, som alltid avslutas med framgång, eftersom "en felnotifierare som kan misslyckas är en andra sak att övervaka".
Dödmansgreppet
Här är felet som hela det här kapitlet finns för att undanröja. Nattkörningen skickar ett meddelande till ägarens telefon bara när ett bolag behöver uppmärksamhet. De flesta nätter gör inget bolag det, och telefonen är tyst. Anta nu att körningen kraschade klockan 22:30 en tisdag och har varit död sedan dess. Telefonen är tyst. De två situationerna, "ingenting behöver dig" och "ingenting har körts på en vecka", ger exakt samma upplevelse: tystnad. Med verktygets egna ord: "en bevakning vars felläge är tystnad är en bevakning som slutar bli trodd första gången du får veta det den hårda vägen."88vss/heartbeat.py, inledningen.
Namnet, och var det kommer ifrån
Tåg har ett handtag som föraren måste hålla eller trycka ned med jämna mellanrum. Om föraren segnar ned släpps handtaget och bromsarna går på. Det kallas dödmansgrepp, och konstruktionsidén är att säkerheten inte får bero på att en signal skickas, eftersom en människa som inte kan skicka den är precis det fall som den finns för. Den måste bero på en signal som fortsätter komma, med larmet på dess uteblivande.99Wikipedia, Dead man's switch: 'Vigilance control was developed to detect this condition by requiring that the dead man's device be released momentarily and re-applied at timed intervals.' Programvaruversionen kallas dödmansgrepp (dead man's switch), och den fungerar på samma sätt: något väntar sig en regelbunden signal och slår larm när signalen inte kommer.
Två observatörer, för det finns två sorters döda
En maskin kan vara levande och trasig, eller så kan den vara död. De kräver olika observatörer, eftersom en observatör som bor på maskinen dör med den.
Observatör ett bor på maskinen
När körningen misslyckas startar schemaläggaren notifieraren som beskrivs ovan, som skickar till telefonen vad som stannade och de sista raderna ur loggen. Det här är den snabba observatören: den utlöses medan felet pågår, och den kan beskriva det. Dess svaghet är att den behöver att maskinen är uppe, att schemaläggaren går och att timern har utlösts. En timer som stängdes av efter en omstart startar ingenting, så ingenting misslyckas, så ingenting ropar, och det är precis det fel som mest liknar en tyst vecka.
Därför har observatör ett ett andra ben på sin egen timer: varje morgon klockan 09:30 kontrollerar ett separat jobb om en slutförd körning finns i registret och om nattimern fortfarande är aktiverad. Det körs avsiktligt på sin egen timer: "om kontrollen av körningen delade timer med körningen skulle felet som stoppade körningen stoppa kontrollen, och dödmansgreppet vore kopplat till sin egen strömförsörjning."1010deploy/vss-checkin.timer, kommentar. Körningen registrerar också sin egen slutförning i en tabell, med en gräns på 72 timmar för nattkörningen och 10 dagar för veckokörningen, och en provkörning eller en körning på ett enda bolag nollställer inte klockan.
Observatör två bor utanför
Inget av det hjälper om maskinen är avstängd, nätverket ligger nere eller hela schemaläggaren har stannat. En död maskin kan inte larma om sig själv. Det enda som kan upptäcka en död maskin är något som inte finns på den: en yttre tjänst som väntar sig en signal om dagen och slår larm när signalen inte kommit före en tidsgräns.1111vss/heartbeat.py: 'a dead VPS cannot page itself... Closing that needs an OUTSIDE observer — a service that expects a ping and alerts on its ABSENCE.' Det är den tomma förfrågan från framgångsutgången ovan. Den yttre tjänsten "är tyst så länge pingarna kommer i tid" och "slår larm så fort en ping inte kommer i tid", med en respitperiod efter den förväntade tiden.1212Övervakningstjänstens egen dokumentation; de föreslagna inställningarna i exempelmiljöfilen är en period på en dag och sex timmars respit.
Varför frånvaro slår fel
Ett felmeddelande behöver en avsändare. Varje avsändare kan fela på ett sätt som hindrar sändningen: processen kraschade innan den nådde den raden, nätverket låg nere, maskinen var avstängd. Ett larm på frånvaro behöver ingenting från den felande sidan. Det är den enda sortens larm vars täckning omfattar fallet att det som bevakas inte längre finns. Därför ger den lyckade körningen ett ljud till den yttre observatören och inget ljud till telefonen: ljudet är inte till för ägaren, det är till för det som kommer att märka när ljudet uteblir.
Ägarens ord när det här benet lades till: "en död VPS är exakt det fall jag vill ha täckt och ingen ping lämnar data."1313deploy/vss-ping-healthcheck.sh, med citat av ägaren, 2026-09-01.
- Beslut
- Två observatörer. En på maskinen som beskriver vad som gick sönder; en utanför som slår larm när en daglig signal uteblir. Framgångsutgången signalerar till den yttre observatören och säger ingenting till telefonen.
- Varför
- Tystnad måste betyda en sak. Det enda larm som täcker en död maskin är ett som ges av något som inte finns på den.
- Kostnad
- En andra extern tjänst, vars egna avbrott är obevakat. En signal som lämnar maskinen varje natt, hållen till en enda tom förfrågan så att ingenting om boken lämnar den med.
Sidan i telefonen
Allt hittills producerar en sida på en hyrd server i ett datacenter. Ägaren sitter på ett tåg i Sverige med en telefon. Kursen på ett bolag på väntelistan har just korsat sin linje. Sidan vet det. Ägaren vet det inte. Det här är inte ett infrastrukturproblem; det är det sista steget i investeringsproblemet, och om det inte löses var resten dekoration.
Hur sidan når telefonen, och vad det kostar
Följ pilarna. På maskinen håller en liten webbserver sidan och lyssnar bara på maskinen själv: den är bunden till adressen som betyder "den här datorn och ingenting annat", så ingenting utifrån kan nå den direkt, någonsin.1414Servern binder bara loopback-adressen. Anteckningarna kallar den raden bärande: utan den skulle servern binda varje gränssnitt, offentligt. Bredvid den går ett andra litet program, en tunnelklient, som gör en enda sak: den ringer ut till en relässtjänst på internet och håller anslutningen öppen. Riktningen spelar roll och är hela konstruktionen. Maskinen gör en utgående anslutning, av samma slag som en webbläsare gör när den laddar en webbsida. Brandväggen rördes inte. Det enda internet kan nå på den här maskinen är porten för fjärrinloggning som redan fanns.1515deploy/TUNNEL-NOTES.md: tunnelklienten 'gör en utgående anslutning... brandväggen är oförändrad', och den enda offentliga lyssnaren är porten för fjärrinloggning som redan fanns.
Nu öppnar ägaren sidans adress på en telefon. Förfrågan går till reläet, inte till maskinen. Innan reläet gör något frågar en ytterdörr vem som frågar. Ytterdörren släpper in exakt en e-postadress. Den skickar en engångskod till den adressen och till ingen annan; en annan adress får inte ens någon kod, eftersom policyn vägrar innan en kod utfärdas. När koden är angiven öppnas dörren i 24 timmar. Först då för reläet förfrågan vidare nedför anslutningen som maskinen öppnade tidigare, maskinens egen server svarar med sidan, och sidan färdas tillbaka uppför samma linje till telefonen.1616Cloudflare Access: en applikation, en policy som tillåter en e-postadress, engångs-PIN som enda identitetsleverantör, 24 timmars session. Verifierat 2026-09-13: två andra adresser fick ingen PIN alls.
Tanken att åtkomst ska bero på vem du är och inte på vilket nätverk du sitter på har ett namn i säkerhetslitteraturen och en historia: det är principen Google beskrev 2014 när det flyttade sina interna verktyg ut på det publika internet bakom identitetskontroller, och den hade fått beteckningen zero trust tidigare av en branschanalytiker. Det här projektet uppfann inte formen; det lånade den minsta möjliga versionen av den.1717Ward och Beyer, 'BeyondCorp: A New Approach to Enterprise Security', ;login: 39(6), 2014; Kindervag, Forrester Research, 2010. Ingen av texterna citeras här; hänvisningen är en pekare, inte ett påstående om deras ordalydelse.
Sidan passerar ett företags infrastruktur som ägaren inte kontrollerar, och det företaget dekrypterar den i sin kant. Med beslutets ord: "Sidan är klartext i deras kant: innehav, statusar, spärrresultat, MBP och stopp, läsbara för Cloudflare och för vem som helst som tvingar eller bryter sig in hos Cloudflare. Det här går inte att mildra inom den här arkitekturen. Det är priset för att läsa boken på en telefon från ett godtyckligt nätverk, och jag betalar det medvetet." Ytterdörren har en enda faktor: den som kontrollerar postlådan kontrollerar sidan. Och tunnelklienten måste köras som en systemtjänst med en inloggningsuppgift som ägarens eget konto inte kan läsa, vilket betyder att den inte kan använda felnotifieraren som beskrivs ovan. Om tunneln dör slutar sidan laddas och telefonen förblir tyst. Nattkörningen och dess egen larmning är inte beroende av den.1818Beslut F1: 'WHAT THIS COSTS' under leden (a) och (b); deploy/TUNNEL-NOTES.md, 'Units — Option C'.
- Beslut
- Sidan når telefonen genom en utgående tunnel till ett relä, bakom en ytterdörr som släpper in en adress med engångskod. Servern lyssnar bara på maskinen själv. Ingen port öppnas.
- Varför
- Ett beslut som inte kan nå ägaren när kursen rör sig var inte värt att fatta. Varje inkommande form öppnar maskinen; den utgående formen öppnar bara en sida, och bara för en person.
- Kostnad
- Sidan är läsbar för reläoperatören. Dörren har en enda faktor. Tunneln kan inte larma telefonen när den dör. Var och en är nedskriven i beslutet som priset.
Tre frågor, i ordning
- Behöver något mig i dag? Ett block överst, i vanliga meningar. Antingen "ingenting", eller de två–tre saker som gör det: en titta-linje eller säljlinje korsad, ett spärrdatum passerat, en ändrad utsikt, en daterad händelse inom sju dagar. Listan över sorter är sluten, så blocket kan inte växa till ett flöde. Bredvid står alltid vad som kontrollerades, eftersom "ingenting behöver dig" och "ingen tittade" annars är samma tystnad.
- Var står allt mot sitt värde? Ett kort per bolag. Ett kort, inte en tabell, eftersom en tabell är till för att jämföra fyrtio saker och ett kort är till för att känna igen en. Kursen stor; värdet och marginalkursen (information) bredvid; ett år av avstämda slutkurser ritat som en liten linje; och ett spår som visar var kursen ligger mellan halva värdet och hälften till, på en skala som aldrig skalas om per bolag. En bild ersätter aldrig en siffra.
- Vad är på väg? De olösta daterade händelserna, de närmaste först. En lång anteckning viks ihop, kapas aldrig, eftersom "ett utelämningstecken på en post är en post som ingen kan läsa."
Reglerna för vad sidan får säga
Ett avstånd, aldrig ett utlåtande
Sidan använder grönt och rött. Den använder dem för att säga hur långt en kurs är från en linje, i fem band vars gränser är metodens egna tal, och för ingenting annat. Ett bolag kan vara grönt och inte behöva något; bolaget som behöver ägaren kan vara rött. Färg läggs aldrig på ett helt kort, eftersom ett grönt kort läses som ett godkännande. Ett bolag som är billigt men har fallit på en spärr ritas nedtonat, med skälet angivet i ord, så att en billig stängd dörr inte läses som en inbjudan. Ingen färg någonstans bär betydelse på egen hand.1919vss/overview.py: 'THE DISTANCE SCALE... it is a MEASUREMENT, never a verdict. It says HOW FAR, and nothing about whether to act.' Band vid 0, 5, 25 och 75 procent.
Inget villkor på köpsidan utan de villkor som kvalificerar det
Om sidan säger att en kurs ligger under sin marginalkurs (information) säger samma mening vad mer som måste gälla: att avläsningen är aktuell, att villkoren från kapitel 11 håller. Inte en rad längre ned. Samma mening, eftersom "den läsare som slutar efter första halvan är den läsare den här sidan är till för."2020vss/overview.py: 'A BUY-SIDE CONDITION NEVER STANDS ALONE. The qualifying clause goes in the SAME SENTENCE, not a line below it.'
Den anger sin egen ålder, två gånger
En körning som misslyckas skriver ingenting. Servern fortsätter servera den senaste goda sidan. Sidan ser identisk ut med en färsk, och ägaren läser förra torsdagens statusar i tron att de är kvällens. Det felet är osynligt för varje larm som beskrivs ovan, eftersom körningen antingen skedde eller inte, och sidans ålder är en annan fråga. Så sidan skriver ut den exakta tiden den genererades, med tidszon, i sidhuvudet, synlig på en telefon utan att rulla, och igen i första meningen i sidfoten. Sidan kan inte markera sig själv som gammal, eftersom det skulle kräva ett skript och skript är förbjudna; den kan bara göra sin ålder omöjlig att missa, och subtraktionen är ägarens.2121Beslut F1 led (c) krav 1, och beslut F2 som drar tillbaka krav 2. Genomfört 2026-09-13.
Den väljer aldrig
Där registret rymmer två värderingar för ett bolag och inget säger vilken som är den aktuella skriver sidan ut DATA SAKNAS och länkar båda. Den tar inte den nyare. En sorteringsordning är inte ett beslut, och sidan får inte besvara en fråga som ägaren inte har besvarat.2222vss/overview.py: 'it never chooses (two run records and no entry naming one ⇒ DATA MISSING and both linked — a filename sort must not answer E39's question)'.
Varför en sida som inte uttrycker någon åsikt är mer användbar
En sida som sa "köp BOLAG A" skulle läsas för sitt utlåtande, och utlåtandet skulle vara rätt eller fel, och ägaren skulle inte lära sig något åt något håll om huruvida avläsningen bakom det var sund. En sida som säger "BOLAG A ligger 3 procent över sin linje, linjen värderades på junirapporten, nästa rapport kommer om nio dagar och en siffra är overifierad" ger ägaren varje fakta som behövs för att avgöra och undanhåller det enda som skulle låta ägaren sluta tänka. Den är mer arbete att läsa. Det är det den är till för.
- Beslut
- Sidan visar läge, avstånd och ålder. Den uttrycker inget utlåtande om något bolag, färgar inget som godkännande, kvalificerar varje mening på köpsidan i samma mening och skriver ut sin egen genereringstid två gånger.
- Varför
- Sidan är det ägaren handlar på. Allt den avgjorde skulle avgöras utan läsningen, och allt den dolde om sin egen ålder skulle bli trott.
- Kostnad
- Den kan inte varna för att den är gammal; ägaren måste läsa tiden och subtrahera. Den ger aldrig svaret, så varje natt gör ägaren tänkandet på nytt.
systemctl --user list-timers 'vss*'Vad som körs härnäst, om du har installerat timrarna. Från repots rot, efter installationen i manualen.
- Varje natt hålls kurserna mot beslut som redan är fattade, och varje ny rapport läses och bolaget värderas igen.
- Telefonen får bara höra en förändring.
- Två observatörer gör att tystnaden betyder något: en på maskinen säger vad som gick sönder, en utanför märker när ingenting kommer.
Källor för det här kapitlet
- Schemaläggarens enheter och skript — läst ur det här repot: deploy/vss.timer, deploy/vss.service, deploy/vss-screen.timer, deploy/vss-queue.timer, deploy/vss-mfn.timer, deploy/vss-checkin.timer, deploy/vss-failure@.service, deploy/vss-ping-healthcheck.sh, deploy/vss-notify-failure.sh, deploy/README.md
- Dead man's switch, Wikipedia
https://en.wikipedia.org/wiki/Dead_man%27s_switch - Healthchecks.io-dokumentationen (larm vid saknad ping)
https://healthchecks.io/docs/ - Hjärtslagsmodulen och enheterna — läst ur det här repot: vss/heartbeat.py; deploy/vss-checkin.timer; deploy/vss-ping-healthcheck.sh; deploy/vss-notify-failure.sh; deploy/vss.env.example; reference/BACKLOG.md B-13
- Ward och Beyer (2014), BeyondCorp: A New Approach to Enterprise Security, ;login:
https://www.usenix.org/publications/login/dec14/ward - Beslut F1 och tunnelanteckningarna — läst ur det här repot: reference/FRAMEWORK-EDITS.md F1; deploy/TUNNEL-NOTES.md; deploy/vss-tunnel.service; deploy/vss-overview.service
- Översiktssidans generator och dess beslut — läst ur det här repot: vss/overview.py; vss/render.py; reference/FRAMEWORK-EDITS.md F1, F2
Den långsamma vägen, gjord uthärdlig. Byggd 2026-11-09 ur repot som det såg ut den dagen. BOLAG A och BOLAG B är påhittade. Ett verkligt bolag, CENTA, följs genom boken, med siffror ur dess egna rapporter och ägarens egna affärer. Inte finansiell rådgivning: en privatinvesterares metod, delad som den är.