Näytetään tekstit, joissa on tunniste Sublime Text. Näytä kaikki tekstit
Näytetään tekstit, joissa on tunniste Sublime Text. Näytä kaikki tekstit

maanantai 25. syyskuuta 2017

Sublime Text settings

Here is my Sublime Text set up

Sublime-settings


{
"additional_path_items":
[
"/opt/local/bin/"
],
"bold_folder_labels": true,
"caret_extra_bottom": 1,
"caret_extra_top": 1,
"caret_extra_width": 1,
"caret_style": "blink",
"color_scheme": "Packages/Monokai Extended/Monokai Extended.tmTheme",
"default_encoding": "UTF-8",
"fade_fold_buttons": false,
"font_face": "Hack",
"font_size": 15,
"ignored_packages":
[
"Vintage"
],
"indent_guide_options":
[
"draw_normal",
"draw_active"
],
"line_padding_bottom": 2,
"line_padding_top": 2,
"margin": 2,
"overlay_scroll_bars": "enabled",
"show_definitions": false,
"show_encoding": true,
"show_line_endings": true,
"show_panel_on_build": false,
"tab_size": 2,
"theme": "Adaptive.sublime-theme",
"translate_tabs_to_spaces": true,
"word_wrap": true
}


Download Hack font. Got better? Insert your comments below!

tiistai 19. heinäkuuta 2016

Yle Uutisten Plus-toteutuksien kehitys

PlusDesk on Yle Uutisissa toimiva tiimi, joka toteuttaa Yle Uutisten verkkosivuille niin sanottuja Plus-toteutuksia. Plus-toteutukset ovat uutisjuttuja, joita ei ole mahdollista toteuttaa julkaisujärjestelmässä. Toisinsanoen esimerkiksi interaktiiviset tai datajournalistiset toteutukset – kun ne vaativat jonkinlaista erityistä verkonkerrontaa – tehdään yhteistyössä PlusDeskin kanssa. Konkreettisesti tällaisia toteutuksia ovat olleet muun muassa:

PlusDesk on toiminut vuoden 2013 alusta eli nyt kolmen ja puolen vuoden ajan. Tänä aikana Plus-toteutuksien toteuttaminen ja julkaiseminen on kehittynyt monilla tavoin. Aloitimme julkaisemisen Ylen verkkolevyn nurkalta, josta on sittemmin luovuttu. Nyt olemme siirtymässä käyttämään AWS-palvelua ja projektikohtaisia Git-repositorioita.

Toteutusten kehitys


Tällä hetkellä PlusDeskissä työskentelee neljä kehitystyötä tekevää henkilöä. Käytössämme on niin Linux- kuin Mac-koneita. Meillä on kaikilla henkilökohtaiset kehitysympäristöt, jotka pyörivät lokaalisti. Kehitysympäristöjen ylläpito ja päivittäminen on pääasiassa käyttäjän vastuulla.

Kehitystyön kannalta olennaista on, että toteutuksia voidaan kehittää ja testata omilla laitteilla mahdollisimman pitkälle ja mahdollisimman vaivattomasti. Tämä helpottaa toteutusten julkaisemista, kun jo kehitysvaiheessa toteutukset testataan mahdollisimman autenttisessa ympäristössä. Eli rautalangasta väännettynä, kehittäjillä on omalla koneellaan kopio Yle Uutisten verkkosivuista, jossa he pystyvät testaamaan kehittämäänsä toteutusta ja näkemään miten toteutus toimii suhteessa muuhun sivustoon. (Kuva 1)

Lokaalisti toimiva kehitysympäristö helpottaa toteutusten testaamista. Kehitysympäristö on kuvankaappaus Yle Uutisten artikkelisivusta. (Kuva 1)

Toteutukset upotetaan suoraan Yle Uutisten sivupohjaan, joten kehittäjän on halutessaan mahdollista rikkoa (muuttaa) koko sivuston toimintaa. Pyrimme hallitsemaan tätä mahdollisuutta rajaamalla kaikki toteutukset koskemaan vain niitä elementtejä, jotka liittyvät itse toteutukseen. Tämä rajaaminen estää, etteivät koodit vaikuta mihinkään toteutuksen ulkopuolisiin elementteihin. Se, että toteutukset asetetaan suoraan sivupohjaan (esimerkiksi iFrame-upotuksen sijaan) kuitenkin mahdollistaa sen, että kehittäjän on helppoa manipuloida myös sivupohjaa niin halutessaan.

Toteutukset noudattavat tiedosto- ja kansiorakenteeltaan aina samaa muotoa, joka on kuvattu alla.

js/
data/
css/
img/
index.html

Näiden lisäksi projekteissa voi soveltuvasti olla mukana esimerkiksi audio, video tai script -nimisiä kansioita. Eri osa-alueet on siis jaettu omiin kansioihinsa. CSS-tyylitiedostot löytyvät omasta css/-kansiosta. Javascript-tiedostot eli toimintalogiikka löytyy js/-kansiosta ja niin edelleen. Käytämme toteutuksissa aina tätä samaa rakennetta, joka helpottaa projektien hallinnointia jälkikäteen ja eri kehittäjien kesken.

