• Ei tuloksia

Asiakaspalautekyselyrajapinnan luonti Nodella

N/A
N/A
Info
Lataa
Protected

Academic year: 2022

Jaa "Asiakaspalautekyselyrajapinnan luonti Nodella"

Copied!
37
0
0

Kokoteksti

(1)

Joona Mäkinen

Asiakaspalautekyselyrajapinnan luonti Nodella

Metropolia Ammattikorkeakoulu Insinööri (AMK)

Tieto- ja Viestintätekniikka Insinöörityö

3.6.2019

(2)

Tekijä Otsikko Sivumäärä Aika

Joona Mäkinen

Asiakaspalautekyselyrajapinnan luonti Nodella 30 sivua

3.6.2019

Tutkinto Insinööri (AMK)

Tutkinto-ohjelma Tieto- ja Viestintätekniikka Ammatillinen pääaine Ohjelmistotuotanto

Ohjaajat

Yliopettaja Erja Nikunen

Tavoitteena on tallentaa asiakaspalaute käyttäen Node.js-pohjaista rajapintaa. Modernin verkkosuunnittelun mukaisesti back-end toteutetaan JavaScriptillä, jolloin taakse jäävät vanhan LAMP-pinon ikää näyttävät toimintaperiaatteeet.

Tutkimusongelmana on asiakaspalauteen tallentamisen helppokäyttöisyys ja saadun datan valmistelu sen myöhempään käyttöön. Myös suoritustehoa vertaillaan perinteiseen LAMP- pinoon.

Projektin toteutukseen tarvittava ohjelmisto on Node.js, sen paketinhallinta NPM,

CouchDB, nano-tietokantakirjasto, Express.js-rajapintakirjasto ja git-versionhallinta. Lisäksi LAMP-pinon nopeustestaukseen CEPN-pinoa vastaan otetaan käyttöön MAMP-pino-ohjel- misto ja HeidiSQL-tietokantatyökalu. Visuaaliset tulosteet toistetaan Google Chrome -se- laimella.

Node-projekti mahdollistaa myös käyttöliittymän suunnittelua nopeuttavan Gulpin käyttöön- oton, joka koostaa verkkosivun tyylikirjaston (CSS) ja JavaScriptin pieneen kokoon sivun latausnopeuden parantamiseksi.

Sekä projektin- että nopeustestauksen tulos vastasi odotuksia. CEPN-pino on erittäin var- teenotettava sekä toteutus- että suoritusaikansa puolesta.

Projekti kertasi vähintääkin hyvän koodin käytäntöjä ja verkkokoodauksen teoriaa. Opin myös uusimmat ECMAScript-standardit, joita käytetään kaikessa verkkoalustoista mobii- lisovelluksiin.

Avainsanat Rajapinta, javascript, asiakaspalvelu

(3)

Author Title

Number of Pages Date

Joona Mäkinen

Creating a customer feedback API using Node 30 pages

3 June 2019

Degree Bachelor of Engineering

Degree Programme Information and communication technology Professional Major Software Development

Instructors

Erja Nikunen, Principal Lecturer

The goal of the project is to save customer feedback using a Node.js -based application interface (API). In accordance to modern web development, back-end will be implemented completely in JavaScript, leaving behind flawed and old tech behind the traditional LAMP- stack.

As a thesis problem is the research on both ease of use and usability of the gotten data.

The new implementation is also benchmarked against similar LAMP-stack API.

The required software for the thesis are Node.js, Node Package Manager (npm),

CouchDB, nano, Express.js and git. In addition to these, MAMP and HeidiSQL are used to comparatively benchmark LAMP-stack against CEPN-stack. All visual output is monitored using a web browser Google Chrome.

Node-project enables usage of performance improving Gulp, that minifies webpage’s cas- cading style sheets and JavaScript.

Both the results of the project and benchmark matched expectation. CEPN-stack can be deemed as very promising web-development platform with both its fast implementation and execution time.

Project made me revisit good practices and theory of web-development. I also learned about latest ECMAScript-standards that are used in about everything from web-platforms to mobile apps.

Keywords API, JavaScript, Customer Service

(4)

Sisällys

Lyhenteet

1 Johdanto 1

2 Rajapinnat, LAMP ja CEPN 2

2.1 Rajapinta 2

2.2 LAMP-pino 2

2.2.1 Linux 3

2.2.2 Apache ja MySQL 3

2.2.3 PHP 4

2.3 JavaScript 4

2.3.1 Lupaukset 5

2.3.2 Node.js 7

2.3.3 Gulp, CSS ja Bootstrap 7

2.4 CEPN-pino 8

2.4.1 CouchDB 8

2.4.2 Kehykset ja Express.js 9

2.5 Kehittyvät rajapinnat ja tietoturva 9

2.6 CEPN-pino verrattuna LAMP-pinolla tehtyyn rajapintaan 10

2.7 Asiakkuudenhallinta 11

3 Toteutus 12

3.1 Ohjelmisto 12

3.2 Käyttöönotto 17

3.3 Käyttöliittymän parantaminen 18

3.4 Datan visualisointi 19

3.5 Koodivirheiden korjaus 20

4 Testaus 23

4.1 Rajapintalinkkien testaus 23

4.2 Suorituskyvyn testaus 24

4.3 Suorituskyvyn testauksen tulokset 27

(5)

5 Yhteenveto 28

Lähteet 29

(6)

Lyhenteet

REST Representational State Transfer. Ohjelmistotapa kuljettaa informaatiota verkon yli.

JS JavaScript. Pääasiassa verkkoympäristössä käytettävä komentosarjakieli.

Ei ole sukua Javalle, sillä nimi on julkisuustemppu.

MEAN Lyhenne sanoista MongoDB Express Angular Node.js. Implikoi modernien, JavaScript-pohjaisten teknologien käyttöä verkko-ohjelmoinnissa.

CEPN Lyhenne sanoista CouchDB Express Pug Node. Yksi useista täysin Ja- vaScriptillä toteutettavista pinoista.

LAMP Lyhenne sanoista Linux Apache MySQL PHP. Implikoi perinteisten tekno- logioiden käyttöä verkko-ohjelmoinnissa.

PHP Alun perin Personal Home Page, nykyään rekursiivinen PHP: Hypertext Processor. Verkko-ohjelmointikieli.

SQL Tietokantaohjelmisto. Tiedon ulkoiseen tallentamiseen ja lukemiseen tar- koitettu ohjelmisto.

XSS Cross Site Scripting. Tietoturvatermi, verkkoyhteyksien tietoturvahaavoit- tuvuuksia käsittävä skriptaus.

AJAX Asynchronous JavaScript and XML eli datan lähetys ja käyttöliittymä verk- kosivulla irrallisina prosesseinaan.

HTTP HyperText Transfer Protocol. Verkkoprotokolla hypermedian, kuten HTML:n siirtoon, jota käytetään internetselaukseen.

(7)

JSON JavaScript Object Notation. Puhtaan JavaScript-pinon suosituin data- tyyppi.

CSS Cascading Style Sheets. Tyyliohjekieli, jota kaikki nykyiset ja muinaiset verkkoselaimet tukevat. Määrittää verkkosivun ulkoasun.

SASS Kompaktimpi tyyliohjekieli, joka kootaan projektissa CSS-tyyliohjeeksi.

SCSS Tiedostopääte SASS-tyyliohjeille. Tiedostot, jotka päättyvät scss:ään.

DOM Document Object Model. Verkkosivujen rakenteen puu.

HTML Hypertext Markup Language. Verkkosivujen DOM-rakenteen määrittävä merkintäkieli.

