torstai 21. joulukuuta 2017

Make the Yuletide gay

Vuosi lähestyy loppuaan. Sunnuntaina on jo jouluaatto. Sain eilen viimeiset tämän vuoden tentit korjattua ja kirjattua, loppuviikon teen "oikeaa" työtä yksityiselle sektorille -- vaikka aikamoista konstailua tämäkin on, ei mitään konkreettista vaan palvelua. Jokainen taloudesta jotain ymmärtävä tietää, että ainoastaan kaivostoiminta ja maanviljelys ovat oikeaa työtä, palvelut vain kuluttavat yhteiskunnan varoja ja mikään julkiselle sektorille tehty työpanos ei ole minkään arvoinen eikä hyödytä ketään koskaan millään tavalla, ja kansakunnan hyvinvoinnin määrää se, paljonko kuninkaan kirstussa on kultaa.

Näissä merkantilistisissa tunnelmissa on hyvä laskeutua joulunviettoonkin, sillä kuten tiedämme, Joulun tärkein sanoma on kuluttaminen, eli se että ostamme lahjoja -- mieluiten itsellemme, mutta myös mahdollisesti lapsille. Tärkeintä on, että lahjat on tehty muovista tai metallista, kaikenlaiset aineettomat lahjat ovat arvottomia eivätkä hyödytä ketään millään tavalla. Yksi pahimmista kaikista ovat tietokonepelit, jotka ovat pelkkiä bittejä. Lisäksi tietokoneilla pelaaminen kuluttaa sähköä, jota voisi käyttää paperitehtaassa paperikoneen pyörittämiseen,  valimossa metallin sulattamiseen, tai konepajalla hitsaamiseen.  Saunan lämmitys ja kinkun paisto tosin ovat suomalaisia perinteitä, ja koska perinteet ovat tärkeitä, niihin sähköä saa käyttää.

Huumori sikseen. Noin vuosi sitten kirjoitin ostikolla "Annus Mirabilis" vuodesta 2016, ja siitä että miten ns uusi elämäni oli lähtenyt käyntiin ja miten vointini oli parempi kuin pitkiin aikoihin. En koe pettyneeni tähän kuluneeseen vuoteen suhteessa edelliseen. Siinä missä vuodet 2015 ja 2016 olivat massiivisten myllerrysten vuosia, tämä on ollu varsin tylsä -- hyvässä mielessä.

Yksi pettymys täytyy kuitenkin heti paljastaa. En vetänyt tänä vuonna maasta kahtasataa kiloa, vaan ainoastaan 172.5 kiloa, ja senkin maaliskuussa. Viime viikolla 165 kiloa ei noussut polven yläpuolelle. Selkä on reistaillut nyt enemmän kuin aiemmin, ikä ei tule yksin. Myös kyykkytulos on pakittanut tämän vuoksi. Tiistaina jäi 130 kiloa uskon puutteen vuoksi räkkiin; otin sen harteille ja totesin että selässä tuntuu sen verran ikävälle, etten uskalla, ja laskin sen takaisin. Eilen tosin punnersin penkistä 107.5kg, eli kehitystä on tullut tuo 7.5kg vuodessa. Otan jokaisen voiton vastaan.

Tämä vuosi tulee jäämään mieleeni eräänlaisena välivuotena. Mitään kovin ihmeellistä ei tapahtunut, mutta otin silti ensi askeleet seuraavaan vuoteen. Otin riskin, kun lähdin uuteen työhön -- vaikkakin vain toinen jalka edellä ensin. Ammuin ensi kertaa liki kolmeenkymmeneen vuoteen haulikolla viime viikkolla. Vedin kesällä ensi kertaa kahteenkymmeneen vuoteen sellaiset kännit että oksensin, joskin vahingossa: Menin serkkuni luo kylään ja hänellä oli vodkapullo avoinna, joten päätin ottaa yhden. Ja toisen. Ja kolmannen. Ja sitten käytin induktiota kunnes tuli ns ylivuoto. Vaikka siitä on nyt jo kohta puoli vuotta, minulla on vieläkin fyysinen pahoinvointi kun ajattelenkin juopottelua.

Ostin tietokoneen pelkästään pelaamista varten itselleni ensimmäistä kertaa kahteenkymmeneen vuoteen. Uin Välimeressä ensi kertaa kolmeenkymmeneen vuoteen. Olin hakemassa uutta koiraa kennelistä -- vaikkakaan en itselleni -- ensi kertaa neljääntoista vuoteen. Tein monta asiaa, joita en ollut pitkään aikaan tehnyt. Osa oli hyviä, osa huonoja asioita.

En hanki joulukuusta enkä jouluruokia kotiin. Ulkoistan nämä muille. Olohuoneeni suurella ruokapöydällä on aseteltuna Next War- Korea. (Ks tilanne) Odotan uusinta painosta WiF:istä saapuvaksi alkuvuodesta. Olen hyväksynyt itseni sellaisena kuin olen. Olen pelaaja; pelaan lautapelejä ja tietokonepelejä. Näen asiat melkein poikkeuksetta sääntöinä ja algoritmeina.