Koodauksessa pyrimme käyttämään apuna hyväksi havaittuja ja luotettuja kirjastoja kuten D3.js, jQuery ja Highcharts. Aina tarpeen mukaan käytämme projekteissa myös uusia kirjastoja, mutta näiden käytössä olemme tarkkoja, että ne toimivat varmasti kaikilla laitteilla. Soveltuvasti käytössämme on myös Three.js:n, Reactin ja Angular.js:n kaltaisia kirjastoja. Kirjastot tarjoillaan projekteille joko staattisina tiedostoina tai Node-moduuleina.

Javascriptissä käytämme niin ES5:sta kuin ES6:sta. CSS:ssä meillä on käytössä niin LESS kuin SASS. Nämä kehittäjästä ja projektista riippuen.

Yksinkertaiset projektit pyrimme pitämään mahdollisimman yksinkertaisina (KISS).

Alusta asti olemme käyttäneet Git-versionhallintaa. Versionhallinta mahdollistaa muun muassa koodien jakamisen kehittäjien kesken, mutta myös toteutusten versioinnin. Tähän päivään asti meillä on ollut jokaisen vuoden projekteja varten yksi repositorio, mutta nyt olemme siirtymässä käyttämään projektikohtaisia repositorioita. Projektikohtaiset repositoriot mahdollistavat ketterämmän versionhallinnan hyödyntämisen. Jatkossa nimeämme repositoriot seuraavasti:

"vvvv-kk-projektin_nimi"

Eli esimerkiksi 2016-06-asuntokone. Aikaisemmin kansiorakenne oli muotoa vvvv/kk-projektin_nimi. Meillä on komento, joka luo projektin perustamisen yhteydessä uuden repositorion (myös remoten).

Testaus


Testaamme toteutuksiamme vaihtelevasti, mutta etenkin uudet teknologiat isoimmat projektimme testaamme kattavasti eri laitteilla ja eri ympäristöissä. Tämä tarkoittaa, että kokeilemme toteutuksia puhelimilla, tableteilla, Mac- ja Windows-koneilla sekä eri selaimilla. Meillä on erikseen testaamiseen hankittuja laitteita.

Testaamiseen hyödynnämme Google Chrome DevTools:a, Xcode Simulator:a ja Ghostlab-ohjelmistoa.

Pyrimme siihen, että kaikki toteutuksemme toimivat teknisesti kaikilla nykyisillä laitteilla ja ympäristöillä.

Teemme myös käyttäjätestejä mahdollisuuksien mukaan.

Julkaistavan version buildaaminen


Olemme siirtymässä ja pääosin jo siirtyneet projektien "buildaamiseen". Buildaaminen tarkoittaa, että teemme Plus-toteutuksien koodeista erillisen julkaistavan version. Julkaistavat versiot asetetaan projekteissa public/-nimiseen kansioon, jonka alta löytyy käytännössä sama kansiorakenne kuin yllä kuvatulla kehityspuolella. Public-kansiossa asuvat vain tiedostot joita julkaistava versio tarvitsee.

