Java 8 vs Scala Lambdat bytecode tasolle

Java 8 julkaistiin pitkän odottelun jälkeen, ja viimein kieleen saatiin Lambda lausekkeet – sekä niitä hyödyntäviä rajapintoja aikaiseksi. Monessa muussa kielessä Lambdat ovat olleet jo pitkään, ja voidaan ehkä sanoa että Scala popularisoi ne. Jäin miettimään onko Java ja Scala lambdatoteutuksissa eroja bytecodetasolla, molemmat kun ovat käännettäviä kieliä. Törmäsin kiintoisaan artikkeliin:

 

http://www.takipiblog.com/2014/01/16/compiling-lambda-expressions-scala-vs-java-8/

 

Aikanaan kun Scala tehtiin, kieleen lisättiin monenlaisia rakenteita jotka toteutetaan aika rajulla bytecode teurastuksella. Esim. funktio ilman luokkaa ei ole Javassa ollut mahdollinen, joten Scalassa on luotu keinotekoisia luokkia jos johonkin väliin. Lopputulos on kielen osalta hieno ja innovatiivinen mutta bytecode tasolla vähän purkkaviritystä.

Java 8 toteuttaa Lambdat käyttäen Java 7:ssä lisättyä uutta bytecode tason piirrettä nimeltä invokevirtual. Näin vältetään purkkaviritykset väliin, ja funktio voidaan luoda sellaisenaan. Syntyvä bytecode on paljon mutkattomampaa. Suorituskyvystä ei artikkelissa puhuttu mutta voisin arvata että senkin suhteen Java 8 vetää pisteet kotiin.

Eli koska rakastan kovasti Scala kielellä koodailua – se tuntuu raikkaan keväiseltä hengähdykseltä – tässä toivelista Scala piirteille joita pitäisi ottaa kiinni:

– Sama optimointi: Käytetään Java 7 invokedynamic piirteitä

– Samantien voitaisiin toteuttaa vähäisemmät Java 7 Coin piirteet: binääriliteraalit, try-with-resources (AutoCloseable), alaviivat numeroiden ryhmittämiseen (tämä ei ehkä onnistu ollenkaan koska villikortti), jne.

Mainokset

MongoDB Raspberry PI:ssa

MongoDB käännetty, asennettu ja testattu RaspBerry PI:ssa (Kotiserveri Glassfish + EE 7 + Java 8 + MongoDB projekti).

Seurasin ohjeita seuraavista blogeista yhdistellen:

http://c-mobberley.com/wordpress/2013/10/14/raspberry-pi-mongodb-installation-the-working-guide/

http://ni-c.github.io/heimcontrol.js/get-started.html

Toisesta myös Node.js apuja. Joka tapauksessa, hyödyksi on että koneessa oli 512 megaa muistia, hyvä sammutella muistisyöpöt prosessit käännösten ajaksi ja varata tosiaan tunteja aikaa.

Kuva

Sitten katsotaan miten EJB paukuttelee ajastuksia ja logituksia Mongoon. Oisko tämä Big Datan vastakohta? 😉

Java 8, Eclipse, IntelliJ, Netbeans 8 – kaikki ulkona

Jep, eilen tuli Java 8 release valmiiksi ja jakoon,se lopullinen versio. Se jossa on lambdoja, oletustoteutuksia rajapinnoissa, kokoelmat pistetty uusiksi, päivämääränkäsittelyt pistetty taas kerran uusiksi.Se kauan odotettu vastine Scalalle, josta olen bloggaillut jo aiemmin.

Omalta osalta tässä ei ole mitään järisyttävää, Java 8 release candidatet ovat itsellä pyörineet tuotannossa kera Glassfishin ja MondoDB:n jo kuukausia, ja kehitysympäristössä se on ollut oletuksena pidempään. Kuitenkin vaikuttaa että ihmiset ovat olleet sormi  liipasimella jo hetken, sillä samalla siunaamalla paukahti release versioita kaikista suosituista IDE:istä, ja lukuisia artikkeleita kasiversiosta.

Eli nyt sitä saa. Ja tässä linkityksiä:

Java 8:
http://www.oracle.com/technetwork/java/javase/downloads/index.html

Netbeans 8:
https://netbeans.org/

Eclipse with Java 8 (Luna, Kepler with SR2):
https://www.eclipse.org/downloads/ ja https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler

IntelliJ IDEA 13.1:
http://www.jetbrains.com/idea/

Eli, kimppuun vain ja hauskaa pitämään! Tieturilla on tietysti myös koulutusta tarjolla, http://www.tieturi.fi/kurssit/kurssi.html?course=85000345

 

 

Java 8 ja Glassfish 4 Raspberry Pihin

No niin, olen taas ollut Cyberhome-projektin parissa, eli tietotekniikkaa omaan kotiin. Projekti etenee laiskasti kun vapaa-ajalla ei jaksa/pysty/huvita ihan kaikkia iltoja koodailla ja säätää. Mutta eilen tuli vähän läpimurtoa taas Raspberry Pi (raspi) minitietokoneen osalta – siitä ja sen serkuksista on tarkoitus tulla autonomisen mutta tarvittaessa mobiilisti ohjattavan kodinohjausjärjestelmän aivot.