maanantai 18. joulukuuta 2017

Poliittinen monisto

Erinäisiä poliittisia kompasseja ja karttoja on esitetty vuosien saatossa, jotta ihmiset voisivat asemoida itsensä poliittisesti. Perinteisempi vasemmisto-oikeisto- jaottelu on osoittautunut riittämättömäksi jo pitkään. Myös konservatiivi-liberaali- asteikko on jossain määrin epätyydyttävä.

Tyypillinen tällainen jaottelu perustuu yhteen tai useampaan dimensioon jossa ajatellaan olevan ääripäät, tms, jonkinlaiset puhtaaksiviljellyt arkkityypit erilaisista poliittisista ideologioista tms. Esimerkiksi perinteinen talouspoliittinen vasen/oikea ja sosiaaliliberaali/konservatiivi- jaottelu antaa mahdollisuuden luokitella ihmiset karkeastiottaen kahdeksaan kategoriaan. Koordinaatit kuuluvat neliöön jonka kulmapisteinä ovat (-1,-1), (1,1) (Koska kyse on neliöstä, muut kulmat määräytyvät näistä). Olennaiset pisteet ovat seuraavat:

  • (-1,-1)- kulmassa ovat ultraliberaalin vasemmiston edustajat, henkilöt joita olen yleensä nimittänyt makkaratukiksi. Tonni kuussa käteen kaikille, porvareille 120% verot, huumeita ja homoseksiä kaikille ilmaiseksi.  Äänestävät vasemmistoliittoa tai vihreitä.  Eivät käy töissä. Näiden kaveriksi pääsee kun pistää päälle Che Guevara-paidan ja ryhtyy vegaaniksi.
  • (1,1)-kulmassa ovat tiukkaa kuria edustavat ns "oikeistolaiset". Kannattavat sääty-yhteiskuntaa, homoseksuaalisuuden kriminalisointia, irtolaisten pakkosterilisaatiota ja kuningasvaltaa. Ja (aateliston) verovapautta.  Äänestävät KD:ta tai kokoomusta. Äänestäisivät Persuja muuten mutta kun ne ovat liian rahvaanomaisia. Jos ovat töissä, niin työskentelevät puolustusvoimissa tai poliiseina, tai Kansaneläkelaitoksessa.  Näiden kaveriksi pääsee kun perii miljoonaomaisuuden  tai käy kadettikoulun.
  • (-1,1)- kulmassa ovat perinteiset stalinistit. Äänestävät SKP:tä.  Ovat eläkkeellä nykyisin kaikki, lähes kuolleet sukupuuttoon.  Näiden kaveriksi pääsee jos kertoo sytyttävänsä Stalinille tuohuksen.
  • (1,-1)-kulmassa ovat libertaarit, joiden mielestä verotus on murhaa ja joiden mielestä Margaret Thatcher ja Ronald Reagan olivat ihan samanlaisia sosialisteja kuin kaikki muutkin. Eivät äänestä, vaan vetävät huumeita, pelaavat tietokoneella. Työskentelevät mikrotuessa tai ohjemoijina. Tai elävät sossun tuilla.  Näiden kaveriksi ei oikein pääse, koska he eivät pidä ihmisistä.
  • (-1,0)- reunassa ovat tavalliset sosialistit. Äänestävät SDP:tä ja työskentelevät raskaassa teollisuudessa tai julkisella sektorilla.  Myös aika paljolti kuolleet sukupuuttoon.
  • (0,1)-reunassa ovat Persut. Kirjava, edustava otos kansasta työpaikkojen (tai sellaisen puutteen) ja mielipiteiden osalta. Yhdistävä tekijä on lähinnä pelko siitä että jonain aamuna heräävät ja maailma on muuttunut islamilaiseksi.  Nämä hyväksyvät kaverikseen kaikki ja kannattavat jokaista mielipidettä, kunhan se alkaa sanoilla "En ole rasisti, mutta..."
  • (0,-1)-reunassa ovat "oikeistovihreät".  Saattavat äänestää kokoomusta tai vihreitä, riippuen siitä, mistä ovat kotoisin. Koiranpillinä toimivat ilmaisut "Sosiaaliturvajärjestelmä on rikki" tai "työehdoista pitäisi sopia paikallisesti", tai "Suomea uhkaa työvoimapula". Toimivat erilaisissa asiantuntijatehtävissä ja uskovat että ihminen kuuluu työväenluokkaan jos hänen tulonsa ovat noin 5 tonnia kuussa. Hiukan poliittisesta suuntauksesta riippuen ovat usein kasvissyöjiä (poislukien juottovasikan sisäfile, kaviaari ja foie gras). 
  • (1,0)-reunassa ovat "maltilliset oikeistolaiset". Äänestävät tyypillisesti kokoomusta. Ovat sitä mieltä että parkkimaksut ovat sosialismia ja oopperan subventio on vain kohtuullinen korvaus siitä että he kuitenkin maksavat niin paljon veroja.  Ihailevat USA:n republikaaneja ja irtisanoutuvat rasismista kovaan ääneen. Tyypillisesti miehiä. 