Käytössämme on muutamia rinnakkaisia buildaustyökaluja, mutta useimmat meistä käyttävät työkalua nimeltä Gulp (olisi mahdollista käyttää myös Grunt:a. Olemme integroineet Gulp:n Sublime Gulp:lla Sublime Text -editoriin, jota käytämme koodin kirjoittamiseen (Kuva 2).

Gulp tarkkailee muutoksia tiedoissa ja suorittaa buildin. (Kuva 2)

HTML, CSS ja JS tiedostoille Gulp suorittaa omat tehtävänsä. Javascript-tiedostojen buildaus tekee seuraavat toiminnot (Suluissa ovat käytettyjen Node-moduulien nimet):

Lint tarkistaa koodin syntaksia, Browserify tekee koodeista selaimessa toimivia, Uglify minifoi koodin, Sourcemaps mahdollistaa minifoidun koodin palauttamisen, Livereload kertoo selaimelle tiedostojen muuttuneen.

CSS-tiedostoille buildi tekee toiminnot:

Less muuntaa Less-syntaksin selaimen ymmärtämään CSS-muotoon, Cleancss minifoi koodin, Sourcemaps mahdollistaa minifoidun koodin palauttamisen, Livereload kertoo selaimelle tiedostojen muuttuneen.

HTML-tiedostoille ajetaan:

Htmlmin minifoi koodin, Livereload kertoo selaimelle tiedostojen muuttuneen.

Gulp rakentaa buildin public/-kansioon, jonka sisältö siirretään julkaisua varten julkisen verkko-osoitteen taakse. Tulevaisuudessa tämä julkinen paikka on AWS:ssa. AWS on pilvipalvelu, jonka kautta voidaan jakaa helposti ja tehokkaasti staattisia tiedostoja. Aikaisemmin olemme käyttäneet Ylen omia verkkolevyjä minne tiedostot on siirretty käsin. AWS:n myötä tämä tiedostojen siirtäminen automatisoituu. Tässä suhteessa yhtenäistämme käytäntöjä Ylen sisäisesti.

Toteutuksen siirtäminen julkaisujärjestelmään


Julkaisujärjestelmämme on nimeltään Escenic. Esceniciä käytetään Yle Uutisten sisällön luomiseen ja tallentamiseen. Escenicistä tiedot haetaan rajapinnan (Yle API) avulla yle.fi/uutiset-sivustolle. Plus-toteutuksien osalta Esceniciin luodaan erillinen sisältötyyppi nimeltä "Ulkoinen sisältö". Ulkoiselle sisällölle määritellään kaikki resurssit, joita toteutus tarvitsee eli tämä tarkoittaa HTML, CSS ja JS-tiedostoja. (Kuva 3)

Asetamme julkaisujärjestelmäämme projektin tarvitsemat resurssit. Tässä esimerkiksi Asuntokoneen ulkoinen sisältö. CSS ja JS resursseja voi tarvittaessa olla useita. (Kuva 3)
Ulkoinen sisältö voidaan sitten liittää uutisartikkelissa mihin tahansa haluttuun paikkaan, jolloin HTML-sisältö liitetään haluttuun kohtaan. CSS- ja JS-tiedostot menevät niille varattuun paikkaan sivupohjassa. Aikaisemmin ulkoiset sisällöt oli mahdollista sijoittaa vain jutun alkuun tai loppuun.

torstai 13. joulukuuta 2012

Sormiharjoitus Twitter-datalla, osa 2

Käsittelin pari viikkoa sitten yksinkertaista Twitter-datan analyysiä, joka muodostui siinä määrin yleisömenestykseksi, että ainakin neljä ihmistä innostui sen perusteella tekemään vastaavanlaisen visualisoinnin ja tästä hurmioituneena ajattelin jatkaa saman aiheen tiimoilta.

Tällä kertaa minulla on tavoitteena kertoa miten on mahdollista kerätä ja visualisoida käyttäjän kuukausittaiset twiittimäärät. Innostuin ideasta viime aikoina Twitter:ssä liikkuneen ilmiön kautta, jossa kerrotaan omista Twitter:iin liittymispäivistä (kts. Twitter Birthday -palvelu). Etenkin, että monet kertoivat liittyneensä jo useita vuosia sitten, mutta aktivoituneen palvelun käyttämiseen vasta viime aikoina, herätti minussa kiinnostuksen siitä milloin itse aloin todella Twitter:ä käyttämään.

Ajatus, joka minulle heräsi oli kerätä talteen kaikki twiittini ja ryhmitellä ne kuukausittaisiksi twiittimääriksi. Eli esimerkiksi niin, että joulukuussa 2011 twiittasin 98 kertaa ja tammikuussa 2012 84 kertaa. Halusin nähdä datan piirrettynä yksinkertaisesti visualisoituna pylväsdiagrammiksi, jossa pystyakseli kuvaa twiittien määrää ja vaaka-akseli aikaa. Näin pystyisin näkemään missä vaiheessa olen esimerkiksi saavuttanut twiittimäärissäni nykyisen tason ja millä tavoin tuo twiittien kuukausitten määrä on vaihdellut eri aikoina.

Mutta nyt itse asiaan!



Kuten aikaisemmasta harjoituksesta opimme on All My Tweets -palvelun kautta mahdollista ladata käyttäjän kaikki twiitit aina
30003200:een viimeisimpään twiittiin saakka (Note: Twitter limits the number of tweets returned to 3,200). Itselläni tämä raja ei tule täyteen, joten edelleen palvelu palvelee käyttötarkoitustani.

Aloitan kuten aikaisemmassakin esimerkissäni eli kopioin henkilökohtaisen All My Tweets -sivuni sisällön Sublime Text -editoriin leikepöydän kautta. Analyysia tehdessäni minulla oli Twitter:n mukaan 1930 twiittiä ja tarkistin, että tämä lukuarvo täsmäsi Sublime Text -editoriin kopioituneiden rivien määrää. (Kuva 1)

Otin twiitit talteen All My Tweets-palvelusta yksinkertaisesti maalaamalla kaikki twiitit ja kopioimalla ne leikepöydän kautta käyttämääni Sublime Text -tekstieditoriin. (Kuva 1)
Edellisellä kerralla halusin poistaa kaikki aikaleimatiedot datasta, koska en halunnut niitä mukaan avainsanapilveen. Tällä kertaa motivaationi on sen sijaan muokata päivämäärätietoa niin, että siitä poistetaan reduntantti tieto twiitin lähetyspäivästä, koska haluan niputtaa twiittejä yhteen nimen omaan kuukauden ja vuoden perusteella. All My Tweets -palvelusta kopioitujen twiittien perässä oleva aikaleima on muotoa "Dec 10, 2012", joten tavoitteeni on muuttaa tekstijono muotoon "Dec, 2012". Tällä tavoin kaikki joulukuussa 2012 lähetetyt twiitit saavat yhteisen nimittäjän, jonka avulla ne on myöhemmässä vaiheeessa mahdollista visualisoida.

Teen muunnoksen jälleen säännöllisten lausekkeiden avulla. Käyttämäni etsi ja korvaa koodi näyttää seuraavalta:

([A-Z]{1}[a-z]{2}) ([0-9]+), ([0-9]{4})

ja

\1, \3

Korvaan siis merkkijonon jossa on kolme merkkiä joista ensimmäinen on kapitaali, välilyönti, numeroita yksi tai useampi, pilkku, välilyönti, sekä neljä numeroa siten, että poistan päivämäärää kuvaavan osuuden. (Kuva 2)

Etsi ja korvaa toiminto löytyy CMD/CTRL + SHIFT + F näppäinyhmistelmän takaa. Voit myös tarkistaa, että vasemmasta alanurkasta löytyvä hakutuloksien määrä vastaa twiittiesi määrää. (Kuva 2)
Tähän asti toteutus on edennyt hyvin samalla kaavalla kuin edellisessäkin harjoituksessa. Data hankittiin All My Tweets -palvelusta ja sitä muokattiin hieman sopivampaan muotoon Sublime Text -editorissa. Tässä kohtaa esimerkit lähtevät kuitenkin eri poluille, koska aikaisemmassa harjoituksessa veimme tekstimuotoisen datan suoraan Sublime Text -editorista Wordle:en. Nyt datan muokkaamista tulee kuitenkin jatkaa antamalla sille lisää rakenteisuutta, koska on tarpeellista pystyä osoittamaan missä kohtaa twiitin tekstisisältö loppuu ja tieto twiitin lähetysajankohdasta alkaa.

Tein twiitin tekstisisällön ja aikaleiman erottamisen askelsarkainmerkillä (tabulator). Tämä siitä syystä, että esimerkiksi pilkun tai puolipisteen käyttäminen ei ole oikein mielekästä, koska ne ovat normaalisti twiiteissä/tekstissä käytettäviä merkkejä ja erotinmerkin tulee olla sillä tavalla yksikäsitteinen, ettei sitä voida sekoittaa sisältöön. Eli oletan, ettei twiittien sisällöissä ole askelsarkaimia. (Kuva 3)

Poistan päivämäärien edessä olevan välilyönnin ja korvaan sen askelsarkain merkillä, jota käytän erottamaan tekstisisältö- ja aikasolut toisistaan. (Kuva 3)
Nyt data on valmis tallennettavaksi (CMD/CTRL + S). Tallennettaessa kannattaa käyttää .csv-tiedostopäätettä. CSV-tiedosto on rakenteista dataa sisältävä tiedostoformaatti, jossa data on useimmiten eroteltu toisistaan pilkuilla, mutta pilkkujen sijaan on mahdollista käyttää oikeastaan mitä tahansa erotinmerkkiä (kts. DSV). CSV-tiedoston avaaminen onnistuu kätevimmin LibreOffice-taulukkolaskentaohjelmassa, joka mahdollistaa tiedostossa käytettävän erotinmerkin manuaalisen valitsemisen. (Kuva 4)

Erotinmerkiksi on valittu "Tab". Muut asetukset toimivat usein sellaisenaan, mutta ongelmia voi syntyä esimerkiksi merkistökoodauksen kanssa, jolloin "Character set" asetusta voi yrittää muuttaa valintojen ISO-8859-1:n ja UTF-8:n välillä. (Kuva 4)
Tiedoston avaamisen jälkeen huomasin, että muumien twiittien aikaleimat eivät olleet tulleet oikein erotelluiksi, mutta korjasin ne tässä vaiheessa käsin, koska kyse oli vain muutamasta kymmenestä virheellisestä esiintymästä. (Kuva 5)

Dataa kannattaa selata silmämääräisesti läpi, jotta huomaa tämänkaltaiset ilmiselvät virheet. (Kuva 5)
Korjattuani virheet tallensin tiedoston uudelleen LibreOfficessa ja tehdessäni näin valitsin, että haluan muokata asetuksia (Kuva 6). Tämä mahdollistaa sen, että voin valita mitä erotinmerkkiä jatkossa käytetään (Kuva 7). Tämä on tärkeää, koska seuraavaksi käyttämämme Excel ei osaa käsitellä oletuksena kuin puolipistein eroteltua dataa.

"Edit filter settings" -asetus antaa seuraavassa vaiheessa mahdollisuuden muokata .csv-tiedoston asetuksia. (Kuva 6)
Tärkeää on valita "Field delimeter" -kohtaan puolipiste (;) ja Text delimeter -kohtaan lainausmerkki ("). (Kuva 7)
Nyt minulla on siis hyvin jäsennelty .csv-muotoinen tiedosto, joka sisältää taulukkodataa missä on rivejä twiittieni määrä ja kaksi saraketta. Ensimmäinen sarake pitää sisällään lähettämäni twiitin sisällön ja toinen tiedon siitä minä kuukautena ja vuotena twiitti on lähetetty.

Seuraavaksi avaan tiedoston Excel:ssä. Mikäli huomaat ongelmia ääkkösten kanssa voit yrittää vaihtaa kuvassa 7 näkyvän Character set valinnan ISO-8859-1:ksi (twiittien tekstisisällöllä ei tämän harjoituksen kannalta ole kuitenkaan merkitystä). Kuitenkin jos kaikki meni hyvin näet aika- ja twiittitiedot eroteltuina omiin soluihinsa myös Excel:ssä. Mitä meidän täytyy tässä vaiheessa tehdä on lisätä datan alkuun yksi rivi, johon lisäämme solujen kuvauksen. (Kuva 8)

Sarakkeille on annettava nimet, jotta voimme käsitellä niitä jatkossa. Nimi sijoitetaan lisäämällä alkuun uusi rivi ja sijoittamalla rivien ensimmäisiin sarakkeisiin jokin saraketta kuvaava tunniste. (Kuva 8)
Nyt dataa on mahdollista analysoida Excel:ssä. Tämä onnistuu helposti Pivot-taulukoiden avulla. Pivot-taulukon luominen onnistuu kätevimmin osoittamalla kenttää A1 ja valitsemalla valikosta Tiedot -> Pivot. Pivot-taulukot mahdollistavat taulukkomuotoisen datan jäsentämisen ja yhteenkokoamisen. Eli esimerkiksi tässä tapauksessa Pivot-taulukko mahdollistaa, että voimme niputtaa twiitit aika-sarakkeen perusteella yhteen. Myös LibreOffice:sta löytyy Pivot-toiminnallisuus, mutta olen kokenut, että Excel:n vastaava on hieman näppärämpi käyttää. (Kuva 9)

Luotuani Pivot-taulukon huomasin, ettei taulukkoa ollut mahdollista järjestää ajallisesti laskevaan tai nousevaan järjestykseen, koska kuukausien lyhennetyt nimet eivät järjestäyty tietokoneen avulla millään yksinkertaisella logiikalla kronologiseen järjestykseen. Aikamääreet olisi voinut muuntaa tässä kohtaa johonkin toiseen muotoon, mutta päädyin tekemään järjestämisen käsin, koska kyse oli kuitenkin vain muutamasta kymmenestä data-alkiosta. Käsin järjestetty data on nähtävillä kuvassa 9 oikealla puolella ja alkuperäinen Pivot-taulukko vasemmalla.

Vasemmalla vihreän otsakkeen alla näkyy Pivot-taulukko. Oikealla sama data, mutta jäsennettynä ajallisesti nousevaan järjestykseen. (Kuva 9)
Nyt data on helppo visualisoida Excel:stä löytyvillä kaavio-komponenteilla. Tämä onnistuu maalaamalla haluttu data – tässä tapauksessa kuvassa 9 näkyvä oikeanpuolimmainen data – ja lisäämällä soveltuvan valikon kautta taulukkoon kaaviokomponentti. Kaaviokomponentiksi valitsin pylväsdiagrammin, koska se on melko luonnollinen tapa kuvata tämänkaltaista dataa määrällistä dataa, jolla on kaksi ulottuvuutta (määrä ja aika). (Kuva 10)

Twitter-käyttöni trendi on ollut selkeästi kasvava. (Kuva 10)
Näinkin monivaiheisen toteutuksen tekeminen oli kuitenkin melko yksinkertaista ja ei ehkä vienyt minulta kuin 15-minuuttia. Tämä kertoo toki, että olen melko sopeutunut käyttämään eri sovellusten parhaita puolia datan käsittelyssä ja tiedän valmiita polkuja, joiden avulla pääsen haluamaani lopputulokseen. Uskon kuitenkin, että jos vain suuntaviivat ovat selvillä niin samankaltaiseen lopputulokseen pääseminen ei ole kovin suuri tekninen haaste.

Jatkokehitysideoitakin keksin matkan varrella kuten, että pylväät voisivat pitää sisällään tiedon siitä kuinka moni twiiteistä kulloisenakin kuukautena on ollut uudelleentwiittaus (retweet).

Kuulen taas mielelläni jos joku on onnistunut toteuttamaan omasta Twitter-datastaan samanlaisen analyysin. Tai mielelläni pullautan tarvittaessa tällaisen sellaisesta kiinnostuneelle.

Muokkaus: 14.1.2013

Tässä Anna Emilia Alentolan versio:
https://twitter.com/anniemilia__/status/282175539157028865

keskiviikko 21. marraskuuta 2012

Sormiharjoitus Twitter-datalla

Julkaisin viime viikolla twiitin, jossa kerroin erilaisista tunnusluvuista koskien Twitter:ni käyttöä ja lisäksi olin liittänyt mukaan kuvassa 1 näkyvän twiittieni sanapilven.

Avasin twiittieni tunnuslukuja ja piirsin sisällöistä sanapilven. (Kuva 1)
Mielestäni tekemäni sormiharjoitus oli siinä määrin hauska ja dataa monipuolisesti käsittelevä, että halusin jakaa kokemukseni. En väitä, että käsittelemäni menetelmät olisivat paras tapa selvittää kyseisiä Twitter-tilin tietoja, mutta käytän niitä tässä, koska ne ovat hyödynnettävissä hyvin monenlaisessa datan käsittelyssä.



Tarina sai alkunsa kun löysin netistä palvelun nimeltä All My Tweets, joka listaa annetun käyttäjän kaikki twiitit (3000 ensimmäistä). Egosentrisenä ihmisenä lähdin kokeilemaan oman tilini tilannetta ja löysin palvelulla tuolloin 1729 twiittiä. Tarkastin, että luku täsmäsi Twitter-profiilistani löytyvään arvoon.

Mieleeni tuli, että voisin visualisoida twiitit avainsanapilvenä. Ajattelin, että tämä olisi helppoa verkosta löytyvän Wordle-työkalun avulla, joka mahdollistaa avainsanapilvien toteuttamisen yksinkertaisesti syöttämällä palveluun sisältöä. Haluttu sisältö oli mahdollista kopioida All My Tweets -palvelusta leikepöydälle ja sieltä Wordle:en, mutta ongelma oli, että tässä selaimen ruudulta kopioidussa sisällössä olivat mukana twiittien aikaleimat (esim. Nov 17, 2012). Nämä aikaleimat mielletään Wordle:n puolesta myös osaksi sisältöä, joten halusin päästä niistä eroon, koska ne olisivat esiintymistiheytensä myötä nousseet avainsanapilvessä hallitsevaan asemaan. (Kuva 2)

Nappasin twiittini All My Tweets -palvelusta yksinkertaisesti maalaamalla ja kopioimalla koko sivun sisällön leikepöydälle. (Kuva 2)
Ratkaisin ongelman jatkokäsittelemällä Twitter-dataani. Datan käsittelyyn ja esimerkiksi tämankaltaisen aikaleimatiedon poistamiseen on useita eri mahdollisuuksia, mutta toteutin siivoamisen säännöllisten lausekkeiden avulla Sublime Text -editorissa. Sublime Text on periaatteessa hyvin tavallinen tekstieditori, joka kuitenkin sisältää konepeltinsä alla hyvin laajan ominaisuuksien kirjon. Yksi hyödyllisistä on "etsi/korvaa" -toiminnallisuus, joka mahdollistaa merkkijonojen korvaamisen –  perinteisen tavan lisäksi myös – säännöllisten lausekkeiden avulla.

Säännölliset lausekkeet mahdollistavat hakuehtojen muodostamisen erinäisten hahmojen (engl. pattern) avulla. Säännöllisten lausekkeiden avulla on esimerkiksi mahdollista hakea päivämäärää muodossa 2012-11-19 käskemällä ohjelman etsiä merkkijonoa jossa on:
  • neljä numeroa
  • viiva
  • kaksi numeroa
  • viiva
  • kaksi numeroa.
Näin ollen säännöllisten lausekkeiden avulla on mahdollista hakea kerralla kaikki tekstissä esiintyvät päivämäärät ja muuntaa ne esimerkiksi suomalaiseen muotoon 19.11.2012. Tavallisella etsi/korvaa -toiminnolla tämänkaltainen muuntaminen olisi mahdollista vain päivämäärä kerrallaan.

Tässä tapauksessa halusin poistaa tekstistä kaikki "Nov 16, 2012" -tyyliset merkkijonot. Hakemassani merkkijonossa tulisi siis löytyä:
  • kolme kirjainta
  • välilyönti
  • kaksi numeroa
  • pilkku
  • välilyönti 
  • neljä numeroa. (Kuva 3)
Säännöllisen lausekkeen löytämät merkkijonot näkyvät rajattuina suorakulmioihin. Haettu merkkijono korvataan tyhjällä eli käytännössä poistetaan. (Kuva 3)
Koska tavoitteeni oli poistaa löydetyt päivämäärää kuvaavat merkkijonot valitsin, että kyseisen haun tulokset korvattaisiin tyhjällä merkkijonolla. Haun löytämät merkkijonot näkyvät kuvassa 3 nelikulmioihin rajattuina. Rakentamassani säännöllisessä lauseessa käyttämäni hahmot ovat:

  • a-z, mikä tahansa pieni kirjain väliltä a-z
  • A-Z, mikä tahansa kapitaali kirjain välillä a-z
  • 0-9, mikä tahansa numero välillä 0-9.

Edelleen halusin poistaa All My Tweets -palvelun datasta "RT" merkinnät, koska nämä eivät sinällään olleet twiittien varsinaista sisältöä, jonka halusin mukaan sanapilveen. RT merkkijonon poistamisessa minun ei tarvinnut hyödyntää säännöllisiä lausekkeita, vaan hain yksinkertaisesti merkkijonoa "RT ". Eli hain merkkijonoa, jossa esiintyi järjestyksessä:
  • kapitaali R
  • kapitaali T
  • välilyönti. (Kuva 4)
Sublime Text näyttää tehdyn haun löytämien merkkijonojen esiintyminen määrän editorin vasemmassa alakulmassa, joten ennen kuin tein korvaamisen tarkistin, montako kertaa "RT " esiintyi datassa. Koska RT merkintä tarkoitti, että twiitti oli retwiitti, sain näin selville kuinka moni twiiteistäni oli retwiitti. (Kuva 1)

Halusin poistaa merkkijonot "RT ", mutta samalla selvittää kuinka monta kertaa se datassa esiintyi. (Kuva 4)
Samalla periaatteella ja etsimistoiminnolla tutkin montako kertaa datassa esiintyivät merkit "@" ja "#", jolloin sain selville montako kertaa olin maininnut henkilön ja montako kertaa olin viitannut johonkin Twitter-kanavaan (kts. Twitter-terminilogiaopas). Jälkikäteen ajateltuna olisi ollut, ehkä järkevää poistaa datasta myös henkilöiden maininnan, koska ne nousivat niin hallitsevaan rooliin lopputuloksessa. (Kuva 1)

Lopuksi kopioin käsittelemäni datan Sublime Text -editorista Wordle-palveluun. Wordle on hyvin yksinkertainen käyttää. Haluttu data kopioidaan leikepöydän kautta palveluun, jonka jälkeen käyttäjän on mahdollista piirtää avainsanapilvi haluamallaan tavalla lukuisiin eri muuttujiin perustuen. (Kuva 5) Itse olen käyttänyt lähinnä palvelun "randomize" toimintoa kunnes olen saanut mieleiseni lopputuloksen, mutta palvelu mahdollistaa muuttujien määrittämisen myös käsin. Lopputuloksen otin palvelusta talteen ruudunkaappausohjelmistolla.

Wordle-palveluun on mahdollista liittää mitä tahansa tekstiä tai suoraan haluttu RSS-virta. (Kuva 5)
Käytin siis hyväksi kahta verkosta löytyvää ilmaispalvelua – All My Tweets ja Wordle – sekä Sublime Text -editoria yhdessä säännöllisten lausekkeiden kanssa. Näiden työkalujen avulla keräsin, käsittelin, jäsensin, analysoin ja visualisoin dataa. Tämänkaltainen useiden eri työkalujen käyttäminen on usein tehokasta, koska toiset työkalut ovat hyviä toisissa asioissa kun taas toiset pureutuvat paremmin toisenlaisiin haasteisiin.

Ja eikun itse kokeilemaan! Kuulen mielelläni tuloksista :)

Muokkaus: 22.11.2012

Tässä Micke Hindsbergin versio:
https://twitter.com/mickhinds/status/271282180423032832

Muokkaus: 27.11.2012

Tässä Anna Emilia Alentolan versio:
https://twitter.com/anniemilia__/status/273505849203376128

Tässä Anna-Sofia Niemisen versio:
https://twitter.com/SofiaNieminen/status/273125304132845569

tiistai 6. marraskuuta 2012

#Kuntavaalit-analyysi

Ajattelin ottaa lyhyesti osaa kuntavaalidatan perkaamiseen ja käsittelyyn. Tähän minut motivoi mm. A-Stream:stä tuttu toimittajana Jaakko Karhu, joka jakoi keräämänsä – Twitter-kavanalle #Kuntavaalit – kerääntyneen keskustelun. Asiaa edisti, että data oli .tsv-muodossa, joten ajattelin, että datan avaaminen ja jatkokäsittely esimerkiksi Excel:ssä olisi siten helppoa ja nopeaa.

Avasin aluksi datan kuitenkin LibreOffice:ssa, jotta sain tallennettua datan uudelleen .csv-muodossa, koska Excel ei oletusarvoisesti – ainakaan minulla – osaa avata .tsv-muotoista tiedostoa oikein. Tämän lisäksi korjasin n. 600 virheellisesti rivitettyä twiittiä säännöllisten lausekkeiden avulla Sublime Text -editorissa. Virheellisesti rivitetyt twiitit oli helppo paikantaa sen perusteella, että rivin ensimmäisenä arvona tuli olla aina yksittäisen twiitin numeerinen id-arvo eikä esimerkiksi kirjaimia.

Näiden toimenpiteiden jälkeen data oli valmis käsiteltäväksi Excel:ssä. Data piti sisällään viisi saraketta, jotka olivat:
  1. Yksittäisen twiitin numeeronen tunniste (ID)
  2. Käyttäjän, joka twiitin oli lähettänyt, käyttäjätunnus (esim. teelmo)
  3. Twiitin lähetyspäivä (esim. 31.10.2012)
  4. Twiitin lähetysaika (esim. 15:44)
  5. Twiitin sisältö
Data oli siis jo lähtökohtaisesti hyvin rakenteistettu eikä sitä tarvinnut siten jatkokäsitellä esimerkiksi pilkkomalla useampiin sarakkeisiin. (Kuva 3)

Analyysin tekemiseen käytin Excel:stä löytyvää Pivot-toiminnallisuutta, jolla sain helposti laskettua, että twiittejä datassa oli mukana yhteensä n. 19 000 kpl:tta. Pivot-taulukkojen avulla on helppoa tutkia datan jakautumista eri sarakkeiden arvoihin perustuen. Ensimmäiseksi tutkin miten twiittien määrä jakautui käyttäjien kesken ja piirsin datasta pylväsdiagrammin. Lopputulos on hyvin perinteinen esimerkki long tail -datasta. Eli pieni osa käyttäjistä oli erittäin aktiivisia kun taas suurin osa osallistui keskusteltuun vain harvoin (Samankaltainen käyttäyminen oli nähtävissä myös Lontoon mellakoista tehdyissä Twitter-analyyseissä). (Kuva 1)

Suurin osa käyttäjistä osallistui keskusteluun vain muutaman kerran. (Kuva 1)
Pivot-taulukosta oli luettavissa, että yksittäisiä twiittaajia datassa oli n. 2 900, joista n. 1 300 twiittasi kanavalle vain kertaalleen. Määrällisesti Top10-twiittaajien lista näytti seuraavalta:
  1. DimitriQvintus (762 twiittiä)
  2. EliasAarnio (319)
  3. EkholmTalas (306)
  4. juffek (274)
  5. jussisalonranta (253)
  6. juhanilohikoski (229)
  7. TimoSoinii (216)
  8. aleksieskelinen (186)
  9. FinlandInc (181)
  10. katleena (175)
Toiseksi halusin katsoa miten twiitit jakautuivat päivittäin. Edelleen Pivot-taulukoissa tämänkaltaisen tiedon esiin tuominen on helppoa. Suosituimmaksi päiväksi osoittautui 25.10., jolloin twiitattiin yhteensä 4 138 kertaa. Päivän suosio selittyy tuona torstaina Yle:n lähettämällä "Kuntavaalit 2012: Loppukiri" -kuntavaalitentillä. Päivien Top6-lista näyttää seuraavalta:
  1. 25.10. (4138 twiittiä)
  2. 24.10. (2183)
  3. 20.9. (1358)
  4. 19.10. (1295)
  5. 27.9. (1271)
  6. 29.10. (1218)
Mielenkiintoista on, ettei itse vaalipäivä (28.10.) nouse listalla kovin korkealle. Keskimäärin seurantajaksolla 20.9.2012 – 31.10.2012 (42 päivää) twiittejä #Kuntavaalit-kanavalle lähetettiin n. 460 kpl:tta (19470 twiittä / 42 päivää). Piirsin myös twiittien päivittäisestä jakautumisesta samankaltaisen pylväsdiagrammin kuin edellä. (Kuva 2)

Suurin päivittäinen keskustelupiikki osui Yle:n vaalitenttipäivälle 25.10. (Kuva 2)
Kolmanneksi tein vielä samankaltaisen analyysin twiittien jakautumisesta tunneittain. Tämän toteuttamiseksi minun piti irrottaa "tunti"-tieto twiitin lähettämisajasta. Onnistuin tekemään tämän Excel:ssä ajamalla jokaiselle twiitille, uudessa lisäämässäni sarakkeessa, seuraavanlaisen komennon.

=JOS(PITUUS(D30)=5;VASEN(D30;2);VASEN(D30;1))

Kyseinen koodi laskee sarakkeessa D rivillä 30 olevan tekstin pituuden merkkeinä ja palauttaa riippuen siitä onko pituus viisi vai ei joko kentän kaksi ensimmäistä tai vain ensimmäisen merkin. Sarakkeessa D on jokaisen twiitin lähetysaika muodossa hh:mm. Kyseinen ehto kahden ensimmäisen tai vain ensimmäisen merkin mukaan ottamisesta oli tehtävä, koska datassa "tunti"-tietoon ei oltu merkitty etunollia, joten ennen klo 10:ntä lähettyistä twiiteistä halusin ottaa mukaan vain ensimmäisen numeron kun taas klo 10:ltä ja sen jälkeen halusin mukaan kaksi ensimmäistä numeroa. (Kuva 3)

Excel:ssä onnistuu melko suurienkin datajoukkojen käsittely vaivattomasti. Hour sarake on luotu time sarakkeen perusteella syöttökentässä näkyvän koodin avulla. (Kuva 3)
Myös twiittien tunnittainen jakauma osoitti, että aktiivisimmat twiittausajankohdat osuivat yhtäaikaisesti TV:n iltaisin tulleiden vaalilähetysten kanssa. (Kuva 4)

Suurin osa keskusteluista ajoittui ilta-aikaan, jolloin myös TV:n vaaliväittelyt pidettiin. (Kuva 4)
Mielenkiintoista tunnittaisessa jakautumisessa on myös aamun korostuminen iltapäivään verrattuna sekä, ettei  keskustelua öisin juuri ollut, joka ei Internet-maailmassa ole niin itsestäänselvä tulos.

Analyysin perusteella minulle heräsi kysymys; ruokkiiko media toiminnallaan Twitter:n käyttöä vai onko Twitter Suomessa itsenäisesti elävä organimisti, jonka media on luonnollisesti ottanut mukaan toimintaansa. Analyysi osoittaa, että keskustelu oli aktiivista kun Twitter sai näkyvyyttä mediassa, mutta muuten keskustelua oli vähemmän. Toinen hyvä kysymys on; onko Twitter:n laaja läsnäolo esimerkiksi TV-lähetyksissä oikeutettua 2 900:n kansalaisen vuoksi. En tarkoita näitä kysymyksiä sinällään kritiikkinä Twitter:n läsnäoloa ja käyttöä kohtaan, mutta mielestäni tulokset ovat mielenkiintoisia.

Huomioitavaa analyysissä on, että tehnyt havainnot ovat vain yhtä hyviä kuin mitä alkuperäinen raakadata on (toki tekijälläkin on osansa). Esimerkiksi Olli Parviainen raportoi Twitter:ssä, että #Kuntavaalit-kanavalle olisi kirjoitettu reilusti yli 30 000 twiittiä. Uskoisin kuitenkin, koska tehdyt havainnot ovat siinä määrin järjellisiä ja tukevat ennakkohypoteeseja, ettei suurta muutosta tapahtuisi vaikka sama analyysi tehtäisiin tälle laajemmalle twiittimäärälle.

Muokkaus 6.11. klo 19:00

Ero Olli Parviaisen ja Jaakon Karhun keräämien twiittimäärien välillä selittyi sillä, että Olli Parviainen oli kerännyt sanan "kuntavaalit" sisältäneet twiitit kun Jaakko Karhu oli kerännyt nimenomaan #Kuntavaalit-kanavalle lähetetyt twiitit.

Twiittien kerääminen aloitettiin vasta 20.9. eli ensimmäisen kuntavaalitentin jälkeisenä päivänä, joten aineisto ei ole tältä osin täysin kattava eikä koko #Kuntavaalit-ilmiötä kuvaava.

Yksittäisten twiittaajien ja twiittien määrää analysoitaessa on huomioitava Nielsenin 90-9-1 -sääntö.



Siivoamani data Excel-muodossa on ladattavissa Dropbox-palvelusta. (13MB, .xlsx, suomenkielinen Excel).

Linkit alkuperäisiin raportointeihin Twitterissä: