Spring kirjastot Maven riippuvuudet

Spring sivuja oli taas muutettu, ja nyt on saatu suorastaan mahdottomaksi päästä enää .jar paketteihin fyysisesti suoraan käsiksi joten alkaa olla aika jolloin Maven on ainoa vaihtoehto saada Spring kirjastot käsiinsä. Se taas edellyttää että on opiskellut Mavenin toiminnan ja tulee sen kanssa toimeen. Ja repositoryt ovat hallussa.

Joka tapauksessa, tässä lista Spring riippuvuuksista sen mukaan mitä mihinkin tarvitaan, ja näppärä niksi jolla voi kerralla hoitaa versiot. Idea ei ole mitenkään oma mutta pistän sen muistiksi tähän. Perusliikkeellelähtöprojektiin riittää seuraava (pom.xml:ään):

<!-- Shared version number properties -->
<properties>
  <spring.version>3.2.4.RELEASE</spring.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
  </dependency>
</dependencies>

Tuo auttaa alkuun mutta ei riitä loputtomiin, vaan lisää riippuvuuksia tarvitaan, tilanteen mukaan.  AOP vaatii seuraavat kirjastot edellisten lisäksi:

<!-- Spring AOP dependencies -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>${spring.version}</version>
</dependency> 

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.6.11</version>
</dependency>

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.6.11</version>
</dependency>

Tietokanta vaatii ajurin lisäksi:

<dependency>
  <groupId>commons-dbcp</groupId>
  <artifactId>commons-dbcp</artifactId>
  <version>1.4</version>
</dependency>

JPA Hibernatella vaatisi ainakin seuraavaa:

<!-- ORM Dependencies -->

<dependency>
  <groupId>org.springframework</groupId>
   <artifactId>spring-orm</artifactId>
   <version>${spring.version}</version>
</dependency>

<dependency>
  <groupId>org.hibernate.javax.persistence</groupId>
  <artifactId>hibernate-jpa-2.0-api</artifactId>
  <version>1.0.1.Final</version>
</dependency>

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>4.2.6.Final</version>
</dependency>

Mutta kaikki riippuu tilanteesta. Ei kannata lisätä riippuvuuksia ellei niitä tarvita, eli jos koodi kääntyy ja ajaa. Monessa Spring kirjastossa on jo mukana riippuvuudet ulos, esim. Spring core sisältää commons-logging kirjaston, spring context sisältää mm. spring-aop, spring-beans, spring core, ja spring-expression kirjastot. Näiden mukana taas tulee mm. aopalliance.

Joskus on tarpeen määrittää itse näitä kirjastoja ihan versionumerokonfliktien vuoksi, päätasolle. Ja jos kirjastot ovat samantasoiset, Mavenhan viime kädessä valitsee version esittelyjärjestyksen mukaan. Johon ei pitäisi koskaan joutua menemään.

Jos ajaa web-asioita Tomcatissa, JSTL kirjastot saa esim. näin. Tässä esimerkissä näkyy myös miten voi estää alipakettien (johdettujen riippuvuuksien) tuonnin, jos esim. serverillä on jo servlet ja jsp-kirjastot:

<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>jstl-impl</artifactId>
  <version>1.2</version>
  <exclusions>
    <exclusion>
      <artifactId>servlet-api</artifactId>
       <groupId>javax.servlet</groupId>
    </exclusion>
    <exclusion>
      <artifactId>jsp-api</artifactId>
      <groupId>javax.servlet.jsp</groupId>
    </exclusion>
  </exclusions>
</dependency>

Huom! Muista että Maven käsittelee resurssi ja lokalisointitiedostoja eri tavoin kuin normaali Eclipse projekti- niille on oma paikkansa, ja se on src/main/resources  – jos laitat .properties tai .xml tiedostoja java-lähdekoodin sekaan ne eivät ajon aikana toimi oikein. Heti kättelyssä hyvä pistää log4j.properties paikalleen.

Linkki Spring oppaan liikkeellelähtö-ohjeisiin:

http://projects.spring.io/spring-framework/

Linkki jossa selitetään kaikkien kirjastojen käyttötarkoitus:

http://spring.io/blog/2009/12/02/obtaining-spring-3-artifacts-with-maven/

Google Play ja 16000 biisiä

Jep, tämä päivitys ei koske mitään omia ohjelmointiprojekteja tai työasioita vaan ihan vapaa-aikaa ja sen laatua. Olen aina pitänyt erityisesti musiikista, se vei aikanaan dj-hommiinkin ennen nykyistä uraa. Sen seurauksena on kertynyt mittava arkisto kaikentyylistä musiikkia, aikanaan digitoin ihan jokaisen cd-levynikin ja jopa vinyylit että niitä on helpompi käsitellä.

Nyt Google Play avasi Suomenkin nurkilla musiikkipalvelunsa jonka seurauksena latailin tietysti kaikki biisini palveluun. Nyt pystyn sieltä striimaamaan musiikkia ja soittolistoja fiiliksen mukaan missä vain missä on verkkoyhteys, mihin vain laitteeseen joka juttelee Playn kanssa.  Ja niitähän piisaa.

Kun tämän yhdistää uuden auton audiojärjestelmään, Ford Synciin, joka kytkee bluetoothilla iloisesti taskussakin olevan kännykän ohjausratin ohjaimiin, on autolla mukavampaa ajella kuin koskaan. Sync on yllättävän hyvä kapistus ja juttelee Samsung S3 Android kännykän kanssa kivuttomasti. Myönnettäköön että olisi hienoa kun biisien navigointi olisi monipuolisempi, mutta toimii sentään eteen, taakse ja volyymi hienosti ja langattomasti, ja jos joku sattuu soittamaan, autoon integroitu hands free astuu peliin ja musa häviää taustalle.

Ei ollut automainos, eikä Googlen mainos, mutta tämän myötä ajelusta on tullut huomattavasti hauskempaa kuin cd-levyrumban aikaan. Tykkään nykyteknologiasta joka toimii ja antaa jotain uutta. Tämä pistää myös miettimään yhtä asiaa…

Mitä kaikkea helkkarin scheissea on tullut vuosien saatossa kerättyä musakokoelmaan 😉

Screenshot 2013-10-23 19.55.41

Liikettä, Lambdaa ja JavaFX:ää

Ei kai sitä oikea propellihattu olisi jos ei joskus kokeilisi epävakailla beta-versioilla koodata. Niinpä löysin itseni tilanteesta johon kuului:

-LeapMotion kontrolleri joka mahdollistaa ohjauksen ilmaan tehtävillä eleillä kosketuksen sijasta. Jep, kuten Minority Reportissa 😉

– Java 8 early access versio

– Netbeans 7.4

– JavaFX 8 Developer Preview

Miksi juuri tämä setti? No mehukkaat 3D rajapinnat tulevat vasta JavaFX 8 versiossa joka ei ole vielä valmis. Tällä hetkellä paras alusta kokeilla sitä on Java 8. Jossa sattuu tulemaan myös maukkaat Lambda Expressionit mukana. Netbeans 7.4 tukee jo Java 8 versiota. Kuten myös erinomaisesti HTML5+JavaScript koodausta.

LeapMotion kontrolleri

Joka tapauksessa, LeapMotion kytkeminen tapahtuu USB väylän kautta, ja Java alkaa juttelemaan sen kanssa kun sovellukseen liitetään leapmotion.jar kirjasto, sekä käyttöjärjestelmäkohtaisia dll:iä pari. Tämän jälkeen rajapinta antaa mukavasti tietoa siitä mitä mokkula havainnoi n. metrin pallossa ympärillään. Sen verran tarkkaa on että esim. sormien lukumäärä voidaan lukea, erilaiset eleet ja tietysti käsien ja sormien koordinaatit kolmiulotteisessa avaruudessa.

JavaFX 8 käyttöönotto vaati hieman enemmän vaivaa, mutta selvimmin homma toimi tosiaan asentamalla Java 8 early access, jossa nuo JavaFX 8 kirjastot tulevat suoraan mukana, kytkemällä se Netbeansiin, ja valitsemalla Maven arkkityypiksi zenjava javafx maven plugineineen kaikkineen. Samaan Maven pom:iin tietysti riippuvuudet LeapMotion Java kirjastoihin (piti asentaa paikalliseen repositoryyn koska maven centralista ei vielä löydy). Ja lopulta vielä Netbeans run-parametreja muokaten sen verran että Leapmotion .dll tiedostot tulevat mukaan.

LeapFX8a

Mutta nyt toimii. Ajattelin kirjoitella yksittäisen prototyypin ensin selvittääkseni mihin laite pystyy ja mitä tietoa sieltä irtoaa. Pistin kolmiulotteiseen avaruuteen Tieturi-logolla varustetun kuulan. Kytkin sen LeapMotion kontrollerin koordinaatistoon käyttäen JavaFX Property Binding metodia. Tässä yhteydessä Java 8 Lambdat olivat maukkaita: JavaFX:ssähän ei mm. saa koskea UI:hin edes property bindingin kautta ilman että operaatio ajetaan osana UI säiettä. Muuten tulee poikkeus. Tässä esimerkkisnippet Lambdoista ja Leapmotion rajapinnasta:

