onsdag 7 maj 2008

JavaOne 2008, dag 1, 6:e maj 2008

Första JavaOne-dagen startade som sig bör med ett stort allmänt pass, en ”general session”, där Suns ledning presenterade var de anser att Java är idag samt vilka idéer de har för hur Java ska utvecklas i framtiden. Det uttalade målet är att Java ska nå alla enheter, devices, såsom till exempel mobiltelefoner och BluRay-spelare, samt att Java ska nå alla utvecklare och konsumenter. Utvecklarna nås genom att tillhandahålla en tilltalande plattform för utveckling och konsumenterna nås genom att göra det enkelt för dem att använda Java. Som en milstolpe på väg mot det senare målet presenterades det att senaste Ubuntu, 8.04, innehåller en OpenJDK i grundinstallationen. (Nåja, om jag kör /usr/bin/java -version på min Ubuntu 8.04 så får jag fortfarande en GNU libgcj version 1.5.) Att Java kan paketeras tillsammans med en linuxdistribution möjliggörs av att hela OpenJDK-Java nu omfattas av GPLv2-licensen.

Man kan också använda general session-passet för att bilda sig en uppfattning om vad årets konferens har för tema. Det uttalade temat i år är det lagom flummiga Java + YYousom kan tolkas som att den handlar om hur Java påverkar ditt liv i vardagen. De gav många exempel och några demonstrationer på var Java används där man kanske inte väntar sig det, som till exempel i åkkort för kollektivtrafiken eller för styrning och övervakning av industriella processer.

JavaFX presenterades första gången för en större publik under förra JavaOne. Då var det fortfarande till stor del en pappersprodukt, men i år finns JavaFX i en långt framskriden beta, så nu gick att visa betydligt mer av substans. En demo visade en applet som använde JavaFX för att aggregera data från Facebook, Flickr med flera sajter på ett snyggt sätt, där ”snyggt” innebär tungt brukande av olika 3D-effekter. Ett sus gick genom publiken när presentatören drog appleten från webbläsaren och släppte den på desktopen och på så sätt gjorde den till en desktopapplikation som kunde köras även efter att webbläsaren stängts ned. Dra-släppandet möjliggörs av att applet-insticksmodulen i webbläsare från och med Consumer-JRE:n (Java 6.1, förlåt, 6u10) är omdesignad och nu kör appleten i en separat JVM-process istället för, som förut, i webbläsarens process. Omdesignen innebär också att man nu kan köra applets med olika, till och med motstridiga, krav på javaversioner i samma webbläsare. I och med omdesignen och lanseringen av JavaFX menar man att ”Applets are back”. Som sig bör så fungerade inte demon helt smärtfritt utan appleten krashade minst två gånger under den nästan fem minuter långa demon.

En annan viktig JavaFX-relaterad nyhet är att Sun presenterade ett samarbete med företaget On2 som innebär att deras video-codecs kommer paketeras tillsammans med JavaFX, något som länge saknats i javavärlden.

På det hela taget ser det ut som att Sun positionerat JavaFX väl för att bli en Flash-/Air-/Silverlight-dödare. Det återstår bara att se hur verkligheten kommer utveckla sig...

Mot slutet av general session så dök Neil Young upp på scenen och gav Suns ledargarnityr lite rockstjärne-cred. Han berättade om hur hans ambitiösa arkivprojekt gjorts möjligt genom de Java-funktioner som finns i BluRay och visade en lång (och bra) demo över hur han kunde navigera genom den första av fem arkiv-BluRay:er samt hur han kunde komplettera innehållet på skivan med innehåll från nätet om han skulle hitta fler gamla, obskyra inspelningar i framtiden.

Efter det allmänna passet vadade vi genom folkmassan till ett pass med titeln ”Java SE: A youthful maturity”. Där visade Suns Danny Coward vad som hänt i de senare uppdateringarna av Java 6 samt vad som var planerat till Java 7. Tyvärr var han obeskrivligt trist som föreläsare, och passet räddades bara av det mycket intressanta innehållet.

