Spring Boot, Java 8, AngularJS, ja Heroku pilvipalvelu

Tuli ajankohtaiseksi puskea Spring Boot sovellus Herokun alle tarjoiltavaksi. Heroku on siitä vänskä palveluntarjoaja että sieltä saa ilmaisella jäsenyystasolla jo jonkun verran prosessoriaikaa, ja resursseja – samoin kuin Google App Enginestä (ainakin aikoinaan).

Homma ei mennyt ihan heittämällä, joten kirjailen taas vähän kokemuksia ja säätöjä tähän. Omassa tapauksessani muutama kiemura johtui siitä että olin yhdistänyt sekä Javaa että Angularia samaan pakettiin – ja Heroku parka meni sekaisin sen suhteen mitä pitäisi buildata ja miten. Muuten Spring Boot + Heroku on taivaassa tehty liitos, mahtava yhdistelmä!

Mitä tarvitaan/esivalmistelut:

– Yksi Spring Boot sovellus, jossa esim. In-Memory tietokanta ja AngularJS UI sisään paketoituna – ei niin välttämätöntä, mikä hyvänsä Spring Boot käy lopulta, mutta kannat vaativat toki esim extratyötä

– Projekti pitäisi olla git versioitu, se tekee heroku käytön suorastaan naurettavan helpoksi

– Tietty Heroku free tier tunnukset tarvitaan, ja ne tulisi olla tiedossa

– Heroku Toolbelt asennettuna omalle käyttöjärjestelmällesi

– Pientä lisäjännää: Haluat ehkä lisätä bower_components tyyppiset vendor javascript kirjastot gittiin, koska jos buildaat projektin Java builderillä, mitään automatiikkaa javascript/angular puolelle ei ole, eli sen mitä lähetät Herokuun tulisi olla joko Mavenin kautta buildattua automaattisesti, tai sitten esirouskuteltua staattista sisältöä. bower_components pusku gittiin on muutenkin paras käytäntö koska ulkomaan repositoryt tai interweb eivät noin muutenkaan ole aina buildatessa saatavana, joten näillä mennään!

Ja sitten touhuamaan. Aluksi kannattaa lisätä projektiin muutama tiedosto, ellei niitä jo ennestään löydy. Tarvitset settings.properties tiedoston, Procfile tiedoston, ja application.properties tiedoston. Näistä kaksi ensimmäistä liittyy Heroku-alustaan, ja viimeinen on Spring Boot standarditiedosto – joka on luontevaa tallettaa /config kansioon.

