WEB-SOVELLUS GOOGLE APP ENGINE ALUSTALLE
|
|
|
- Hannu-Pekka Laakso
- 10 vuotta sitten
- Katselukertoja:
Transkriptio
1 Lappeenrannan teknillinen yliopisto Teknistaloudellinen tiedekunta Tietotekniikan koulutusohjelma Kandidaatintyö Jarno Lehto WEB-SOVELLUS GOOGLE APP ENGINE ALUSTALLE Työn tarkastaja: Professori Kari Smolander Työn ohjaaja: Professori Kari Smolander
2 TIIVISTELMÄ Lappeenrannan teknillinen yliopisto Teknistaloudellinen tiedekunta Tietotekniikan koulutusohjelma Jarno Lehto WEB-SOVELLUS GOOGLE APP ENGINE ALUSTALLE Kandidaatintyö sivua, 5 kuvaa, 1 taulukko ja 11 liitettä Tarkastaja: Professori Kari Smolander Hakusanat: App Engine, pilvimalli, pilvilaskenta, pilvisovellus, sovellus palveluna, sovellusalusta palveluna, tietojärjestelmän ulkoistaminen, palveluiden saatavuus pilvestä App Engine on lyhenne englanninkielisistä termeistä application, sovellus ja engine, moottori. Kyseessä on Google, Inc. -konsernin toteuttama kaupallinen palvelu, joka noudattaa pilvimallin tietojenkäsittelyn periaatteita ja mahdollistaa asiakkaan oman sovelluskehityksen. Järjestelmään on mahdollista ohjelmoida itse ideoitu palvelu Internet - verkon välityksellä käytettäväksi, joko yksityisesti tai julkisesti. Kyse on siis hajautetusta palvelinjärjestelmästä, jonka tarjoaa dynaamisesti kuormitukseen sopeutuvan sovellusalustan, jossa asiakas ei vuokraa virtuaalikoneita. Myös järjestelmän tarjoama tallennuskapasiteetti on saatavilla joustavasti. Itse kandidaatintyössä syvennytään yksityiskohtaisemmin sovelluksen toteuttamiseen palvelussa, rajoitteisiin ja soveltuvuuteen. Alussa käydään läpi pilvikäsite, joista monilla tietokoneiden käyttäjillä on epäselvä käsitys. Erilaisia kokonaisuuksia voidaan luoda erittäin monella tavalla, joista rajaamme käsittelyn kohteeksi toteuttamiskelpoiset yleiset ratkaisut. i
3 ABSTRACT Lappeenranta University of Technology Faculty of Technology Management Degree Program of Information Technology Jarno Lehto WEB-APPLICATION INTO GOOGLE APP ENGINE PLATFORM Bachelor of Science thesis pages, 5 images, 1 table and 11 appendixes Examiner: Professor Kari Smolander Keywords: App Engine, Cloud computing model, Cloud computing, Cloud application, Software as a service, Platform as a service, Computer system outsourcing, Cloud service availability App Engine stands for computer application and software engine. Here it means commercial service provided by Google, Inc. which applies cloud computing model. This service allows Google s customers their very own application development without rented servers. An application can be a private or a published one. The service provides globally scattered resources dynamically as applications load changes including data transfer, storage and processor usage. Cloud computing is used for cost reduction, offloading information and data processing from private data centres. In this Graduate Work I discuss more deeply about my test project, App Engine development, its limitations and applicability. Different application configurations can be created in several ways. I have limited to the most common cases and uses. In the beginning I introduce the concept of cloud computing which is still commonly misunderstood. ii
4 ALKUSANAT Tämä työ on tehty Lappeenrannan teknillisen yliopiston teknistaloudellisen tiedekunnan tietotekniikan koulutusohjelman kandidaatintyönä. Minä haluan kiittää tietotekniikan laitoksen opetukseen osallistuneita henkilöitä kannustavasta ja motivoivasta suhtautumisesta. Haluan kiittää erityisesti työn valvojaa professori Kari Smolanderia arvokkaista neuvoista ja tarpeellisesta kriittisyydestä. iii
5 SISÄLLYSLUETTELO 1 JOHDANTO TAUSTA TAVOITTEET JA RAJAUKSET TYÖN RAKENNE PILVI TIETOTEKNIIKASSA MERKITYS TARJONTA JA MAHDOLLISUUDET GOOGLE APP ENGINE WEB-SOVELLUS RATKAISUMENETELMÄT TOTEUTTAMINEN TOTEUTTAMISEN VAIHEET SAAVUTETTU TULOS POHDINTA TUTKIMUS YHTEENVETO LÄHTEET LIITTEET 1
6 LYHENNE- JA SYMBOLILUETTELO API CGI CPU CSS GWT HTML HTTP HTTPS IBM JVM SQL URL XHTML XMPP YAML WSGI Application Programming Interface Common Gateway Interface Central Processing Unit Cascading Style Sheet Google Web Toolkit Hypertext Mark-up Language Hypertext Transfer Protocol Hypertext Transfer Protocol Secure International Business Machines, Inc. Java Virtual Machine Structured Query Language Uniform Resource Locator Extensible Hypertext Mark-up Language Extensible Messaging and Presence Protocol Yaml ain t mark-up language Python Web Server Gateway Interface 2
7 1 JOHDANTO Tallennettavan tiedon määrä on lisääntynyt valtavasti parin vuosikymmenen aikana ja edelleen voidaan väittää, että määrä tulee kasvamaan edelleen pitkälle tulevaisuuteen. Ihmisen uteliaisuus tulee asettamaan uusia vaativampia tavoitteita. Samalla prosessoinnin ja tiedonsiirron vaatimukset kasvavat edelleen, johon toki vastataan laitteiden ja tietoliikenneyhteyksien kehittämisellä. Kuitenkin on päädytty kyseenalaistamaan, kenen kannattaa omistaa teratavuja vuorokaudessa prosessoivat laitteet? Monia vähemmän ajan suhteen kriittisiä palveluita voisi tuottaa IT -alan palveluihin erikoistuva yritys, jolloin lähes jokaisella yrityksellä ei tarvitsisi olla omaa jäähdytettyä tilaa palvelintietokoneille. Teknisenä selvityksenä tässä työssä kehitettiin laajaa asiakasjoukkoa palvelevalle pilvisovellusalustalle kovin tyypilliseen lomakkeen täyttämiseen perustuva sovellus, joka huolehtii tiedon tallentamisesta tietokantaan. 1.1 TAUSTA Teen tämän seminaarityön kandidaatintyönä. Valitsin aiheekseni Google App Engine sovellusalustan teknisestä näkökulmasta tarkasteltavaksi, mutta aikomukseni on myös lyhyesti arvioida soveltuvuutta ja taloudellista merkitystä. Valintani on seurausta ajankohtaisesta mielenkiinnosta pilvikäsitteen mukaiseen tietojenkäsittelyyn, ja koska omaan erityistä mielenkiintoa laajoja hajautettuja tietojärjestelmiä kohtaan. Pilvi tarkoittaa tässä palveluna Internetin kautta vältettyjä sovelluksia ja suorituskykyistä konesaleihin sijoitettua järjestelmää, josta palvelu tarjotaan. Konesaleihin sijoitettuun järjestelmään sisältyy laitteisto ja järjestelmäohjelmisto (Armbrust, et al., 2009). Samalla yleensä turvataan tiedon saatavuutta, ja siirretään valvonnan, tallennuksen ja varmuuskopioinnin vastuuta palveluntarjoajalle. Yleinen mielenkiinto ja edelleen kasvava huomio ovat myös seurausta globaalista kustannustehokkuuden tavoittelusta yrityksissä ja yhteisöissä. Sähköenergian hinta on merkittävä tekijä, eikä yleensä ydinliiketoiminnan osaajia ja omistajaa kiinnosta välttämätöntä enemmin omien tietotekniikan palveluiden ylläpitäminen. Toisaalta pilvijärjestelmiä kehittäviä organisaatioita ja niiden omistajia kiinnostaa merkittävän liikevaihdon kasvun tilaisuuden tarjoutuminen. Pilvioperaattorit ovatkin strategioissaan tavoittelemassa erityisesti merkittävien yritysten maksamaa 3
8 korvausta ulkoistetusta palvelusta. Ulkoistamisen toteutuksen aste voi olla yksittäinen osa yhdestä sovelluksesta, aina olemassa olevan tietojärjestelmän korvaamiseen asti. Yrityskohtaisiin pilvisovelluksiin sisältyy yhteyksiä ulkoisiin tietokantoihin ja olemassa oleviin järjestelmiin, kuten toiminnanohjausjärjestelmiin ja lisäksi on saatavilla yksityisiä SQL (Structured Query Language) -tietokantoja pilvioperaattorilta sopimuksen mukaan. Tämän seurauksena on jo olemassa työllistävä kysyntä pilvialustojen sovelluskehittäjille. Suoraviivaisen liiketoiminnan lisäksi osaavat yksilöt voivat kehittää luovuuttaan toteuttaen kokonaan uusia ideoita julkisiksi sovelluksiksi, ja parhaissa tapauksissa suosio voi kasvaa Facebook:in osoittamalla tavalla. Tällaisessa tapauksessa pilvioperaattori saisi osansa saavutetusta taloudellisesta hyödystä resurssien hinnoittelun kautta verkkopalvelun kasvun myötä. Tämä opportunismi edellyttää pilvioperaattoreiden kilpaillessa ilmaista pienen resurssin aloituspakettia, jollaisia on tarjolla. 1.2 TAVOITTEET JA RAJAUKSET Tässä työssä tullaan ensisijaisesti keskittymään oman sovelluksen eri osien sijoittamiseen ja kuvaamiseen Google App Engine -pilvisovellusalustalle sekä selvittämään, mitkä ovat kehitettävän pilvisovelluksen vaatimukset ja ohjelmalliset osat. Tavoitteena on ohjelmoida keskustelupalsta web-sovelluksena, jossa toimintalogiikan ohjaamiseen ja toteuttamiseen käytetään sovellusalustan tukemaa Python-ohjelmointikieltä ja alustan tarjoamaa tietokantaa. Tämä tavoite on lukijalle helppo ymmärtää, mitä olen tekemässä selvitys- ja oppimistarkoituksessa. Samalla se alustavan arvion puitteissa mahtuu laajuutensa osalta Googlen tarjoamaan ilmaiseen tutustumiseen tarkoitettuihin rajoituksiin. Tarkastelussa pyrin ensisijaisesti tekniseen lähestymiseen ohjelmointia painottaen. Teknisen tarkastelun lisäksi kerron hieman pilvialustan taloudellisista vaikutuksista, vastuunjaosta, tallennetun tiedon saatavuudesta ja vikaantumisen sietokyvystä. Itse konesalien palvelintietokoneet jätän erittäin vähälle huomiolle ja ennemmin lyhyesti kirjoitan tämän edelleen suosioltaan yleistyvän pilvisovellusalustan ja nykyisten yksityisten konesalien välisen eron pienimuotoista vertailua. Kerron lyhyesti myös julkaistusta hinnoittelusta kirjoittamisen hetkellä ja esitän hinnoittelua havainnollistavan 4
9 taulukon. Pilvimallin mukaisia kilpailevia toimijoita ei tulla käsittelemään tässä työssä, mutta sivutaan ohimennen nimeltä mainittuna. Työn laajuuden huomioiden rajaan käsittelyn ulkopuolelle maailmanlaajuiset tallennusverkot, konesalien tallennusratkaisut ja tietoliikenneyhteydet, palvelimien käyttöjärjestelmät ja Googlen sisäiset suljetut järjestelmät, koska näihin ei sovelluskehittäjällä ole suoraa pääsyä. Tässä selvityksessä esiteltävää omaa sovellusta en oleta puutteettomaksi, mutta tavoitteen toteutumista arvioidaan. Jätän kirjojen kirjoittajille loistavan tilaisuuden esittää kaiken kattavat yksityiskohtaiset rakennusohjeet App Engine -sovellusten kokoamisesta ja käyttöönotosta. 1.3 TYÖN RAKENNE Luvussa 2 käsittelen yleistä asiaa pilvimallista, sovelluksen alustasta ja ohjelmallisista osista. Lukuun sisältyy käytettyjen käsitteiden ja termien esittely ja määrittely. Luvussa 2 esittelen myös jonkin verran toimintaperiaatteita, sekä lyhyesti näiden vaikutuksia ja vaatimuksia. Luku 3 esittelee tavoitteena olevan pilvialustalle toteutettavan sovelluksen, siihen liittyviä haasteita ja tarpeita yleisesti. Haasteisiin kuuluu sovellusalustan asettamat rajoitteet. Luvussa 4 esittelen tarkasteltavan ongelman ratkaisutapaa. Ratkaisutapaan liittyy joukko päätöksiä, joista kerrotaan lyhyesti. Luku 5 sisältää käytännön toteutuksen osuuden. Käytännön toteutuksessa käsitellään ensisijaisesti ratkaisuna luotua lähdekoodia, joten viidennessä luvussa kuvaillaan mitä on tehty, etenemisen vaiheet, miten toteutin, kohtaamani ongelmat, tulosten yhteenveto ja oma tulkinta tuloksista. Luvussa 6 pohdiskelen tuloksen merkitystä ja tulevaisuuden näkymiä. Luku 7 sisältää johtopäätökset yhteenvetona, jo esitetyistä asioista. Loppuun sijoittuu lähdeluettelo ja aivan viimeisenä sijaitsee lähdekoodia sisältävät liitteet. 5
10 2 PILVI TIETOTEKNIIKASSA Tietotekniikan ja tietoliikenteen historiassa yksinkertaistetuissa kaavioissa on usein kuvattu pilvisymbolilla sitä verkon osaa, joka ei ole omassa hallinnassa vaan jonkun muu vastuulla. Esimerkiksi menneessä ajassa konsernin keskuskoneen tai isokoneen, ohjelmia käytettiin modeemiyhteyksien välityksellä toimipisteiden tekstiä esittävillä päätteiltä (Voas, et al., 2009). Tuolloin teleoperaattorin verkko, kuten nytkin tietoliikenneyhteyden tarjoavan operaattorin verkko saatetaan kuvata pilvipiirroksella. Nykyinen Internet ansaitsee erityisesti pilvisymbolilla käsitteellistämisen, koska se ei ole kenenkään yhden organisaation omistuksessa ja siihen voi liittyä kuka tahansa kohtuullisen taloudellisen aseman omaava. Kuitenkin merkittävä siirtonopeuksien kasvu vähentää pitkään korostetun paikallisen suorittamisen painetta ja monimuotoisemman sisällön välittäminen ei aiheuta enää ratkaisevan haitallista hitautta. Ajatus yhdessä tehokkaassa järjestelmässä suorittamisesta on jälleen saavuttamassa hyväksyntää teknisten esteiden väistyessä. Pilveä on kuluneen parin vuoden kuluessa alettu tulkitsemaan uudella tavalla, jossa Internet-verkkoon sijoittuu useita kilpailevia tehokkaita hajautettuja järjestelmiä, joista tarjotaan tiedonkäsittelyn ja tallennuksen resursseja palveluna. Samasta järjestelmästä pyritään tarjoamaan palvelua mahdollisimman monelle asiakkaalle samanaikaisesti ja tarjotun palvelun laajuus voi vaihdella itsepalvelusta täysihoitoon. Palveluna suoritettavat sovellukset tai sovelluksen osat asiakas voi kehittää itse tai teettää kolmannella osapuolella. Tällaisena lyhyesti sanottuna ymmärretään nykyisin pilvikäsite. Mutta mikäli aihealueen tuntemus on olemattomalla pohjalla, on suositeltavaa tutustua kirjallisuuteen (Hurwitz, et al., 2009) ennemmin, kuin Wikipedian vakavasti puutteelliseen tynkään (Wikipedia, 2010). 2.1 MERKITYS Yleinen mielenkiinto pilvikäsitteeseen ja edelleen kasvava huomio ovat seurausta maailmanlaajuisesti korostetusta kustannustehokkuuden tavoittelusta. Samalla on alettu 6
11 tiedostaa toteuttamiskelpoisuus, johon isot IT -alan toimijat ovat havahtuneet tilaisuutena ja sisällyttäneet strategiaansa palvelun tarjoamisen pilvijärjestelmällä. Varhaiset toimijat ovat jo saavuttaneet merkittävän käyttökelpoisuuden, vaikka tulevaisuuden kehitystä varten on otettu vasta ensimmäisiä askeleita. Esimerkkeinä voidaan nähdä alustalta tarjotut selaimessa toimivat toimisto-ohjelmat, kuten tekstinkäsittely ja taulukkolaskenta. Vastaavasti varhaisten omaksujien sovellukset ovat olleet esimerkiksi selaimessa toimivia pelejä ja dynaamista sisältöä tarjoavia verkkosivuja. Soveltamisen mahdollisuudet (Stanoevska-Slabeva, et al., 2009) ovat kuitenkin valtavasti laajemmat, esimerkiksi tutkimusta tukeva tiedonkeruu (Convers, 2009). Sovelluksen käyttäjä voi olla myös toinen tietojärjestelmä. Lähinnä paikallista automaatiota ohjaavat reaaliaikajärjestelmän osat ja elintoimintoja tukevat järjestelmät rajautuvat pois mahdollisuuksien joukosta vaatimustensa vuoksi. Isojen pilvijärjestelmien konesalien tietoliikenneyhteydet ovat riittävät lähes kaikkeen muuhun. Käytännössä loppukäyttäjän niin kutsuttu viimeisen mailin yhteys vaikuttaa havaittuun käytettävyyteen paljon. Silti kuitenkin on joukko järjestelmiä, joiden prosessoima informaatio on lailla säädeltyä ja siten ne eivät ole siirrettävissä julkiseen pilvijärjestelmään. Yleiseen kustannustehokkuuden tarkasteluun liittyy tuotannon välineiden omistamisesta ja palkoista kertyvien kustannusten vertailu vaihtoehtoiskustannuksiin, jotka aiheutuisivat kelvollisista vaihtoehdoista kilpailuttamalla valitun alihankkijan käyttämisestä. Kuitenkin laajalle joukolle toimialoja, ydinliiketoimintaan ei kuulu IT -palveluiden tuottaminen, mutta käytön tarpeellisuus nykyisessä kilpailuympäristössä ymmärretään. Tällöin on luonnollista kysyä, kannattaako meidän omistaa palvelintietokone lähes jokaiselle käytetylle ohjelmistolle vai voisiko joku tehdä tarvittavan osuuden meille ulkopuolisena? Suojattu ja jäädytyksellä varustettu tila palvelintietokoneille maksaa tilan koon suhteessa ja kulutetun sähköenergian sen päälle. Lisänä kustannuksiin tulee laitehankinnat, lisenssimaksut, asennustarvikkeet ja palkat (Misra & Mondal 2010). Voisiko mitenkään selvitä pelkkien työasemien leasingilla? Kokonaan ilmaista osuutta ei ole tarjolla pilvisovellusten vaihtoehtoa tarkasteltaessa, mutta kuitenkin tarjoutuu mahdollisuus maksaa käytön määrän mukaan. Eli ei tarvitse ostaa alussa varmuuden vuoksi yli todellisen tarpeen, koska skaalautuvuus ja kuormantasaus on jo alustana toimivassa järjestelmässä. Pilvisovelluksen merkittävä kustannus aiheutuu alussa itse sovelluskehityksestä, mutta sen jälkeen saavutettu säästö pitäisi olla vuosittaista. Osa saavutettavasta säästöstä tulee vaativien laitehankintojen ja niihin kuluvan selvitystyön välttämisestä (Rosenthal, et al., 7
12 2010). Toki on olemassa edelleen sama riski kustannusten kasvulle, jos esimerkiksi lakimuutos edellyttää muutoksia sovellukseen. Liiketoiminnalle merkittävien sovellusten sijoittamista pilveen on julkisessa kirjoittelussa moitittu sillä, että kontrolli informaatioon menetetään. Toki ihmisten joukossa epäilijöitäkin on, eikä täysin aiheetta (Subashiniand & Kavitha 2010). Tietomurto ei ole uusi asia. Muistettavaa on, että tiedonsiirrot on mahdollista toteuttaa salausta käyttäen ja informaatio voidaan tallentaa salattuna myös pilvisovelluksissa. Toisaalta on aivan välttämätöntä säilyttää liiketoiminnassa tuotettu data myös fyysisesti eri sijainnissa kuin yrityksen toimipisteessä, muuten otetaan kokonaan menettämisen riski esimerkiksi tulipalon sattuessa. Pilvisovelluksen tapauksessa toimitilojen ulkopuolelle tallentaminen saadaan toteumaan, mutta on vastaavasti välttämätöntä suorittaa säännöllinen datan varmuuskopiointi ja medioiden säilytys lukitussa tilassa. Toinen tunnistettu huolenaihe on riippuvuus sovellusalustasta, koska kilpailija ei välttämättä tue samoja tulkattuja ohjelmointikieliä. Saattaa kuitenkin olla, että kilpailun ja jatkuvan kehitystyön seurauksena suosituimmat ohjelmointikielet on myöhemmin käytettävissä lähes kaikilla. Riippuvuus on vähemmän merkitsevää, jos pilvestä ostettu palvelu on pelkkää virtuaalikoneen vuokrausta. Tulisi kuitenkin muistaa korkean abstraktiotason kieliä käytettäessä, että riippuvuus alustasta rajoittuu lähinnä tiedon tallennukseen, joten kaikkea ei jouduta kehittämään tyhjästä. Riippuvuus palvelun tarjoajasta ei ole ylitsepääsemätöntä, mutta oletettavasti teettää kohtuullisen määrän muutostyötä, koska alkuperäinen idea on jo olemassa. Mutta etujakin on, kuten sovellukseen käyttö maailmanlaajuisesti, jos halutaan. Eikä käyttöliittymän ehdottomasti tarvitse olla selainohjelmassa, jos niin halutaan, mikä usein unohdetaan tarkasteluissa. Selainohjelman käytön voidaan kuitenkin katsoa vähentävän ylläpidon kustannuksia, koska tällöin työasema tarvitsee vähemmän ohjelmistoja (Velte, et al., 2010). Pilveen yrityksen kannattaa investoida erityisesti silloin, kun on tarkoituksena tehdä kokonaan uusi palvelu, tai kun on tarkoitus korvata vanhentunut järjestelmä kokonaan paremmin nykyisiä tarpeita vastaavalla (Fisher, et al., 2010). Tällöin pystytään parhaiten välttämään vanhan järjestelmän muuttamisen aiheuttamat kulut ja vähentämään eri aikakausien ohjelmointimenetelmien yhteensovittamisen sisältämää riskiä. Toisaalta laajemmalta yleisöltä pieniä maksuja keräävien idearikkaiden tahojen tulevaisuutta pilvijärjestelmät muuttavat oleellisesti, kun uuden idean kokeilemisen 8
13 investointikustannukset ovat olemattomat, koska ei joudu ostamaan palvelinta ja vuokraamaan konesalipaikkaa sille. Rohkeampia ideoita on odotettavissa, koska epäonnistumisen hinta on pieni, enimmäkseen yksilöiden ohjelmointiin käyttämä aika ja vaiva. Pilvijärjestelmillä on myös uudenlainen merkitys ohjelmistoja kehittäville yrityksille, koska markkinoinnissa tarjontaa tulee laajentaa, ja asiantuntevia työntekijöitä pitää löytää projekteihin. Ohjelmistoalalle on odotettavissa uusia pienyrityksiä, joissa kehitetään ohjelmistoja pilvialustoille tilaustyönä. Yleisesti työntekijöiden tarve tietotekniikassa ei vähene, koska pienikokoisia prosessorin ja tietoliikenneyhteyden sisältäviä laitteita otetaan käyttöön yhä enemmän ja useampiin tarkoituksiin kuin koskaan aikaisemmin. Tehtävää kehitysvaiheen työtä on valtavasti. Lopulta ihmisen mielikuvituksen rajallisuus saattaa rajoittaa eniten, mitä näillä voisi toteuttaa, jos tallennus ja suoritintehoa vaativat osat kokonaisuudesta prosessoitaisiin jossakin toisessa järjestelmässä. 2.2 TARJONTA JA MAHDOLLISUUDET Suurimmalla mielenkiinnolla kirjoittelu pilvestä kohdistuu merkittävän aseman alussa saavuttaneisiin järjestelmiin, kuten esimerkiksi Amazon Elastic Cloud 2, Salesforce.com, Force.com, Microsoft Azure, Yahoo! Hadoop ja Google App Engine. Myös IBM (International Business Machines, Inc.) tavoittelee osuutta yritysasiakkaista omalla tarjonnallaan. Kuitenkin pienemmän taloudellisen resurssin kanssa aloittaneita toimijoita on jo olemassa ja myöhemmin maailmanlaajuisesti tulee olemaan satoja. Kaikki pilvipalvelun tarjoajat eivät toimi täsmälleen kilpailijoitaan kopioiden, josta seuraa eroavaisuuksia soveltuvuudessa. Ne jotka tarvitsevat jostakin syystä tietyn käyttöjärjestelmän, jolla aikaisemmin luotu ohjelmisto on suoritettavissa, etsivät pilvestä virtuaalikoneen tapaista palvelua, johon tarpeeseen Amazonin EC2 yrittää vastata. Amazon EC2 yrittää erottua skaalautuvalla muistin ja virtuaalisten suorittimien määrällä tavallisesta palvelinvuokrauspalvelusta. Lisäksi Amazon tarjoaa järjestelmästään tallennustilaa S3 - nimisenä palveluna. Microsoftin Azure soveltuu parhaiten.net ohjelmointiin suuntautuneille, jolloin tällä sovellusalustalla kannattaa toteuttaa kohdennetusti sovelluksia ja dynaamisia sisältöjä Windows ja XBOX360 järjestelmillä käytettäväksi. Salesforce.com 9
14 ja Force.com ovat saman Salesforce.com, inc. -yrityksen eri kohderyhmille markkinoitavat palvelut, jotka tarjotaan samasta järjestelmästä. Force.com ja Salesforce.com on sovellusalusta, johon voi kehittää ohjelmistoja alustan omalla tulkattavalla Apexohjelmointikielellä, jonka on haluttu muistuttavan C#:n syntaksia mahdollisimman paljon. Salesforce.com mainostaa tämän kirjoittamisen hetkellä sivustollaan tulevaa Javakehitysympäristöä, jolla tulevat tekemään tärkeän laajennuksen yritysasiakkaiden näkökulmasta. Salesforce.com tarjontaan kuuluu joukko valmiita sovelluskehittäjien julkaisemia ohjelmistoja, joista on mahdollista ottaa valittuja sovelluksia oman organisaation käyttöön ilman sovelluskehitysvaihetta. Kun taas Force.com on enemmän suunnattu sovelluskehityksestä kiinnostuneille henkilöille ja yhteisöille. Yahoo! Application Platform tarjoaa palvelua avoimen lähdekoodin Apache Hadoop -projektiin (Yahoo, 2010) perustuvalla järjestelmällä. Google App Engine on Google, inc. -konsernin toteutus sovellusalustasta, jolle voi kehittää ohjelmistoja Python tai Java - ohjelmointikielillä (Goscinski & Brock 2010, s.949). Google on aloittamassa sovellusalustallaan App Engine for Business -palvelun, jossa sitoudutaan määriteltyyn palvelun laatuun ja yrityssovellus voi saada oikean rajoituksettoman SQL-tietokannan käytettäväksi. App Engine, Azure ja Force.com ovat sovellusalustoja, joihin kehitetyn ohjelmiston lähdekoodi siirretään suoritettavaksi, ja joissa sovelluksella on käytettävissä SQL:n syntaksia noudattava tietokanta käsitellyn informaation tallentamiseen. Näiden etuna on, että ei tarvita käyttöjärjestelmän ja palvelinohjelmiston virittelyä. Sovelluskehittäjän ei tarvitse huolehtia piilotetun hajautetun laitteiston hallitsemisesta lähdekoodissa, koska näistä mekanismeista on jo valmiiksi huolehdittu järjestelmän alemmilla tasoilla. Siis sovelluksen käytön lisääntyessä tulee automaattisesti tarvittu määrä resurssia käytetyksi ja vastaava hinnaston mukainen lasku maksettavaksi. Erityisen miellyttävää on se, että hajautetun järjestelmän vaativimmat asiat eivät ole sovelluskehittäjän huomion kohteena (Goscinski & Brock 2010, s ). Huomion arvoista on sekin, että pilvijärjestelmissä on mahdollista ottaa joustavasti lisää tallennustilaa käyttöön välttäen vapaan levytilan loppumisesta aiheutuvat arvaamattomat häiriöt. On syytä muistuttaa, että pilvialustalle voidaan sijoittaa pelkkä ohjelmiston osa, esimerkiksi ekstranetin käyttöliittymä ja kaikki informaatio tulee omasta järjestelmästä. Tai kokonaisuus voidaan jakaa usean eri palveluntarjoajan järjestelmiin. Eli ohjelmistosta voi 10
15 tehdä kaiken samaan järjestelmään, mutta ei ole pakko. Se mitä sovelluksella tehdään, riippuu tarpeista ja luovuudesta, mutta esimerkiksi kyselytutkimusten lomakkeet ja tiedonkeruu syötteistä ovat helppoja toteuttaa. Mutta toisaalta, tunnetusti matkapuhelimessa on näyttö ja tietoliikenneyhteys, mutta prosessointitehoa rajallisesti. Käytännössä niin kutsuttujen älypuhelinten sovelluskehityksessä avautuu laajat mahdollisuudet, joita ei ole vielä hyödynnetty akkukäytön asettaman rajoituksen vuoksi. Havainnollistavana esimerkkinä ajatus, jossa käyttöliittymä-osassa kuvattu videoleike siirtyy matkapuhelimesta Internet -yhteyden kautta tausta-osalle pilvessä, jossa se muunnetaan yleiseen Windows-yhteensopivaan videoformaattiin, tallentuu käyttäjän video-arkistoon ja vastaanottajiksi listattujen kavereiden ladattavaksi. Vastakohtana keskihintaisen matkapuhelimen prosessorilla videomuunnos valotuskorjauksella kestäisi käyttäjälle epämiellyttävän pitkän ajan. 2.3 GOOGLE APP ENGINE Google App Engine on pilvikäsitteen mukainen sovellusalusta, jossa voi suorittaa itse kehitettyjä sovelluksia (Google, 2010a), joilla tarjotaan loppukäyttäjille tai muille järjestelmille hyödyllisiä palveluita. Esimerkiksi Googlen omia julkisia web-sovelluksia on kehitetty ja sijoitettu samaan järjestelmään. Jotta Google ei itse asettuisi luovuutta rajoittavaan monopoliasemaan järjestelmässään, oletusarvoisesti Google ei kehitä sovelluksia asiakkaille. Järjestelmän asiakas tekee kehitystyön itse, omalla organisaatiollaan tai teettää työn sovelluskehitykseen erikoistuneella kolmannella osapuolella. Valmiiseen sovellukseen voi liittää oman toimialueen nimen, jolloin nimipalvelu ohjaa pyynnön sovellukselle. Vaihtoehtoisesti voi käyttää Googlen oletuksena tarjoamaa, jolloin URL (Uniform Resource Locator) sovellukseen on muotoa sovellusnimi.appspot.com, jonka käyttö ei ole maksullista (Zahariev 2009, s.1). Sovellusten kehittäjä ja käyttäjä ei tiedä ennalta, missä Googlen konesaleissa ja millä palvelimilla sovelluksen osat tulevat käytön aikana suoritetuksi. Laajan hajautetun järjestelmän kompleksisuuden piilottaminen on kuitenkin merkittävä etu, koska kehitettävistä sovelluksista tulee yksinkertaisempia. Piilotettu osa järjestelmästä sisältää lahjakkaiden asiantuntijoiden kehittämää optimointia, jonka opiskelulta sovelluskehittäjät välttyvät. Sovellusalustan piilotetun osan järjestelmät etsivät sovellukselle vapaan 11
16 käytettävissä olevan resurssin automaattisesti. Tämän ansiosta sovellusten kehittäminen on ratkaisevasti nopeampaa ja joukko erittäin vaikeasti selvitettäviä virheitä jää todennäköisten riskien joukosta. Google tarjoaa sovelluskehittäjille ilmaisen tutustumisen mahdollisuuden, jossa yksi sovelluskehittäjä käyttäjätunnuksellaan voi tehdä ja asettaa käyttöön kymmenen sovellusta. Kaikilla App Engine sovelluksilla on ilmaisen käytön quota -raja (Google, 2010b), jonka ylittävältä osalta voi sallia laskuttamisen asetettuun ylärajaan asti. Laskulle voi itse asettaa halutun maksimin. Resurssien käytössä hinnoiteltuja osia ovat tallennuskapasiteetti gigatavuina per kuukausi, tiedonsiirto sisäänpäin gigatavuina, tiedonsiirto ulospäin gigatavuina, CPU (Central Processing Unit) -käyttöaika minuutteina ja lähetetyt sähköpostit vastaanottajien lukumääränä. Taulukko 1 esittää hinnoittelun ilmaisen käytön ylittävältä osalta. Ilmaiseen käyttöön sisältyy yksi gigatavu tallennuskapasiteettia, josta voi 500 megatavua käyttää tietokantaan tallentamiseen, ja yksi gigatavu vuorokaudessa tiedonsiirtoa molempiin suuntiin, sekä 6,5 tuntia käytetyn prosessoriajan kertymää vuorokaudessa. Ilmaisen käytön rajoitusten puitteissa sovellukseen saa kohdistua enintään pyyntöä vuorokaudessa. Suurella todennäköisyydellä ilmaisen käytön rajaa ei tule ylittäneeksi kehitysvaiheessa päivittäin, mutta jos laskuttamista ei salli tuotantokäytössä, silloin sovellus päätyy pysäytettyyn tilaan varsin nopeasti. Mutta toki pienen urheiluseuran päivityskäyttöliittymällä varustettu harjoitusvuorolista saattaisi pysyä näkyvillä ilmaiskäytön puitteissa ilman katkoksia. Taulukko 1. Hinnoittelu Yhdysvaltojen dollareina (Google, 2010c) Resurssi Yksikkö Yksikkökustannus tiedonsiirto ulospäin gigatavua 0,12 $ tiedonsiirto sisäänpäin gigatavua 0,10 $ CPU-käyttöaika CPU-tuntia 0,10 $ tallennettu data gigatavua kuukaudessa 0,15 $ lähetettyjä sähköposteja kpl (vastaanottajia) 0,0001 $ App Engine -sovelluksia voi kehittää kahdella merkittäväksi kehittyneellä ohjelmointikielellä, Javalla tai Pythonilla. Javalla ohjelmoitaessa on käytettävissä GWT 12
17 (Google Web Toolkit) web-sovelluskehys (Roche & Douglas 2009) ja Eclipse kehitysympäristö Googlen laajennuksella varustettuna. Java-sovellukset voi kehittää JVM (Java Virtual Machine) versio 5:n tai 6:n mukaiseksi (Moore, et al., 2010). Normaaliin Javalle tarkoitettuun Eclipse:n asennettava lisäosa nopeuttaa sovelluskehitystä ja sisältää osan, jolla sovelluksen saa siirretyksi Googlen järjestelmään vaivattomasti. Pythonilla ohjelmoitaessa on mahdollista käyttää pythonilla koodattua WSGI (Web Server Gateway Interface) tai CGI (Common Gateway Interface) rajapintojen määrityksiä noudattavaa web-sovelluskehystä, myös muita kuin Google webapp, esimerkiksi Django, CherryPy, Pylons tai web.py. Myös Pythonilla tehtyjä template -järjestelmiä voi sisällyttää omaan sovellukseen, kuten esimerkiksi Cheetah, ClearSilver, Django, EZT tai Quixote. Pythonsovellukset suoritetaan versiota noudattavassa ajonaikaisessa ympäristössä. Molempiin kehitysympäristöihin sisältyy paikallisena web-palvelimena toimiva osa, joka jäljittelee sovellusalustaa, ja näin saadaan nopeasti testatuksi tehtyä lähdekoodia. Aidolle sovellusalustalle siirretyt sovellukset suoritetaan niin kutsutuissa hiekkalaatikoissa toisiltaan eristettyinä, joka määrittää tarkasti mitä sovellukselle on sallittua. Hiekkalaatikon säännöt ovat voimassa myös kehitysympäristössä. Nämä säännöt sisältävät joukon tietoturvaa vahvistavia rajoituksia, kuten paikalliseen tiedostojärjestelmään ei voi kirjoittaa. Toteutetun palvelun staattiset tiedostot tulee siirtää järjestelmään sovelluksen mukana. Muuttuvan tiedon tallentaminen tulee suorittaa tuettujen API (Application Programming Interface) -rajapintojen välityksellä, esimerkiksi sovellusalustaan sisältyvään tietokantaan. Sovelluskehittäjän työtä helpottavia rajapintoja järjestelmässä on useita, mm. Blobstore API, Mail API ja Image Manipulation API, jolla voi suorittaa kuvankäsittelyn perustoimintoja. Lisäksi sovelluksella voi olla ajastettuja ylläpitotoimia (engl. Cron Jobs), jollaisella voi ajastaa esimerkiksi tiedonsiirron varmuuskopioinnista vastaavaan järjestelmään. Toistaiseksi tiedonsiirto ulkoisen järjestelmän kanssa sallitaan vain HTTP (Hypertext Transfer Protocol) ja HTTPS (Hypertext Transfer Protocol Secure) -protokollia käyttäen standardiportteihin, kun sähköposti ja tuettu XMPP (Extensible Messaging and Presence Protocol) -pikaviestiprotokolla (Saint-Andre, 2004) tulkitaan tarkoitukseen sopimattomiksi. Tämä rajoite pakottaa sovelluskehittäjän käyttämään luovuutta, mikäli sovelluksen tulee siirtää usein kookkaita tiedostoja järjestelmästä toiseen. Toiseksi pyynnön yhteydessä siirrettävän informaation maksimikoko on 10 megatavua suunnasta riippumatta. Kolmannen rajoitteen asettaa se, että sovellukselle lähetetty pyyntö ei voi 13
18 käynnistää uusia aliprosesseja tai säikeitä taustalle ja pyyntöön vastaamisella on 30 sekuntia aikaraja. Aikarajan ylittymisen jälkeen suoritus katkaistaan, jolla varmistetaan resurssien vapautuminen esimerkiksi jos vaikka ohjelmointivirheestä aiheutuisi päättymätön toistorakenne. Silti osaan sovelluksen rajoituksista voi anoa sovelluskohtaista oletusarvoa korkeampaa rajaa, esimerkiksi pyyntöjen lukumäärään vuorokaudessa, johon sovelluskehittäjille suunnatulla sivustolla suorastaan rohkaistaan. Mutta yksi eristetyn suoritusympäristön rajoitus pysyy muuttumattomana, Java tai Python ympäristöön C- kielellä ohjelmoituja laajennusosia ei voi sisällyttää sovellukseen, vain ympäristön puhtaalla tulkattavalla ohjelmointikielellä toteutettuja kolmannen osapuolen kirjastojen toiminnallisuutta voidaan hyödyntää. Toisaalta jopa tulkattavia korkean abstraktiotason ohjelmointikieliä voi kehittää alustan ohjelmointikielillä tai hyödyntää jo saatavilla olevia. Yleisesti käytettyjen kehitysympäristöjen lisäksi kapeille sovellusalueille (Sledziewski, et al., 2010) luodut kolmannen osapuolen kehitystyökalut ja sovelluskehykset tulevat yksinkertaistamaan toistuvien toimintojen kehittämistä sovellusalustan ohjelmointikielillä. Googlen kirjallisten käyttöehtojen lukeminen aiheuttaa erillisen huolenaiheen. Googlen ehtojen mukaan palvelun tarjoajalla ei ole mitään vastuita ja asiakkaalla ei ole muuta oikeutta, kuin omistusoikeus kehittämäänsä lähdekoodiin. Ehtojen hyväksyminen kuitenkin oikeuttaa palvelun tarjoajan perimään laskutettavan vaikka oikeustoimin kuluineen ja korkoineen. Tämä kielii lainsäädännön puutteesta uudella palvelusektorilla. Oletettavasti kaikki kilpailevat toimijat tekevät samoin, jotta välttyvät korvausvelvollisuudelta ongelmatilanteessa. Toistaiseksi vain kahdenvälinen erillinen kirjallinen sopimus voi määritellä halutun tasoisen palvelun laadun ja vastuut täsmällisesti. Oikeusviranomaisten ohjauksen puuttuessa käyttäjien tulisi ilmaista tahtoa yhtenäisempänä rintamana. Nyt vain App Engine for Business -palvelulle, joka virallisesti avataan myöhemmin, sen esittelyssä luvataan palvelun laadulle minimitasoa. 14
19 3 WEB-SOVELLUS Tässä työssä on asetettu tavoitteeksi kehittää web-sovellus selvitystarkoituksessa. Selvitykseen oppimistavoitteella pyritään ratkaisemaan miten tavoitteen mukainen sovellus tehdään ja asetetaan alustalle käyttöä varten. Sovelluksen tulee toteuttaa suppeasti keskustelupalstan toiminnallisuus, mikä on lukijan helppo ymmärtää tavoitteena. Asetettu tavoite on ennalta tehdyn arvion perusteella laajuudeltaan sellainen, että se mahtuu ilmaisen tutustumisen tarjoamiin puitteisiin. Sovelluksen vaatimukset ovat lyhyesti ilmaistuna seuraavat. Dynaamista toiminnallisuutta ohjailevat osat on määritelty toteutettavaksi Pythonia käyttäen. Käyttäjät käyttävät sovelluksen käyttöliittymää selainohjelmassa. Sovellukseen syötettävä tekstimuotoinen informaatio tulee tallentua järjestelmään sisältyvään tietokantaan. Käyttäjän syöte kerätään lomaketta käyttäen. Käyttäjän syötteen ajankohta tallennetaan. Syötettyjä sanomia saa lukea vain sisään kirjautuneena. Uuden viestiketjun saa aloittaa vain sisään kirjautuneena. Edellisten lisäksi käyttäjä saa lisätä uuden sanoman viestiketjuun vain sisään kirjautuneena. Sisään kirjautuminen tarkoittaa käyttäjän tunnistautumista käyttäjätunnusta ja salasanaa käyttäen. Sovellus listaa kaikki olemassa olevat viestiketjut aikajärjestyksessä linkillä varustettuna. Valitun viestiketjun sanomat tulostuvat aikajärjestyksessä. Jokaisella näytöllä on esillä mahdollisuus poistua toiminnosta ja mahdollisuus uloskirjautumiseen. Sovellus pitää kirjaa jokaisen olemassa olevan viestiketjun lukukerroista. Keskustelupalsta sovelluksena ei sisällä mitään ennen näkemätöntä, mutta siihen sisältyy yksityiskohtia joita sovelletaan myös yrityskäyttöön valmistettuihin sovelluksiin, kuten käyttäjätieto, käyttäjän syötteen kerääminen lomakkeiden kentistä ja tietokannan käyttö informaation prosessoinnin yhteydessä. Pilvisovelluksen tapauksessa kohteena oleva sovellusalusta asettaa haasteita rajoitteiden muodossa, eikä nyt voida muuttaa palvelimen asetuksia hetken tahtotilan seurauksena. Ensimmäinen tunnistettu haaste on tietokanta, joka on oliotietokanta. Tietokannasta tiedetään, että se toteuttaa relaatiotietokantojen SQL:n syntaksista rajoitetun joukon, osittain tietoturvan vahvistamiseksi. Tietokannan SQL-syntaksin rajoitettu noudattaminen toki helpottaa sovelluskehittäjiä alkuun, mutta aluksi on selvitettävä API metodit, joita voi käyttää pythonilla ohjelmoitaessa. Toinen haaste on sovelluskehitystä yksinkertaistavan web-sovelluskehyksen valinta, koska ei ole 15
20 järkevää ohjelmoida kaikkia mekanismeja tyhjästä aloittaen (Vosloo & Kourie 2008), jos toimivaa ja testattua on vapaasti saatavilla. Valitun sovelluskehyksen käyttäminen edellyttää oppimisprosessia, johon kuluu tuntematon määrä aikaa. Lisäksi on selkeä tarve eri osien sisältämän riskin arviointiin, jotta voidaan asettaa työjärjestys. Tarkoituksena on yrittää ratkaista suurimman epäonnistumisen riskin sisältävät osuudet ensin. Seuraavaan listaan on sijoitettu toteuttamiskelpoiseksi arvioitu työjärjestys, jossa kehitystyö on jaoteltu osa-alueisiin. Onnistumisen kannalta numerojärjestyksessä suurimman haasteen sisältävä osuus on ensimmäisenä ja vähiten haastava viimeisenä. 1. Alussa on ilmeinen tarve suunnitella käyttöliittymä pelkkinä piirroksina, muutoin on merkittävä riski, että eri osat lopulta toteuttavat yksinään jotain vaadittua ilman ehjää kokonaisuutta 2. kypsässä kehitysvaiheessa olevan web-sovelluskehyksen valinta, ja sen tarjoamien keskeisten palveluiden lyhyt kokeileminen oppimistarkoituksessa. Tavoitteena lopulta käytettävien template ja form -osien kehittäminen pelkkiin muuttujiin tallentaen 3. tietokantaan tallentaminen. Ratkaistava mitä on toiminnan kannalta välttämätöntä tallentaa 4. haku tietokannasta ja haun tuloksen templatella esittäminen 5. käyttäjätilit ja kirjautuminen 6. toimintojen integrointi toimivaksi kokonaisuudeksi 7. testausta ja löydettyjen puutteiden korjaamista 8. käyttöliittymän ulkoasun viimeistely 9. App Engine -järjestelmään siirtäminen. Ainoa suoraan teknisiin ratkaisuihin liittymätön haaste on työlle asetettu aikataulu, jossa ohjelmointitavoitteelle on asetettu tarkka aikaraja. Sovelluksen ohjelmointiin on varattu yhtenäinen kaksi kalenteriviikkoa kestävä ajanjakso. 16
21 4 RATKAISUMENETELMÄT Ensimmäisenä tehtiin käyttöliittymää koskevat tärkeimmät suunnittelupäätökset. Näistä käyttöliittymän pääsivun piirros ros kuvassa 1 esittää tavoitteen, miten viestiketjujen lista tulisi esiintyä. Tarkoituksena on käyttää uudelleen näkymän yläosaa samanlaisena kaikissa sallituissa käyttötapauksissa, paitsi kieltävissä ilmoituksissa. Vaihtoehtoinen näkymä on kuvassa 2, joka esittää miten viestiketjun tulisi esiintyä. Uuden viestiketjun lisääminen päätettiin toteuttaa siten, että toiminnon linkki liipaisee toiminnon, jossa viestiketjujen listan korvautuu lomakkeella. Lomakkeessa kysytään viestiketjun aihe ja aloittavan käyttäjän mielipidettä ilmaiseva tekstisisältö, jonka jälkeen toiminto jää odottamaan käyttäjän toimia. Kuva 1. Viestiketjujen listan esittävä näkymä 17
22 Kuva 2. Viestiketjua esittävä näkymä Useita päiviä jatkuneen Internet-aineiston lukemisen jälkeen päätös web- sovelluskehyksestä syntyi. Valitsin Django Web-application Framework:in (Django, 2010), koska App Engine -aiheisessa aineistossa, mm. Sanderson (2009, s ), McGaw (2009, s ) ja Roden (2010, s ), sitä käsitellään useimmin. Djangoa käsitellään usein myös Googlen omassa aineistossa ja yleisesti muussa webohjelmointia käsittelevässä aineistossa, koska se on vuosien kehitystyön läpikäynyt. Jopa Googlen webapp -sovelluskehys on kehitetty Djangon pohjalta (Sanderson 2009, s ). Djangon käyttöä opastavia esimerkkejä on runsaasti saatavilla tavallista hakukonetta käyttäen. Ongelman keskeisten osien ratkaisemisessa tullaan käyttämään oliopohjaista ohjelmointiajattelua, telua, koska Pythonin lisäksi Djangossa sovelletaan oliopiirteitä, kuten periytymistä. Web-sovelluskehystä käytettäessä, myös vastuiden jakautumisen voisi tulkita läheisesti muistuttavan perinteistä Model-View-Controller -suunnittelumallia (Sanderson 2009, s ). Malli (engl. model) sisältää varsinaisen olion tietoineen, jonka näkymä 18
23 (engl. view) tulostaa ruudulle, kun taas ohjain (engl. controller) vastaanottaa käyttäjältä tulevat syötteet ja välittää muutokset mallille. Djangoon sisätyvistä osa-alueista keskustelupalstasovelluksessa hyödynnettiin templates, shortcuts ja forms -palveluita. Djangon template -tiedostojen staattiset osat noudattavat tavallista HTML (Hypertext Mark-up Language) tai XHTML (Extensible Hypertext Mark-up Language) -syntaksia. Tämän vuoksi käyttöliittymän ulkoasun viimeistely tehtiin staattisella CSS (Cascading Style Sheet) -tyylitiedostolla. Käyttöliittymän rakennetta koskevien päätösten jälkeen selvitettiin tietokannan käyttämisessä tarvittavat kirjastot, jotta lähdekoodiin voitiin sisällyttää välttämättömät tuonnit. Tähän ja peruskäsityksen luomiseen tietokannasta tarvittiin Python Datastore API:a (Google, 2010f) koskevan lähdeaineiston läpikäymistä. Löydetyt muutaman rivin käyttöesimerkit osoittautuivat myöhemmin kriittisen tärkeiksi. Samalla syntyi käsitys, että jokaisen sanoman tulee olla itsenäinen olio, joka pitää sisällään sanomalle määriteltyjen tietotyyppien mukaiset jäsenmuuttujat. Näitä olioita (engl. Entity) lopulta voi lisätä, päivittää ja poistaa vaivattomimmin. App Engine ohjelmointia käsittelevästä Internet-aineistosta huomio kiinnittyi mahdollisuuteen käyttää Googlen käyttäjätilejä ja tunnistautumista Users API:a käyttäen. Tämän käyttöön haluttiin tutustua käytännön tasolla, joten sovelluksessa tullaan käyttämään Googlen käyttäjätilejä integroituna palveluna. Itse ohjelmoitu käyttäjätilien lisäys ja tunnistautuminen olisi ollut ainoa todellinen vaihtoehto tälle päätökselle. 19
24 5 TOTEUTTAMINEN Käytettävissä olleeseen Windows-työasemaan asennettiin viimeisin Python 2.5 julkaisuversio (Python, 2008) ja pythonilla toteutetut sovelluskehitystyökalut (Google, 2010d). Python for Windows asennuksen mukana tuleva editori katsottiin riittäväksi lähdekoodin kirjoittamiseen. Vapaasti saatavilla olevia ohjelmointieditoreita ei etsitty. Asennuksen jälkeen oli välttämätöntä tutustua Googlen aineiston (Google, 2010e) tarjoamiin lyhyisiin esimerkkeihin, joita kokeillessa selvisi esimerkiksi miten Django voidaan ottaa käyttöön sovellusalustalla tarvittavat alustukset suorittavia tiedostoja käyttäen. Sovelluksessa käytetyt liitteiden 3, 4 ja 5 esittämät asetustiedostot perustuvat (Google, 2008) esimerkkiin. 5.1 TOTEUTTAMISEN VAIHEET Ensimmäisenä sovellustavoitteen määrittelyn jälkeen piirrettiin käyttöliittymän näkymistä hahmotelmat paperiarkeille käsin, jonka jälkeen niistä tietokoneella piirrosohjelmaa käyttäen luotiin siistit ja selkeät kuvat. Kuvien olemassa oleminen selkeytti omaa käsitystä, mihin ollaan pyrkimässä, mitä sen pitää sisältää ja miltä lopputuloksen tulee näyttää. Samalla keksittiin sovelluksen nimi Codeboard Discussion Arena, jonka toivotaan rohkaisevan ohjelmointiaiheiseen kirjoitteluun. Ohjelmointia aloitettaessa luotiin tyhjään hakemistoon liitteen 1 mukainen YAML (Yaml ain t mark-up language) -asetustiedosto, jossa ensimmäisellä rivillä asetetaan projektin nimi. App engine ja kehitystyökalut vaativan tämän tiedoston olemassa olon, koska siinä määritetään käytettävä suoritusympäristö ja tiedostonimi, josta suoritus aloitetaan. Lisäksi siinä ilmoitetaan alihakemistot, joista saa avata muuttumattomia tiedostoja, kuten ulkoasua koristelevia kuvatiedostoja. Sovelluksessa näkyvä nimen sisältävä kuva sijoitettiin asetustiedostossa mainittuun alihakemistoon media. Seuraavaksi huomio siirtyi pelkän tekstisisällön esittämiseen template -tiedostoa käyttäen (Django, 2007). Django template:ssa on tageja, muuttujia ja periytymisiä. Tageilla voi muodostaa ehtolauseita, toistorakenteita ja tuoda template -tiedostoja osaksi esitettävää sivua. Muuttujaa käyttäen sivulla voi kyseisessä kohdassa esittää sovelluksessa 20
25 muodostetun arvon tai djangoforms lomakkeen. Tulostettavalle muuttujan arvolle voi asettaa suodattimia. Suodattimilla voi muotoilla esitystä, esimerkiksi kellonaikaa, päiväystä tai leikkausta. Periytymisessä lapsi-template voi peittää periytymiskohdassaan vanhempi-templaten toiminnallisuuden ja periytymisessä lapsi-template saa vanhemman muuttujat käyttöönsä. Templaten ominaisuuksien vuoksi muuttujanimissä on syytä olla tarkkana ja välttää laiskaa saman muuttujanimen käyttöä jokaisessa kohdassa. Nämä templateen liittyvät asiat olivat toteuttamishetkellä uusi omaksuttava asia, jonka omaksumiseen kului noin vuorokauden verran aikaa. Sen jälkeen oli mahdollista kirjoittaa alustavat template -tiedostot, joilla saattoi jatkaa kehitystyötä. Liitteessä 8 esitetty vanhempi-template sisältää kaksi {%block%} -paikkaa, joihin liitteiden 9, 10 tai 11 perivä lapsi-template voi asettaa oman tuottamansa sisällön. Templateissa esiintyvät {%url%}- tagit saavat linkin esittävän arvon suorituksen aikana, ja näillä linkeillä käyttäjä vaikuttaa sovelluksen suoritukseen. Url-tagilla on parametreja yksi tai kaksi, joista ensimmäinen viittaa ohjelmamoduulin metodiin ja jälkimmäinen on välitettävä parametri, esimerkiksi sanoma-olio viestiketjujen listassa. Kolmantena vaiheena huomio kiinnittyi tietokannan rakenteeseen ja käyttöön. Erityisesti rakenteessa oli virheiden mahdollisuus, joista muistutuksena kohdattiin tarve muuttaa ensimmäisestä mallia jota yritettiin käyttää. Oliotietokannassa käytetyt tietotyypit esitetään lähdekoodissa luokkana, joka määrittelee tietomallin. Tietomallissa määritellään olion jäsenmuuttujat ja jäsenmuuttujien tietotyypit. Lopullinen tietomalli on nähtävillä liitteen 6 lähdekoodissa. Sanomien lukumäärää ei haluttu alussa rajoittaa pienempään lukualueeseen, joten tietomallissa threadid alustetaan long -tyyppiseksi. Tässä erityinen piirre kokonaislukuja talletettaessa on, että vaikka muuttujassa annetaan integer-tyypin lukuarvo, tietokantaan tallentuu long-tyypin arvo. Tämä on syytä pitää mielessä lähdekoodia silmäillessä, ja asiaan sopeutumista on nähtävissä liitteen 6 esittämässä lähdekoodissa tyyppimuunnoksina funktioissa thread ja newthread. Googlen datastore API sisältää joukon moderneja tietotyyppejä, kuten Property. Datastore API-moduuliin sisältyy kolme keskeistä metodia, jolla voi suorittaa parametrillä määritellyn haun. Lähdekoodissa on käytetty get() -luokkametodia ja gqlquery() -metodia. Kolmas olisi luokkametodi gql(), joka on gqlquery() -metodia lyhyempi kirjoittaa, koska se liittää oletuksenaan SQL:ssä yleisen SELECT * alkuosan kyselyyn. gqlquery() ja gql() jäljittelevät mahdollisimman paljon SQL:ää, minkä verran sallitaan, jotta SQL:ään tottuneille asioiden tekeminen olisi vähemmän vierasta. Toisaalta luokkametodilla delete() olisi mahdollista poistaa talletettu 21
26 olio. Luokkametodia put() käytetään olion tallettamiseen. Huomioitavaa on, että jos käsiteltävä olio on jo olemassa tietokannassa, put() suorittaa tietokannan sisältämän olion tilan päivittämisen. Toteutuksessa käytetään newthread -funktiossa put() -metodia kahdesti, koska siinä käytetään key() -metodia. Key -luokan tietokantaan asettamista attribuuteista ID:tä hyödynnetään käyttöliittymässä käyttäjän valitseman viestiketjun tunnistamiseen. Kuitenkin key() -metodi vaatii, että olio on tietokannassa, jotta se voisi palauttaa olion IDarvon. Vaatimukseen on ollut yksinkertaista sopeutua tallettamalla uusi olio juuri ennen key() -metodin kutsua. Olion puuttuminen tietokannasta key() -metodia kutsuttaessa aiheuttaisi poikkeuksen, jonka käsittelyyn ei haluta ajautua. Kokonaisuudessa olioiden jäsenmuuttujaan threadid tallennettua kokonaislukua käytetään tunnistamiseen, mihin viestiketjuun tämän olion sanoma kuuluu. Toinen toiminnan kannalta kriittinen olion jäsenmuuttuja on starter, jonka boolean-arvo määrittää, onko kyseinen olio viestiketjun aloittaja. Kaikkien olioiden datetime -arvot asetetaan automaattisella aikaleimalla put() - metodin suorituksen aikana. Viidentenä huomion kohteena käsiteltiin käyttäjän tunnistaminen. Koska oli päätetty käyttää Googlen palvelua, se edellytti users -moduulin tuonnin lisäämistä lähdekoodiin. Tämän jälkeen oli mahdollista tavoitella kirjautumisen ja uloskirjautumisen lisäämistä. Käytännössä havaittiin Users -luokan olioiden tarjoamat palvelut riittäväksi tämän sovelluksen tarpeisiin, mutta ei järkevästi sovellettavaksi suljetun ympäristön sovellukseen. Sovellukselle on saatavissa vain käyttäjän sähköpostiosoite, nimi ja kutsumanimi Usersolion jäsenmuuttujista. Nimi on käytännössä sähköpostiosoitteen alkuosa ja kutsumanimi alkuosan ensimmäinen osa. Kehitysympäristön web-palvelimeen on lisätty kyky teeskennellä tunnistautumispalvelua, joka helpotti merkittävästi kehitysvaiheen toteutuksen käyttäytymisen testaamista. Lähdekoodissa oleva users.createloginurl(request.path) palauttaa linkin tunnistautumispalveluun, joka esitetään templaten url-tagilla. Tunnistautumispalvelu ohjaa kirjautuneen käyttäjän takaisin sovellukseen. Vaihtoehtoisesti kirjautuneelle samaan url-tagiin esitetään users.createlogouturl('/') palauttama linkki, jonka käyttö aiheuttaa uloskirjautumisen. Metodi GetCurrentUser() palauttaa käyttäjäolion, jos käyttäjä on kirjautunut, muutoin tyhjän arvon None. Käyttäjän identifiointi tällä tavoin toteutettuna ei aiheuttanut haasteita. Lopulta tämä osuus saatiin kokonaisuuteen varsin vähäisellä työn määrällä. 22
27 Kuudentena työvaiheena huomio kohdennettiin toimivan kokonaisuuden muodostamiseen. Tässä vaiheessa ei ollut väliä näkymän asettelulla, vain oikeiden asioiden tapahtumisella oli merkitystä. Aikaisempien vaiheiden läpikäymisellä oli selkeä vaikutus. Näkemys oli selkeä, mitä on käytettävissä. Haasteen aiheutti hetkittäin selaimeen ilmestyneet djangon kryptiset virheilmoitukset, joista oli kuitenkin toistamiseen hyötyä. Djangon forms - lomakkeita määritellään lähdekoodissa kaksi erilaista. Molemmat määritellään luokkana, MessageForm ja ThreadForm, jotka saavat syötekentät tietomallin perusteella. Kuitenkin molemmissa rajataan käyttötilanteessa tarpeettomat kentät pois. Funktiossa respond djangon shortcuts.render_to_response(template, params) -metodi muodostaa lomakkeen templaten {{form}} -muuttujan kohdalle, sekä välittää templateen parametrien arvot. Funktion respond olemassaolo on perusteltua lähinnä saman ohjelmakoodin uudelleenkäytön näkökulmasta ja koska se selkeyttää lähdekoodia, muutoin siinä tehtävät asiat pitäisi upottaa erillisinä kopioina index, thread ja newthread -funktioihin. Liitteessä 5 esitetty sallittujen polkujen aseteustiedosto sisältää viittauksen views.py sisältämään funktioon index, joka suoritetaan ensimmäisenä. Ensiksi otetaan käyttäjätieto, sitten haku tietokannasta ja lopuksi halutaan esittää template list aina aloittavan base - templaten lapsena. Seurauksena on viestiketjujen listan esittävä pääsivu. Kun käyttäjä uuden viestiketjun halutessaan käyttää toiminnon aktivoivaa linkkiä, polku /new/ asetustiedostossa viittaa funktioon newthread. Funktiossa otetaan käyttäjätieto, alustetaan message_id:n arvoksi None, varmistetaan että käyttäjä on todella kirjautuneena, alustetaan message:n arvoksi None, luodaan ThreadForm -olio ja kun syötteenä tullut pyyntö ei ole typpiä POST niin suoritetaan template newtread base -templaten lapsena. Seurauksena käyttäjä saa näkymän alaosaan tyhjän lomakkeen, jossa pyydetään uuden viestiketjun aihetta ja kirjoitettua asiaa. Kun käyttäjä on täyttänyt lomakekentät ja käyttänyt lisäämispainiketta, funktioon kohdistuu kutsu, mutta syötteenä tuleva pyyntö ei ole tyyppiä GET. Nyt suoritus ei etene templaten esittämiseen, vaan jatkuu eteenpäin. Silloin tutkitaan onko lomakkeen syötteessä virheitä, sijoitetaan lomakkeesta luotu uusi olio message:n, asetetaan oliolle käyttäjätieto, varmistetaan viestiketjulle nimi, asetetaan olion jäsenmuuttujan starter arvoksi tosi, asetetaan olion jäsenmuuttujan timesviewed lukuarvoksi nolla, talletetaan olio, otetaan talletettuun olioon kytkeytyvä key -instanssi msg_key_inst:n, sijoitetaan key -instanssilta saatu lukuarvo olion threadid jäsenmuuttujaan, päivitetään tietokannassa jo olevan olion 23
28 tila ja halutaan lopuksi juurta vastaavat toimenpiteet. Seurauksena on uusi viestiketjua tarkoittava olio tietokannassa ja käyttäjällä on viestiketjujen listan esittävä näkymä esillä, jossa on vasta lisätty viestiketju. Jos käyttäjä ei ollut kirjautuneena, hän ei voinut saada muuta kuin HttpResponseForbidden() -metodin tuottaman sivun vastauksena, jolla esitetään funktioon syötteenä annettu merkkijono. Jos taas lomakkeen syötteessä oli jotakin kelvotonta, virhetilanne käsitellään asettamalla sama lomake uudestaan esille käyttäjän toimia varten. Samanlainen virhetilanteen käsittely toteutetaan myös viestiketjuun kirjoittamista käsittelevässä funktiossa thread. Kun käyttäjä haluaa lukea viestiketjujen listassa mainittua viestiketjua, toteutus vaatii käyttämään linkkiä, joka samalla kertoo viestiketjun aiheen. Linkin polku on dynaaminen, joka ilmenee asetustiedostosta, mutta viittaa samaan funktioon. Tässä polussa esiintyy luku, joka on templaten tuottamassa näkymässä osoitetun sanomaolion key-id tietokannassa. Linkin käyttäminen aiheuttaa funktion thread suorittamisen tunnisteen sisältävällä parametrilla varustettuna. Käyttäjän valinnan seurauksena funktiossa thread vastaanotetulla parametrilla message_id on lukuarvo. Funktiossa otetaan käyttäjätieto, tarkastetaan onko kirjautuneena, asetetaan message_id:n arvo message_id_copy:n arvoksi, alustetaan message0:n arvoksi None, message0:n haetaan message_id:tä vastaavalla ID:llä varustettu olio tietokannasta, message0:n olion jäsenmuuttujan threadid arvo alustetaan thread_id_copy:n arvoksi, message0:n jäsenmuuttujan threadname merkkijono alustetaan thread_name_copy:n arvoksi, message0:n jäsenmuuttujan timesviewed lukuarvoa kasvatetaan yhdellä, olion tila tietokannassa päivitetään, message_id:n arvoksi asetetaan None, message alustetaan arvoon None, luodaan MessageForm -olio, haetaan tietokannasta oliot joiden threadid on sama kuin message_id_copy:n arvo ja kun syötteenä tullut pyyntö ei ole typpiä POST niin suoritetaan template reply base -templaten lapsena. Seurauksena käyttäjä saa näkymän alaosaan viestiketjuun kirjoitetut sanomat ja loppuun lomakkeen oman kommentin jättämistä varten. Kun käyttäjä on kirjoittanut lomakekenttään oman vastineensa ja käyttänyt lisäämispainiketta, funktioon thread kohdistuu kutsu, mutta syötteenä tuleva pyyntö ei ole 24
29 tyyppiä GET. Tässä suoritus ei etene templaten esittämiseen, vaan jatkuu eteenpäin. Silloin tarkastetaan onko käyttäjän syöte virheellinen, asetetaan lomakkeesta muodostettu olio message:n, asetetaan käyttäjätieto olion jäsenmuuttujaan author, asetetaan olion jäsenmuuttujan starter arvoksi False, astetaan olion jäsenmuuttujan threadname arvoksi thread_name_copy:n arvo, asetetaan olion jäsenmuuttujan threadid arvoksi thread_id_copy:n arvo, talletetaan uusi olio tietokantaan ja halutaan lopuksi juurta vastaavat toimet. Suorittamisen seurauksena on aikaisemmin valittuun viestiketjuun tullut lisätyksi uusi käyttäjän kommentin sisältävä sanoma ja käyttäjän näkymä on vaihtunut esittämään viestiketjujen listan sisältävää pääsivua. Kokonaisuudessa Djangon tarjoama palvelu kantaa vastuun toteutuvan näkymän esittämisestä ja vähensi ohjelmoijan työmäärää merkittävästi. Toteutetut toiminnot yhdessä toteuttavat ehjän kokonaisuuden, jossa käyttäjä voi siirtyä toimintoon ja siitä takaisin, jos on kirjautuneena. Tavoitteen määrittelyn mukaisesti tuntematon käyttäjä ei voi lukea sisältöä tai tuottaa uutta sisältöä. Rajoituksen tarkoituksena on vähentää tarjotun palvelun harkitsematonta roskaamista. Viimeisenä merkittävänä työvaiheena suoritettiin käyttöliittymän viimeistely. Käytännölliseksi osoittautui staattisilla XHTML yhteensopivilla tageilla muodostetut taulukot, joihin sijoitettiin templaten muuttujat tai lomake. Näiden taulukkoon perustuvien rakenteiden ominaisuuksiin pystyttiin vaikuttamaan ongelmitta liitteen 7 esittämällä CSS - tiedostolla. Näkymän merkitsevän sisällön leveydeksi rajattiin 800 pistettä, jotta myös paremmin varustellun matkapuhelimen selaimella käytettävyys olisi jotenkin siedettävä. Osien valittujen värien löytäminen perustui nopeaan kokeilemiseen, vaikka oli tiedossa, että Internetistä löytyy kattavia värikarttoja. Kriittisimmäksi muokattavaksi kohteeksi osoittautui lomakkeen textarea:n attribuutit, koska oletus tuottaa pienen syötekentän isoa kirjasinkokoa käyttäen. Käytettäväksi asetettiin pienikokoisempi kirjasin, leveys asetettiin 600:n pisteeseen ja korkeus 120 pisteeseen. Tällä tavoin muokatussa kentässä käyttäjä pystyy silmäilemään edellä kirjoittamaansa tekstiä kohtuullisesti. Uuden viestiketjun aloittamisen lomakkeessa olevan aihekentän leveys asetettiin myös 600:n pisteeseen, jolla saavutettiin yhtenäinen ulkoasu. Mahdollisten käyttötapausten paikallisen testaamisen jälkeen oli ajankohtaista siirtää sovellus lopulliseen suoritusympäristöön. Tähän sovelluskehittäjällä tulee olla esimerkiksi 25
30 gmail-sähköposti tai pitää käydä rekisteröitymässä saadakseen käyttäjätilin, koska sovellusta siirrettäessä vaaditaan kirjautuminen Google:n käyttäjätilin tunnuksella ja salasanalla. Sovelluskehitystyökalujen Windows ja MacOS -versioissa on käytettävissä graafinen käyttöliittymä, jossa Deploy -painike käynnistää prosessin, jossa selainohjelmassa käydään kirjautumisen kautta rekisteröimässä sovelluksen nimi ja liitetään käytettävissä olevaan toimialueen nimeen. Samalla edellytetään hyväksymään sopimusehdot ja on välttämätöntä syöttää hallussa olevan matkapuhelimen puhelinnumero. Puhelinnumero annettiin kansainvälisessä muodossa maakoodin kanssa, jonka seurauksena matkapuhelin vastaanotti tekstiviestin. Tekstiviestissä ilmoitetaan järjestelmän generoima sovelluksen yksilöivä rekisteröintikoodi. Tämä menettely on varsin järkevä väärinkäytösten mahdollisuuden rajoittamiseksi. Lopuksi sovelluksen sai sisällytettyjen virhetarkastusten jälkeen lähetetyksi yksinkertaisen helposti ja samassa yhteydessä syötettiin kysyttäessä matkapuhelimeen vastaanotettu koodi. Vaihtoehtoisesti komentoriviltä työskentelevän olisi välttämätöntä ensin tutustua käytettävissä olevien kytkimien merkityksiin ja käytöstä julkaistuihin ohjeisiin, mikä ei muuttaisi asiaa merkittävästi. 5.2 SAAVUTETTU TULOS Työvaiheet suorittamalla saavutettiin toimiva pilvisovellus Google App Engine -alustalle. Tavoitteen määritelmän mukaiset toiminnot saatiin toteutetuksi sovellukseen alussa asetetun aikataulun puitteissa. Mitään osuutta ei tarvinnut jättää toteuttamatta. Kuvissa 3, 4 ja 5 näkyvä sovellus on työvaiheiden jäljiltä sovellusalustalle siirrettynä ja suorituksessa. Työssä käsitelty sovellus (Lehto, 2010a) on kaikkien Google Mail käyttäjätunnuksen hankkineiden käytettävissä. Liitteessä 9 esitetty viestiketjujen listan esittävä template ja funktio index eivät ole optimaaliset kokonaisuutena suorituskyvyn näkökulmasta, koska viestiketjujen lista ei tarvitse kaikkia olioita, mutta toteutusvaiheessa oli mielenkiintoista kokeilla tagien tarjoamaa mahdollisuutta. Tehokkaampaa olisi ollut kohdistaa tietokantaan haku, jossa halutan vain viestiketjun aloittavat oliot. Ensimmäisen toteutuksen heikkous tulee ilmi, kun käyttäjien joukko on syöttänyt sovellukseen suuren määrän sanomia, jolloin viestiketjujen listan muodostus hidastuu ja suorituksenaikainen muistinkäyttö lisääntyy merkittävän 26
31 paljon. Tämän havainto on mahdollista tulkita virheeksi, vaikka se ei estä sovelluksen toimintaa. Kuva 3. Lista viestiketjuista (Lehto, 2010b) Versiossa 2 on tarvittavat muutokset. Toinen versio sisältää vain suorituskykyyn vaikuttavat muutokset ja app.yaml -tiedostossa version lukuarvoa on kasvatettu kakkoseen. Käyttöliittymässä ei ole eroa. Funktiossa index haku tietokannasta on täsmennetty viestiketjun aloittaviin sanomiin; 27
32 messages = db.gqlquery('select * FROM Message WHERE starter = :1 ORDER BY created DESC', True) Kuva 4. Uuden viestiketjun aloittaminen (Lehto, 2010b) Koska kysely tehdään joka tapauksessa, muutos kyselyssä vaikuttaa suoritusaikaan merkityksettömän vähän. Lisäksi viestiketjujen listan esittävä template list.html on muutettu tulostamaan kaikki haun sisältämien olioiden otsikot ilman valikoivaa if -tagia. Tämän voi olettaa vähentävän suoritusajan kulutusta vain hyvin vähän yhdellä 28
33 toistorakenteen kierroksella, mutta kyselyn muutos vähensi toistokertojen määrää. Kokonaisuutena yhdessä muutosten voi olettaa vähentävän suoritusaikaa tavoitellusti. Samalla hyödytään hinnoitellun suoritinajan pienemmästä kertymästä. Taloudellisesta näkökulmasta käyttöönotettavan sovelluksen suorituskyvyn optimointi on suositeltavaa. Muutokset muokattiin ja siirrettiin sovellusalustalle heti ensimmäisen version koekäytön jälkeen. Heti sen jälkeen kirjauduttiin sovelluksen hallintakonsoliin, jossa versio 2 asetettiin oletukseksi. Tämän jälkeen versio 2 on lopulta julkaistu versio, joka löytyy osoitteesta Lehto (2010b). Kuva 5. Viestiketjun lukeminen ja kommentointi (Lehto, 2010b) 29
34 6 POHDINTA Tavoiteltu tulos saavutettiin, vaikka sovellus ei ole täydellinen. Ohjelmoitaessa tehtiin ensin yksi ratkaisu, jonka voi tulkita virheeksi. Korjaava muutos seuraavaan versioon oli pieni. Lisäksi puutteita tunnistettiin käytettävyydessä, koska toteutus on karu ilman hienouksia, joita vaativa käyttäjä saattaisi odottaa. Asetettu aikataulu ei antanut mahdollisuutta lisättävien vaatimusten sisällyttämiseen. Tulevaisuudessa toiminnoiltaan monipuolisemman version kehittäminen siirtyy yksilötason harrastustoiminnan piiriin. Sovelluksen suorituskykyä voisi tulevaisuudessa parantaa Memcache Services API:n (Ciurana 2009, s ) palveluita käyttämällä, jolloin eniten lähetetty sisältö olisi alustana toimivassa hajautetussa järjestelmässä muistinvaraisena ja nopeimmalla tavalla saatavissa. Silti saavutettuun tulokseen ollaan varauksetta tyytyväisiä kaikilta osin. Käsitys sovelluskehityksestä pilveen selveni oppimisprosessin myötä, ja myös suunniteltu ajankäyttö on toteutunut. Lisäksi toteuttamisen yhteydessä opittiin menetelmistä ja API - moduuleista, joten vielä määrittelemättömän sovellusprojektin toteuttaminen tulevaisuudessa samalle sovellusalustalle on varmempaa. Toisena erillisenä tuloksena esitetään tulkinta, että kaikille sovellusalueille App Engine ei vielä taivu, vaikka kehitystyön odotetaan tuovan muutoksia vuosien kuluessa. App Engine soveltuu mainiosti lyhytkestoisten transaktioiden käsittelyyn, esimerkiksi kaupankäyntipalveluiden toteuttamiseen, mutta sääennusteiden laskemiseen ei, koska järjestelmässä suoritusaika ei saa olla useita minuutteja. Samoin todetaan, että kilpailijoilla omat on heikot ja vahvat alueensa. Myös virtuaalipalvelinten tarjoajilla on tilaa pilvessä. Toteuttaessa saavutettu käsitys on vakuuttava. Kehitystyön aikana julkaistiin yksi uusi versio sovelluskehitysvälineistä, joten taustalla tehtävä kehitystyö selkeästi on käynnissä. Aidolle sovellusalustalle siirtämisen jälkeen sovelluksen saatavuudessa ei ole havaittu yhtään katkoa. Jokaisella sovelluksella on hallintakonsoli, josta näkee erittelyn resurssien kulutuksesta. Palvelintietokoneen hankkimista ja valmistelemista ei tarvinnut mietiskellä, ja Googlen palkatut työntekijät vastaavat laitteiden huollosta. App Engine:n tuottamalle palvelulle uskaltaa ennustaa suurta mielenkiintoa, kun useampi sovelluskehittäjä on uskaltanut kokeilla sitä ja kun väljemmin rajoituksin toteutuva App Engine for Business julkaistaan. Googlen taloudelliset resurssit ovat merkittävät, joten sovellusalustan 30
35 lakkauttaminen ei vaikuta todennäköiseltä varsinkaan, kun tähän mennessä kehitystyössä tehty investointi on mittava ja strategisen edun sisältävä markkina-asema on saavutettavissa. 6.1 TUTKIMUS Yksi tämän työn tarkoituksista on esittää, miten kuvatun kaltainen sovellus voidaan toteuttaa. Mielestäni pilvilaskennan käsitteestä on jo tutkijoiden keskuudessa kirjoiteltu riittävästi, jotta huomio voisi siirtyä soveltavaan tutkimukseen. Kaupallisesti tarjotut pilvijärjestelmät ovat jo kypsiä sovellusten suorittamiseen. Huomion tulisi kohdistua siihen miten monilla eri tavoilla saatavilla olevaa pilvilaskennan resurssia voisi hyödyntää muilla tutkimusalueilla. Tutkimustulosten tulisi jatkossa esittää, miten on saavutetut tulokset siirrettävissä hyvään ja hyödylliseen tuotantokäyttöön. Mahdollisista tutkimuskohteista olisi hyödyllinen esimerkiksi lääketieteellisen tutkimuksen avuksi tehty tutkimus, jossa laskentatehoa vaativa potilaskuvien avustava tulkinta sijoitettaisiin pilvisovelluksen vastuulle sisällyttämättä potilastietoja. Potilastietoja ei voi sijoittaa säilytettäväksi julkiseen pilvijärjestelmään. Toinen ehdotus on seismologisen tutkimusaineiston kerääminen mittalaitteilta pilvijärjestelmään, johon kehitetään automatisoituja tulkintasovelluksia ja varoitusjärjestelmiä. Tällaisessa tulisi olla myös julkinen käyttöliittymä, josta havaintoja voisi kuka tahansa tarkastella. Maailmanlaajuisesti ihmishenkiä menetetään maanjäristyksissä vuosittain ja potentiaalisen alueellisen vaaran tunnistaminen lähimpinä tunteina olisi kunnioitettava saavutus. Kokemuksen ja tutkimusyhteisöjen saavuttaman osaamisen siirtäminen ohjelmakoodiksi on todellinen haaste jo nyt. Osa ratkaisua on se, että eri osaamisalueiden ihmiset saadaan useammin vuorovaikutukseen keskenään. 31
36 7 YHTEENVETO Alussa määriteltiin pilvikäsite ja pohdittiin sovellusten pilveen sijoittamisen mielekkyyttä. App Engine on pilvikäsitteen mukaisia sovelluksia suorittava järjestelmä, johon sisältyy automaattinen kuorman tasaus ja automaattinen skaalautuminen. Palvelun asiakas voi säästyä laitteiston ja sähköenergian hankinnalta. Tälle sovellusalustalle sovelluskehityksen voi tehdä itse tai teettää sen korvausta vastaan kolmannella osapuolella, mutta oletusarvoisesti Google ei kehitä sovelluksia asiakkaalle. Sovelluskehitystä voi tehdä Java tai Python -ohjelmointikieliä käyttäen, johon on saatavissa sovelluskehityksen työkalut ilmaiseksi. Omassa sovelluksessa voi käyttää web-sovelluskehystä kehitysvaiheen nopeuttamiseksi. App Engine for Business, jossa on mahdollisuus oikeaan relaatiotietokantaan, tulee laajentamaan palvelua vahvasti yritysasiakkaisiin suuntautuen. Tässä työssä kehitettiin selvitys- ja oppimistarkoituksessa keskustelupalsta pilvisovelluksena. Sovelluksen toimintaa ohjaavassa osassa käytettiin Python - ohjelmointikieltä ja Django web-sovelluskehystä, sekä järjestelmään sisältyvää tietokantaa. Djangon käyttämisellä saavutettiin se käytännön etu, että työssä voitiin käyttää vakaaksi tunnetun ohjelmistokomponentin palveluita ja välttää siten virheitä. Uuden oppiminen oli merkittävin haaste, sillä kehitystyökalut ja App Engine toimivat ongelmitta kuten ne oli saatavilla olleessa aineistossa kuvailtu. Kehitetyn sovelluksen kaikki määritellyt tavoitteet saavutettiin ilman, että mitään olisi tarvinnut jättää toteuttamatta. Tehdyt havainnot olivat rohkaisevia, joten laajemman sovelluksen kehittäminen jää tulevaisuuden tavoitteeksi. 32
37 LÄHTEET Armbrust, M. & al., A View of Cloud Computing. Communications of the ACM, April 2010, 53(4), pp ISSN , doi: / Ciurana, E., Developing with Google App Engine. New York (NY): Apress, ISBN , [e-book] Convers, J.D., Grays 2.0: A Web 2.0 on-line Medical Social Bookmarking system using the Google App Engine and Django. [Internet] Dublin: Dublin Institute of Technology (Masters Thesis, accepted May 2009). Saatavilla : Django, The Django template language: For template authors. [Internet]: Django Software Foundation. Saatavilla : Django, The Django framework. [Internet]: Django Software Foundation. Saatavilla : Fisher, P. Edberg, J. & Pant, R., Cloud Computing: Assessing Azure, Amazon Ec2, Google App Engine and Hadoop for It Decision Making and Developer Career Growth. New York (NY): Apress, ISBN Google, django_example. [Internet]: Google, Inc. Saatavilla : Google, 2010a. App Engine. [Internet]: Google, Inc. Saatavilla : Google, 2010b. Quotas. [Internet]: Google, Inc. Saatavilla : 33
38 Google, 2010c. Billing and Budgeting Resources. [Internet]: Google, Inc. Saatavilla : Google, 2010d. Development Tools. [Internet]: Google, Inc. Saatavilla : Google, 2010e. Samples for Google App Engine. [Internet]: Google, Inc. Saatavilla : Google, 2010f. The Python Datastore API. [Internet]: Google, Inc. Saatavilla : Goscinski, A. & Brock, M., (in press). Toward dynamic and attribute based publication: discovery and selection for cloud computing. Future Generation Computer Systems, available online 14 April ISSN X Hurwitz, J. Bloor, R. Kaufman, M. & Halper, F., Cloud Computing For Dummies. Hoboken (NJ): Wiley Publishing, ISBN Lehto, J., 2010a. Codeboard Discussion Arena. [Internet] Lappeenranta: Lehto. Saatavilla : Lehto, J., 2010b. Codeboard Discussion Arena version 2. [Internet] Lappeenranta: Lehto. Saatavilla : McGaw, J., Beginning Django E-Commerce. New York (NY): Apress, ISBN , [e-book] Misra, S.C. & Mondal, A., (in press). Identification of a company s suitability for the adoption of cloud computing and modelling its corresponding Return on Investment. Mathematical and Computer Modelling, available online 30 March doi: /j.mcm
39 Moore, D. Goodwill, J. & Lan, I., Professional Google App engine programming with Java. s.l.: John Wiley & Sons, ISBN Python, Python Release. [Internet]: Python Software Foundation. Saatavilla : Roche, K. & Douglas, J., Beginning Java Google App Engine. New York (NY): Apress, ISBN , [e-book] Roden, T., Building the Realtime User Experience: Creating Immersive and Interactive Websites. Sebastopol (CA): O'Reilly Media, Inc., ISBN Rosenthal, A. Mork, P. Li, M.H. Stanford, J. Koester, D. & Reynolds, P., Cloud computing: A new business paradigm for biomedical information sharing. Journal of Biomedical Informatics, April 2010, 43(2), pp ISSN Sanderson, D., Programming Google App Engine. Sebastopol (CA): O'Reilly Media, Inc., ISBN Saint-Andre, P. ed., Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence. [Internet]: Internet Engineering Task Force. Saatavilla : Severance, C., Using Google App Engine. Sebastopol (CA): O'Reilly Media, Inc., ISBN Sledziewski, K. Bordbar, B. & Anane, R., A DSL-Based Approach to Software Development and Deployment on Cloud. Perth, Australia April th IEEE International Conference on Advanced Information Networking and Applications. doi: /AINA
40 Stanoevska-Slabeva, K. Wozniak, T. & Dimitrakos, T. eds., Grid and Cloud Computing: A Business Perspective on Technology and Applications. Berlin: Springer Berlin Heidelberg, ISBN , [e-book] Subashiniand, S. & Kavitha, V., (in press). A survey on security issues in service delivery models of cloud computing. Journal of Network and Computer Applications, available online 15 July doi: /j.jnca Velte, A. Velte, T. & Elsenpeter, R., Cloud Computing: A Practical Approach. New York (NY): McGraw-Hill Professional, ISBN Voas, J. & Zhang, J., Cloud Computing: New Wine or Just a New Bottle? IT Professional, March-April 2009, 11(2), pp ISSN Vosloo, I. & Kourie, D., Server-centric web frameworks: An overview. ACM Computing Surveys, April 2008, 40(2), Article 4. ISSN , Wikipedia, Pilvilaskenta. [Internet]: Wikipedia. Saatavilla : Yahoo, Hadoop Tutorial. [Internet]: Yahoo!, Inc. Saatavilla : Zahariev, A., Google App Engine. Espoo, Finland Helsinki University of Technology: Espoo. Saatavilla : 36
41 LIITTEET LIITE 1. App Engine sovelluksen asetustiedosto app.yaml application: codebrd version: 1 runtime: python api_version: 1 handlers: - url: /media static_dir: media - url:.* script: django_bootstrap.py LIITE 2. Indeksien asetustiedosto index.yaml indexes: # AUTOGENERATED # This index.yaml is automatically updated whenever the dev_appserver # detects that a new type of query is run. If you want to manage the # index.yaml file manually, remove the above marker line (the line # saying "# AUTOGENERATED"). If you want to manage some indexes # manually, move them above the marker line. The index.yaml file is # automatically uploaded to the admin console when you next deploy # your application using appcfg.py. - kind: Message properties: - name: threadid - name: created - kind: Message properties: - name: threadid - name: created direction: desc LIITE 3. Djangon käyttöönoton alustava tiedosto django_bootstrap.py # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. (jatkuu)
42 LIITE 3. (jatkoa) # You may obtain a copy of the License at # # # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Bootstrap for running a Django app under Google App Engine. The site-specific code is all in other files: settings.py, urls.py, models.py, views.py. And in fact, only 'settings' is referenced here directly -- everything else is controlled from there. """ # Standard Python imports. import os import sys import logging import builtin # Google App Hosting imports. from google.appengine.ext.webapp import util import pickle sys.modules['cpickle'] = pickle # Enable info logging by the app (this is separate from appserver's # logging). logging.getlogger().setlevel(logging.info) # Force sys.path to have our own directory first, so we can import from it. sys.path.insert(0, os.path.abspath(os.path.dirname( file ))) # Must set this env var *before* importing any part of Django. os.environ['django_settings_module'] = 'settings' # Make sure we can import Django. We may end up needing to do this # little dance, courtesy of Google third-party versioning hacks. Note # that this patches up sys.modules, so all other code can just use # "from django import forms" etc. try: from django import v0_96 as django except ImportError: pass # Import the part of Django that we use here. import django.core.handlers.wsgi (jatkuu)
43 LIITE 3. (jatkoa) def main(): # Create a Django application for WSGI. application = django.core.handlers.wsgi.wsgihandler() # Run the WSGI CGI handler with that application. util.run_wsgi_app(application) if name == ' main ': main() LIITE 4. Djangon asetusten tiedosto settings.py # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Django settings for this project. import os DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = () MANAGERS = ADMINS DATABASE_ENGINE = '' 'sqlite3' or 'ado_mssql'. DATABASE_NAME = '' DATABASE_USER = '' DATABASE_PASSWORD = '' DATABASE_HOST = '' with sqlite3. DATABASE_PORT = '' sqlite3. # 'postgresql_psycopg2', 'postgresql', 'mysql', # Or path to database file if using sqlite3. # Not used with sqlite3. # Not used with sqlite3. # Set to empty string for localhost. Not used # Set to empty string for default. Not used with # Local time zone for this installation. Choices can be found here: # TIMEZONE-SET-TABLE # although not all variations may be possible on all operating systems. (jatkuu)
44 LIITE 4. (jatkoa) # If running in a Windows environment this must be set to the same as your # system time zone. TIME_ZONE = 'America/Los_Angeles' # i.e., Mountain View # Language code for this installation. All choices can be found here: # # LANGUAGE_CODE = 'en-us' SITE_ID = 1 # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = False # Absolute path to the directory that holds media. # Example: "/home/media/media.lawrence.com/" MEDIA_ROOT = '' # URL that handles the media served from MEDIA_ROOT. # Example: " MEDIA_URL = '' # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a # trailing slash. # Examples: " "/media/". ADMIN_MEDIA_PREFIX = '/media/' # Whether to append trailing slashes to URLs. APPEND_SLASH = False # Make this unique, and don't share it with anybody. SECRET_KEY = 'hubba-bubba' # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.load_template_source', ) MIDDLEWARE_CLASSES = ( ) ROOT_URLCONF = 'urls' TEMPLATE_DIRS = ( os.path.join(os.path.dirname( file ), 'templates'), # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ) INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.contenttypes', )
45 LIITE 5. Djangon URL-polkujen asetustiedosto urls.py # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from django.conf.urls.defaults import * urlpatterns = patterns( '', (r'^$', 'views.index'), (r'^new$', 'views.newthread'), (r'^thread/(\d+)$', 'views.thread'), ) LIITE 6. Keskustelupalstan keskeinen toimintalogiikka # -*- coding: cp1252 -*- # *************************************************** # * Kurssinumero: CT10A4000, Kandidaatintyö ja seminaari # * Tekijä: [Jarno Johan Lehto] # * Päivämäärä luotu: [ ] # * CodeBoard Discussion Arena ############# tiedosto: views.py #################### import os from google.appengine.api import users from google.appengine.ext import db from google.appengine.ext.db import djangoforms import django from django import http from django import shortcuts class Message(db.Model): #tietokantamalli threadname = db.stringproperty(multiline=false) #viestiketjun nimi threadid = db.integerproperty(long) #viestiketjun tunnus starter = db.booleanproperty() #viestiketjun aloittaja content = db.textproperty(required=true) #viestin tekstisisältö author = db.userproperty() #käyttäjä, joka kirjoitti created = db.datetimeproperty(auto_now_add=true) #milloin syötetty modified = db.datetimeproperty(auto_now=true) #milloin muokattu (varaus) timesviewed = db.integerproperty(long) #laskuri, viestiketjun katselukertoja (jatkuu)
46 LIITE 6. (jatkoa) class ThreadForm(djangoforms.ModelForm): #lomakemäärittely, uudelle viestiketjulle class Meta: model = Message exclude = ['threadid','starter','author','created','modified','timesviewed'] class MessageForm(djangoforms.ModelForm): #lomakemäärittely, ketjuun lisättävälle class Meta: model = Message exclude = ['threadname','threadid','starter','author','created','modified','timesviewed'] ############# Koodin uudelleenkäyttöä varten ####################### def respond(request, user, template, params=none): if params is None: params = {} if user: params['user'] = user params['sign_out'] = users.createlogouturl('/') params['is_admin'] = (users.iscurrentuseradmin() and 'Dev' in os.getenv('server_software')) else: params['sign_in'] = users.createloginurl(request.path) if not template.endswith('.html'): template += '.html' return shortcuts.render_to_response(template, params) # END-OF-respond ########### aloittaa näkymän muodostamisen (polun juuri) ########### def index(request): """request aih. base ja list -templ. käsittelyn (viestiketjujen lista)""" user = users.getcurrentuser() messages = db.gqlquery('select * FROM Message ORDER BY created DESC') return respond(request, user, 'list', {'messages': messages}) # END-OF-index ########### viestiketjun näyttäminen ja vastauksen syöttö ########## def thread(request, message_id): """request.get tuo tyhjän lomakkeen, request.post käsittelee/tallentaa sen""" user = users.getcurrentuser() if user is None: return http.httpresponseforbidden('you must be signed in to view a thread') if message_id: message_id_copy = int(message_id) #käytettävissä,jos seuraava tark. OK message0 = None if message_id: message0 = Message.get(db.Key.from_path(Message.kind(), int(message_id))) #tältä voi kysellä vietiketjuun liittyvää, jos on olemassa. if message0 is None: return http.httpresponsenotfound('no message exists with that key (%r)' % message_id) thread_id_copy = message0.threadid (jatkuu)
47 LIITE 6. (jatkoa) thread_name_copy = str(message0.threadname) message0.timesviewed = message0.timesviewed + 1#luettu-kertojen lisäys message0.put()#olemassa olevan olion päivitys message_id = None message = None #asetus arvoon, myöhemmin olio tähän form = MessageForm(data=request.POST or None, instance=message)#data=request.post or None if not request.post: messages = Message.gql("WHERE threadid = :1 ORDER BY created ASC", int(message_id_copy)) return respond(request, user, 'reply', {'form': form, 'message_id': message_id_copy, 'message': message, 'messages': messages}) #jos oli request.post errors = form.errors #onko pakoll.syötteet ja oikeaa tyyppiä? if not errors: try: message = form.save(commit=false)#lomakkeesta kerätyt tiedot jäsenmuuttujiin except ValueError, err: errors[' all '] = unicode(err) if errors: #virheellinen syöte, korjaa ole hyvä! return respond(request, user, 'reply', {'form': form, 'message_id': message_id_copy, 'message': message, 'messages': messages}) if not message.author: #jos ei ole author arvoa, asetetaan se. message.author = user message.starter = False #uusi vastaus ei ole viestiketjun aloittaja message.timesviewed = 0 message.threadname = thread_name_copy message.threadid = thread_id_copy message.put() #tallennetaan olio. return http.httpresponseredirect('/') #homma hoidettu # END-OF-thread ###################### aloita uusi viestiketju ##################### def newthread(request): """request.get tuo tyhjän lomakkeen, request.post käsittelee/tallentaa sen""" user = users.getcurrentuser() message_id =None if user is None: return http.httpresponseforbidden('you must be signed in to add a thread') message = None form = ThreadForm(data=request.POST or None, instance=message) if not request.post: return respond(request, user, 'newthread', {'form': form, 'message': message}) #jos oli request.post errors = form.errors if not errors: try: message = form.save(commit=false)#lomakkeesta kerätyt tiedot (jatkuu)
48 LIITE 6. (jatkoa) jäsenmuuttujiin except ValueError, err: errors[' all '] = unicode(err) if errors: return respond(request, user, 'newthread', {'form': form, 'message': message}) if not message.author: #jos ei ole author arvoa, asetetaan se. message.author = user if not message.threadname: #jos käyttäjä jätti tyhjäksi, asetetaan oletus message.threadname = '(none)' message.starter = True message.timesviewed = 0 message.put() #tallennetaan olio. Pakko olla tallennettu ennen seuraavaa. msg_key_inst = message.key() #vaaditaan tallennetun olion key -instanssi message.threadid = int(msg_key_inst.id())# instanssimetodilla saadaan numero message.put() #päivitetään tallennettu olio. return http.httpresponseredirect('/')#homma hoidettu # END-OF-newthread # EOF LIITE 7. Ulkonäköä asetteleva tyylitiedosto mainstyle.css /* sivun tyylimaarittely, (C) Jarno Lehto screen {p.medium {font-family:"trebuchet MS", Arial, Helvetica, sansserif; font-size:12px;} print { p.medium {font-family:times,serif; font-size: 10pt;} div#mainuibar {display:none;} div#artwork {display:none;} handheld { p.medium {font-family:verdana,sans-serif; font-size:12px; font-weight:bold;} img {display:none;} } body { color:#0e5f8c; background-color:#aacaff; } img { } a:link { width:800 height:320 (jatkuu)
49 LIITE 7. (jatkoa) color:#2f729c; } a:visited { color:#0e5f8c; } a:hover { background-color:#badbff; /* color:#0e5f8c; */ /* font-weight: bold; */ } a:active { color:#0e5f8c; } textarea { } input { } input.btn { } width: 600px; height: 120px; font-family:tahoma,verdana,sans-serif; font-size:12px; border: 1px solid #999999; padding: 1px; /*background-color:#0e5f8c; color:#eceddb;*/ width: 600px; height: 20px; font-family:tahoma,verdana,sans-serif; font-size:12px; border: 1px solid #999999; padding: 1px; /*background-color:#0e5f8c; color:#eceddb;*/ font-size:14px; color:#0d5a87; width:120px; height:20px; border:1px solid #999999; table.uibar { border-collapse:collapse; (jatkuu)
50 LIITE 7. (jatkoa) border-width:1px; border-color:#ffffff; border-style:solid; width:800px; height:50px; color:#eceddb; background-color:#0e5f8c; } td.uibar { width:140px; text-align:center; } a.uibar:link { color:#eceddb; } a.uibar:visited { color:#eceddb; } a.uibar:hover { color:#ffffff; background-color:#0e5a89; } a.uibar:active { color:#eceddb; } table.linecolumn { border-collapse:collapse; border-width:1px; border-color:#ffffff; border-style:solid; width:800px; height:20px; color:#eceddb; background-color:#0e5f8c; } td.linecolumn0 { width:140px; text-align:left; } td.linecolumn1 { width:140px; text-align:center; } (jatkuu)
51 LIITE 7. (jatkoa) td.linecolumn2 { width:140px; text-align:center; } td.linecolumn3 { width:140px; text-align:right; } table.threadline { border-collapse:collapse; border-width:1px; border-color:#ffffff; border-style:solid; width:800px; height:50px; color:#0e5f8c; background-color:#dddddd; } table.newcontent { border-collapse:collapse; border-width:1px; padding: 1px; border-color:#ffffff; border-style:solid; width:800px; height:200px; color:#0e5f8c; background-color:#dddddd; } div.reply { } position:absolute; width:800px LIITE 8. Vanhempana toimiva template <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " <html> <!-- ################################################### # Kurssi: CT10A4000, Kandidaatintyö ja seminaari # Tekijä: [Jarno Johan Lehto] # Päivämäärä luotu: [ ] (jatkuu)
52 LIITE 8. (jatkoa) # CodeBoard Discussion Arena ############ tiedosto: base.html ################### --> <!-- päätemplate(parent) --> <head> <meta http-equiv="content-language" content="fi" /> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>codeboard Discussion Arena {%if message%}- {{message.threadname escape}} - {%endif%}</title> <link type="text/css" rel="stylesheet" href="/media/mainstyle.css"> <link type="image/x-icon" rel="shortcut icon" href="/media/favicon.ico" /> </head> <body> <div id="mainuibar"> <table class="uibar"><tr><td class="uibar"><p id="username">username: {{ user.nickname }} <{{user. }}></p></td> <td class="uibar"><p id="startnew"><a class="uibar" href="{%url views.newthread %}">Start a new thread</a></p></td> <td class="uibar"><p id="tohomepage"><a class="uibar" href="{%url views.index%}">home</a></p></td> <td class="uibar"><p id="loginout"> {%if sign_out%}<a class="uibar" href="{{sign_out}}">sign out</a> {% else %} {%if sign_in%}<a class="uibar" href="{{sign_in}}">sign in</a>{%endif%} {%endif%} </p></td></tr></table> {%if is_admin%} <a class="uibar" href="/_ah/admin">admin</a>{%endif%} </div> <div id="artwork"><p> <img alt="page top-image" src="/media/image1.jpg" /></p> </div> {%block content%}{%endblock%} {%block body%}{%endblock%} </body> </html> LIITE 9. Lapsena toimiva template viestiketjujen listaamiseen {%extends "base.html"%} <!-- ################################################### # Kurssi: CT10A4000, Kandidaatintyö ja seminaari # Tekijä: [Jarno Johan Lehto] # Päivämäärä luotu: [ ] # CodeBoard Discussion Arena ############ tiedosto: list.html ################### --> <!-- viestiketjulistan esittävä template (child) --> (jatkuu)
53 LIITE 9. (jatkoa) {%block content%} <div id="threadcols"> <table class="linecolumn"><tr> <td class="linecolumn0"><p>date and time</p></td> <td class="linecolumn1"><p>begun by</p></td> <td class="linecolumn2"><p>thread name</p></td> <td class="linecolumn3"><p>views</p></td></p></td></tr> </table> </div> {%endblock%} {%block body%} <div id="threadz"> {% for message in messages %} {% if message.starter %} <p> <table class="threadline"><tr> <td class="linecolumn0"><p>{{message.created date:"y.m.d H:i:s"}}</p></td> <td class="linecolumn1"><p>{{message.author.nickname}}</p></td> <td class="linecolumn2"><p><a class="threadline" href="{%url views.thread message.key.id%}">{{ message.threadname escape }}</a></p></td> <td class="linecolumn3"><p>{{ message.timesviewed }}</p></td></tr> </table></p> {% else %} {% endif %} {% endfor %} </div> {%endblock%} LIITE 10. Lapsena toimiva template uuden viestiketjun aloittamiseen {%extends "base.html"%} <!-- ################################################### # Kurssi: CT10A4000, Kandidaatintyö ja seminaari # Tekijä: [Jarno Johan Lehto] # Päivämäärä luotu: [ ] # CodeBoard Discussion Arena ############ tiedosto: newthread.html ################### --> <!-- viestiketjun aloittamisen template (child) --> {%block body%} <div id="reply"> <h2>start a new message thread</h2> <p> <form action="{%url views.newthread message.key.id%}" method="post"> <table class="newcontent"> <tr><td class="linecolumn0" colspan="2"> {{form}} </td></tr> (jatkuu)
54 LIITE 10. (jatkoa) <tr><td class="linecolumn0"><input class="btn" type="submit" value="create a thread"></td> <td class="linecolumn3"><a href="{%url views.index%}">cancel</a></td></tr> </table> </form> </p> </div> {%endblock%} LIITE 11. Lapsena toimiva template viestiketjun lukemiseen ja vastaamiseen {%extends "base.html"%} <!-- ################################################### # Kurssi: CT10A4000, Kandidaatintyö ja seminaari # Tekijä: [Jarno Johan Lehto] # Päivämäärä luotu: [ ] # CodeBoard Discussion Arena ################## tiedosto: reply.html ################### --> <!-- viestiketjun ja kommenttikentän esittävä template (child) --> {%block content%} <div id="thread_"> {% for msg in messages %} {% if msg.content %} <p><table class="threadline"><tr> <td class="linecolumn0"><p>date and time: {{msg.created date:"y.m.d H:i:s"}}</p></td> <td class="linecolumn0"><p>thread name: {{msg.threadname escape}}</p></td></tr> <tr><td class="linecolumn"0" colspan="2"><b>{{ msg.author.nickname }} wrote: </b><br />{{ msg.content escape}}</td></tr> </table> </p> {% endif %} {% endfor %} </div> {%endblock%} {%block body%} <div id="reply"> <p><form action="{%url views.thread message.key.id%}" method="post"> <table class="newcontent" colspan="2"> <tr><td class="linecolumn0"> {{form}} </td></tr> <tr><td class="linecolumn0"><input class="btn" type="submit" value="send reply"></td> <td class="linecolumn3"><a href="{%url views.index%}">cancel</a></td></tr> </table> </form></p> </div> {%endblock%}
Amazon Web Services (AWS) on varmaankin maailman suosituin IaaS-tarjoaja. Lisäksi se tarjoaa erilaisia PaaS-kategoriaan kuuluvia palveluita.
1 2 Amazon Web Services (AWS) on varmaankin maailman suosituin IaaS-tarjoaja. Lisäksi se tarjoaa erilaisia PaaS-kategoriaan kuuluvia palveluita. 3 4 Region vastaa palvelun fyysistä sijaintipaikkaa (AWS
Järjestelmäarkkitehtuuri (TK081702)
Järjestelmäarkkitehtuuri (TK081702) yleistyvät verkkopalveluissa Youtube Google... Avaavat pääsyn verkkopalvelun sisältöön. Rajapintojen tarjoamia tietolähteitä yhdistelemällä luodaan uusia palveluja,
Alkuraportti. LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS CT10A4000 - Kandidaatintyö ja seminaari
LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS CT10A4000 - Kandidaatintyö ja seminaari Alkuraportti Avoimen lähdekoodin käyttö WWW-sovelluspalvelujen toteutuksessa Lappeenranta, 30.3.2008,
582203 Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus
582203 Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus Sisältö Mikä on web-sovellus? Selaimen rooli web-sovelluksessa Palvelimen rooli web-sovelluksessa Aineistopyynnöt Tiedon välittäminen
T-111.361 Hypermediadokumentin laatiminen. Sisältö. Tavoitteet. Mitä on www-ohjelmointi? Arkkitehtuuri (yleisesti) Interaktiivisuuden keinot
T-111.361 Hypermediadokumentin laatiminen -Ohjelmointi Peruskäsitys www-ohjelmoinnin kentästä Tekniikat interaktiivisuuden toteuttamiseen tekniikat tekniikat Tietokannat Juha Laitinen TKK/TML [email protected]
Written by Administrator Monday, 05 September 2011 15:14 - Last Updated Thursday, 23 February 2012 13:36
!!!!! Relaatiotietokannat ovat vallanneet markkinat tietokantojen osalta. Flat file on jäänyt siinä kehityksessä jalkoihin. Mutta sillä on kuitenkin tiettyjä etuja, joten ei se ole täysin kuollut. Flat
ELM GROUP 04. Teemu Laakso Henrik Talarmo
ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................
MOBISITE-TYÖKALUN SISÄLTÄMÄT TOIMINNOT
MOBISITE-TYÖKALU MobiSite on työkalu matkapuhelimeen soveltuvan mobiilisivuston rakentamiseen. AIMO-järjestelmän jatkuvasti päivittyvä päätelaitetunnistus tunnistaa useimmat puhelinmallit ja mukauttaa
Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14
Arkkitehtuurikuvaus Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy Ryhmä 14 Muutoshistoria Versio Pvm Päivittäjä Muutos 0.4 1.11.2007 Matti Eerola 0.3 18.10.2007 Matti Eerola 0.2
TimeEdit opiskelijan ohje TimeEdit-instructions for students from this link
TimeEdit opiskelijan ohje TimeEdit-instructions for students from this link TimeEdit on työjärjestys- (lukujärjestys) ja tilanvarausohjelmisto. Sisältö 1 Oikeudet... 2 2 TimeEdit Web... 2 3 Kirjautuminen...
TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö
TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö Tekijät: Eemeli Honkonen Joni Metsälä Työ palautettu: SISÄLLYSLUETTELO: 1 SEMINAARITYÖN KUVAUS... 3 2 TIETOKANTA... 3 2.1 MITÄ TIETOKANNAT SITTEN OVAT?... 3
Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo
Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...
11/20: Konepelti auki
Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen [email protected] Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon
Hyödynnä DPS- ja SA-setelit Azure hybridipilvi-palveluiden suunnittelussa ja testauksessa!
Hyödynnä DPS- ja SA-setelit Azure hybridipilvi-palveluiden suunnittelussa ja testauksessa! Onregon DPS-työpajat ovat Microsoft Enterprise Agreement asiakkaille sopivia työpajoja, joiden maksamiseen voi
IT-OSAAJA, TIETOJENKÄSITTELYN ERIKOISTUMISOPINNOT
IT-OSAAJA, TIETOJENKÄSITTELYN ERIKOISTUMISOPINNOT KOULUTUKSEN KOHDERYHMÄ SISÄLTÖ Koulutuksen tavoitteena on antaa opiskelijalle valmiudet uusien tietoteknisten menetelmien ja välineiden hyödyntämiseen.
opiskelijan ohje - kirjautuminen
opiskelijan ohje - kirjautuminen estudio on Edupolin kehittämä e-oppimisympäristö koulutusryhmän verkkoalustana perinteisen luokkaopetuksen tukena. etäopiskelussa ja -opetuksessa kotoa tai työpaikalta.
Tikon Ostolaskujenkäsittely versio 6.1.2 SP1
Toukokuu 2012 1 (14) Tikon Ostolaskujenkäsittely versio 6.1.2 SP1 Asennusohje Toukokuu 2012 2 (14) Sisällysluettelo 1. Vaatimukset palvelimelle... 3 1.1..NET Framework 4.0... 3 1.2. Palvelimen Internet
Työpöytävirtualisointi
Työpöytävirtualisointi VMware View LIPO - SAMK Liiketoiminta ja kulttuuri Pori Liiketalouden, matkailun, tietojenkäsittelyn, viestinnän ja yrittäjyyden ja liiketoimintaosaamisen koulutusta. Käyttäjiä noin
Tekninen suunnitelma - StatbeatMOBILE
Tekninen suunnitelma - StatbeatMOBILE Versio Päivämäärä Henkilö Kuvaus 1.0 13.12.2013 Pöyry Alustava rakenne ja sisältö 1.1 22.12.2013 Pöyry Lisätty tekstiä ilmoituksiin, turvallisuuteen ja sisäiseen API:in
LoCCaM Riistakamerasovellus. Dimag Ky dimag.fi
LoCCaM Riistakamerasovellus Dimag Ky janne.koski @ dimag.fi +358505907788 Sovelluksen toimintaperiaate Toimintaperiaate yksinkertaistettuna on seuraavanlainen Kamera ottaa kuvan tai videon jonka lähettää
Pilvipalvelujen tietoturvasta
Pilvipalvelujen tietoturvasta It-palveluiden tilaisuus 20.3.2015 Matti Levänen Mitä pilvipalvelut ovat? Pilvipalvelu on toimintamalli, jolla tarjotaan helposti käyttöön otettavaa ja skaalautuvaa tietotekniikkaresurssia.
FuturaPlan. Järjestelmävaatimukset
FuturaPlan Järjestelmävaatimukset 25.1.2017 2.2 Hermiankatu 8 D tel. +358 3 359 9600 VAT FI05997751 33720 Tampere fax. +358 3 359 9660 www.dbmanager.fi i Versiot Versio Päivämäärä Tekijä Kommentit 1.0
Tekninen suunnitelma - StatbeatMOBILE
Tekninen suunnitelma - StatbeatMOBILE Versio Päivämäärä Henkilö Kuvaus 1.0 13.12.2013 Pöyry Alustava rakenne ja sisältö 1.1 22.12.2013 Pöyry Lisätty tekstiä ilmoituksiin, turvallisuuteen ja sisäiseen API:in
Virtualisointiympäristössä on kolme pääosaa: isäntä (host), virtualisointikerros ja vieras (guest).
1 Virtualisoinnin avulla voidaan purkaa suora linkki suoritettavan sovelluksen (tai käyttöjärjestelmän tms.) ja sitä suorittavan laitteiston välillä. Näin saavutetaan joustavuutta laitteiston käytössä.
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
WEBINAARIN ISÄNNÄT. Jarno Wuorisalo Cuutio.fi. Petri Mertanen Superanalytics.fi. Tomi Grönfors Brandfors.com
WEBINAARI 3.11.2015 Mitä Tag Management on käytännössä ja miten se vaikuttaa analytiikkaan? Petri Mertanen, Super Analytics - @mertanen Jarno Wuorisalo, Cuutio - @jarnowu Tomi Grönfors, Brandfors - @groenforsmethod
Julkinen. Suomen Pankin ja Finanssivalvonnan suojattu sähköposti: ulkoisen käyttäjän ohje
Muistio 1 (7) Suomen Pankin ja Finanssivalvonnan suojattu sähköposti: ulkoisen käyttäjän ohje Sisällys 1 Johdanto... 1 2 Suojatun viestin vastaanottaminen... 1 3 Suojatun viestin lukeminen... 2 4 Vastaanotetun
Uutta Remote Support Platform 3.0 -versiossa
Uutta Remote Support Platform for SAP Business One Asiakirjaversio: 1.0 2012-10-08 Kaikki maat Typografiset merkintätavat Kirjasintyyli Esimerkki Näytöstä lainatut sanat tai merkit. Näitä ovat kenttien
Projektinhallintaa paikkatiedon avulla
Projektinhallintaa paikkatiedon avulla Tampereen Teknillinen Yliopisto / Porin laitos Teemu Kumpumäki [email protected] 25.6.2015 1 Paikkatieto ja projektinhallinta Paikkatiedon käyttäminen projektinhallinnassa
Alkuraportti. LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS Ti Kandidaatintyö ja seminaari
LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS Ti5004000 - Kandidaatintyö ja seminaari Alkuraportti Avoimen lähdekoodin käyttö WWW-sovelluspalvelujen toteutuksessa Lappeenranta, 4.6.2007,
Office 2013 - ohjelmiston asennusohje
Office 2013 - ohjelmiston asennusohje Tämän ohjeen kuvakaappaukset on otettu asentaessa ohjelmistoa Windows 7 käyttöjärjestelmää käyttävään koneeseen. Näkymät voivat hieman poiketa, jos sinulla on Windows
Onko sinun yritykselläsi jo tietotekniikka Palveluksessa? vtoasp -palvelun avulla siirrät tietojärjestelmäsi haasteet ammattilaisten hoidettaviksi.
Onko sinun yritykselläsi jo tietotekniikka Palveluksessa? vtoasp -palvelun avulla siirrät tietojärjestelmäsi haasteet ammattilaisten hoidettaviksi. vtoasp -palvelu 1) Huolehtii yrityksesi tietojärjestelmän
FiSMA 1.1 Toiminnallisen laajuuden mittausmenetelmä Ohje monikerrosarkkitehtuurin mittaamiseen
FiSMA 1.1 Monikerrosarkkitehtuuri 1 (6) FiSMA 1.1 Toiminnallisen laajuuden mittausmenetelmä Ohje monikerrosarkkitehtuurin mittaamiseen 1. Yleiset periaatteet FiSMA 1.1 -menetelmässä mitataan sovellusperiaatteen
Kieliversiointityökalu Java-ohjelmistoon. Ohje
Kieliversiointityökalu Java-ohjelmistoon Ohje 2/6 SISÄLLYSLUETTELO 1 YLEISTÄ OHJELMASTA... 3 2 PÄÄ-IKKUNA...4 3 YLÄVALIKKO... 4 3.1 TIEDOSTO... 4 3.2 TOIMINTO... 4 3.3 ASETUKSET... 5 3.4 OHJE... 5 4 VÄLILEHDET...5
Interfacing Product Data Management System
Interfacing Product Data Management System Tekijä: Työn valvoja: Mats Kuivalainen Timo Korhonen Esitelmän sisältö Työn suorituspaikka - Ideal Product Data Oy Käsitteitä Työn tavoitteet Työn tulokset 1/5
Sähköposti ja uutisryhmät 4.5.2005
Outlook Express Käyttöliittymä Outlook Express on windows käyttöön tarkoitettu sähköpostin ja uutisryhmien luku- ja kirjoitussovellus. Se käynnistyy joko omasta kuvakkeestaan työpöydältä tai Internet Explorer
Blogger-blogin käyttöönotto ja perusasiat Bloggerista & bloggauksesta
1 Blogger-blogin käyttöönotto ja perusasiat Bloggerista & bloggauksesta Blogi on yhden tai useamman kirjoittajan verkkosivu tai -sivusto, jonka kautta voidaan julkaista omia kirjoituksia perinteisten julkaisukanavien
Pilvipalveluiden arvioinnin haasteet
Pilvipalveluiden arvioinnin haasteet Tietoturvallisuus- ja jatkuvuuden hallinnan vaatimukset ICT-hankinnoissa, 12.5.2014 Laura Kiviharju Pilvipalvelut Pilvilaskenta (CloudComputing) tarkoittaa internetissä
Ohjelmistojen mallintaminen, mallintaminen ja UML
582104 Ohjelmistojen mallintaminen, mallintaminen ja UML 1 Mallintaminen ja UML Ohjelmistojen mallintamisesta ja kuvaamisesta Oliomallinnus ja UML Käyttötapauskaaviot Luokkakaaviot Sekvenssikaaviot 2 Yleisesti
ETAPPI ry JOOMLA 2.5 Mediapaja. Artikkeleiden hallinta ja julkaisu
ETAPPI ry JOOMLA 2.5 Artikkeleiden hallinta ja julkaisu ETAPPI ry JOOMLA 2.5 Sivu 1(16) Sisällysluettelo 1 Joomla! sivuston sisällöntuotanto... 2 2 Artikkeleiden julkaisu sivustolla... 4 3 Artikkelin julkaisemista
Mikä on WordPress? itse ylläpidettävä (self-hosted) WordPress.com: ilmainen 3. osapuolen ylläpitämä pilvipalvelu (Cloud-hosted)
WordPress.com Mikä on WordPress? Tällä hetkellä maailman suosituin ns. julkaisujärjestelmä (CMS) Rakennettu blogialustaksi, nykyään myös muussa käytössä ilmainen ns. avoimen lähdekoodin julkaisujärjestelmä
AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML
AJAX-konsepti AJAX Asynchronous JavaScript And XML Viimeisin muoti-ilmiö web-ohjelmoinissa, termi Ajax tuli käyttöön vuoden 2005 aikana Joukko teknologioita, joiden avulla voidaan toteuttaa uudenlaisen
pilvipalvelu tarkoittaa?
Virtuaalipilvet tietotekniikassa: mitä pilvipalvelu tarkoittaa? Keijo Heljanko Tietotekniikan laitos Perustieteiden korkeakoulu Aalto-yliopisto [email protected] 18.1-2014 1/14 Pilvipalvelut Kun
Mainosankkuri.fi-palvelun käyttöohjeita
Mainosankkuri.fi-palvelun käyttöohjeita Sisällys 1. Johdanto... 1 2. Sisäänkirjautuminen... 1 3. Palvelussa navigointi... 2 4. Laitteet... 2 5. Sisällönhallinta... 4 6. Soittolistat... 7 7. Aikataulut...
ANVIA PILVI. kotimaisia pilvipalveluita yrityksille 24/7
ANVIA PILVI kotimaisia pilvipalveluita yrityksille 24/7 Anvia Pilvi TIESITKÖ, ETTÄ YLI PUOLET SUOMALAISYRITYKSISTÄ KÄYTTÄÄ PILVIPALVELUITA? Anvia Pilvi on suomalaisille yrityksille tarkoitettu palvelu,
Tiedostonhallinta. Yleistä
Tiedostonhallinta Tiedostonhallinnan kautta voi muokata kaikkia näkymän tiedostoja. Sitä tarvitaan näkymien räätälöintiin ja joidenkin asetusten muuttamiseen. Yleistä Tiedostojen tarkastelu ja muokkaus
FiSMA 1.1 Toiminnallisen laajuuden mittausmenetelmä Ohje monikerrosarkkitehtuurin mittaamiseen
FiSMA 1.1 Monikerrosarkkitehtuuri 1 (7) FiSMA 1.1 Toiminnallisen laajuuden mittausmenetelmä Ohje monikerrosarkkitehtuurin mittaamiseen 1. Yleiset periaatteet FiSMA 1.1 -menetelmässä mitataan sovellusperiaatteen
Nimi: Opnro: Harjoitustyön suoritus: ( ) syksy 2006 ( ) syksy 2005 ( ) muu, mikä. 1. Selitä seuraavat termit muutamalla virkkeellä ja/tai kaaviolla:
Harjoitustyön suoritus: ( ) syksy 2006 ( ) syksy 2005 ( ) muu, mikä 1. Selitä seuraavat termit muutamalla virkkeellä ja/tai kaaviolla: a) käytettävyys b) käyttäjäkeskeinen suunnittelu c) luonnollinen kieli
Liite 1: KualiKSB skenaariot ja PoC tulokset. 1. Palvelun kehittäjän näkökulma. KualiKSB. Sivu 1. Tilanne Vaatimus Ongelma jos vaatimus ei toteudu
Liite 1: skenaariot ja PoC tulokset 1. Palvelun kehittäjän näkökulma Tilanne Vaatimus Ongelma jos vaatimus ei toteudu Palvelun uusi versio on Palveluiden kehittäminen voitava asentaa tuotantoon vaikeutuu
Action Request System
Action Request System Manu Karjalainen Ohjelmistotuotantovälineet seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos 25.10.2000 Action Request System (ARS) Manu Karjalainen Ohjelmistotuotantovälineet
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat
Pilvi mitä, miksi ja miten
Pilvi mitä, miksi ja miten We are stuck with technology when what we really want is just stuff that works. Douglas Adams Pekka Virtanen TTY/Ohjelmistoarkkitehtuurit 2010-10-07 Päivän menu Pilvilaskenta
Laitteessa tulee olla ohjelmisto tai uudempi, tarvittaessa päivitä laite
TW-EAV510: PORTTIOHJAUS (VIRTUAL SERVER) ESIMERKISSÄ VALVONTAKAMERAN KYTKEMINEN VERKKOON Laitteessa tulee olla ohjelmisto 5.00.49 tai uudempi, tarvittaessa päivitä laite OPERAATTORIN IP---OSOITE - Jotta
Tiedostojen jakaminen turvallisesti
Tiedostojen jakaminen turvallisesti Taustaa Tiedostojen jakaminen sähköisesti (File Sharing) on ollut joissakin organisaatioissa ongelmallista hallita. Jaettaviksi halutut viestit ovat liitetiedostoineen
Integrointi. Ohjelmistotekniikka kevät 2003
Integrointi Ohjelmistotekniikka kevät 2003 ERP (Toiminnanohjausjärjestelmä) Myynti Henkilöstö, palkanlaskenta Kirjanpito Myynti Myyjät Extranet Tietovarasto Laskutus, reskontrat Asiakas ERP Asiakasrekisteri
Ohjelmisto on selainpohjaisen käyttöliittymän tarjoava tietokantajärjestelmä merikotkien seurantaan WWF:n Merikotka-työryhmän tarpeisiin.
TIETOKANTA MERIKOTKIEN SEURANTAAN Käyttöohje Versiohistoria: Versio Päivämäärä Kuvaus Tekijä 1.0 11.12.2007 Ensimmäinen luonnos Janne Piippo 2.0 13.12.2007 Virallinen verio Janne Piippo HELSINGIN YLIOPISTO
Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen
Pedacode Pikaopas Java-kehitysympäristön pystyttäminen Pikaoppaan sisältö Pikaoppaassa kuvataan, miten Windowstyöasemalle asennetaan Java-ohjelmoinnissa tarvittavat työkalut, minkälaisia konfigurointeja
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä
PUSH palvelut mobiilikehityksessä: Android ja Windows phone 7. Pauli Kettunen
PUSH palvelut mobiilikehityksessä: Android ja Windows phone 7 Pauli Kettunen Esityksen rakenne 1. Taustaa 2. Push web-ohjelmoinnissa Comet Interaktiomallit 3. Push älypuhelinalustoilla Deacon pilvipalveluna
KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma / Tietoverkkotekniikka
KYMENLAAKSON AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma / Tietoverkkotekniikka Linux pohjaiset pilvipalvelut Linux järjestelmät TI 11/12 TIVE Santeri Kangaskolkka TI 12 Janne Enroos TI 12 Mikä on
ANVIA ONLINE BACKUP ASENNUSOPAS 1(7) ANVIA ONLINE BACKUP ASENNUSOPAS 1.0
1(7) ANVIA ONLINE BACKUP Asioita, jotka tulee huomioida ennen asennusta! Koska palvelu sisältää myös sharing-ominaisuuden, on asiakas itse vastuussa millaisia tiedostoja palvelimelle varmuuskopioi ja kenelle
opiskelijan ohje - kirjautuminen
opiskelijan ohje - kirjautuminen estudio on Edupolin kehittämä e-oppimisympäristö koulutusryhmän verkkoalustana perinteisen luokkaopetuksen tukena tai etäopiskelussa ja -opetuksessa kotoa tai työpaikalta.
Ohjelmisto on tietokanta pohjainen tiedostojärjestelmä, joka sisältää virtuaalisen hakemisto rakenteen.
1 / 50 1. Etusivu Ohjelmisto on tietokanta pohjainen tiedostojärjestelmä, joka sisältää virtuaalisen hakemisto rakenteen. Virtuaali hakemistoihin voi tuoda tiedostoja tietokoneelta tai luoda niitä tällä
Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas
Tiedonhallinnan perusteet Viikko 1 Jukka Lähetkangas Kurssilla käytävät asiat Tietokantojen toimintafilosofian ja -tekniikan perusteet Tiedonsäilönnän vaihtoehdot Tietokantojen suunnitteleminen internetiä
www.solita.fi [email protected]
www.solita.fi [email protected] JAVA-SOVELLUSTEN RAKENTAMINEN INTEGROITUUN YMPÄRISTÖÖN Jarno Peltoniemi Solita Oy 10.5.2005 Aiheet Johdanto Portaalit, portletit Oracle Portal Java-sovelluksen rakentaminen
EK:n palkkatiedustelun asiointipalvelu ja SFTPtiedonsiirto. Ohje
EK:n palkkatiedustelun asiointipalvelu ja SFTPtiedonsiirto Ohje Tiedonanto- ja siirtopalvelut Palkkatiedustelun tietoja voi toimittaa eri tekniikoilla 1. Syöttämällä käsin asiointipalvelun lomakenäkymässä
Webforum. Version 14.4 uudet ominaisuudet. Viimeisin päivitys: 2014-12-6
Webforum Version 14.4 uudet ominaisuudet Viimeisin päivitys: 2014-12-6 Sisältö Tietoja tästä dokumentista... 3 Yleistä... 4 Yleistä & hallinnointi... 5 Dokumentit... 5 Perättäinen tarkistus- ja hyväksymisprosessi...
Sukupuu -ohjelma. Ossi Väre (013759021) Joni Virtanen (013760641)
Sukupuu -ohjelma Ossi Väre (013759021) Joni Virtanen (013760641) 7.11.2011 1 Johdanto Toteutimme C -kielellä sukupuuohjelman, johon käyttäjä voi lisätä ja poistaa henkilöitä ja määrittää henkilöiden välisiä
Miksi ja miten siirtyä käyttämään nykyistä ERP-järjestelmää pilvessä?
Miksi ja miten siirtyä käyttämään nykyistä ERP-järjestelmää pilvessä? Sisällys Lukijalle 3 Mitä pilvipalveluilla tarkoitetaan? 4 Toiminnanohjausjärjestelmä pilvessä 5 Miksi siirtyä pilvipalveluihin? 6
EMVHost Online SUBJECT: EMVHOST ONLINE CLIENT - AUTOMAATTISIIRROT COMPANY: EMVHost Online Client sovelluksen käyttöohje AUTHOR: DATE: 15.03.
EMVHost Online SUBJECT: COMPANY: COMMENTS: AUTHOR: EMVHOST ONLINE CLIENT - AUTOMAATTISIIRROT NETS OY EMVHost Online Client sovelluksen käyttöohje NETS OY DATE: 15.03.2011 VERSION: 1.0 1 SISÄLLYS SISÄLLYS...
AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin
AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin Raimo Nikkilä Aalto-yliopiston sähkötekniikan korkeakoulu - Automaation tietotekniikan tutkimusryhmä 17. tammikuuta 2013
JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?
JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen [email protected] Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,
Käyttöoppaasi. F-SECURE PSB E-MAIL AND SERVER SECURITY http://fi.yourpdfguides.com/dref/2859688
Voit lukea suosituksia käyttäjän oppaista, teknisistä ohjeista tai asennusohjeista tuotteelle F-SECURE PSB E-MAIL AND SERVER SECURITY. Löydät kysymyksiisi vastaukset käyttöoppaasta ( tiedot, ohjearvot,
Tietoturvavinkkejä pilvitallennuspalveluiden
Tietoturvavinkkejä pilvitallennuspalveluiden turvallisempaan käyttöön 11/2014 Sisällysluettelo Johdanto... 3 1 Mikä on pilvipalvelu?... 3 2 Mikä on pilvitallennuspalvelu?... 3 3 Ovatko pilvipalvelut turvallisia?...
Ajanvarauspalvelu. T-111.5006 Konseptointi ja käsikirjoitus Einopekka Laurikainen Joonas Laurikainen
Ajanvarauspalvelu T-111.5006 Konseptointi ja käsikirjoitus Einopekka Laurikainen Joonas Laurikainen Idea Ajanvarauspalvelumme ideana on yhdistää kaikki kunnan palvelut yhteen sivustoon, jolloin palvelujen
RATKI 1.0 Käyttäjän ohje
RATKI RATKI 1.0 Käyttäjän ohje Ohje 0.5 Luottamuksellinen Vastuuhenkilö Petri Ahola Sisällysluettelo 1. Yleistä... 3 1.1. Kuvaus... 3 1.2. Esitiedot... 3 1.3. RATKIn käyttöoikeuksien hankinta... 3 1.4.
SOPIMUSPRO - VERKKOPALVELUNOHJE. Työpaikkakouluttajan ohje SopimusPro verkkopalveluun. Pikaohje arvioinnin kirjaamiseen SopimusPro -verkkopalveluun
Työpaikkakouluttajan ohje SopimusPro verkkopalveluun Pikaohje arvioinnin kirjaamiseen SopimusPro -verkkopalveluun 1. Saat sähköpostiin ilmoituksen arvioinnista ja linkin arviointisivulle (sivu 1). 2. Työpaikkakouluttaja
Menetelmäraportti - Konfiguraationhallinta
Menetelmäraportti - Konfiguraationhallinta Päiväys Tekijä 22.03.02 Ville Vaittinen Sisällysluettelo 1. Johdanto... 3 1.1 Tärkeimmät lyhenteet... 3 2. Konfiguraationhallinnan tärkeimmät välineet... 4 2.1
Purot.net Wiki. Tutkielma. Paavo Räisänen. Centria Ammattikorkeakoulu 24.10.2012
Purot.net Wiki Tutkielma Paavo Räisänen Centria Ammattikorkeakoulu 24.10.2012 Sisällysluettelo 1: Esittely 2: Perustaminen 3: Uuden sivun luonti 4: Kuvien lisääminen 5: Linkin lisääminen 6: Lopuksi 1:
elearning Salpaus http://elsa.salpaus.fi Elsa-tutuksi
elearning Salpaus http://elsa.salpaus.fi Elsa-tutuksi SISÄLLYSLUETTELO 1 MIKÄ ON ELSA, ENTÄ MOODLE?... 3 1.1 MITÄ KURSSILLA VOIDAAN TEHDÄ?... 3 2 KURSSILLE KIRJAUTUMINEN... 3 3 KURSSILLE LIITTYMINEN...
Visma Business AddOn Tositteiden tuonti. Käsikirja
Visma Business AddOn Tositteiden tuonti Käsikirja Oppaan päiväys: 10.2.2012. Asiakaspalvelu: Helpdesk: www.visma.fi Visma Software Oy pidättää itsellään oikeuden mahdollisiin parannuksiin ja/tai muutoksiin
Raporttiarkiston (RATKI) käyttöohjeet Ohjeet
Raporttiarkiston (RATKI) käyttöohjeet Ohjeet 15.11.2012 1.0 Vastuutaho TRAFI Sisällys Raporttiarkiston (RATKI) käyttöohjeet 1 1. Johdanto 3 1.1. Esitiedot 3 1.2. Käyttöoikeudet 3 1.3. Sisäänkirjautuminen
Salasanojen turvallinen tallentaminen KeePass ohjelmalla
Salasanojen turvallinen tallentaminen KeePass ohjelmalla KeePass on vapaasti saatavilla oleva, avoimen lähdekoodin ohjelma, jonka tarkoituksena on auttaa salasanojen hallinnassa. Tämä KeePass ohje on päivitetty
Tik-76.115 Tietojenkäsittelyopin ohjelmatyö Tietotekniikan osasto Teknillinen korkeakoulu KÄYTTÖOHJE. LiKe Liiketoiminnan kehityksen tukiprojekti
Tik-76.115 Tietojenkäsittelyopin ohjelmatyö Tietotekniikan osasto Teknillinen korkeakoulu JÄRJESTELMÄN KÄYTTÖOHJE LiKe Liiketoiminnan kehityksen tukiprojekti Versio: 1.1 Tila: hyväksytty Päivämäärä: 13.2.2001
iphone ja ipad
1 Laadinta- ja lähettämisohje Laadinnassa on mahdollista käyttää sähköpostipohjaa tai Word-asiakirjapohjia. Tietokoneilla (Windows 10) on erilliset ohjeet Word-asiakirjapohjien käyttöön, mutta tässä ohjeessa
Sähköpostitilin käyttöönotto
Sähköpostitilin käyttöönotto Versio 1.0 Jarno Parkkinen [email protected] Sivu 1 / 16 1 Johdanto... 2 2 Thunderbird ohjelman lataus ja asennus... 3 3 Sähköpostitilin lisääminen ja käyttöönotto... 4 3.2 Tietojen
4. Lausekielinen ohjelmointi 4.1
4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen ja tulkinta. - Kääntäminen,
Lyseopaneeli 2.0. Käyttäjän opas
Lyseopaneeli 2.0 Käyttäjän opas 1. Esittely Lyseopaneeli on Oulun Lyseon lukion käyttäjätietojen hallintapalvelu jonka tarkoitus on niputtaa yhteen muutamia oleellisia toimintoja. 2. Yleistä paneelin käytöstä
Ohje luottamuksellista tietoa sisältävien sähköpostiviestien lähettämiseen ja vastaanottamiseen
Ohje luottamuksellista tietoa sisältävien sähköpostiviestien lähettämiseen ja vastaanottamiseen Liikenteen turvallisuusvirasto 27.9.2012 Sisällysluettelo Luottamuksellista tietoa sisältävien sähköpostiviestien
Visma Business AddOn Factoring-laskuaineisto. Käyttäjän käsikirja
Visma Business AddOn Factoring-laskuaineisto Käyttäjän käsikirja Oppaan päiväys: 09.06.2011 Asiakaspalvelu: Helpdesk: www.visma.fi Visma Software Oy pidättää itsellään oikeuden mahdollisiin parannuksiin
Android ohjelmointi. Mobiiliohjelmointi 2-3T5245
Android ohjelmointi Mobiiliohjelmointi 2-3T5245 Mikä on Android? Linux kernelin päälle rakennettu, Googlen kehittämä sovelluspino mobiilisovelluksiin Erillinen versio puhelimelle ja taulutietokoneille
Opus SMS tekstiviestipalvelu
Opus SMS tekstiviestipalvelu Sivu 1 / 17 1. Yleistä toiminnosta Opus SMS tekstiviestipalvelun avulla voidaan Opus Dental potilashallintaohjelmasta Lähettää muistutuksia tekstiviestillä Lähettää tiedusteluita
Visma Approval Center. Versiosaate 1.3
Visma Approval Center Versiosaate 1.3 Visma Approval Center - Versiosaate 1.3 Kaikkia koskettavat kehitykset Muutokset käyttöliittymän välilehdissä Tarkastajat ja hyväksyjät näkevät ylävalikon jatkossa
SOPIMUSPRO - VERKKOPALVELUNOHJE. Opiskelijan ohje SopimusPro verkkopalveluun. Pikaohje arvioinnin kirjaamiseen SopimusPro -verkkopalveluun
Opiskelijan ohje SopimusPro verkkopalveluun Pikaohje arvioinnin kirjaamiseen SopimusPro -verkkopalveluun 1. Saat sähköpostiin ilmoituksen arvioinnista ja linkin arviointisivulle (sivu 1). 2. Työpaikkakouluttaja