XML Extensible Markup Language. Merkintäkieli ja standardi, jota HTML noudattaa.

CRM Customer Relations Management. Ohjelmistokokonaisuuksia asiakassuh- teiden ylläpitoon.

NPM Node Package Manager. Node-suoritettavan oma, sisäänrakennettu pake- tinhallinta ja latauspalvelu, josta useimmiten kaikki tarvittavat kirjastot pro- jekteille ladataan.

NoSQL Not Only SQL. Relaatiotietokantoja uudempia ratkaisuja, jossa on erilainen datatoteutus.

(8)

1 Johdanto

Opinnäytetyöni aihe on asiakaspalautteiden tallentaminen käyttäen rajapintaa, joka on luotu Nodella. Tutkin lopputyössä JavaScript-pinon toimintaperiaatetta ja sen varteen- otettavuutta yritysohjelmiston luontiin. Lisäksi vertailen JavaScript-pinoa varsinkin no- peusmielessä perinteiseen LAMP-pinoon.

Toimeksiantajana asiakaspalauterajapinnalle toimi alun perin Agenda Helsinki, jonka johto kaipasi kätevää tapaa sisällyttää pikalinkkejä sähköpostin pohjalle. Nämä pikalinkit lähettäisivät rajapintaa käyttäen asiakkaan palautteen digitaaliseen palveluun muo- dossa: vapaamuotoinen teksti ja arvosana 0-5. Projekti siirtyi kokonaan henkilökoh- taiseksi haasteeksi muiden työtehtävien määrän takia.

Sovelluksen tulee tallentaa sähköpostilinkein jaettava asiakaspalautekysely käyttäen Node.js-pohjaista rajapintaa. Data tallennetaan ensisijaisesti rajapintakutsuna, joka säh- köpostin pohjalla näkyvästä linkistä suorittuu ja tallentaa tyytyväisyyden lukuarvona as- teikolla 0-5. Arvosanaluku on siis linkin lopussa parametrinä (?tt=1), jonka rajapinta poi- mii pyynnön aikana. Lisäksi rajapinta tulostaa linkkiä klikattuaan käyttöliittymän, jossa voi yhdistää aikaisempaan arvosanaan tekstipalautteen.

(9)

2 Rajapinnat, LAMP ja CEPN

Toteutuksessa käytettäviä teknisiä termejä on syytä kartoittaa. Tässä luvussa käsitellään työn pohjalla pyörivää tietotekniikkaa, eli LAMP- ja CEPN-pinoja, niiden teknologioita ja rajapintoja ylipäätään.

2.1 Rajapinta

Rajapinta on ominaisuuksien joukko, jota voi ulkopuolelta hyödyntää. Verkkorajapinta tarkemmin on siis informaatiota kuljettava ohjelmisto, jota voi verkon yli käyttää. Verkko- rajapinnoissa keskitymme REST-rajapintaan, joka on joukko standardoituja pyyntöjä ja vastauksia http-tiedonsiirtoprotokollaa käyttäen. Jos on ikinä nähnyt verkkoselaimen tu- lostavan surunaaman ja ”404 – Sivua ei löytynyt”, on nähnyt http-protokollan vastauksen 404 sivun tulostuspyyntöön (GET). REST-rajapinnan voi nykyään toteuttaa monella oh- jelmistolla, joista keskitymme tässä lopputyössä kahteen pinoon: LAMP ja CEPN.

Kuva 1. Googlen rajapinnan GET http -vastaus 404 (1)

2.2 LAMP-pino

LAMP-pinolla (Linux Apache MySQL PHP) tarkoitetaan perinteistä ja suosittua ohjelmis- tokokoelmaa verkkosivupalvelimelle. Pino on erittäin suosittu verkkosivujen suuren

(10)

WordPress-käyttötilaston takia, joka käyttää LAMP-pinon ohjelmia. LAMP-pinosta suo- sittuja variaatioita on vaihtaa lyhenteen GNU/Linux toisella käyttöjärjestelmällä, kuten WAMP:lla (Windows) ja MAMP:lla (Mac OS).

2.2.1 Linux

Vuoden 2010 vaihteessa GNU/Linuxista tuli suosituin käyttöjärjestelmä yritysten siirty- essä vuosituhannen vaihteen jälkeen pikkuhiljaa käyttämään sitä palvelimissaan sen il- maisen hintalapun ja nopeutensa vuoksi (2). Linux-ytimen on luonut Linus Torvalds vuonna 1991 tavoitteenaan parantaa UNIX-ydintä. Siihen päälle on oma yhteisönsä (GNU) luonut kokonaisen käyttöjärjestelmän julkaisemalla tarvittavaa ohjelmistoa. Avoin lähdekoodi ja suoritusnopeus mielessä se on noussut palvelimissa oletusarvoiseksi käyt- töjärjestelmäksi. Tähän vaikuttaa myös sen vakaus ja tietoturva. (3.)

Linux asennetaan useimmiten valmiina jakelupaketteina, joita saa sekä työpöydälle että palvelimille sovitettuna. Pelkkä ydin ei luo kokonaista käyttöjärjestelmää. Käyttöjärjes- telmä on nimeltään GNU/Linux, koska ytimen kaveriksi ladataan GNU-projektin tuomat ohjelmistot luodakseen kokonaisen käyttöjärjestelmäkokemuksen. Käyttöjärjestelmää- kin kutsutaan usein pelkästään ”Linuxina”, mutta silloin viitataan kokonaiseen GNU/Li- nux-ohjelmistoratkaisuun.

Usein työpöytäkäyttöön tarkoitetut jakelut sisältävät graafisen työpöydän. Graafisia työ- pöytiä on valittavissa useita, kuten GNOME ja KDE, ja niitä voi olla useita yhdessä GNU/Linux -asennuksessa. Palvelinratkaisuissa harvemmin on graafista käyttöliittymää, vaan se tulostavat suoraan näytölle ja verkon yli terminaalipäätteen. Linuxin saa myös erittäin usealle arkkitehtuurille. Palvelimissa suosittu Debian yksinään on saatavilla 15 arkkitehtuurille (Alpha, Armel, armhf, arm64, ia64, m68k, mips, mipsel, PowerPC, s390, s390x, sh, sparc) (4).

2.2.2 Apache ja MySQL

Suosituimman palvelinkäyttöjärjestelmän kaverina verkkosivupalvelimissa toimii suosi- tuin verkkosivuohjelmisto Apache. PHP:tä liitännäisenä suorittava Apache on syystäkin suosittu selkeytensä takia: Asenna Linux, asenna Apache, laita projektin tiedostot

(11)

Apachen HTTP-lähdekansioon, ja palvelin on valmis omasta puolestaan ylläpitämään verkkosivua. SSL-salaus, domainit ja nimipalvelimet ovat sitten omana tarinansa, mutta niitäkin ilman perusedellytykset verkkopalvelimelle täyttyvät. Relaatiotietokanta MySQL toimii hyvin tietyn datarakenteen ylläpitämiseen verkkosivulla, jota hyödynnetään varsin- kin suositun WordPressin kanssa. Vähemmissä relaatioissa tätäkin parempana koetaan NoSQL-tietokantoja (Not Only SQL), joissa datarakenne tallennetaan yksinkertaisemmin esim. JSON-formaatissa paremman suorituskyvyn vuoksi.

2.2.3 PHP