Tässä niiden sisältö:

  • /settings.properties (asettaa JDK versioksi 8)
    • system.properties=1.8
  • /Procfile (kertoo mikä sovellus ja mistä käynnistyy)
    • web: java $JAVA_OPTS -jar target/*.jar
  • /config/application.properties (määrittää käyttäämän serveriporttina PORT ympäristömuuttujaa, tai 8080 jos sitä ei löydy)
    • server.port: ${port:8080}

Näistä tosiaan application.properties saattaa olla jo tehtynä, ja voi olla muussa kansiossakin, eli ole tarkkana. Se on Spring Boot perustiedostoja.

Nyt voidaan alkaa touhuamaan. Lisää kaikki edellämainitut git repositoryyn, commitoi, ja jatka näillä Heroku komennoilla:

  • heroku login (tänne sitten tunnareita ja salasanaa Herokun mukaan)
  • heroku create (luo sovelluksen, ja käytännössä määrittelee uuden remote repositoryn nimeltä heroku)
  • heroku buildpack:set https://github.com/heroku/heroku-buildpack-java (asettaa builderiksi juuri Java, eikä esim. NodeJS tms)
  • heroku ps:scale web=1 (asettaa käyttöön yhden dynon, ellei ole jo – nyt on resursseja ajamaan sovellusta)

Voiton puolella jo! Nyt voidaan puskea sovellus herokuun, tähän tapaan:

git push heroku master

Seuraa tarkkaan ilmoituksia mitä näkyy – etenkin jos virheilmoituksia ilmenee. Jos kaikki sujui hyvin, voit nyt avata sovelluksen:

heroku open

Toimiko? Onnittelut! Jos ei pelannut, tässä muutama debugging niksi:

  • Tarkista Heroku logit komennolla: heroku logs –tail
  • Tarkista web dynojen status komennolla: heroku ps

Huomioi että jos dynoja on vain yksi käynnissä, Heroku nukuttaa sen jos tuntiin ei ole ollut käyttöä. Näin ollen se käynnistyy hitaanlaisesti kun sitä taas tarvitaan. Tämän voi kiertää laittamalla kaksi dynoa – tai enemmän:

heroku ps:scale web=2

Huomaa että free tier antaa vain 750 dyno-tuntia, joten kahden dynon voimalla ei piisaa tehoja kuin puoleen kuukauteen ilmaistasolla. Muista myös sammutella dynot kun et niitä enää tarvitse, komennolla:

heroku ps:scale web=0

Näin! Spring Boottia voi siis tunkea Raspberry Pi kakkoseen, tai pilveen. Vaikuttaa aika toimivalta alustalta nykymuodossaan.

Tässä hyvä linkki myös artikkeliin jossa käsitellään Heroku multi-buildpack strategiaa – eli miten voit buildata sekä Java että JavaScript puolen erikseen sillä suunnalla.

https://devcenter.heroku.com/articles/using-grunt-with-java-and-maven-to-automate-javascript-tasks

Itse käytin joskus aikanaan Eirslett Maven-Grunt pluginia, joka osaa imaista node, npm, bower jne työkalustot paikallisiksi ja käyttää niitä projektin alta – mutta se oli aika monimutkainen ja kömpelökin ratkaisu. Monella on tarpeista riippuen ollut menestystä myös ihan exec-maven pluginin kanssa javascript prosessoinnissa, mutta sen ongelmana on että node pitäisi olla koneeseen asennettuna etukäteen.

Mainokset

Java 8 Optional – oikea käyttö

Olen käytellyt Java 8 versiota tuotannossa jo useammassa paikassa yli vuoden verran, mutta Optional luokasta en ole kirjoitellut – enkä suuremmin käyttänyt. Olen kuitenkin suuri NullPointerException:ien vihaaja (emmekö me kaikki) ja olen aiemmin vähennellyt niitä lähinnä hyvillä paluuarvo ja parametrikäytännöillä. Tämähän on yleisimpiä ja viheliäisimmin metsästettäviä poikkeuksia Javassa – kiitos poikkeuksien kuplimisen.

Syy miksi en ole kirjoitellut tai käytellyt Optionalia vielä on että esimerkit joita olen nähnyt sen käytöstä ovat olleet surkeita. Kun Javan päälle laastarilappu-liimataan uusia piirteitä, käy usein niin että lääke on sivuvaikutuksiltaan pahempi kuin alkuperäinen sairaus. Ja Optional-paluuarvon tarkistaminen if-lauseilla on juuri sitä. Hyi!

Nyt näin kuitenkin ihan virkistävän uuden blogipostauksen jossa muistuteltiin muistakin tavoista. Teen myöhästyneen uudenvuodenlupauksen testailla näitä itsekin, ja katsoa tykästynkö. Ideana on korvata Optional-arvon tarkistus ehtolauseessa sen omilla funktioilla ja ominaisuuksilla, ja näin saada koodista luettavampaa silti säilyttäen fiksumpi null pointer käsittely.

Ytimessään idea on tässä:

Optional<String> result = service.find("id");
final String value = result.orElseGet(() -> "<absent>").trim();

Tämä on jo itselle ihan sopiva tapa, pystyn lukemaan sen. Artikkelin kirjoittajalla oli toinenkin idea, joka koski Optional käyttöä kokoelmana, näin:

Optional<String> result = service.find("id");
String value = result.map(String::trim).orElse("<absent>");
Tästä en ole ihan varma, jotenkin häiritsee ajatus että vedetään collections apit hatusta mukaan, mutta kiitokset luettavuudesta saa tämäkin.
Artikkelin kirjoittajalla oli pari muutakin hyvää pointtia, joten en ala kopioimaan niitä tähän vaan pidetään tätä artikkelia teaserinä. Jos mielenkiinto heräsi, kipin kapin lukemaan alkuperäinen artikkeli tuosta alta 😉

Ja artikkelin lähde:

https://www.voxxed.com/blog/2015/02/defence-java-8s-optional-use/

Raspberry Pi 2 kotiutui

Posti toi mukanaan paketin, jossa oli uudentuoksuinen Raspberry Pi 2 kapistus. Sille löytyykin heti käyttöä, mutta maltoin napsia pari kuvaa ja jaan vähän ensivaikutalmia tässä. Pahoittelen kuvien Nexus 6-laatua, liikkeellä on paljon laadukkaampaakin kuvitusta 😉

Raspberry Pi 2

Kuten on toitotettua, laite on aiempaa moninkerroin tehokkaampi, 900MHz quad core prosessorilla varustettu, ja kuitenkin alkuperäisen hintainen. Muitakin muutoksia löytyy rautapuolelta.

USB portteja on nyt kahden sijasta hubitettu neljä, ja muistikorttikin on pienentynyt MicroSD-kokoon.

USB Portit

Muistikortit

Komposiittivideo löytyy nykyään audioportista. Muuten tutun kaltainen kapistus. Jaahas, ei sitten muuta kuin käyttistä kortille.

Nyt on valinnanvaraa taas hiukan enemmän. Itse olen tykästynyt ennestään Raspbianiin jossa tulee Oraclen Javaa heti mukana hard floatilla. Mutta tarjolla myös mm. Snappy Ubuntu Corea, Pidoraa, Noobsia, Risc OS:ia, ja tietenkin se Windows 10.

Mutta mennään Raspbianilla vielä toistaiseksi, pari projektia mielessä sen päälle. Ja sinne plutkahti perus-käyttöönoton päälle vanha tuttu Java 8 (kuuluu nykyään distroon, ei vaadi sen enempää), ja uutena tulokkaana node.js, npm, sekä mongodb. Hassua kyllä nämä viimeisimmät vaativat erityisvimpautuksia raspbianiin – mutta eivät toki kovin ihmeellisiä. Tahkosin toimivat komennot scripteinä talteen – postailen ne ehkä vastaisuudessa tännekin. Tässä on vähän varaa valita haluaako kääntää itse vai käyttää muiden tekemiä 3rd party paketteja. Mongon kääntäminen ja asennus vei viimeksi tunteja (siinä muuten hyvä benchmarkki uudelle) joten tuikkasin 3rd party paketeista kaiken kehiin.

Tästä kuuluu ehkä vähän lisää joku toinen kerta 😉

Android Wear, Moto 360

Vaihteeksi Gadget blogi. Tulin hommanneeksi joku viikko takaperin uuden kellon.

Moto 360 pakkaus

Hauskasti aikanaan pidin älykelloja todella typerinä ideoina – mielessä vielä elävästi 80-luvun ritariässä ja laskinkellohirvitykset. Itse olin innoissani Google Glassista – ja olen vieläkin – jahka se inkarnoituu uudestaan. Jossain vaiheessa kun kuulin kellojen spekseistä vastahakoisuus muuttui varovaksi kiinnostukseksi. Päädyin tuohon Moto 360:seen ihan silmät avoinna early adopter-hengessä tietäen että ensimmäinen sukupolvi näitä laitteita lienee täyttä sukkaa. Mutta jos kukaan ei niillä leiki ei seuraavia sukupolvia tulekaan 😉

Joten Moto 360. Kellon piti olla pyöreä, ja joskin motossa on surkea akkukesto ja köyhempi suoritin kuin kilpailijoissa, tykkäsin lookista, ja langattomasta latauksesta. Valinta oli itselle aivan selvä.

 

 

Kelloa ja taulua

 

No mitä tämä härveli sitten tekee? Näyttää ajan – jos akkua on jäljellä. 😉 Ehkä tällä hetkellä itseä innostavin osa on kellotaulut, joita voi vaihtaa fiiliksen mukaan, omassa valikoimassa on informatiivista ja modernia, klassista, armeijahenkistä, ja scifiä. On analogista ja digitaalista, spartalaisen pelkistettyä ja aivan kahjoa. Ja jahka ehdin, koodaan vielä omankin.

Toiseksi paras juttu on notifikaatiot kellossa. Puhelinta tulee aidosti otettua vähemmän ulos taskusta. Kello myös käyttää värinää kun jotain mielenkiintoista tapahtuu, esim. email, facebook, tekstiviesti, tai vaikka navigaattorissa käännös lähestymässä. Pidän yleensä puhelinta äänettömällä päiväsaikaan, kun kello notifioi.

Muuta kivaa löytyy esim. säätiedot kellossa, askel ja sykemittaus (joka voisi tosin olla tarkempikin) Google Fittiin ja vastaaviin yhdistettynä. Itselle kiva keksintö on myös kameran etälaukaisin, joka toimii ihanan automaattisesti. Mahdollistaa selfiebelfiewelfiet.

 

 

Moto 360 kellonaJep, ilmankin pystyisin elämään mutta hauska vekotinhan tämä on ja säästää itsensä takaisin jo niinä lukuisina kelloina mitä en nyt sitten osta joka viikko kun haluan vaihtaa lookkia. Akkukestokin on parempi kuin on peloteltu, toistaiseksi – kestää omaa aktiivikäyttöäni hyvin iltaan saakka ja tarvittaessa latautuu työpaikalla langattomassa dockissa. Tosiaan seuraava askel: Watch facejen koodaus.

Uusi vuosi, uudet kujeet

Aloitin Helmikuun alusta uudessa työpaikassa Solita nimisessä firmassa. Ainakin toistaiseksi pitänyt kiirettä sen verran että henkilökohtaiset bloggailutkin ovat jääneet takasijalle.

Muutamia juttuja on kuitenkin jäänyt mieleen pidemmältäkin ajalta kokeilluista. Ensinnäkin Spring Boot alkaa viimeinkin vakuuttaa. Kun viimeksi sitä kokeilin, se veti liiankin vahvasti Spring rajapintojen varaan, mutta nykyisellään se tukee kiitettävästi EE standardeja, tehden esim. sovellusten migraatiosta tai standardimaisuudesta huomattavasti helpompaa.

Angular on versiossaan 1.3 varsin mukava paketti, vaihteeksi on taas hetken aikaa kaikki pyörinyt kitkattomasti sen puitteissa. Mielenkiintoista nädä miten versio 2 laskeutuu – itsellä on melko dramaattisen kahtiajakautuneet ajatukset sen osalta. Ehkä aika vilkuilla markkinoilta vähän muitakin kandidaatteja..

Ai niin, otin rohkeasti haasteen vastaan ja työkoneekseni Macbook Pro mallin – OS X on nykyalustoista viimeinen joita en läpikotaisin tunne, en oikeastaan alkuunkaan, joten tästä alkaa tutkimusmatka tuntemattomaan. Ensivaikutelmat ovat hyvinkin positiiviset – rakastan etenkin sitä että alta löytyy terminaali ja komentorivi, jossa asiat oikeasti toimivat. Yosemiten kanssa on ehkä vielä pari pilkkua viilaamatta mutta devaajakoneeksi se on kova. Homebrew hoitaa loput tarvittavat paikalleen. Tässä on vaarana että hetken päästä en pysty enää unissani koodaamaan Windows-shortcuteilla.