if (!frame.hands().isEmpty()) {
    Hand hand = frame.hands().get(0);
    Vector vPos = hand.palmPosition();
    Platform.runLater(() -> {
        positionX.set(v.getX());
        positionY.set(v.getY());
        positionZ.set(v.getZ());
        rotateValue.set(hand.direction().yaw());
    });
}


Yep, ja positionX, Y ja Z ovat siis JavaFX Bound Property arvoja, joten kun muutan niitä, kuulan ko koordinaatit muuttuvat automaattisesti sen mukaan. Jouduin harrastamaan pientä aivojen rassausta koska Java koordinaatisto alkaa vasemmasta ylänurkasta xy-suunnassa kun taas leapmotion normaalisti vasemmasta alanurkasta. Miten hoidetaan tämä bound propertyillä? Näin:

sphere.translateYProperty().bind(positionY.negate().add(SCREEN_SIZE_Y));

Ja tietysti sama z-koordinaatille, x meni onneksi ihan suoraan. Nyt kuula liikkuu kolmiulotteisessa avaruudessa kun käteni, loittonee, tulee lähemmäs, menee ylös, alas, vasemmalle, oikealle, viistoon, etc. Tottakai pakkaan voi lisätä muitakin asioita kuten ranteen kiertoa, sormien lukumäärää, nopeutta akselilla, jne. Mitä iloa on sitten animoida tekstuurimäpättyä kuulaa 3d-avaruudessa?

Itselleni suurtakin, hauska projekti vaihteeksi kaiken yritys-transaktio-ejb-vakavuuden välillä. Mutta seuraava steppi on kytkeä tuota käyttöön oikeiden sovellusten käyttöiittymiin. Ja kun lempiaiheenani on viime aikoina ollut Business Intelligence, reaaliaikametriikka raportoinnin sijaan, Big Data ja Fast Data, ja oikea ja luotettava tieto liiketoiminnan käyttöön, arvaahan sen mitä siitä syntyy… 😉

Tämä on taas yksi niitä asioita joissa video kertoo enemmän kuin kuva.


KÄYTTÄJÄT ANSAITSEVAT PAREMPIA JA INTUITIIVISEMPIA KÄYTTÖLIITTYMIÄ

Codenvy ja koodausta pilvessä

JavaOne seminaarissa yksi mieleen jääneistä asioista oli Codenvy pilvipalvelu, jossa poiketen monesta muusta tarjolla olevasta, malli ei ole serveri pilvessä, vaan malli on kehitysympäristö pilvessä. Kehitysympäristö joka kytkeytyy tarpeen mukaan erilaisiin alustoihin testausta varten, joiden kautta voi saada mm. Android emulaattoritestausta pilvipalveluna – tai ihan tavallista serveripään kamaa.

IDE pilvessä herätti itselle mielenkiinnon koska se tarkoittaa että taas kerran voi varata kapasiteettia tarpeen mukaan, ja ympäristöjä on helppo monistaa, ne toimivat aina samalla tavalla toisin kuin IDE omassa kannettavassa tai työkoneessa. Ja niitä voi käyttää tabletilla (itse käytän bluetooth näppistä koodatessani).

Olen pystyttänyt muutaman työtilan Codenvyyn, ja tässä on factory jonka kautta niiden pitäisi aueta. Peruskäyttö pilvessä on maksutonta, mutta tuttuun tapaan ruokahalun kasvaessa tulevat maksutkin peliin. Tässä on esimerkki factorystä Spring työtilaan:

Linkki Codenvy Spring-työtilaan

Itse saatan kokeilla jakaa jatkossa koodinpätkiä tätä kautta – saa enemmän interaktiivisuutta aikaan. Osan asioita voi tehdä kirjautumatta, osan voi tehdä luomalla maksuttomat tunnukset kuten itsellä on, ja osa piirteitä aukeaa kaupallisen tilin myötä.

codenvy

Pikkasen kutkuttaisi tutkia mahdollisuuksia myös koulutuskäytössä ympäristönä. Alkaa olla vanhentunutta itse ylläpitää koneita ja ympäristöjä, koodatahan voisi vaikka ipadeillä.. Tai millä ikinä koneella haluaakaan.

Harmi ettei sinne (tietääkseni) saa vielä Java 8 tai Java EE 7 ympäristöjä. Mutta Springilläkin saa monenmoista ja Maven näyttää olevan peruskauraa.

JavaOne seminaarissa oli tosiaan monenmoista pilvipalvelua, pitänee perehtyä myös testauksen palveluihin jatkossa, mutta Codenvyn tutkiminenkin on vielä itseltä kesken. Pidemmän päälle tietenkin kiinnostaa vakaus ja lähdekoodin versionhallinta.

Esineiden Internet

JavaOne 2013 seminaarin yllättävä teema IoT – Internet of Things jäi jylläämään päähän seminaarin jälkeen – eniten ehkä siksi että vaikka olen aina ennustellut monipuolisempien päätelaitteiden tulemista, en ymmärtänyt että sitä ei tarvitse enää odotella – se on jo täällä.

2013-09-23 09.40.24

Mutta näin teema avasi silmät siihen miten IoT on jo läsnä, olemassa, ja sitä käytetään isojenkin yritysten toimesta isoissa asioissa. Sen puitteissa on myös kunnon vanhan ajan innovaatiota, sitä paljon kuulutettua sykettä, ja nykyään on hauskoja aloittelijapaketteja joilla pääsee vauhtiin kokeilemaan ideoitaan. Tässä on vanhaa kunnon propellihattu-menoa. Ja kaiken keskelle Java EE 7 serveri kaikkine hienouksineen. 😉

Itsellenihän jäi seminaarista käteen yksi Raspberry Pi mikrotietokone. Olen sillä hieman jo leikkinyt, mutta ajanpuutteen vuoksi en ole ehtinyt mitään kovin ihmeellistä tehdä. Kuitenkin, tuohon 30$ laitteeseen olen asennellut langattoman verkon ja säätänyt sen toimimaan headless moodissa eli ilman näyttöä, näppistä tai hiirtä, asennellut siihen Java 7 u 40 SE version, ja ajellut PI4J kirjaston avulla ohjelmia jotka käskyttävät myös sitä mielenkiintoista GPIO porttia johon voi kytkeä kaikenlaisia vimpaimia. Ledivalot vilkkuvat jo iloisesti Javan käskemänä. Tilasin jenkeistä Adafruitin servonohjaus-piirisarjan (vielä kun ehtii kolvata) ja muutaman servomoottorin sen puolen testailuja varten.

Raspberry PI GPIO väylä on sen parasta antia

Originaali ajatukseni on ollut että nämä Internetin esineet ovat huokeita ympäristöään aistivia sensoripaketteja – jotka lähettävät aistimansa prosessoitavaksi keskuskoneelle. Osoittautui että ajatus oli varsin vaatimaton. Laitteet toimivat myös toiseen suuntaan, aistimisen ohella osaavat myös vaikuttaa ympäristöönsä. Koska tämä puoli on itselle uudempi, sinnehän pitää sukeltaa. 😉 Kehitysympäristönä Netbeans ja Maven.

Muutakin kiintoisaa osuu silmiin. Eilen verkkokauppa.com julkaisi tarinaa  etäläsnä-olosta myymälässä liikkuvalla robotilla. Selkeää propellihattuhommaa, ja kiintoisaa. IT viikon päivän aihe on tänään: Robottiautot tulevat, lait puuttuvat. VTT:n suunnalta on tullut julkaisua otsikolla: Esineiden ja asioiden Internet- seuraava teollinen murros.

Remote presence robot

Älykkäät serveriin ja toisiinsa kytketyt tabletteja tai edes älykelloja monimuotoisemmat vimpaimet tulevat ja ovat jo täällä. Tulevaisuuden keittiö tarjoaa ruokareseptejä ja apua kokkaukseen. Tulevaisuuden kotisairaala tarkkailee terveystietojasi kotosalla tai toimistossa ja osaa kiinnittää huomion muutoksiin ja poikkeuksiin. Tulevaisuuden auto osaa pysäköidä itsensä ilman että kuski on edes sisässä – tai navigoida ja ajaa itsenäisesti kohteeseensa. Sanoinko tulevaisuuden? Tulevaisuus on jo täällä, kaikki tämä toimii jo nyt. Ne pitää vain pakata 10x pienempään nättiin muovikoteloon ja lyödä hintalappu päälle.

 

(Mutta huoh, se tietoturva!)

Ja tuossa muutama IoT linkki näistä aiheista mistä puhuin, jos joku haluaa seurata polkuja tai vain sivistää itseään uuteen suuntaan 😉

http://www.youtube.com/watch?v=Holq_Oz6T3Q

http://www.itviikko.fi/uutiset/2013/10/14/verkkokauppacom-testaa-robottivierailuja-kaupassa/201314252/7

http://www.itviikko.fi/teknologia/2013/10/15/robottiautot-tulevat-lait-puuttuvat-emme-aio-olla-jarruna/201314258/7

http://www.vtt.fi/files/news/2013/smart_lightning/Esineiden_ja_asioiden_internet_Ailisto.pdf

http://www.tietoviikko.fi/kaikki_uutiset/esineiden+internet+voi+mullistaa+ruuanlaiton/a933023

http://www.cooking-hacks.com/documentation/tutorials/ehealth-biometric-sensor-platform-arduino-raspberry-pi-medical