Java 6-uppdateringarna består dels av Consumer-JRE:n, Java 6u10, och dels av stora prestandaförbättringar i JVM:en (mer om dem nedan). Consumer-JRE:n är en nedbantad version av JRE:n som själv kan ladda ned kompletteringar till sig själv om den kör program som behöver API:er som inte följer med i den första, bantade, nedladdningen. Förutom nedladdningsstorleken så har Sun-ingenjörerna arbetat med att få ned JVM:ens kallstartstid, alltså den tid det tar för att starta ett javaprogram i en ny JVM-process. Genom att förladda JVM-data i hårddiskarnas cache så menar man på att man sänkt uppstartstiden till en acceptabel nivå. Det återstår att se hur det hela fungerar i verkligheten när JVM-förladdningen trängs med femton andra XP-taskbar-processer som gör samma sak för Adobe Reader, RealPlayer, etcetera. Rent allmänt tycker vi att en del optimeringsstrategier som de använt framstår som rätt tveksamma och frågan är om inte nackdelarna i form av större komplexitet och högre minnesanvändning överväger fördelarna i form av någon sekunds snabbare uppstartstid här eller någon millisekunds snabbare exekvering där. Ett färskt exempel på där den motsatta strategin; att minska komplexiteten och minnesanvändningen, faktiskt också gett bättre prestanda är Firefox 3. Ett annat exempel är Apple som har upptäckt att de får bäst prestanda i OS X då de ställer in kompileringen för att optimera för låg minnesanvändning. Som en bonus får de också ett operativsystem som inte kräver två gigabyte internminne för att användas.

Den kanske viktigaste nyheten i Java 7, som planeras vara klar sommaren 2009, handlar om modularitet. Moduler föreslås bli en större enhet för att gruppera kod i än de paket som finns idag (och kommer att leva kvar). I och modulernas ankomst introduceras nyckelordet ”module” som kan användas för att göra klasser, interface, metoder eller variabler endast synliga inom sin egen modul, alltså en något mindre publik ”public”. Moduler paketeras sedan i JAM-filer som innehåller information om modulens version samt dess beroenden till andra moduler. Det går kanske att ana några OSGi-influenser här, och det kommer också att återkomma i hur Sun, liksom de flesta andra applikationsservertillverkare, håller på med att göra sina applikationsservrar till OSGi-moduler.

På passet demonstrerades också (gratis-)produkten VisualVM som kan användas för att instrumentera en JVM då den körs och då gör det möjligt att bland annat analysera och felsöka minnesläckor eller titta på vad olika trådar gör. Den verkar vara väl värd att kika närmare på.

Nästa pass vi gick på hette ”Maximizing Enterprise Java Performance on Multi-core Platforms” och hölls gemensamt av Intel och Sun. De har samarbetat aktivt i drygt ett år om att förbättra JVM:ens prestanda på Xeon- och Itanium-processorer. Antagligen kommer prestandaförbättringarna också oss till gagn som kör vanliga Core2-processorer med, men de pratade bara om Xeon, gissningsvis för att hindra oss från att springa iväg och köpa för billiga servrar.

Den statistik över prestandaförbättringar de kunde visa upp var imponerande. Det såg ut som att det fanns stora prestandavinster att göra då de anpassade JVM:en till hur en dator med Intelprocessor och -chipset faktiskt fungerar. (Motsvarande anpassningar har antagligen också gjorts till AMD-chip, vi får säkert anledning att återkomma till det.) Mycket av det de gjort finns med i senare uppdateringar av Java 6, men mycket har också släpps i en speciell prestanda-version av JVM:en, Java 6u5p, som finns att ladda ner från Sun. Tanken är att arbetet som gjorts där ska hitta in i vanliga Java 6.

Så länge man som programmerare följer vanliga best practices, såsom att allokera variabler i så litet scope som möjligt (hellre lokala variabler i en metod än instansvariabler, till exempel) samt att minimera mängden data som delas mellan flera trådar, eller snarare, som kan skrivas till av flera trådar, så får vi prestandaförbättringarna gratis. För den som vill krama ur ytterligare prestanda ur en applikation så finns det många JVM-flaggor att leka med.

Nästa pass var ytterligare ett allmänt pass, denna gång med titeln ”Java-centricity: Leveraging Java technology at the hub of your digital life”. Där presenterades kommande nyheter i Java EE, Java SE och Java ME.

Den stora Java EE-nyheten handlade om hur man försöker dela upp Java EE i profiler, alltså i olika varianter som möter olika behov, till exempel webbapplikationer eller, kanske i framtiden, telekomapplikationer. Det såg dock ut att bli en lång och krokig väg fram till det att man kunde komma överens om exakt vilka API:er som skulle ingå i vilka profiler, så det återstår att se om vi får några profiler redan i Java EE 6.

Bland Java EE-nyheterna presenterades också det nya JAX-RS, alltså en motsvarighet till JAX-WS för att bygga REST:iga webbtjänster. Tanken är liknande den hos JAX-WS, att man annoterar sina klasser med publiceringsinformation, och sedan tar applikationsservern hand om att göra en, i det här fallet, REST-webbtjänst av den. Precis som i JAX-WS så sopas dock de XML-dokument som skickas under mattan till förmån för automatiska serialiserare, så vår prognos är att JAX-RS kommer att bli lika kass som JAX-WS. Tyvärr.

