Hyppää sisältöön

Munakello 0.1

Tämä on lyhyt tarina Munakellosta ja siitä, kuinka se syntyi, kuinka pieni kokeilu johti toiseen kokeiluun ja kuinka koko hommasta kehkeytyi pieni muutaman illan vapaa-ajan miniprojekti.

Pomodoro

Pomodoro-tekniikka on ajanhallintatyökalu[1]. Siinä pyritään keskittymään määrätty aika työskentelyyn ja välttämään häiriöitä sinä aikana. Sitten pidetään tauko. Tarkoituksena on rytmittää tekemiset ja tauot niin, että työskentely tehostuisi. Pomodoro-nimitys tulee tomaatin muotoisesta keittiöajastimesta, joka voidaan laittaa soimaan halutun ajan kuluttua.

Teen työtä tietokoneen ääressä, ja toisinaan pitäisi muistaa pitää tauko ja vähän jaloitella. Toisaalta taas, kun on tekemisen aika, pitäisi pystyä keskittymään itse tekemiseen. Siksipä palasin taas kokeilemaan tätä tekniikkaa.

Vaikka minulla onkin oikeastaan sopiva ajastin olemassa, en pidä siitä, koska se pitää turhan suurta ääntä muuten rauhallisessa ympäristössä. Myös tietokoneen ääressä työskenneltäessä ajastinkin voisi toimia koneella. Sellainen piti siis tehdä[2].

Asyncio ja taskit

Olin jonkin verran tutustunut Pythonin asyncio-kirjastoon, ja ajattelin toteutusta taskeina. Yksinkertaisesti pomodoron toteutus voi olla seuraavanlainen:

async def pomodoro():
    print("Start work...")
    await asyncio.sleep(25 * 60)
    print("Stop work.")
    print("Start break...")
    await asyncio.sleep(5 * 60)
    print("Stop break.")

Kyseessä on siis coroutine, jonka suoritys pysähtyy sleepin kohdalla ja antaa vuoron toisille coroutinelle. Tämän ohella voi sitten ajaa muita taskeja, vaikka taskia, joka raportoi kuinka paljon aikaa on jäljellä, tai taskia joka piippaa, kun aika lähestyy loppuaan. Nämä taskit käynnistään "taustalle" asyncio.ensure_future -kutsuilla. Taskien toteutus on suoraviivainen, kuten:

async def report_time(start_time, end_time):
    while datetime.now() < end_time:
        print('{} remaining'.format(end_time - datetime.now()))
        await asyncio.sleep(60)

Tällaisenaankin tämä toki toimi, mutta sorruin muotoilemaan tulostusta muotoon "21 minutes remaining" tai "30 seconds remaining". Lisäksi pyrin laskemaan sleep-ajoille mahdollisimman täsmälliset hetket. Tässä olikin jonkin verran vääntämistä. Olisi pitänyt heti ymmärtää ottaa test-driven-development käyttöön, ja varmistaa aikalaskujen toimivuus sillä. (Nyt testien tekeminen kuitenkin jäi johonkin tulevaisuuteen.)

Asennus

Kun olin saanut jollakin tavalla toimivan version rakennettua, halusin kokeilla sitä toisella koneella. Helpointa taas olisi ollut kopioida munakello.py-tiedosto toiselle koneelle ja käynnistää se siellä komennolla python3 munakello.py.

Yhdistin kuitenkin tähän kokeiluun vielä setup.py-tiedoston tekemisen ja sillä asennuspaketin tekemisen. Tiedostossa tehdään setup-funktion kutsu ja sille määritellään ohjelmaan ja sen asennukseen liittyviä asioita.

# ...
setup(
    name='munakello',
    version='0.1.0',

    description='A simple Pomodoro timer',
    long_description=long_description,
# ...

Määriteltäviin asioihin kuuluvat mm.

  • ohjelma nimi,
  • ohjelman versio,
  • kuvaus ohjelmasta,
  • ohjelman kotisivu,
  • tekijä ja tekijän sähköpostiosoite,
  • lisenssi,
  • ohjelman luokittelu,
  • avainsanat,
  • pakettien tai moduulien, joista ohjelma koostuu, määrittely, ja
  • nk. entry-pointtien määrittely[3].

Näistä osa oli helposti täytetty, mutta jotkin muut taas puolestaan toivat lisää tekemistä, tai — positiivisemmin sanottuna — antoivat mahdollisuuden lisätekemiseen.

setup.py:n ajamalla saa tehtyä kätevästi lähdekoodipaketin (tar.gz) ja asennuspaketin (wheel).

python3 setup.py sdist bdist_wheel

Lisenssi

Lisenssiksi määrittelin GPLv3:n. Ohjelma on siten vapaasti käytettävissä, muokattavissa ja jaeltavissa, kunhan jaeltu tuotos antaa samat oikeudet eteenpäin.

Lisenssin valitsin ohjelmalle jo aika varhaisessa vaiheessa, ihan vain siltä varalta, että tästä tulisi jotain "valmista". Käytän mielelläni vapaita ohjelmia ja tämäkin ohjelma on tehty vapaita työkaluja käyttäen. Siksi luonnollinen valinta olikin valita vapaa lisenssi.

Sivut

Kotisivut minulla on, mutta kirjoitin nyt sinne oman osuuden tälle ohjelmalle. Ohjelmalla on nyt pääsivu sekä lähdekoodi versionhallinta ja ladattavat paketit. Lisäksi varaan sivuiltani oman paikan versionhallinnan repositorylle[4] ja toisen tiedostojen laamiselle. Muita sivuja teen sitten myöhemmin, jos tai kun tarvetta ilmenee.

Olisihan sivut voinut luoda esimerkiksi GitHubiin tai johonkin vastaavaan paikkaan. Sellainen olisi tarjonnut valmiina versionhallintaa ja tukea vikojenhallinnalle. Tässä vaiheessa en kuitenkaan pidä tätä tarpeellisena. Toisaalta vierastan myös ajatusta "kaikkien ohjelmien" keskittymistä yhteen "hubiin". Autan mieluummin Internettiä pysymään hajautettuna.

Julkaisu

Kaiken kaikkiaan tästä muodostui aika mukava pikku harjoitus. Vaikka ohjelma ei — tässä vaiheessa — olekaan kovin ihmeellinen, pienen häkkäämisen lisäksi tuli käytyä läpi myös Python-ohjelman asennuspaketin tekeminen ja ohjelman julkaisu.

Siispä: Täten olkoon Munakellon versio 0.1 julkaistu kaiken kansan käytettäväksi

Munakello: http://tsk.iki.fi/sw/munakello/

[1] Tosin jossain sanottiin osuvasti, että aikaa ei voi hallita. Kyse on enemmänkin siitä, miten se käytetään…
[2] Jo toki niitä ajastimia löytyy valmiinakin, esim. GNOME Shell time-management app, joka minulla jo olikin asennettuna. Rupesinpa silti tekemän itse. Nih.
[3] Entry-pointeilla voidaan määritellä laajennuspisteitä ohjelmalle sekä nk. console script. Kun paketti asennetaan pip-ohjelmalla, se generoi automaattisesti shell-skriptin tai bat-tiedoston, jolla ohjelman voi käynnistää.
[4] Versionhallintana käytän Bazaaria. Tutustuin siihen jo vuosia sitten, ja vaikka sen kehitys onkin viime aikoina ollut hidasta, pidän sitä kuitenkin erinomaisena työkaluna. Lisäksi Bazaarin versionhaaran julkaisu staattisilla webbisivuilla on helppoa, ei tarvitse kuin kopioida haara näkyville.

Kommentit