Vuonna 1995 julkaistu PHP-ohjelmointikieli selkeytti verkkosivujen luontia, kun ne vasta alkoivat popularisoitua. Tämä mahdollisti tiedon tallentamisen ja hakemisen verkkosi- vulla helposti käyttäen olemassa olevia tietokantoja kuten SQL. PHP-tulkki yleisissä verkkosivuohjelmistoissa muuntaa kielen raa’aksi laskennaksi, jonka jälkeen vastaus lä- hetetään verkkoselaimelle http-protokollan mukaisesti. Tämän sovellukset alkuaikoina olivat enimmäkseen yksinkertaisia foorumeja ja kotisivuja, josta PHP:n alkuperäinen ly- henne myös kielii: Personal Home Page. Nykyään lyhenne on rekursiivinen PHP: Hyper- text Preprocessor.

2.3 JavaScript

Netscapen kehittämä JavaScript on dynaaminen komentosarjakieli, alun perin suunni- teltu verkkokäyttöliittymien toiminnallisuuden parantamiseen. Backend-aspekti, jossa ra- japintapyynnöt ja tietokantaoperaatiot suoritetaan JavaScriptillä, on vasta tuore aihe oh- jelmoinnissa.

Uusimmat JavaScript-toiminnallisuudet ja kielen syntaksi määrittyy ECMAScript-stan- dardin kautta, jota varsinkin yritykset Google ja Mozilla ajavat eteenpäin. Standardin mu- kaista JavaScriptiä kutsutaan myös ECMAScriptiksi. Uusimmat ECMAScript-määritykset (ECMAScript 2016-2018) toivat mukanaan mobiilikehitykseen tärkeitä ominaisuuksia, kuten lupaukset (Promise-datatyyppi). Promisea käytetään runsaasti varsinkin Reactissa ja React Nativessa, joista jälkimmäinen kokoaa Android- ja iOS-mobiilikäyttöjärjestelmiin

(12)

natiiveja sovelluksia. ECMAScript-versiointi oli versioon 5 ja vuoteen 2014 asti perintei- nen kokonaisluku ja tarvittaessa desimaali, kunnes versio 6 (2015) eteenpäin niitä jul- kaistiin vuosittain versiona vuosiluku. (5.)

Javasta poiketen oliomalli ei perustu luokkiin (Class) vaan prototyyppeihin. Näitä proto- tyyppejä olemassa oleviin datatyyppeihin on tarkoitus määrittää suorituksen aikana. Ja- vaScriptin kohdalla suurin käyttötarkoitus prototyyppien määritykseen on ”polyfillata” (po- lyfill) vanhojen selaimien toiminnallisuutta eli tuoda tuoreimmat ECMAScript-määritykset taaksepäin yhteensopivaksi. Näitä polyfillejä käytetään varsinkin Internet Explorer -verk- koselaimen toiminnallisuuden korjaamiseksi sen vanhan toteutuksen mutta suurien käyt- tötilastojen takia (6).

Olennainen seikka JavaScriptiä koodatessa on se, että sen suoritus ei keskeydy mihin- kään eikä se jää oletuksena odottamaan funktioiden valmistumista. Toisin sanoen sen suoritus on asynkronista. Tapahtumajärjestystä toteuttaessa JavaScriptin asynkronisuus tekee datan käsittelystä haastavaa, kun mukaan tulee eri nopeudella suorittuvia tekijöitä, kuten rajapinnat. Avuksi tähän ongelmaan ovat lupaukset.

2.3.1 Lupaukset

ECMAScript 6 (2015) myötä tulleet lupaukset (”promises”) mahdollistaa paremmin Ja- vaScriptiä koodatessa tapahtumajärjestyksen määrittämisen (7). Ennen lupauksia tarvit- taessa koodia, joka tapahtui synkronisesti eli tietyssä tapahtumajärjestyksessä piti koodi asettaa järjettömään callback-junaan. Tässä junassa kutsutaan siis funktioita funktioissa peräkkäin, jotta esimerkiksi tarvittava data on varmasti tallentunut muuttujaan ennen kuin sitä mallataan johonkin arvoon. Tästä esimerkkinä muinainen typewriter-efekti verkkosi- vulla, jossa seuraavan sanan kirjoittamisfunktio sai suorittua vasta, kun edellinen sana on kokonaan kirjoitettu:

function secondSetFirstWords(){

var string = '';

if(langSelection == 'en'){

string = 'Service design,';

}else{

string = 'Palvelumuotoilu,';

}

$("#tw-2-1").typed({

strings: [string], typeSpeed: 0,

(13)

callback: secondSetSecondWords });

}

function secondSetSecondWords(){

var string = '';

if(langSelection == 'en'){

string = 'brands and technology.^1500';

}else{

string = 'brändit ja teknologia.^1500';

}

$("#tw-2-2").typed({

strings: [string], typeSpeed: 0,

callback: secondSetThirdWords });

$("#tw-2-1").siblings().hide();

}

Esimerkkikoodi 1. Funktiojunaesimerkki JavaScriptissä. Seuraavan funktion kutsu paksun- nettu.

Uusissa lupauksissa voidaan suoraan määrittää asynkronisessa koodissa jotain suorit- tumaan vasta, kun datatyyppi lupaus on toteutettu (Promise.resolve()) eli sen data on muuttunut määritetyksi. Tästä esimerkkinä lupauksen sisäänrakennettu ”then”-funktio, jota suoritetaan, kun CouchDB-tietokannasta on haettu dataa:

router.get('/graph', function(req, res, next) { var palaute=req.palaute;

var nano=req.nano;

palaute.list({include_docs: true}).then((body) => { var palaute=[];

for(var r of body.rows) {

console.log(r.doc.AsiakkaanTyytyvaisyys);

palaute.push(r.doc);

}

res.render('graph', { palaute: palaute });

}).catch(function(err){

if(err){console.log('Palautteita ei löydetty')}

res.render('nofeedback', { err:err

});

});

});

Esimerkkikoodi 2. Palautteiden listan datan haku käyttäen lupauksia. Then-Catch-funktio pak- sunnettu

(14)

2.3.2 Node.js

Node.js on sekä back-endin että front-endin käyttöön tarkoitettu verkkoselaimeton Ja- vaScript-suorittaja. MongoDB-tietokannan kehittäjän Ryan Dahl luoma Node.js luotiin 2014 suoritusteho ja koodajaläheisyys mielessä Googlen JavaScript V8-moottorilla (8).

V8:n nimi viittaa historialliseen suosittuun kilpa-autojen moottoriin, joka kiihdytti autoja omana aikanaan muita moottoreita nopeammin. Sama pätee myös JavaScript V8 -moot- toriin, joka on ohjelmistojätti luonut nopeus prioriteettina ensisijaisesti verkkoselaimel- leen Google Chrome.

Node.js tukee esnextiä, jolla viitataan uusimpiin ECMAScript -standardeihin versiosta 6 (2015) eteenpäin. Uusin Node.js tukee siis kaikkia ECMAScript-standardeja 2018-versi- oon asti. Käyttöliittymän JavaScriptiä (front-end) koodatessa täytyy ottaa vanhempien selainten huono ECMAScript-tuki huomioon. Tähän apuna tarvittaessa on esimerkiksi Babel.js, joka muuntaa uudempaa js-syntaksia vanhemmille verkkoselaimille yhteenso- pivaksi tarvittavin Polyfillein.

Palvelimen JavaScriptissä (back-end) ei tarvitse taaksepäin yhteensopivuudesta mureh- tia, koska ainut JavaScriptiä suorittava taho on tuorein versio Nodesta, jossa pidetään ECMAScript-standardin mukainen kielituki ajan tasalla.

Aikanaan toimiva ratkaisu Node.js on Dahlin mukaan tietoturvasotku. Dahl työstää itse Nodelle uutta korvaavaa JavaScript-suorituskirjastoa Deno. Lopputyön aikaan uusi oh- jelmisto on vielä auttamattoman kehitysvaiheessa, mutta jään henkilökohtaisesti seuraa- maan mielenkiinnolla sen kehittymistä mahdolliseksi Noden korvaajaksi. (9.)

2.3.3 Gulp, CSS ja Bootstrap

JavaScript-pohjainen tehtävänhallintaohjelmisto Gulp.js mahdollistaa koontioperaatioi- den suorittamisen erittäin pienellä konfiguraatiolla. Koontioperaatiolla tarkoitetaan käyt- töliittymässä käytettävän JavaScriptin ja CSS:n puristamista mahdollisimman pieneen tilaan eli minifikointia. Gulp.js osaa vahtia projektin alla tiedostojen muutoksia suorittaen esim. CSS-minifikoinnin, kun tyylikirjastoa muokataan SASS-koontikielellä. (10.)

(15)

CSS, eli ”Cascading Style Sheets”, on joukko ulkoasumäärityksiä, joita verkkoselain osaa lukea piirtäessään käyttöliittymää. SASS on CSS:n koontikieli, joka mahdollistaa määrityksille helppokäyttöisemmän puurakenteen, mutta se pitää koota CSS:ksi, jotta määrityksiä voi käyttää verkkoselaimella.

Bootstrap on Twitterin luoma, kattava ja suosituin tyylikirjasto käyttöliittymien luontiin.

Mukana tulee myös käyttöliittymän JavaScript-kirjasto dynaamisemman sisällön, kuten tiputusvalikkojen, nopeaan luontiin. Suosituin osa Bootstrapiä on sen tuoma grid-toimin- nallisuus. Responsiivisesti skaalautuvia, eli kaikille laitteille ja resoluutioille sopivia, gri- dejä, jossa sisältöä asetetaan vierekkäin voi luoda muutamalla luokalla HTML-elemen- teille.

2.4 CEPN-pino

Vaikkakin MEAN-lyhenne viittaakiin myös MongoDB:n ja Angularin käyttöön (MongoDB Express Angular Node), on se puhekielessä tunnettu termi koko ohjelmistopinon luontiin JavaScriptillä. Myös MERN-pino (MongoDB Express React Node) on suosittu variaatio, mutta sekään ei täsmää omaani, joka on CEPN (CouchDB Express Pug Node).

2.4.1 CouchDB

Puhtaasti JavaScriptillä toimiva ja JSON:ina tallentava CouchDB on toimiva ratkaisu Node-projektiin sen NoSQL-toimintaperiaatteen ja nopeuden takia.