Ett tema för Java EE-utvecklingen är fortfarande att det ska bli enklare att Java EE-utveckla. I praktiken betyder det att mycket av det som finns i, till exempel, web.xml kan ersättas med annotations, helt i konflikt med principen om ”separation of concerns”, eller om man vänder på det, helt enligt ”kiss i sängen”-metoden (varmt och skönt först, kallt och jobbigt sen). Sun pratade om att klasser själva kan registrera sig som servlets med context-lyssnare. Något som vi tycker låter jättefarligt inte minst ur ett säkerhetsperspektiv. Det borde öppna för ett helt nytt sätt att kunna skriva elak kod på.

Med andra ord så förutspår vi att det inte kommer hända så mycket av värde i Java EE 6. Vi skulle förstås själva bli glada om vi fick fel, men utsikterna ser bleka ut. Desto mer intressant är den OSGi-ifiering som nu sker av många av de större applikationsservrarna. Den innebär att det kommer bli lättare att skräddarsy en applikationsserver, till exempel Glassfish, för de faktiska behov som föreligger och på så sätt kapa uppstartstider och minnesanvändning.

Till vår stora fasa klev sedan Danny Coward från vårt andra pass upp på scenen för att den här gången ge en halvtimmesversion av samma föreläsning. Intressant? Iallafall mycket, mycket sövande.

Slutet av passet ägnades åt JavaFX. De visade en intressant live-demo där en art director designade ett användargränssnitt i Photoshop och Illustrator och exporterade det som JavaFX-filer. Sedan tog en utvecklare vid och gjorde ett fungerande användargränssnitt av det. Riktigt snyggt, troligen den bästa demon under hela dagen!

Nästa pass var ”Upcoming Java Programming-language Changes” och handlade om framtida ändringar i själva språket Java. Som sagt planeras ett nytt keyword, ”module”, till Java 7. Vis av lärdomarna från ”assertion” och ”enum” så lovade man nu att lägga till det på ett sätt som inte gör att variabler som heter ”module” ger kompileringsfel.

En annan, mycket intressant, nyhet är JSR 308 som handlar om annotations som ger ytterligare information om koden utöver vad nyckelorden gör. Den definierar bland annat assertions såsom @NotNull, @ReadOnly, @NotEmpty och @Immutable. Med hjälp av dem kan man göra Java ännu mer statiskt typat (för den som vill det) och låta kompilatorn hitta ännu fler möjliga fel redan vid kompileringen. De visade siffror på hur många fel de hittat genom att annotera en kodmassa och jämföra antalet hittade fel med hur många fel som FindBugs, PMD och Jlint hittade. Resultatet av deras demo var inte oväntat att annoteringarna sopade mattan med de andra.

Efter ett pass på vi lyssnade på hur virtuella maskiner fungerar och vilka problem som kan finnas med virtuella miljöer bytte vi spår helt och tog oss till ett pass med den långa titeln ”Lightweight UI Toolkit for the Java ME Platform Making Compelling Java ME UI:s Easy”. Den verktygslåda som de presenterade, LUWIT, är designad för att fungera ungefär som Swing, fast istället skapa användargränssnitt för mobiltelefoner. En demo visade hur de kunde skriva ett UI som de sedan visade på ett antal olika telefonmodeller. Generellt såg det snyggt ut, speciellt ett tilläggsprogram för att bygga teman. De har även lagt in stöd för att få till vissa 3D-effekter även på telefonmodeller som inte stödjer 3D i grunden.

Vi avslutade, rejält trötta, en lång dag med att gå på ett Birds-of-a-feather-pass (en BOF) av och med Greg Wilkins, mannen bakom webbservern Jetty. Han hade också ett par kollegor med sig på scenen, men de fick knappt en syl i vädret. Han berättade om vad de gjort i Jetty 6.1 samt om vad de planerar att göra till Jetty 7.

Jetty 7 kommer implementera Servlet API:t, version 3 så fort som det blir färdigt. I det ingår suspend och resume för att parkera och återuppta servletanrop under tiden som servletapplikationen självt väntar på data, kanske under ett asynkront anrop till en extern resurs. På så sätt kan man hantera många, samtidiga anrop utan att låsa upp ett lika stort antal trådar. Helt plötsligt blir det möjligt att till exempel implementera en effektiv HTTP-proxy i Java.

/Fredrik Stålnacke och Kalle Gustafsson, Omegapoint

Inga kommentarer: