Sveža kava pri MailChimpu
Tokrat vam predstavljamo gostujoči prispevek Stevena Sloana, razvijalca pri podjetju MailChimp.
Razlogi za inovacijo
Pri MailChimpu vedno skušamo delovati po načelu dobrega poslušanja in hitrih menjav, kar pomeni, da velikokrat potrebujemo kavo. Vsak oddelek ima svoj način pripravljanja kave, predvsem pa se to dela s standardnimi komercialnimi aparati Bunn-O-Matic. Nekaj ljudi občasno uporabi naš espresso sistem. Razvijalci tako zapolnijo dve skodelici – eno z navadno in drugo z dvojno močjo. Nato je na vrsti ekipa, ki se ukvarja s trženjem in dragocen Chemex. Tako naredimo veliko skodelic kave vsako uro, kar čez cel dan, v 5 dneh v tednu in nekaj čez 50 tednov v letu znese kar precej. Decembra prejšnje leto smo tako zbirali podatke za letno poročilo, nakar nas je pričelo zanimati koliko svežih skodelic kave spijemo. Vse skupaj smo skušali prešteti, vendar moram priznati, da nam to ni uspelo tako dobro, saj smo se pri tem zanašali na porabljen denar. Odločili smo se, skodelice kave skušamo prešteti kar z enostavnim števcem, vendar tudi to ni trajalo dolgo.
Za nekaj časa se je tako točnost zaužite kave zdela, kot da je to le še ena izmed mnogih skrivnosti vesolja. Kmalu zatem sem se ob čakanju na svežo pripravljeno skodelico kave pogovarjal z Markom in mu rekel, da bi se lahko naredilo sistem, ki bi preverjal temperaturo kave z Raspberry Pijem in v komunikacijski sistem poslal, da je na voljo nov lonec sveže kave. Seveda tega nisem mislil povsem resno, Markov odziv pa je bil podoben kot takrat, ko kdo predlaga kakšno smešno idejo, ki naj bi jo izvedli v našem podjetju. Rekel je, da se to sicer sliši odlično in kaj potrebujem, da bi to naredil.
Svež Pi
Prva stvar, ki sem jo naredil z Raspberry Pijem v rokah je bila skripta, ki je po zagonu sistema poslala e-poštno sporočilo z uporabo Mandrilla s svojim IPjem, tako da sem ga v omrežju našel brez problema. Nato sem se spopadal s težavo o zaznavanju stanja skodelice z eno podatkovno točko: trenutno temperaturo. Upal sem, da bo primerjanje tekočih povprečij različnih časovnih razponov zadostovalo za ugotovitev stanja skodelice. (Povprečna Chemexova temperatura po nekaj minutah je podala drugačen rezultat, kot v primerjavi s povprečno temperaturo po eni uri.)
Ker je šlo za greenfieldov projekt, sem želel delati z nepoznanim jezikom. Menil sem, da bi se funkcijska narava Clojure več kot skladala z enim kosom stanja. Izkazalo se je, da je šlo za odlično odločitev in ravno to vam bom tudi razložil.
Grafični prikaz
Na hitro sem naredil program, ki je prebral trenutno temperaturo in povprečje obdobja ene minute, ene ure in povprečje ocene spremembe, ki so bili zapisani v dnevniško datoteko, da sem jih lahko analiziral.
1 2 3 4 5 6 7 8 |
... {"current":32.062, "minute":24.8747, "hour":23.5391, "running-rate":0.039508} {"current":32.437, "minute":25.0008, "hour":23.5635, "running-rate":0.0423943} {"current":32.875, "minute":25.1322, "hour":23.5897, "running-rate":0.045361} {"current":33.625, "minute":25.2738, "hour":23.6177, "running-rate":0.048569} {"current":33.625, "minute":25.413, "hour":23.6476, "running-rate":0.05159} {"current":33.625, "minute":25.55, "hour":23.6793, "running-rate":0.054437} ... |
Ker sem imel na voljo dnevniške datoteke, sem na hitro odšel nazaj na Ruby ter z uporabo čudovite knjižnice za prikaz grafov Gruff naredil vzorce za enostavnejše branje podatkov. Nekaj preizkusnih serij vroče vode mi je dalo idejo kako naj bi stvari izgledale, zato sem prestavil kavni stroj na svojo mizo, da bi dobil podatke v živo. Tako mi je uspelo preveriti aktualno stanje in stanje v mojem programu, da sem ju lahko primerjal s pravim stanjem lončka (ter dobil nekaj posmehov sodelavcev in čudovit vonj v pisarni čez cel dan).
Na grafu je enostavno zaznati kdaj je svež lonec kave pripravljen, vendar se je izkazalo, da je zaznavanje prazne skodelice lahko malo zahtevnejše. Chemex potrebuje nekaj trenutkov, da se popolnoma ohladi, kar pomeni, da je lahko prazen vendar še vedno topel, kar pa bi ob nepravilnem funkcioniranju programa lahko privedlo do nekaj razočaranih pohodov v kuhinjo. Na srečo se to enostavno reši s preverjanjem kako hladen je lonec, ki nam pove če je polna ali prazna – pol skodelice kave ostane toplejše, kot če je lonec prazen zaradi tega, ker je v njem še vedno kava. Lepo je imeti fiziko na svoji strani.
Opazovanje zmage
Opremljen z zbirko podatkovnih točk (s povprečji, znaki sprememb in tako dalje) za vsako stanje skodelice, sem pričel ugotavljati kako opozoriti skupinsko klepetalnico našega oddelka ob stanjih, ko je lonec kave v pripravi, pripravljen, prazen ali zastarel. Tukaj prav pride kar nekaj funkcij, ki so že vgrajene v Clojure. Program za zapisovanje stanja vsake sekunde sem že imel pripravljen, s spremembo dejanskega stanja na agentih, pa sem lahko pognal opazovalce. Ti so bili klicani kadar se je stanje na agentih spremenilo, kar je popolno za analiziranje sprememb stanja. Nov dodan agent pa je bil lonček sam, saj je vsak opazovalec preveril in posodobil njegovo stanje, ki je pognalo nove opazovalce in posodobilo status v klepetalnici. Ko je prišel čas za dostavljanje obvestil pa je bil prva izbira Dave Grohl.
Tukaj pa še primer kode opazovalca skodelice, ki je zaznaval polnjenje:
1 2 3 4 5 6 7 8 |
(def pot-status (agent {:status "empty"})) (defn pot-watcher [watcher status old_status new_status] (if (= (:status new_status) "brewing") (notify/is_brewing))) (add-watch pot-status :pot-watcher pot-watcher) |
Odlična stvar pri tem je to, da je opazovalec klican ob spremembi stanja, ne pa ob vsaki spremembi temperature. Z uporabo agentov sem bil v tem primeru zares zadovoljen, saj so zagotovili čisto pot do spremljanja stanja (brez dodatnih klicev in ostalih podobnih stvari), tako da je s tem program ločen na različne dele.
Svežina v prihodnosti
Še vedno delam na nekaj zankah, optimizaciji in vodenju dnevnika lončkov. Bilo je res zabavno in naučil sem se veliko. Nekaj pa mi pravi, da to ne bo zadnjič, ko sem delal z Raspberry Pijem na projektu. Verjetno je naslednji projekt svež lonec kave v vesolju? Na srečo imamo dovolj kave, s katero lahko naredimo veliko.
Velika zahvala gre seveda Stevenu in MailChimpu, ki sta nam dovolila uporabiti ta prispevek, hkrati pa smo veseli, da vidimo Raspberry Pi v novi obliki uporabe iz strani razvijalcev.