Raspberry Pi ohjaa kotia

Raspille on paljon artikkeleita pythonille, mutta päätin tapella siihen sensijaan Java-puolen kuntoon. Jotta saadaan vaikeustaso kohdalleen, uusimman release candidate version Java 8 versiosta. Siinä ei ollut sinällään mitään ihmettä, pudottelin Hard Float version JDK 1.8:sta arm prosesorille, purin sen /opt alle, fiksasin linkit ja ympäristömuuttujat, ja nyt pyörii Java 8 – ja lambdat ja streamit – täysimuotoisena.

Seuraava etappi oli Glassfish 4. Siihen oli yllättävän paljon ohjeistusta, mutta pääosin vain tiputin sen paikalleen /opt alle, ja säädin vähän muistia ja timeout arvoja, tähän tapaan:

<jvm-options>-XX:MaxPermSize=96m</jvm-options> 
 <jvm-options>-XX:PermSize=32m</jvm-options> 
 <jvm-options>-Xmx128m</jvm-options>
<thread-pool name="admin-thread-pool" max-thread-pool-size="50" max-queue-size="256" idle-thread-timeout-seconds="3600"></thread-pool> 
 <thread-pool name="http-thread-pool" idle-thread-timeout-seconds="3600"></thread-pool> 
 <thread-pool name="thread-pool-1" max-thread-pool-size="200" idle-thread-timeout-seconds="3600"></thread-pool>

Jep, se ei ole nopea, mutta se toimii. Full Java EE 7 Stack, plus uudet Java 8 piirteet.

Tämän päälle rojautin sinne MySql ajurit ja kannan. Ja asensin sen automaattikäynnistyväksi ajamalla Glassfish työkalun asadmin create-service. Tässä tulikin pikku pulma. Glassfish käynnistyi kyllä ajamalla sudo /etc/init.d/GlassFish_domain1 – kuten pitääkin. Mutta ei toiminut buutatessa automaattisesti.

Pikkasen yömyöhän kokeilemisen avulla löytyi ongelma yllättävästä päästä – tuossa Glassfish scriptissä tulisi olla oikeanlaiset headerit, ilman niitä se ei asennu palveluksi. Lisäsin sinne seuraavaa ja se alkoi toimimaan:

### BEGIN INIT INFO
# Provides: Glassfish
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO

Sitten tuunasin vielä Netbeansin lähettämään työn alla olevat softat suoraan sftp:llä Glassfishin autodeploy-kansioon. Tästä oli hyvät ohjeet ant:lle, mutta halusin tehdä saman Mavenillä – ja pikku säätelyn jälkeen sekin onnistui. Se osuus taas näyttää tältä:

<build>
 <plugins>
<plugin>
 <artifactId>maven-antrun-plugin</artifactId>
 <executions>
 <execution>
 <phase>install</phase>
 <configuration>
 <tasks>
<echo level="info" message="Copying dist directory to remote Pi"/>
<exec executable="d:/utils/pscp.exe" dir="${basedir}">
<arg value="target/${project.build.finalName}.${project.packaging}"/>
<arg value="pi@raspissh:/opt/glassfish4/glassfish/domains/domain1/autodeploy"/>
</exec>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Ja nyt on homma aika saumatonta. Tuo ylläoleva toki vaatii lisäksi oikeat työkalut, omassa tapauksessani putty-kirjaston ohjelmistoja, ja tuo raspissh avain pitää luoda ja asentaa paikalleen raspiin jotta salasanoja ei tarvitse kirjoitella vaan autentikointi hoituu lennossa avaimilla.

Päräytin varhaiskokeiluna Java EE 7 mukaisen REST palvelun joka käyttää Pi4J kirjastoa ja kääntää releitä ja kytkimiä ja ledejä päälle ja pois. Siihen päälle HTML5+JQuery käyttöliittymä joka niitä JSON komentoja heittelee sisään ja ulos. Alkaa näyttämään hyvältä. Kiitos Mavenin voin pajautella muutoksia vaikka tekstieditorilla ja asentaa uuden softan komentoriviltä.

Jahka saan vielä paketin vahvavirta-releitä ja vähän konsultointiapua, kodin automaatio etenee taas pykälällä. Tarkoitus on mm. ajastaa lämmitystoimintoja älykkäämmin säilyttäen silti override-mahdollisuudet mm. kännykällä ja ihan vanhanaikaisella Big Red Button(tm):lla.

Tässä pari vinkkiä mistä oli itselle säätäessä apua (mikään ei tietysti toiminut heti heittämällä kuin Strömsössä):

http://www.thehecklers.org/2013/10/27/glassfish4-raspberrypi/

http://blog.c2b2.co.uk/2013/06/getting-started-with-glassfish-4.html

https://blogs.oracle.com/speakjava/entry/integrating_netbeans_for_raspberry_pi