Ero MongoDB-tietokantaan ei ole massiivinen, mutta yksi iso ominaisuus CouchDB:n rivien päivittämisessä on niiden versiohistoria. CouchDB:n riveistä voi selata eri histori- allisia versioita (”revision”) syöttämällä tietokannan rajapintapyyntöön halutun version tunnisteen (”revision ID”). MongoDB:n riveissä on vain yksi ja viimeisin versio, jota voi päivittää. MongoDB:n etuna on taas parempi virallinen ohjelmisto. MongoDB:n virallisia rajapintakirjastoja saa MongoDB:n sivulta 13 kielelle (C, C++11, C#, Go, Java, Node.js, Perl, PHP, Python, Motor, Ruby, Mongoid, Scala), josta jokaiselle on selkeä dokumen- taatio (11). Kolmannen osapuolen CouchDB-kirjastoja on ripoteltu sinne tänne GitHubin syövereihin.

(16)

2.4.2 Kehykset ja Express.js

Kehykset (framework) ovat tärkein osa JavaScript-pinon rajapinnan luonnissa. Kehys lataa tarvittavat kirjastot yksinkertaistamaan rajapinnan reititystä. Reitityksessä määrite- tään REST-operaatiot eri alaosoitteille. Esimerkiksi jos etusivulle tarvitaan vastaus verk- koselaimella selatessa palvelimen juuressa, on osoitteelle ”/” (juuriosoite) määritettävä siirrettävä data ja käyttöliittymän piirtäjä. Jos tarvitaan taustalla pyörivä tallennusoperaa- tio, määritetään POST-operaatio ilman käyttöliittymäpiirtäjää. Molemmissa tapauksissa rajapinta lähettää takaisin vastauskoodin viestillä. Näitä http-vastauskoodeja on useita, mutta olennaisimmat ovat 200 (onnistunut), 403 (estetty) ja 404 (ei löytynyt). Jos raja- pinta ei piirrä käyttöliittymää, rajapintaa kuuluu käyttää AJAX-pyynnöin esim. verkkosi- vun JavaScriptillä.

Helposti suosituin JavaScript-pohjainen kehys on Express.js, joka mahdollistaa rajapin- tapyyntöjen luonnin pelkästään NPM-kirjastosta löytyvällä ohjelmistolla. Express.js on back-end-osa MEAN- ja CEPN-pinoa, jota käytetään esimerkiksi PayPalin, Uberin ja IBM:n palveluissa. (12.)

2.5 Kehittyvät rajapinnat ja tietoturva

Alkuvaiheessa verkkosivuja riivasi varsinkin XSS (Cross Site Scripting) -hyökkäykset, koska sen aikaiset iteraatiot verkkosivujen lomakkeista eivät ottaneet niitä huomioon.

Tässä verkkosivun lomakkeisiin ja nappuloihin syötetään erilaisia seuranta- ja tiedonha- kupyyntöjä. Tietokantaan saattoi päästä yksinkertaisesti syöttämällä SQL-kyselyn verkko-osoitteen loppuun. Myös turvaamatonta verkkoliikennettä pystyy vieläkin mani- puloimaan, jonka takia Googlen huhutaan heidän 80%:n Chrome-käyttäjätilastollaan pa- kottamaan sivut käyttämään salattua HTTP-yhteyttä (HTTPS). Alati päivittyvä lista PHP:n haavoittuvuuksista on yksi syistä, joka saa ohjelmoijat seuraamaan Googlen ja muiden kehittäjien lippulaivaa Nodea, joka virtaviivaistaa verkkosivuja ja verkkopalve- luita. Nodessa on myös koodaajalle selkeämpää hallinnoida informaatiota, jota käyttäjä näkee ja tallentaa. Tämä ei tee siitä automaattisesti tietoturvallisempaa, mutta helppo- käyttöisempää konfiguroida tietoturva mielessä. (13.)

(17)

2.6 CEPN-pino verrattuna LAMP-pinolla tehtyyn rajapintaan

Relaatiotietokannan käyttö perinteisesti toimii hyvin esim. henkilöstön ja resurssien kir- jaamiseen avainarvonsa takia. Yksi henkilö firmassa on yksi id, johon voi sitoa monta taulullista informaatiota hänen lomistaan, etuuksistaan ja ylitöistään. Kun tallennetaan paljon yksinkertaisempaa dataa, kuten asiakaspalautetta vain nimin ja palauttein, tarvit- sematta taulujen sitomista toisiinsa, ovat NoSQL-tietokannat, kuten MongoDB ja CouchDB, nopeampia.

Verkkofoorumien ohjelmoinnista tietävät yleensä tuomitsevat JavaScriptin käyttöä backendissä sen käyttämän tallennustilan ja huonojen implementaatioiden takia (14).

Tallennustilaa runsaasti vievät node-kirjastot pieneenkin toteutukseen ovat tässä sa- massa näkemyksessä haaskausta.

Nodea osaava voi kylläkin implementoida Express.js-kirjastoa käyttäen rajapinnan erit- täin nopeasti. Tämä kyky luoda rajapintoja rajatulla aikataululla on ohjelmistoyritystyös- kentelyssä olennaista. Node-ohjelmakirjasto kattaa erittäin laajasti eri toiminnallisuuden tarpeet, kuten esimerkiksi verkkokommunikaation. Tästä esimerkkinä on monialustainen Electronilla tehty ääni- ja tekstikommunikaatiosovellus Discord (15).

Electron on Node-pohjainen kirjasto, joka mahdollistaa työpöytäsovellusten luonnin verk- koteknologioilla HTML, JavaScript ja Cascading Style Sheets (16). Sillä on luotu esimer- kiksi Visual Studio Code -tekstieditori, Spotify-mediapalvelun työpöytäsovellus ja Skype- verkkokommunikaatiosovellus. JavaScript-pinolla voi myös luoda natiiveja mobiilisovel- luksia käyttäen React Native -kirjastoa. Siinä sovelluksen käyttöliittymä luodaan käyttäen Node-pohjaista Reactia, ja mahdolliset tietokantaoperaatiot sovitetaan mobiilikäyttöjär- jestelmien sisäänrakennettuihin tietokantoihin, kuten Androidin ja iOS:n SQLite. Täysin JavaScriptinä React Nativea voi käyttää tekemällä tietokannalle rajapinnan, johon mo- biilisovellus yhdistää. Samantasoisia natiiveja sovellusratkaisuja ei löydy LAMP-pinosta.

LAMP-pinoa voi kylläkin käyttää React Native -sovelluksen REST-rajapintana, johon ap- plikaation data tallennetaan.

(18)

2.7 Asiakkuudenhallinta

Insinöörityöohjelmistoni käyttötarkoitus perustuu CRM-ajatteluun. CRM eli Customer Re- lations Management on asiakassuhteisiin keskittyvä käsite, joka käsittää asiakaslähtöi- sen ajattelun ja asiakastyytyväisyyden ylläpitämisen. CRM-käsitteen historia lähtee 1970-1980-luvuilta yritysten tarpeesta löytää keinoja parantaa asiakaskunnan käyttöko- kemusta tuotteilleen massiivisen kilpailun kasvun johdosta. Ensimmäiset CRM-työkalut 1980-luvun lopulta syntyi teknologian räjähdysmäisen kehitystahdin myötä (Annika Huusko 2015, 17).

CRM-ohjelmisto syntyy asiakaslähtöisestä ajattelusta. Asiakaslähtöisessä ajatellussa asiakas nähdään resurssina, jota optimoida muiden resurssien tavoin tuoton maksimoi- miseksi. Asiakkaat luokitellaan eli segmentoidaan eri tyypeiksi, joista valitaan pääfoku- siin tietty määrä. Tuotetta kehitetään toimimaan parhaiten kaikille kohdedemografian tyy- peille (18). Onnistunut asiakkuudenhallinta jaetaan kolmeen tasavertaiseen osatekijään:

ihmiset, prosessit ja teknologia (Pekka Sahlsten 2012, 19). Tämä tarkoittaa, että työnte- kijöiden, yrityksen liiketoimintaprosessi ja ohjelmisto on tuettava CRM:ää. Henkilökoh- taisena projektina oma rajapintani parantaa näistä vain ohjelmistopuolta, loppuihin tarvi- taan yritys, jota parantaa CRM:n mukaisesti.

(19)

3 Toteutus

Tämä luku käsittelee toteutetun rajapinnan ohjelmointia. Oma projekti toteutetaan Nodella. Tietokantana toimii CouchDB ja rajapintakirjastona toimii Express.js. CouchDB valittiin yli muiden NoSQL-rajapintojen sen helpon käyttöönoton takia Windows-käyttö- järjestelmässä. Lisäksi MongoDB:stä poiketen CouchDB:n suoritettavassa tulee suoraan mukana oma graafinen verkkokäyttöliittymä.

3.1 Ohjelmisto

Kokonaisluku- ja tekstipalautteen tallentamiseen tarvitaan seuraavia työkaluja ja ohjel- mistoa:

• x86-arkkitehtuurin tietokone, johon voi käynnistää Windows-, MacOS-, GNU/Li- nux- tai FreeBSD-käyttöjärjestelmän

• käyttöjärjestelmälle natiivin Node.js suorituskirjaston- sekä sen mukana tulevan paketinhallinnan NPM

• Microsoftin Visual Studio Code -tekstieditori

• Postman-rajapintatestaajan

• Git-versionhallinnan

• CouchDB-tietokannan suoritettavan

• NPM-paketinhallinnalla asennettavat Node.js-kirjastot (ja näiden automaattiset riippuvuudet):

o Express.js (Rajapintaohjelmisto Nodelle)

o Yarn (Uudempi ja parempi paketinhallinta NPM:n tilalle)

o Gulp.js (Front-endin JavaScript- ja tyylitiedostojen pakkaaja, yleinen teh- tävänhallinta)

o Nano (CouchDB-tietokantaan yhdistävä Node-kirjasto).

Työ aloitetaan tekemällä GitLab-alustaan git-säilö (”repository”). GitLab tarjoaa pohjan Express.js-projektille, joka suorittaa Express-generaatorin (express-generator) skriptin git-säilön luontivaiheessa. Express-generator on Node-yhteisön luoma skripti, joka luo valmiiksi Express.js-toteutukselle tyypillisen tiedostorakenteen ja esimerkkitoteutuksen (21).

(20)

Express-generaattori luo alustavan Node.js-konfiguraation, joka suorittaessa ottaa vas- taan juuriosoitteen (“/”) GET-pyynnön ja tulostaa yksinkertaisen “Welcome to Express.js”

-tulosteen selaimessa sivua hakiessa.

GET- ja POST -pyynnöllä tarkoitetaan http-protokollan eri metodeita liikuttaa dataa. Yli- simplifikaationa GET pyytää dataa palvelimelta, POST lähettää sitä.

Pohjan luonnista edetään määrittelemällä tietokannan hallinnointiin tarvittavat kirjastot käytettäväksi Nodella. Nodessa require()-funktio osaa suoraan etsiä merkkijonona nime- tyn liitännäisen alakansiosta node_modules.

var createError = require('http-errors');

var express = require('express');

var path = require('path');

var cookieParser = require('cookie-parser');

var logger = require('morgan');

var prom = require('nano-promises');

var indexRouter = require('./routes/index');

var apiReititin = require('./routes/api');

var app = express();

Esimerkkikoodi 3. Node-suoritettavan kirjastojen lataus

Seuraavaksi tietokanta alustetaan CouchDB:n verkkoselainpohjaisella graafisella käyt- töliittymällä:

(21)

Kuva 2. CouchDB:n taulun (”Noden”) alustus graafisella käyttöliittymällä

Tähän alustettuun tietokantaan muodostetaan yhteys Nodessa:

var nano = prom(require('nano')('http://root:root@localhost:5984'));

nano.db.get('palaute').then((err,body,header) => { }).catch(function(err){

console.log("Palautetaulua ei ole vielä, luodaan.");

dbExists = false;

});

// Luo kannat jos ei olemassa

nano.db.create('palaute').then((body) => { console.log('Luodaan palautekanta.');

}).catch(function(){

console.log('Palautteiden kanta on olemassa. Eteenpäin.') });

nano.db.create('iposoitteet').then((body) => { console.log('Luodaan IP kanta');

}).catch(function(){

console.log('IP kanta on olemassa. Eteenpäin.') });

(22)

var palaute = nano.db.use('palaute');

var iposoitteet = nano.db.use('iposoitteet')

Esimerkkikoodi 4. CouchDB-tietokantaa käyttävän Node.js-kirjaston nano alustus. Koodilai- naus päivältä 10.11.2018 (22)

Tästä jatkuu pitempi prosessi luoda rajapinnan GET- ja POST-pyynnöt käyttäen Expres- sin olemassa olevia ”.get()”- ja ”.post()”-funktioita. Näissä voi ottaa sisään ja lähettää dataa käyttöliittymäpiirtäjälle (Pug) suoraan JavaScript-muuttujina.

/* GET pyyntö lisätä tyytyväisyyspalaute. */

router.get('/sendfeedback', function(req, res, next) { if(req.query.tt!=""){

var tt = req.query.tt;

var palaute=req.palaute;

var iposoitteet=req.iposoitteet;

var host = req.app.get('host');

var apures = res;

var ipused = false;

var tt1 = host+"/api/sendfeedback?tt=1";

var tt2 = host+"/api/sendfeedback?tt=2";

var tt3 = host+"/api/sendfeedback?tt=3";

var tt4 = host+"/api/sendfeedback?tt=4";

var tt5 = host+"/api/sendfeedback?tt=5";

//GET IP blacklist var ip = [1,2,3];

iposoitteet.get(iposoitteet,"osoite").then((body) => { console.log('Hakutulos: '+body);

}).catch(function(err){

if(err){console.log('IP Osoite ei vielä käytetty.')}

ipused=false;

});;

//Scan IP blacklist if(ip.length!=0){

for(var i in ip) {

if(i.osoite == req.connection.remoteAddress.toString()){

ipused = true;

} } }

async function asyncCall() {

//If IP is not blacklisted, add IP and feedback

(23)

if(!ipused) {

//Insert tyytyväisyyskeissi

await palaute.insert({"AsiakkaanTyytyvaisyys":tt}, "palaute-

"+Date.now().toString(), function(err, res) {

if(err){console.log(err)} console.log('Added feedback to database!');

var actionAttachTextSrc = "/api/attachText";

apures.render('textfeedback',{title:'Express', tyytyvaisyys1:tt1, tyytyvaisyys2:tt2,

tyytyvaisyys3:tt3,tyytyvaisyys4:tt4, tyytyvaisyys5:tt5,

actionAttachText:actionAttachTextSrc, resID:res.id, resREV:res.rev,

arvosana:tt });

}).catch(function(err){

if(err){console.log('Hakutulos: '+err)}

console.log('No update! (Alue 1)');

apures.render('alreadysent');

});

} }

asyncCall();

} });