En ota kantaa näihin kahteen dimensioon tai niiden järkevyyteen (tai sen puutteeseen). Sensijaan ehdotan että otetaan (vähintäänkin) kolmas akseli eli ns. metaliberaalius. Tarkoitan tällä sitä, kuinka hyvin henkilö sietää mielipiteitä jotka poikkeavat omista. Henkilö jolla on matala metaliberaaliuden aste, ei hyväksy mielipiteitä jotka eroavat hänen omistaan. Henkilö jolla se on korkea, ei kauhistu ihmisten mielipiteistä riippumatta siitä, mitä nämä ovat.

Omassa tuttavapiirissäni huomaan ainakin sen, että perinteisemmillä mittareilla mielipide-erot eivät juurikaan selitä sitä, millaisia ihmisiä tuttavapiiriini kuuluu. Sensijaan metaliberaalius selittää voimakkaastikin. Tähän ehkä tarvittaisiin vielä toisen asteen metaliberaalius, koska ihmisissä on eroja myös sen suhteen kuinka hyvin he sietävät sitä kuinka huonosti ihmiset sietävät eriäviä mielipiteitä. Itse siedän jopa tätä aika hyvin, joskaan en aivan niin hyvin kuin siedän itse mielipide-eroja.

It is the mark of an educated mind to be able to entertain a thought without accepting it.

maanantai 11. joulukuuta 2017

Kuplista

Tämän kirjoitushetkellä Bitcoinin hinta on $16615.81, eli noin 15k€. En ota varsinaisesti kantaa siihen, onko Bitcoinin hinta "liian korkea". Moni epäilee näin, sillä sen arvo on noussut huimasti viimeisen vuoden aikana. Hiukan suoraksi mutkia vetäen, sen hinta on noin 16-kertaistunut vähän alle vuodessa. Alaspäin arvioiden, hinnan tuplaantumisväli on ollut noin kolme kuukautta, mutta syyskuusta alkaen nousu on nopeutunut.

Myönnän että olen hivenen harmissani. Noin vuosi sitten eräs internet-tuttavani pyysi minua bulvaaniksi hankkimaan hänelle muutamalla sadalla eurolla bitcoinia, ja sain muutaman kympin välityspalkkiota. Silloin ajattelin että voisin muutaman satasen ihan huvin vuoksi sijoittaa Bitcoiniin ja katsoa mitä tapahtuu. En kuitenkaan koskaan saanut aikaiseksi. Jos olisin tuolloin ostanut suunnittelemani 200 euron edestä Bitcoinia, sen arvo olisi nyt noin 4000€, eli noin 20-kertainen, sillä hinta oli tuolloin noin 800 euron paikkeilla per bitcoin. 

Eräs toinen tuttavani kertoi että hän ei varsinaisesti ole sijoittanut BC:iin, mutta omistaa sitä pienen määrän ja myy pois tipoittain sitä mukaa kun sen hinta nousee. Tämä sai minut miettimään asiaa laajemmin eräänalaisena sormiharjoituksena.

Oletetaan että meillä on jokin varallisuuden laji, esimerkiksi bitcoin tai jokin osake tms. Oletetaan että tiedämme että sen hinnassa on meneillään kupla. Nyt on syytä hieman huomauttaa rahoituksen teoriasta ja yleisemmin markkinataloudesta. Nimittäin, on melko tavallista olettaa ns. Efficien Market Hypothesis, tai ainakin jokin sen muoto. EMH:n variantteja tunnetaan myös nimellä "No money on the Table",  tai TANSTAAFL (there ain't no such thing as a free lunch). Nämä kaikki sanovat tavalla tai toisella, että vapailla markkinoilla ei ole mahdollista tehdä helppoja voittoja myymällä ja ostamalla.

Kirjoitan EMH:n tahallani tuolla tavalla, sillä se voidaan ymmärtää monella tavalla lähtökohtaisesti. Vahvin EMH:n muotoilu on että "vapailla markkinoilla kaikki hinnat ovat aina oikeita". Tämä siis tarkoittaa että kaikki tieto joka on julkista, on hinnoissa mukana niin, ettei esimerkiksi aitoja kuplia voi syntyä ilman että vallitsee yleinen väärinymmärrys,  tai joku huijaa tai pimittää informaatiota. Tämä vahvin muotoilu on uskoakseni väärä, koska on helppo osoittaa peliteoreettisesti että voi syntyä tilanne jossa kaikki uskovat että jonkin tietyn arvopaperin hinta on liian korkea mutta riittävän monet myös uskovat että se vielä nousee jonkin verran; Tällöin meneillään on eräänlainen mustapekka-peli, jossa ihmiset lyövät vetoa siitä, koska kupla puhkeaa, tietäen että se puhkeaa ennen pitkää.

En väitä nyt, että Bitcoinin kohdalla kyse on tästä. Koko Bitcoin-markkinan arvo on tällä hetkellä 281 miljardia dollaria. Tämä ei globaalin valuutan kokonaisarvona ole kovin suuri. Mutta se on paljon rahaa, joten on ymmärrettävää jos moni uskoo että BC romahtaa jossain vaiheessa esimerkiksi kymmenesosaan (tai alle) nykyisestä.

Tehdään yksinkertaisehko malli. Oletetaan että meillä on kupla, joka alkaa paisua ajanhetkellä t=0. Alussa arvopaperin hinta on 1 yksikkö, ja hinta kasvaa eksponentiaalisesti tahtia e^(ta), missä a on jokin positiivinen vakio. Käytännössä niin, että t_d = log(2)/a on arvon tuplaantumisaika, eli a = log(2)/t_d Esimerkiksi jos oletamme että BC tuplaantuu kolmessa kuukaudessa (eli 1/4 vuodessa), niin a on noin 2.77.

Kupla kestää jonkin aikaa, mutta emme tiedä kuinka kauan; oletetaan että kupla puhkeaa äkillisesti ja arvo putoaa nollaan. Oletetaan lisäksi että markkinahinta on hivenen kohinainen, eli hinnassa on kohinatermi joka aiheuttaa pieniä laskuja ja nousuja lyhellä välillä, mutta niistä ei tarvitse välittää tässä analyysissä. Oletamme siis, että kun t kasvaa, e^(ta) on koko ajan parempi approksimaatio suhteellisesta hinnasta ajanhetkellä t verrattuna ajanhetkeen 0 (jolloin hinta on 1). Kuplan puhkeamisen ajankohta olkoon b, ja oletamme että se tapahtuma joka on olennaisilta osin poisson-jakautunut mutta emme tunne sen jakaumaa.  Olennaista on vain se, että emme voi päätellä puhkeamisen ajankohtaa siitä, kauanko aikaa on jo kulunut.

Puhkeamisen ajanhetkellä arvopaperin arvo on siis e^(ba), mikä on siis maksimaalinen arvo. Paras sijoitusstrategia olisi tietenkin se, että ostaisi paperin hetkellä t=0 ja myisi sen ajanhetkellä t=b-epsilon, eli mahdollisimman lähellä puhkeamisen ajankohtaa. Emme kuitenkaan tiedä puhkeamisen ajankohtaa, joten emme voi varautua tähän.

Oletetaan että voimme joka ajanhetki myydä (tai ostaa) kyseistä arvopaperia ilman transaktiokustannuksia mielivaltaisen pienissä erissä. Tämä oletus on toki vahva, mutta tutkitaan sitä nyt jotta saadaan jonkinlainen kuva asiasta.. Oletetaan lisäksi että ajanhetkellä t=0 pidämme hallussamme yhtä yksikköä arvopaperia, ja sitä mukaa kun arvopaperin arvo kasvaa, kevennämme salkkuamme niin, että meillä on hallussamme kullakin ajanhetkellä k(t) yksikköä. Ideaalitilanteessa k(t) = 1, kun t < b ja k(t)=0 kun t = b, sillä myymme kaiken pois juuri ennen romahdusta.

Tehdään kuitenkin lisäoletuksia. Ensinnäkin, oletetaan että k(t) on jatkuvasti äärettömän monta kertaa derivoituva, eli että se on analyyttinen, ja että k'(t) < 0 kaikilla t > 0.  Jos lyhykäisyyden vuoksi merkitään hintaa v(t), niin kokonaiskassavirta jonka kuplan kasvun aikana ulosmitataan on integraali -k'(t)v(t) dt, missä t käy nollasta b:hen. Haluamme maksimoida tämän, mutta huomionarvoista on, että me emme voi tietää mikä b on; meidän on etsittävä sellainen muoto k(t):lle, jossa b ei esiinny lainkaan.

Eräs ystäväni ehdotti sellaista strategiaa, jossa k(t)*v(t) -- eli siis hallussa olevan arvopaperin markkina-arvo -- kasvaa kuplan mukana noin suhteessa hinnan neliöjuureen. Tällöin strategia on, että k(t) = 1/sqrt(v(t)). Tällöin -k'(t)*(v(t)) = v'(t)/(2*sqrt(v(t))), eli kassavirta on sqrt(v(b)) - 1. Jos v(t) = e^(at), kuten oletimme, niin tämä on e^(ab/2) - 1. Tällä strategialla pääsee omilleen, jos e^(ab/2) > 2, eli jos hinta ehtii nelinkertaistumaan alkuperäisestä.

Voidaanko pärjätä paremmin? Kuvitellaan strategiaa, jossa portfolion arvo pidetäänkin koko ajan vakiona, jolloin sitä mukaa kun hinta nousee, hinnanousu ulosmitataan kokonaisuudessaan. Tällöin k(t)*v(t) = 1, eli k(t) = 1/v(t), ja -k'(t) = v'(t)/v(t)^2, ja -k'(t)v(t) = v'(t)/v(t), jonka integraali on log(v(t)). Kassavirta on kokonaisuudessaan siis yksinkertaisesti ab. Tässä pääsee omilleen jos ab > 1. Tämän tulkitseminen on jo vähän vaikeampaa, mutta esimerkissämme a=2.77, jolloin b > 0,361, eli hieman yli neljä kuukautta, so. kun hinta on hieman yli tuplaantunut.

Tämä on esimerkki niinsanotun variaatiolaskennan ongelmasta. Ns. Euler-Lagrange-yhtälö on muotoa, jossa etsimme funktiota q(t) siten, että meillä on annettuna funktio L(t, q(t), q'(t)) ja etsimme funktionaalin S(q) = integraali L(t, q(t), q'(t)) dt stationaarista pistettä, eli pistettä jossa S(q + ez) < S(q) kaikilla ei-triviaaleilla funktioilla z ja pienillä e>0. Tässä ez on q:n variaatio, eli jokin pieni muunnelma q:sta. Intergaali tässä on määrätty integraali jollakin annetulla välillä; esimerkissämme se on 0:sta b:hen.

Variaatiolaskennassa on monta eri tapaa lähestyä ongelmaa, ja en nyt ala tässä niitä käsitellä. Jos kuitenkin rajoitumme eksponenttifunktioiden perheeseen, eli k(t) = e^(ct), niin k'(t) = ce^(ct), ja yleinen muoto integroitavassa funktiossa on -ce^((a+c)t), niin tulos on (hiukan hankalasti tulkittava) muotoa - c(e^(c(a+b)) - 1)/(a+b). Jos katsomme, milloin tässä pääsee omilleen, niin merkitsemällä tämän suuremmaksi kuin 1, saamme -ce^(c(a+b)) > a+b+1, mistä nyt ei tule mitään kovin kilttiä funktiota. Jos meillä on arvio a:sta ja jokin uskomus b:stä, niin voimme asettaa c:n siten, että tämä toteutuu.

En edes esitä että tällä olisi mitään todellista sovellusta. Ongelma vain on mielenkiintoinen.


perjantai 8. joulukuuta 2017

Reiluus

Reiluus (engl. fairness) viittaa rinnakkaisten järjestelmien teoriassa suunnilleen sitä, että järjestelmän mallissa otetaan huomioon vain sellaiset äärettömät suoritukset, joissa kaikki komponentit etenevät jossain vaiheessa. Esimerkiksi, jos meillä on kaksi toimijaa, jotka tahtovat käyttää jotain jaettua resurssia (esimerkiksi tulostin, jolla kahdelta eri koneelta tulostetaan) jatkuvasti, niin järjestelmä on reilu, jos molemmat pääsevät halutessaan lopulta tulostamaan.

Käsite on intuitiivisesti ensialkuun selkeä, mutta analysoitaessa tarkemmin, se hajoaa käsiin. Käytetään esimerkkiä jossa kahdelta eri tietokoneelta tulostetaan samalla tulostimella.  Protokolla on seuraavanlainen: Koneelta tulee yksi pyyntö kerrallaan tulostaa paperi. Tulostin valitsee jomman kumman pyynnön ja palvelee sitä. Toinen pyyntö jää voimaan ja tulostamisen jälkeen tulostin valitsee uudelleen. On kuitenkin mahdollista, että ensimmäinen kone on tällä aikaa päättänyt pyytää uuden paperin tulostamista, ja tulostin valitsee sen jäälleen. Toisen koneen pyyntö on koko ajan voimassa, mutta sitä ei koskaan toteuteta. Niin sanottu heikko reiluus sanoo, että jos jokin toiminto on koko ajan mahdollinen, järjestelmä lopulta todella suorittaa sen, eli että järjestelmässä ei ole sellaista ääretöntä suoritusta, jossa pyyntö olisi koko ajan (teoriassa) mahdollista toteuttaa, mutta sitä ei toteuteta.


Todellisuudessa kuitenkin pyyntö menee tulostimen jonoon. Tulostin ottaa jonosta pyynnön ja tulostaa sen. Jos jono toimii niin, että sinne mahtuu "paljon" pyyntöjä, ja ne käsitellään aina järjestyksessä, ongelmaa ei juurikaan ole. Mutta oletetaan että jonoon mahtuukin vain yksi pyyntö (tai jokin pieni määrä). Jos jonossa on yksi pyyntö, tulostin ottaa sen käsittelyyn ja jono tyhjenee (tai sinne mahtuu yksi lisää).  Nyt kuitenkin ensimmäinen kone ehtii tulla takaisin pyytämään ja laittaa oman pyyntönsä jonoon ennen kuin toinen ehtii sitä esittää. 


Nyt siis pyynnön esittäminen ei ole mahdollista silloin, kun jono on täynnä.  Vaikka jokainen todella esitetty pyyntö tulee käsitellyksi, toinen koneista ei pääse esittämään pyyntöään koska se ei ole mahdollista välillä. Järjestelmä ei intuitiivisesti katsottuna ole reilu, mutta heikko reiluus ei tätä mahdollisuutta tavoita. Vahva reiluus taas sanoo, että jos jokin tapahtuma on äärettömän usein mahdollinen (vaikka se välillä olisikin mahdoton), niin se lopulta tapahtuu. Eli vaikka jono välillä on täynnä eikä pyyntöjä voi esittää, vahvasti reilu järjestelmä takaa että toinenkin kone lopulta pääsee esittämään pyyntönsä.

Reiluuden ongelmana on, että se on erittäin hankala mallintaa, ja se on kiusallinen laskennallisesti, verrattuna sellaisiin ominaisuuksiin kuten turvallisuus ja lukkiumat. Turvallisuus viittaa siihen, että esimerkiksi pyynnöt eivät mene sekaisin, eli ei tapahdu tilannetta jossa molemmat koneet kuvittelevat tulostavansa samanaikaisesti (ja esimerkiksi sivulle tulisi kahta eri tekstiä päällekäin tms). Turvallisuusrikkomus voidaan havaita jos järjestelmä päätyy tilaan jossa molemmat koneet kuvittelevat tulostavansa.

Myös lukkiumat ovat helppo todeta; lukkiuma on järjestelmän tila, jossa se ei pääse lainkaan etenemään. Jos esimerkiksi tulostimen ja koneiden välinen jono menee rikki niin, että kumpikin kone näkee jonon olevan täynnä (ja näin jää odottamaan että saisi laittaa sinne pyynnön), ja tulostin kuvittelee että jono on tyhjä (ja näin odottaa pyyntöjä), järjestelmä lukkiutuu. 

Ajatellaan nyt protokollaa joka hoitaa jonkin tällaisen järjestelmän toimintaa. Siinä ei ole jonoa, mutta siinä on eräänlainen "odotushuone". Jokainen joka haluaa päästä tulostamaan -- nimitetään tätä asiakkaaksi -- ilmaisee halunsa tulostaa laittamalla "lipun" päälle. Kummallekin asiakkaalle on oma lippunsa.  Kun asiakas on laittanut lipun päälle, tämä menee "välitilaan"  kirjoittamaan "nimikirjaan" toisen asiakkaan nimen. Tämä tapahtuu riippumatta siitä, mitä nimikirjassa luki. Tämän jälkeen asiakas menee odottamaan. Odottaessaan asiakas tarkastaa, onko nimikirjassa tämän oma nimi vai joku muu. Jos kirjassa on oma nimi, niin asiakas pääsee tulostamaan. Jos siinä ei ole omaa nimeä, asiakas tarkastaa onko kenelläkään lippu päällä. Jos lippuja ei ole päällä, asiakas pääsee myös tulostamaan. Tulostettuaan asiakas laittaa lipun alas.

Tässä järjestelmässä asiakas ei voi "etuilla" muita. Jos joku muu on esittänyt pyynnön, niin kun asiakas esittää pyynnön (eli laittaa lipun päälle), hän samalla antaa vuoron toiselle. Asiakkaat eivät voi estää toisiaan laittamasta lippuja päälle. He voivat viivästyttää toista ainoastaan jäämällä välitilaan jossa lippu on laitettu päälle mutta nimikirjaan ei ole kirjoitettu mitään.  Järjestelmä ei kuitenkaan vaadi edes heikkoa reiluutta, ainoastaan oletuksen, että kumpikaan ei vapaaehtoisesti pysähdy välitilaan, odottamaan, tai tulostamaan.

Me tiedämme että tämä järjestelmä toimii ilman reiluusoletuksia. Vaan entä jos järjestelmä onkin rikki?

Kuvitallaan että asiakas ei tarkastakaan toisen lippua, vaan jää vain odottamaan, että toinen asiakas antaa vuoron. Tällöin asiakas jää odottamaan kunnes toinen asiakas on antanut vuoron ja siirtynyt itse odottamaan. On selvää, että tällainen järjestelmä ei toimi kunnolla -- kuvittele järjestelmä jossa voit tulostaa ainoastaan jos joku muu yrittää myös tulostaa.  Jos kuitenkin mallinnamme järjestelmän niin, että kukaan ei jää odottamaan minnekään, se näyttää toimivan oikein, koska kumpikin yrittää tulostaa uudelleen ja uudelleen. Me toki tiedämme että jos sallimme asiakkaan jäädä paikoilleen alkutilaan, niin virhe paljastuu.

Yleisemmin, ominaisuus joka tässä yleensä tarkastetaan on, että lopulta pyyntöön vastataan. Mutta tämä rikkinäinen järjestelmämme näyttää oikealta jos emme osaa huomioida sitä, että asiakas saattaa alkutilassa jäädä paikoilleen.  Heikko reiluuskaan ei auta suoraan, mutta me voimme saada virheen kiinni, jos laitamme alkutilaan silmukan, jossa asiakkaan on lupa junnata paikallaan. Tällöin saamme aikaan äärettömän suorituksen, jossa pyyntö on esitetty, mutta siihen ei ole mahdollista vastata (koska toinen asiakas pyörii loputtomiin eikä koskaan pyydä mitään), ja olettamalla että reiluus koskee vain välitilaa, odotusta, ja tulostamista. Tämä on kuitenkin varsin hankala mallintajalle, koska mallintajan täytyy ikään kuin tietää missä tilassa virhe voi syntyä ennen kuin hän edes sitä lähtee etsimään.

Ongelma tässä on se, että järjestelmän alkuperäinen malli näyttää oikealta, koska asiakkaalle ei olla mallinnettu muuta mahdollisuutta kuin se, että tämä jatkuvasti esittää pyyntöjä. Huomattavasti luontevampi malli olisi sellainen, jossa asiakas voi todeta että "olen saanut tarpeekseni" tulostettuaan, ja tämä siirtyy tilaan jossa ei enää voida tehdä mitään. Tällöin toki järjestelmä saattaa lukkiutua, mutta lukkiutumisen kohdalla riittää spesifioida erikseen se, onko lukkiuma sallittu vai ei. Eli, jos annamme asiakkaalle mahdollisuuden päättää "nyt loppui" ja parkkeerata itsensä, meidän pitää sallia sellainen lukkiuma (ja vain sellainen) jossa kaikki asiakkaat ovat lopettaneet tyytyväisinä.

Tämä siksi, että on intuitiivisesti selvää ettei asiakkaan pyyntöihin vastaamisen ehtona pitäisi olla se, että toinenkin asiakas pyytää jotain. Jos teemme näin, niin huomaamme, että kun toinen asiakas lopettaa tyytyväisenä, toinen on tuomittu jumittamaan odotustilaan; löydämme lukkiuman joka ei ole sallittu ja virhe paljastuu. Alkuperäisessä järjestelmässä näin ei käy, koska odottava asiakas näkee että toisen asiakkaan lippu on alhaalla, ja pääsee tulostamaan kaikessa rauhassa.

Kun tutkimme jonkin pyynnön toteutumista, nimitämme tällaista ominaisuutta ei-pakotetuksi pyynnöksi (unforced request). Se tarkoittaa, että asikkaalla tulisi olla mahdollisuus kieltäytyä esittämästä pyyntöjä, ja järjestelmän oikeellisuus tulisi säilyä. Pääsemme näin eroon reiluudesta ainakin tässä nimenomaisessa tapauksessa.

Kuvitellaan nyt että rikomme jo rikkonaista protokollaa lisäksi niin, että asiakas ei muistakaan kirjoittaa mitään nimikirjaan. Tällöin siis asiakas vain laittaa lipun päälle ja menee tarkastamaan onko nimikirjassa oma nimi. Nimikirjassa on jonkun nimi, ja tämä joku pääsee loputtomiin käsiksi resurssiin, mutta koska kukaan ei sitä muuta, toinen asiakas puolestaan jää odottamaan loputtomiin.  Huomaisimme tässä kyllä virheen, mutta tehdään lisäoletus: Kun asiakas päättää ettei se enää halua palvelua, se parkkeeraa itsensä, ja vasta sitten kirjoittaa nimikirjaan toisen asiakkaan nimen.

Tällöin käy niin, että niin kauan kun kumpikin asiakas haluaa resurssia, ensimmäinen saa sen käyttöönsä loputtomiin kun taas toinen ei saa sitä lainkaan. Vasta kun ensimmäinen lopettaa, toinen saa vuoron. Tässä kohtaa emme saa virhettä kiinni pelkästään lukkiumia ja turvallisuusominaisuuksia tarkastelemalla, mutta järjestelmällä on kuitenkin ääretön suoritus jossa toinen prosessi odottaa. Reiluutta ei kuitenkaan tarvita mihinkään, ainoastaan oletus että kumpikaan asiakas ei odota loputtomiin.

Nimitämme tällaista ominaisuutta englanninkielisellä ilmaisulla eventual access (en keksinyt hyvää suomennosta). Se tarkoittaa että spesifioimme tilapredikaatteja jotka eivät saa olla voimassa äärettömässä suorituksessa. Emme siis oleta mitään reiluudesta tässä kohtaa, vaan yksinkertaisesti sanomme että "ei ole lupa jättää asiakasta odottamaan äärettömästi". Tämä on hieman samanlaista kuin reiluus, mutta se on eri roolissa; Reiluus on oletus joka tehdään jotta voidaan erottaa aidot virheet silmukoiden alispesifioinnin tuottamista "artefakteista".

Rikkinäisessä järjestelmässä on eventual-access rikkomus, sillä niin kauan kun ensimmäinen asiakas hakee palvelua, tämä saa sitä loputtomiin ja toinen asiakas ei saa mitään. Vasta kun ensimmäinen lopettaa, toinen pääsee resurssiin. Käytännössä tämä näkyy niin, että järjestelmällä on silmukka jossa toinen asiakas odottaa.

Jos siis spesifioimme että järjestelmälle on spesifioitu sallitut lukkiumat, turvallisuus (eli se, ettei resurssia käytetä yhtä aikaa) sekä eventual access- ominaisuus ja varmistamme että mallinnoksessa on huomioitu unforced request, niin voimme saada kaikki em. virheet kiinni ilman mitään erillisiä reiluusoletuksia.

Tämä artikkeli on nyt kirjoituksen alla.





perjantai 1. joulukuuta 2017

Todennäköisyystehtävä.

Laadin opiskelijoille tehtävän, jota en itse osannut ratkaista vielä. Tarkoitan, että osaan kyllä teoriassa ratkaista sen, mutta se ei ole käytännössä helppoa. Asetelma on seuraavanlainen:

Meillä on tikkataulu, jonka virkaa saa tässä tehtävässä hoitaa yksikköympyrä (x,y)-koordinaatistossa, eli niiden pisteiden joukko jotka ovat korkeintaan etäisyydellä 1 origosta. Pisteet toteuttavat epäyhtälön x^2 + y^2 =< 1 (pahoittelen että käytän tätä notaatiota, yläindeksinotaatio HTML:ssä on vain liian työlästä)

Nyt, meillä on kaksi pelaajaa, "räiskijä" ja "tähtääjä". Räiskijä heittää tikkaa aina siten, että hänellä on tarkalleen yhtä suuri todennäköisyys osua mihin tahansa taulun pisteeseeen. Todennäköisyyslaskennan keinoin tämä voidaan ilmaista niin, että otosavaruus räiskijän osumapisteelle on yksikköympyrä, ja tiheysfunktio on 1/Pi. Ympyrän pinta-ala on Pii, joten tämän integroiminen ympyrän yli tuottaa 1.

Tähtääjä puolestaan heittää kohti jotakin pistettä (a,b), ja hänen osumansa on myös jakautunut pisteen (a,b)-keskiseen ympyrään siten, että tiheysfunktio f(x,y) = 2(1 - (a-x)^2 - (b-y)^2)/pi. Jokainen voi tarkastaa että kun tätä funktiota integroidaan (a,b)-keskisen 1-säteisen ympyrän yli, tulos on 1. Tähtääjän todennäköisyys osua kymppiin on paljon suurempi kuin räiskijän, koska paljon suurempi osa tähtääjän "todennäköisyysmassasta" on ympyrän keskellä -- olettaen että hän tähtää keskelle.

Pelaajat laitetaan kuitenkin pelaamaan toista peliä: Heidän tehtävänään onkin osua numeroon 1. Oletamme, että numeroita on kymmenen, ne ovat origokeskisiä ympyrän "kaistaleita" joiden leveys  on 1/10.  Kymppi on siten ympyrä, jonka säde on 1/10, kehät 9 ja 10 muodostavat ympyrän jonka säde on 2/10, jne.

Räiskijän todennäköisyys on helppo laskea, sillä se on 1 - (9/10)^2 eli 19/100. Tämä johtuu siitä, että 9/10 säteestä on numeroiden 2-10 kehiä, ja pinta-ala kasvaa neliöllisesti.

Mutta tähtääjän todennäköisyys riippuu tähtäyspisteestä. Koska ympyrä on symmetrinen, voimme olettaa että tähtääjällä on vain yksi parametri, b, joka sekin on ei-negatiivinen.

Jos tähtääjä tähtää kekselle, niin todennäköisyys on yksinkertaisinta laskea napakoordinaattien avulla, eli x = r*cos(p) ja y = r*sin(p), missä p on kulma ja r on etäisyys origosta. Tällöin pitää muistaa että pinta-ala-differentiaali on r*dr dp.  Merkitään f(r,p,b) (hiukan notaatiota pahoinpidellen) tiheysfunktiota napakoordinaateissa kun tähdätään pisteeseen b, niin saamme integraalin f(r,p,0)*r dr dp, missä r saa arvot välillä  [9/10, 1] ja p arvot välillä [0, 2pi].

Itse integraalilauseke sinänsä ei muutu, eli integroidaan edelleen f(r,p,b)*r dr dp: tä, mutta rajat valitettavasti muuttuvat, sillä kun tähtääjä tähtää ylemmäs taululla, ykköskehää jää taulun alaosassa pois mahdollisten osumakohtien joukosta.  Integraalin rajoja en ole onnistunut johtamaan täysin. Kun b = 1/10, tähtääjän ylipäätään mahdollisten osumakohtien raja koskettaa ykköskehää taulun alareunassa. Tällöin (rajalla), kun p = -pi/2, pitäisi r:n integraali olla [9/10,9/10], eli supistua kokonaan pois, sillä tuossa pisteessä alueet vain koskettavat toisiaan.

Yleisestiottaen, r:n pitäisi kulkea arvosta 9/10 arvoon max(9/10, min(1, z(p))), missä z on (0,b)-keskeisen ympyrän reuna suunnassa p. p saa puolestaan kulkea kyllä [0,2pi], koska r:n integraali menee nolliin niissä kulmissa joissa ykköskehä on osuma-alueen ulkopuolella.

En saanut tätä kuitenkaan vielä sellaiseen muotoon, jossa olisin saanut sen edes numeerisesti murjottua. Tästä pitäisi löytää se b:n arvo, joka maksimoi integraalin arvon. Kyse on jonkinlaisesta variaatiolaskennan tms tehtävästi, ja se on vahvasti ei-triviaali.