Esimerkkikoodi 5. /sendfeedback-osoitteen GET-rajapintapyyntö Expressillä toteutettuna.

Koodilainaus päivältä 10.11.2018

Palautevaihe kaksi eli tekstipalautteen syöttö on tapahduttava vasta, kun numeroarvo- sana on jo palautettu, ja se on liitettävä aikaisempaan palautteeseen. Tässä auttaa apu- funktio, joka mahdollistaa perinteisen ”päivitysfunktion” CouchDB:ssä. Päivitysfunktion avulla halutaan pääsääntöisesti päivittää saman datarivin versio (”revision”) jättäen van- han version rivistä talteen. Tämä apufunktio on jälleen aiemmin mainittua JavaScriptin prototyypin luontia, eli tarvittava funktionaalisuus määritetään suorituksen aikana:

(24)

palaute.update = function(obj, key, callback) { var db = this;

palaute.get(key, function (error, existing) { if(!error) obj._rev = existing._rev;

palaute.insert(obj, key, callback);

});

}

Esimerkkikoodi 6. Apufunktio päivittämään dataa CouchDB-kirjastossa

Rajapinta ei välttämättä tarvitse käyttöliittymää. Rajapinnan arvosanapyynnöt voidaan liittää esimerkiksi sähköpostiin linkkeinä hyödyntäen esimerkiksi MailChimp-palvelun sähköpostiautomatisointia. Tässä projektissa on kylläkin vielä asiakkaalle vapaaehtoi- nen vaihe kaksi, jossa asiakas voi jättää vapaamuotoisen tekstipalautteen.

Kuva 3. Rajapinnan vastaus arvosanan 5 lähetykseen

3.2 Käyttöönotto

Viilausta vaille valmis Node.js-ohjelmisto konfiguroidaan käyttämään verkkosivulle tyy- pillistä 80-verkkoporttia virtuaalipalvelimessa, jotta nettiselaimeen tai linkkeihin ei tarvitse erikseen syöttää porttia. MailChimp-pohja, jossa sen footer, eli alatunniste, täytetään lin- keillä rajapinnan arvosanatallennukseen seuraavanlaisella osoiterakenteella:

(25)

Taulukko 1. Palauterajapinnan osoitteiden rakenne

Erittäin Pettynyt api.esimerkkidomain.fi/api/sendfeedback?tt=1 Melko Pettynyt api.esimerkkidomain.fi/api/sendfeedback?tt=2 Neutraali api.esimerkkidomain.fi/api/sendfeedback?tt=3 Tyytyväinen api.esimerkkidomain.fi/api/sendfeedback?tt=4 Erittäin Tyytyväinen api.esimerkkidomain.fi/api/sendfeedback?tt=5

3.3 Käyttöliittymän parantaminen

Varteenotettavan käyttöliittymän luonti on olennaista ulkoiselle sivustolle johdettaessa sähköpostilinkeistä. Ensin projektille konfiguroidaan gulpfile.js Gulp-tehtävänhallitsijaa varten. Gulpissa konfiguroidaan tarvittavat työtehtävät (tasks), joita voidaan suorittaa au- tomaattisesti ulkoasua muuttaessa.

gulp.task('sass', function() {

var data = fs.readFileSync('env.txt','utf8');

var dest='./public/stylesheets/';

return gulp.src('./sass/style.scss')

.pipe(gulpif((data=='dev'),sourcemaps.init())) .pipe($.autoprefixer({

browsers: ['last 2 versions', 'ie >= 11']

}))

.pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError)) .pipe(rename('style.css'))

.pipe(gulpif((data=='dev'),sourcemaps.write())) .pipe(gulp.dest(dest))

.on('end', function(){

console.log('Agenda log: Compiled css');

browserSync.reload;

});

});

Esimerkkikoodi 7. Gulpin SASS-tyylikirjaston koostamisen työtehtävä.

Kun Gulpin työtehtävät konfiguroiva tekstitiedosto eli ”gulpfile” on konfiguroitu koosta- maan SCSS- ja JS-paketteja, valmiisiin tiedostoihin viitataan käyttöliittymän yläosiossa (”header”):

(26)

html head

title= title

link(rel='stylesheet', href='/stylesheets/style.css')

script(type="text/javascript",src="dist/scripts.compiled.min.js")

Esimerkkikoodi 8. layout.pug yleisrakenteen tyylien ja JavaScriptin lataus (PUG-formaatissa)

SCSS-konfiguraatioon lisätään Bootstrapin SASS-lähdekoodi, johon lisäsin normaalin konfiguraation lisäksi lisävälistysyksiköitä (jotta välistysluokkia olisi välillä 0-20 lineaari- sesti). Esimerkiksi luokilla pt-4 + mt-2 ja pt-6 on siten saman verran pystyvälistystä.

Kuva 4. Käyttöliittymän päivittäminen Bootstrap-kirjaston määrityksien mukaiseksi

3.4 Datan visualisointi

Demotarkoitukseen jo julkisesti alustassa näkyvä sivu kertoo alustalla vastanneiden tyy- tyväisyyden. Numeropalautteen alle tulostetaan myös leijumaan tekstit, jos asiakkaat ovat jättäneet valinnaista tekstipalautetta.

(27)

Kuva 5. Tekstipalautteiden tulostaminen CouchDB-tietokannasta

Ensimmäisessä listassa ovat numeropalautteet, johon ei ole liitetty tekstipalautetta. Osi- ossa ”Tekstipalautteet” on numeropalautteita, johon on liitetty tekstipalaute. Yksinäiset numeropalauteet tulostetaan Bootstrapin mukaisessa responsiivisessa ristikossa (”grid”), joka asettaa automaattisesti riveittäin sisältöä. Molemmille listoille asetetaan res- ponsiivisesti maksimikorkeus ikkunan korkeuden mukaan. Tämän korkeuden saavutet- tuaan listat tulostavat myös vierityspalkin, jolla selata yli maksimirajan listautuvia teksti- palautteita. Molempien listojen ruksit mahdollistavat valitun palautteen poistamisen tie- tokannasta.

3.5 Koodivirheiden korjaus

Koodikielen virheiden korjaukseen käytetään Node-kirjastoa eslint, joka korostaa EC- MAScript-standardin vastaisia virheitä lähdekoodista. Komennot asennukseen ja konfi- gurointiin projektissa ovat hyvin yksinkertaiset:

yarn add eslint npx

”./node_modules/.bin/eslint” –init

(28)

Esimerkkikoodi 9. Eslint-korjaajan lisäys Node-projektiin terminaalissa

Tämän lisäksi on kuitenkin korjattava ESLintin konfiguraatiotiedosto .eslintrc tukemaan Noden omaa funktionaalisuutta ja ”require()”-funktiota:

module.exports = { "env": {

"browser": true, "es6": true, "amd":true, "node": true, },

"extends": "eslint:recommended", "globals": {

"Atomics": "readonly",

"SharedArrayBuffer": "readonly"

},

"parserOptions": { "ecmaVersion": 2018, "sourceType": "module"

},

"rules": {

"no-console": "off", }

};

Esimerkkikoodi 10. .eslintrc-konfiguraatiotiedosto.

Omina lisäyksinä ”amd”- ja ”node”-ominaisuuksien salliminen sekä ”no-console”-sään- nön poisottaminen, koska JavaScriptiä suoritetaan Nodessa, ei selaimessa.

Tämän jälkeen ”npx eslint app.js”-komennon ajaessa saa pääsuoritettavasta huomau- tuksia käyttämättömistä muuttujista:

(29)

Kuva 6. Eslint-suoritettavan tuloste tiedostolle app.js

Lähdekoodin .js-tiedostot korjataan siihen kuntoon, että Eslint-työkalulla ei ole huo- mautettavaa. Tähän avuksi on myös editoriin Visual Studio Code saatavilla laajennus ESLint, joka korostaa graafisesti suoraan editoriin formatointivirheet ja lukee samaa kon- figuraatiotiedostoa ”.eslintrc”, joka aikaisemmin määriteltiin.

Kuva 7. ESLint-visuaalinen huomautus Visual Studio Code -editorin laajennuksella ”ESLint”

(30)

4 Testaus

Rajapintakutsuja testataan ohjelmistolla Postman, joka visuaalisesti kertoo informaatiota eri GET/POST-kutsujen vastauksista. Datan visualisoinnin (graafit) toiminnallisuutta tes- tataan Google Chrome -verkkoselaimella yhdistämällä rajapinnan käyttöliittymään.

4.1 Rajapintalinkkien testaus

Tyytyväisyyskyselyn ensimmäinen osa (numeroarvosanan lähetys) on testattavissa ta- vanomaisin rajapintojen testikeinoin, koska numeroarvosana lähetetään suoraan linkillä, jossa on aiemmin mainittu /api/sendfeedback?tt=numero-kysely.

Linkit syötetään Postman-ohjelmaan, jossa varmistetaan, että http-vastaus on 200 (OK) eikä esimerkiksi 403 (forbidden). Testitulos tälle on lähdekoodin valmistuessa se, että halutut rajapintapyynnöt palauttavat varmasti 200.

Kuva 8. Postmanillä testattu POST-pyyntö lähettää numeropalaute ”Melko pettynyt” vastauk- sella 200 (OK)

(31)

4.2 Suorituskyvyn testaus

Testasin CEPN-pinolla ja LAMP-pinolla tehtyjä, samankaltaisia ohjelmia myös niiden la- tausaikojen suhteen. Noden konsolituloste antaa suoraan eri HTTP-pyyntöjen keston.

Tämän lisäksi tietyn funktion suoritusajan saa kutsumalla aloituksessa con- sole.time("nimi") ja lopetuksessa console.timeEnd("nimi") :

Kuva 9. Node-tulosteen merkitsemät suoritusajat kutsulle /api/sendnumber.

LAMP-pinon nopeuden testaamiseen asennetaan MAMP-ohjelmisto, joka mahdollistaa Apachen ja MySQL-tietokannan nopean käyttöönoton. Graafisella MySQL-työkalulla HeidiSQL luodaan MySQL-tietokanta lamptest, jota käyttää suorituskykytesteihin.

(32)

Kuva 10. MySQL-tietokannan luonti HeidiSQL-ohjelmalla

Puhtaasti PHP:lla ja sen sisäänrakennetulla MySQLi-kirjastolla nopeustestattu koodi tu- lostaa nopeudet verkkoselaimeen MySQL-haut suoritettuaan. PHP:lla lasketaan kulunut aika sisäänrakennetulla funktiolla microtime(), joka tallentaa sen hetkisen ajan mikrose- kunteina. Tällä tavoin voidaan kerätä ensin aloitusaika ja sitten vertailla sitä valmistumis- aikaan.

<?php

set_time_limit(1000);

test_pdo_buffered(100);

test_mysqli_buffered(100);

test_mysql_buffered(100);

function test_mysqli_buffered($size) { $servername = "localhost";

$username = "root";

$password = "root";

$dbname = "lamptest";

$start = microtime(true);

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {

die("Connection failed: " . $conn->connect_error);

}

(33)

for( $i = $size; $i<$size + 200; $i++ ) {

$sql = "SELECT name FROM movies order by name DESC LIMIT ".$i;

$result = $conn->query($sql);

}

$conn->close();

echo "mysqli - fetched rows in " . number_format(microtime(true)-$start, 5)."

seconds<br/>";

}

?>

Esimerkkikoodi 11. MySQLi-toiminnan suoritus ja nopeustestaus. Huomaa tulostuksen ”micro- time miinus alkuperäinen microtime”-laskutoimitus

Näytekokona toimii saman toiminnon suorittaminen ja mittaaminen molemmissa pi- noissa viisi kertaa. Tuloksista muodostetaan keskiarvo, joka osoittaa tarpeeksi tarkasti pinojen suoritustehot. Suoritettavat koodit asetetaan mahdollisimman samalle viivalle, jolloin poistetaan esimerkiksi kompleksi tulostevastaus express.js-toteutuksesta. Toimin- not suoritetaan kokonaan samalla tietokoneella, siten samalla suoritusteholla.

Näillä tavoin kerätyt tulokset LAMP-pinolle ovat seuraavat:

Taulukko 2. LAMP-pinon tietokantatoimintojen suoritusajat

Suoritusaika Tallenna kokonaisluku tieto- kantaan (ms)

Rivin haku 300 kertaa tie- tokannasta (ms)

LAMP (1) 13,73 32,06

LAMP (2) 13,85 24,15

LAMP (3) 14,20 23,18

LAMP (4) 13,76 22,92

LAMP (5) 13,87 22,88

LAMP (Keskiarvio) 13,88 23.28

Kerättyäni samoja aikoja CEPN-pinolla ylhäällä mainituin metodein tulokset olivat seu- raavat:

(34)

Taulukko 3. CEPN-pinon tietokantatoimintojen suoritusajat

Suoritusaika Tallenna kokonaisluku tietokan- taan /sendnumber (ms)

Rivin haku 300 kertaa tietokannasta (ms)

CEPN (1) 7,30 26,07

CEPN (2) 5,32 26,47

CEPN (3) 4,82 20,57

CEPN (4) 4,95 18,07

CEPN (5) 4,62 22,52

CEPN (Keskiarvio) 6,29 22,74

4.3 Suorituskyvyn testauksen tulokset

Tulokset vastaavat odotuksia, jotka puhuvat puhtaan JavaScript-toteutuksen puolesta.

Tämän kokoisessa projektissa on mahdotonta mitata toteutuksen skaalautumista, esi- merkiksi jos koodiin tulisi runsaasti enemmän erilaisia rajapintapyyntöjä ja niitä pyydet- täisiin tuhansia sekunnissa, mutta Nodea NoSQL-kannalla on juurikin kehuttu hyvän skaalautuvuutensa johdosta (23).

(35)

5 Yhteenveto

Tavoitteena tutkia Nodea ja hyödyntää sen tarjoamia valmiita kirjastoja luodakseni yk- sinkertainen ominaisuus kuten asiakaspalautteen tallentaminen. Tässä projekti onnistui.

Nodea aikaisemmassa harjoittelussa ja koulun rajapintakurssilla hyödyntäneenä ei ollut alkeiden opettelu hidasteena. Ohjelmistoa parantaessa eteenpäin sitä uskaltaa myös kaupustella työpaikalle, joka ei koe nykyisiä käytössä olevia valmiita kyselyohjelmistoja ihan parhaiksi mahdollisiksi.

Verkkosivujen ohjelmoinnista tietävät yleensä tuomitsevat JavaScriptin käyttöä backen- dissä sen raskauden takia. Sitä se ei ole, ei ainakaan oikeissa käsissä. Nodea osaava voi implementoida mitä vain maan ja taivaan väliltä nopeasti. Tämä kyky luoda ohjelmis- toa laidasta laitaan käyttäen verkkoteknologioita on ohjelmistoyritystyöskentelyssä avain.

Sovelluksen kehitystyön aikana kehityin vähintäänkin hyvien ohjelmointikäytäntöjen suh- teen. ECMAScript-standardien oppiminen projektin aikana on ohjelmistomaailmassa kul- taa, koska sitä voi nykyään hyödyntää kaikessa full-stack-verkkopalveluista mobiilisovel- luksiin.

(36)

Lähteet

1 Googlen 404-virhesivu. Verkkoaineisto. http://google.com/error. Luettu 26.5.2019.

2 Katherine Noyes. 30.8.2010. Five Reasons Linux Beats Windows for Servers.

Verkkoartikkeli. https://www.pcworld.com/article/204423/why_linux_beats_win- dows_for_servers.html. Luettu 10.11.2018.

3 Linux Adoption. Verkkoaineisto. https://en.wikipedia.org/wiki/Linux_adoption. Lu- ettu 1.11.2018.

4 SupportedArchitectures. Verkkoaineisto. https://wiki.debian.org/SupportedArchi- tectures, luettu 25.5.2019.

5 ECMAScript. Wikipedia-artikkeli. https://en.wikipedia.org/wiki/ECMAScript. Luettu 4.5.2019.

6 JavaScript. Mozillan dokumentaatiosivu. https://developer.mozilla.org/en- US/docs/Web/JavaScript. Luettu 26.5.2019.

7 Promise-polyfill. NPM-arkiston ohjesivu. https://www.npmjs.com/package/pro- mise-polyfill. Luettu 4.5.2019.

8 V8-moottorin verkkosivu. Verkkoaineisto. https://v8.dev/. Luettu 29.10.2018.

9 Jane Elisabeth. 27.6.2018. Ryan Dahl is fixing his Node.js design regrets with Deno. Verkkoartikkeli. https://jaxenter.com/ryan-dahl-fixing-node-deno-

146190.html. Luettu 29.10.2018.

10 Gulp.js. Verkkoaineisto. https://gulpjs.com/. Luettu 26.5.2019.

11 MongoDB Drivers and ODM. Verkkoaineisto. https://docs.mongodb.com/ecosys- tem/drivers/. Luettu 26.5.2019.

12 Express.js. Verkkoaineisto. https://expressjs.com/. Luettu 26.5.2019.

13 phpsadness.com. Verkkoaineisto. http://phpsadness.com/. Luettu 29.10.2018.

14 Nikita Prokopov. 17.9.2018. Discenchantment. Blogijulkaisu, http://tonsky.me/blog/disenchantment/. Luettu 29.10.2018.

15 Discord-ohjelma. Verkkoaineisto. https://discordapp.com/. Luettu 29.10.2018.

(37)

16 Electron.js-kirjasto. Verkkoaineisto. https://electronjs.org/. Luettu 29.10.2018.

17 Asiakkuudenhallinta. Verkkoaineisto. https://fi.wikipedia.org/wiki/Asiakkuudenhal- linta. Luettu 19.5.2019.

18 Annika Huusko. 2015. CRM-järjestelmän valinta kuljetusyritykselle. Opinnäytetyö.

http://urn.fi/URN:NBN:fi:amk-2015052610236. Luettu 19.5.2019.

19 Pekka Sahlsten. 3.9.2012. Asiakkuudenhallinta eli CRM – mistä oikein on kysy- mys? Blogikirjoitus. https://www.myynti20.fi/asiakkuudenhallinta-crm-mista-on- kysymys/. Luettu 26.5.2019.

20 Syed Raja. 23.3.2015. Microsoft Dynamics CRM hotfix for Chrome users.

http://dynamicsfeed.com/tips/microsoft-dynamics-crm-hotfix-chrome-users/. Lu- ettu 26.5.2019.

21 Express application generator. Verkkoaineisto. https://ex- pressjs.com/en/starter/generator.html. Luettu 26.5.2019.

22 Nano-kirjaston dokumentaatio. Verkkoaineisto. https://github.com/apache/nano.

Luettu 10.11.2018.

23 Samer Buna. 13.7.2017. Scaling Node.js Applications. Verkkoartikkeli, https://me- dium.freecodecamp.org/scaling-node-js-applications-8492bd8afadc. Luettu 10.11.2018.

Viittaukset

LIITTYVÄT TIEDOSTOT

Therefore, if we consider some fixed node among the possible start nodes, the packet starting from the node will become active with probability 2 −j+1.. Therefore, the expected

Based on our results, migrating keratinocytes express MMPs, collagenase-1 and stromelysin-2, during wound healing. Expression of collagenase-1 is induced rapidly after injury,

 Pää piirre IrLAP:ssa on pää laitteen (primary node) ja yhden tai useamman sivu laitteen (secondary node) suhde.  Primary node on vastuusta

Explain the reflection and transmission of traveling waves in the points of discontinuity in power systems2. Generation of high voltages for overvoltage testing

Explain the meaning of a data quality element (also called as quality factor), a data quality sub-element (sub-factor) and a quality measure.. Give three examples

19 mm thick wood-fibre panel fronts with low formaldehyde emission CLASS E0, covered on 2 sides with melamine sheets [HRM], edge on 4 sides in 8/10 thick abs.. The external surface

The Extrinsic Object Construction must have approximately the meaning'the referent ofthe subject argument does the activity denoted by the verb so much or in

Jo aikaisemmat Youth in Action -seurannat ovat osoittaneet, että mukana olleiden nuorten ja myös hankevetäjien avaintaidot kehittyvät hankkeen aikana.. Tällä kertaa