Selenium - a must for testing web applications


Really simple to use plugin to firefox. Records and validates your webapplication. Tests can be saved, and multiple tests can be saved as a “suite”. Invaluable once you get the hang of it, and once tests are created they make regression testing a breeze..

Javax goes english

Ok, so I spoke with a friend/mediaguru at a wedding recently. Having red my blog, he asked me: “So.. dont the clientel you aim for understand english?!”. Slightly taken aback I couldn´t deny that the computer-geek cathegory, most likely to stumble on javax.se probably would feel more at home with english, regardless of nationality. The thing is, I explained - I didnt go into this “aiming” for a clientel. I just wanted to write about stuff catching my interest for the moment. Partly for myself, to remember, and partly just for the joy of writing/creating somting.

“You do realize you would reach a much wider audiance if you wrote in english?” he pushed it. Of course I realize that, I concurred. The thing is, there is a million java oriented blogs out there, but the swedish community is still quite small and a swedish javablog would be kinda novel. Even as I feebly tried to argue my case, the truth reared it’s ugly head in the back of my mind. It would allways be very akward to write about these things in swedish. Too many concepts and words had no swedish counterparts. At least none that would be understood. This had been one of my major wrestling issues in the posts so far. From that point on, my friend was kicking in open doors. Oh, we spoke about other things, like page ranks and he encurraged me to start twittering to a larger extent, and adding a twitter badge to my page. Internally I vinced at having to translate my few published post, not to mention the huge amount as yet unpublished. Ah well, a great wedding - it’s nice to have a mission. Now I just have to convince Google to let go of Javax.com.., great!

Big thanks to Martin for ideas and Lennart Bong for providing the setting (The latter is blissfully unaware of javax, but was the one getting married and holding the party)

JavaOne 2009

Resan till till San Fransisco gick via Frankfurt och jag hade förmånen att få spendera 12h timmar på väg över atlanten med en ömsom “äventyrlig”, ömsom rasande 1-åring. Det går inte att undgå att imponeras över hur mycket och ihållande ljud en aggressiv ettåring kan generera. Extremt sliten när jag kommer fram - vilket framgår av bilden ovan!

Under måndagen håller Sun en fri “addon” till JavaOne som man kallar för CommunityOne. Här passar man på att annonsera nyheter i Glassfish, Netbeans och andra saker som är mer “Sun specifika”. Trots detta finns det en hel del matnyttigt i ett 50 tal sessioner.

Själv tar jag det väldigt lungt på måndagen och går bara på två sessioner. På den ena presenterar Guillaume Laforge, från SpringSource, nyheterna i Groovy 1.6. På den andra gick en herre från Adobe igenom Adobe Flex - Helt otroligt att jag missat Flex, måste absolut titta mer på Detta!

DAG 1 - Tisdag

Idag börjar det stora äventyret. Efter att ha gått och lagt mig vid 1700 tiden på måndagen så är jag på plats före 0700 på morgonen, äter frukost på Konferencen (Äter amerikaner verkligen sånt här till frukost? Konstigt att de är stora..) och är först i Alumni kön till den första Keynoten. Den första Keynoten är speciell. Förra året kom jag och kollegan Jonny 45min innan keynoten skulle börja och hamnade en halv kilometer bak i kön.

Till slut är det insläpp och man kommer in i vad som måste vara en av världens största underjordiska salar.. För er som inte har varit här - JavaOne hålls i Moscone Center i centrala San Fransisco. Moscone Center är en enorm konferens anläggning i stil med Älvsjömässans, men med tyngdpunkten mer på konferens än mässa. Dvs det finns en massa föreläsnings salar. Det finns även minst 3 enorma lokaler som rymmer flera fotbollsplaner styck.

Det fantastiska med detta är att i princip allt utom receptionerna och några små föreläsningslokaler, ligger under jord. Det blir extra påtagligt tex i lokalen där keynotes hålls, där jag förmodligen skulle behöva en 5-6 kast med en tennisboll för att komma över till andra sidan. Enorma, 5 meter höga valvbågar i betong går från golvet på sidorna, upp över taket och bort i dunklet - Det är mörkt överallt utom på stora scenen som man har placerat på tvärsen i lokalen det här året. Där pågår någon form av koncert med en dam som spelar ambienta toner. Det hela blåses upp på 3 10 * 10 meters skärmar och understöds av ljusspel som skulle platsa på en rock-koncert

Det går inte att undvika flashbacks från föregående år - JavaOne 2008 - när jag var här med en kollega. Min något mindre timide följeslagare såg till att vi säkrade platser längst fram på jornalistläktaren - som anonym förstagångsdeltagare är man annars hänvisad platser på ganska långt avstånd från scenen. När James Goosling - som betraktas som javas fader och för övrigt är så nära gud man kan komma på den här bloggen - så avslutar sin keynote och stiger ner från scenen, tar min kompanion tag i min arm, och rusar helt sonika fram till Goosling (Små kameradraperade japaner får kasta sig i skydd) “Mr Goosling, Mr Goosling, Sir.. can I have a picture?”. Varvid jag finner mig med en systemkamera i handen och kompisen kamratligt lägger armen om James Goosling. Jag tar ett kort. Tyvvär var ingen blixt på och lokalen är som sagt mörk

Idag är det Johnatan Schwarts, Suns VP håller i showen och bjuder upp lite olika potentater. Bla presenterar man “Dark Chat”, som en typ av massivt grafiskt multiplayer chatsystem som man tänker sig att deltagarna på JavaOne ska använda under konferencen. Jag är inte helt klar på hur än?!

Man visar även upp saker från Intel, JavaFX (förståss), Blackberry och lite annat smått. Därefter en stor nyhet: James Goosling presenterar “Java App Store”. Ännu på test-stadiet är det någonting liknande AppleStore, eller motsvarigheten som Google har för Android, där man tänker sig att vem som helst ska kunna sälja sina produkter till flera miljoner potentiella kunder.

Den sista och största smällen kommer när Oracles grundare Larry Ellis kommer upp på scenen och tillsammans med Suns ena grundare Scott McNealy pratar om hur han ser på “fortsättningen”. Han ger en väldigt positiv bild av hur han vill fortsätta bygga på den community som Sun har byggt upp i och med bla JavaOne. I den mån han vill förändra någonting så släpper han att han gärna skulle se att Oracle/Sun tog upp kampen med Google om java i mobiler etc, typ Android. Han nämner även att oracle kommer att använda sig av JavaFx tekniken I övrigt nämner han ingenting om tex MySql.

När detta är klart börjar själva sessionerna. Det pågår ett antal paralella sessioner hela tiden och det finns ingen möjlighet att hinna med ens en bråkdel. Förra året gjorde vi misstaget att boka in alldeles för många sessioner, vilket gjorde att man blev helt slut i huvudet första dagen och inte behöll speciellt mycket. Jag noterar att jag verkar ha gjort samma sak i år att döma av schemat:

Här är ett axplock av dagens sessioner

Ajaxifying Existing Web Applications

Hålls av Anas Mughal, handlar om hur man Ajaxifierar legacy applikationer. Man går igenom best practice och visar konkreta handhavanden för att implementera Ajax med bla JSON. Han går även igenom en hel del om hur man bär sig åt med Ajax i portaler.

Servlet 3.0 Empowering your web applications with Asynch, Extens and more

Session två handlar om uppdateringar till Servlet specen - Servlet 3.0. Bl.a. tar man upp:

Annoteringar - Ganska väntat, en serie annoteringar motsvarande vad som finns i web.xml. Dessa kommer fortfarande att kunna overridas av web.xml.

Dynamisk registrering av servlets och filters - dvs att man kan lägga till och dra ifrån utan att starta om containern.

Modularisering - för att tillåta frameworks att bli “self-contained”, Samman med annotations, som bidrar till detta, introducerar man Web-fragments: web-fragment.xml, dvs delar av web-xml som kan spridas i applikationen. Dessa måste dock ligga i jarer under WEB-INF/lib. Dessutom blir innehållet i jarer under META-INF/resources mergat med webappens docroot, förutsatt då att jarerna ligger under WEB-INF/lib

Asynkrona servlets - handlar inte om io/ajax, utan om att använda resurser utan att “blocka”. I ett ganska normalt scenario som demades tog en viss serie operationer 30% av tiden för samma operation med gammal teknik (Servlet 2.5), och hade ca 1% av den gamla teknikens resursbehov

Säkerhet - här handlade det främst om en serie annotations för säkerhet runt servlets

Tips and Tricks for Ajax Push and Comet

av Jeanfrancois Arcand - Sun och Ted Goddard - ICEfaces.org.

Push i ajax applikationer - ta det försiktigt, det räcker med väldigt lite push för att få en väldigt interaktiv applikation. Det mesta bör fortfarande vara normal synkron kommunikation

I princip hela sessionen handlar om problem med Push teknik, främst att existerande servrar har använt blockerande teknik, tex servlet 2.4. Detta gör att det behövs en tråd per request och det i sin tur gör applikationer som använder tekniken, omöjliga att skala upp. Nu finns applikations servrar som Glassfish (Grizzly), Jetty, JBoss (via Tomcat) osm stödjer NIO (Non blocking IO) och i och med Servlet 3.0 blir alla servlets nonblocking. Det finns även framework, tex Atmosphere som använder, antingen Servlet 3.0 om detta finns, eller underliggande native teknik för att åstadkomma NIO.

Spring Framework 3.0: New and Notable

Rod Jonsson höll ett väldigt bra anförande (som vanligt - De flesta som pratar här är väldigt bra och Roddan är extrem) där han gick igenom lite nyheter i Spring 3.0. Höjdpunkterna var:

Fortsatt utveckling av annotations från Spring 2.5. Spring 3.0 blir Java 5+ enbart och mycket fokuseras på att förenkla konfigurationen.

Det introducerar ett Expression language (EL) Liknande vanliga EL, men mer kraftfult, genomgripande REST support och förbättrat MVC.

Ett nytt sätt att konfigurera Spring - Java Configuration, som ytterligare ett alternativ till xml och annotations

Roo, som automatkonfigurerar “boilerplate” kod för Spring, så man slipper allt keck med att sätta upp projekt, pom filer, xml etc

DAG 2 - Onsdag

Onsdagen börjar lite soft med Frukost i hall A. Här träffar jag två amerikanska herrar, etablerade utvecklare inom finanssektorn på östkusten - Mike och Sean - och byter erfarenheter om WebSphere, disk skillnader mellan länder etc. Kanske det bästa med JavaOne är alla människor man möter och den enorma KRAFT som ligger i kreativiteten hos den här massan människor.

The Modular Java Platform & Project Jigsaw

Hålls av Mark Reinhold - Sun.

Mark går igeno mproject Jigsaw som handlar om “Modularisering” av java platformen. I huvudsak innebär detta att man delar upp Java platformen i mindre bitar med beroenden. På detta lägger man “Profiler” som in sin tur har beroenden till delarna som ska ingå i resp profil.

Beroenden ska kunna läggas in i resp modul:

module org.planet.jdk.testpackage2 @ 1.0 {
    requires jdom @ 1.0;
    requires saxen @ 1.2;
    requires log4j @ 1.0;
    class org.planet.jdk.testpackage1.Main;
}

Move Your Users: Animation Principles for Great User Experiences

Chet Haase - Adobe & Romain Guy - Google

The twelve rules - Ett set regler från Disney Studios om hur man skapar animeringar i tecknade filmer, applicerat på gui;n. Oerhört bra föredragshållare och ett intressant föredrag. Jag har till en början, lite svårt att se tillämpningen i min verklighet, på annat än kanske extremt påkostade swing applikationer. Å andra sidan kommer JavaFx starkt framöver, och os som Mac OS, Vista och olika unix Distar använder redan hela regelsettet för sina gui:n

Herrarna avslutar med ett antal demos av dialoger som skulle platsa utmärkt i administrativa applikationer och hur de här reglerna appliceras där.

  • Squash & Stretch - capture the action of a body
  • Anticipation - Någnting litet måste hända innan ett större event
  • Staging - vinklar, vyer, dekår, ljus, focus
  • Straight Ahead vs. Pose to Pose - Förändra saker under rörelse, eller automatgenerera förändringen
  • Follow Through and Overlapping action - Komponenter bör uppföra sig enl fysikens lagar för verkliga ting. Vad man gör efter en effekt har stor effekt på vad man försöker förmedla
  • Slow In and Out - Snabbare i mitten av rörelsen, långsammare i extremerna - ger mer realistisk rörelse
  • Arcs - Icke linjär rörelse för verkligare rörelse
  • Secondary Action - rörelse som understryker huvudrörelse
  • Timing
  • Exaggeration - överdriv för att synliggöra. (Lite kaka på kaka)
  • Solid drawing - man behöver kunna rendera objekt från olika vinklar och med olika states
  • Appeal - Objekt och animeringar måste vara tilltalande

Varje animering måste ha ett syfte och vara genomtänkte för att fylla syftet och inte bara förvirra användaren

Riktigt bra föredragshållare som förvandlar gui-makande till en konstform

“Effective Java” - Still effective after all these years

Joshua Bloch - chefsarkitekt för Java 5 på Sun, numera Chefsark på Google, drar lite stycken ur sin bok “Effective Java” som kom ut 2001, och i en nyupplaga förra året. Detaljerna ur föredraget är för rika och splittrade för att summera (plus att jag kom sent i kön, var tvungen att stå och inte kunde anteckna), men boken kan varmt rekommenderas. Jag misstänker att om man ska lära sig någon bok ordentligt så är “Effective Java” ett stalltips

Det här är den mest välbesökta sessionen hittils. Josh fyller en sal som är stor som en fotbollsplan till bristningsgränsen och alla får inte plats. Han är dessutom förmodligen den bästa föredragshållaren här. Joshua studsar fram över scenen, gör oväntade saker och kläcker ur sig kvickheter, samtidigt som han levererar sitt komplicerade budskap - han pratar concurrency och generics - sammanhängande och begripligt. Jag är sjukt imponerad, och det är jag naturligtvis tvungen att berätta för honom!

JavaFX Programming Language + Groovy = Beauty + Productivity

Dierk König - Canoo Engineering. Författare till “Groovy in Action”

Dierk pratar sig varm för kombinationen Groovy/JavaFx, gärna Groovy/Grails/JavaFX och demonstrerar även hur han “effektiviserar” en av apparna Sun skickar med NetBeans för att dema JavFx, och byter ut java delen mot Groovy, varvid 289 rader ful-kod, blir 29 välordnade rader

Dierk gillar Groovy, och är något mer reserverad gentemot JavaFx, men tillstår att det är en “early adopter” technology, och att den kanske behöver utvecklas en hel del.

Han passar även på att dema “Griffon” som är ett väldigt nytt ramverk

Developing Revolutionary Web Applications Using Ajax Push or Comet

En hands on lab som går ut på att man ska bygga först en “chat”, därefter en slideshow och sedan kombinera de två. Slutligen ska man bygga ett tre-i-rad som uppdateras simultant hos båda deltagarna.

Här används Bayeux som är ett JASON orienterat protokoll, och finns bundlat i nya disten av Dojo. På serversidan används Grizzly som finns med i Glassfish från från start, men även kan lyftas in i andra appservrar som ett separat ramverk. Labbarna är bra och genomtänkta, tar givetvis mycket längre tid än man har på sig, men i det hela så lärde jag mig en hel del. Dojo har jag tänkt kika på länge.. känns som allmänkunskap numera! Vad beträffar Ajax push.. Trots att push teknikerna varit i ropet länge nu känns det som om det är ett himla meck för att komma runt problem med att tråd-blocking, för att inte tala om att det vanligtvis behövs tonvis med JavaScript

Kl 0930 på onsdagskvällen springer det fortfarande omkring gott om folk…

Dag 3 - Torsdag

Cloud Computing: Show Me The Money

Jag träffar två gamla collegor och lyckas gå på fel seminarium. Detta handlar om Cloud Computing, och en samlad panel Cloud evangelister från alls stora aktörer får några minuter var att prata för sin sak och dema små applikationer.

Tidigare har jag gått på Jens Riboe:s seminarier och stiftat en ytlig bekantskap med Amazons AWS. Här får man en snabb genomgång av alla alternativ, och Googles AppEngine imponerar. Otroligt lätt att skriva program och deploya direkt från eclipse, via en plugin.

“Design Patterns” for Dynamic Languages on the JVM Machine

Neal Ford - Thought Works

Neal börjar med att beskriva utvecklingen av patterns, från G4 till idag, samt livs-cykeln för ett pattern tills det inte längre är ett pattern utan bara så som saker och ting funkar

Överlag sågar han ganska hårt i allt från G4:s bok, till användandet av UML som är: “Förtekniskt för icke-tekniker, inte tillräckligt tekniskt för tekniker - därav värdelöst för alla”.

Han går sedan igenom excempel på en mängd patterns i Groovy - Iterator, Command, Template, Boilerplate, Decorater etc. Han går sedan igenom ett excempel på hur man skriver ett DSL (Domain Specific Language) ovanpå Groovy.

The Web on OSGi: Here’s How

Dan Brown - Atlassian

Dan beskriver kortfattat tanken bakom OSGi, vilket var själva anledningen till varför jag var där - Det känns som om alla pratar om OSGi de sista åren, men bortsett från att det har med paketering att göra är det väldigt flyktigt. OSGi är namnet på teknik som finns beskrivet i JSR291

Building Facebook & OpenSocial Applications with Java Technology

Richard Pack

Ricard börjar med att beskriva hur sociala näverk fungerar, och hur applikationer som bygger på detta är uppbyggda

Han fortsätter med att beskriva vad en Facebook Applikation är - UI som är URL Addresserbart, omgivet av Facebook Chroome, Has tillgång to Profile Data, Multipla Vyer, etc

Därefter fortsätter han med att jämföra Facebook, med OpenSocial container från Google, som många senare sociala nätverk bygger på

Länkar till hans slides kommer så småningom att finnas här

IBM:s keynote

Craig Hayman - IBM:s vice president för WebSphere lade ut orden bla om IBM:s engagemang inom open source. Här tog han hjälp av Ted Ellison - VP på Apache Foundation och dessutom IBM:are för att dema Harmony.

Craig lyckades även klämma in en hel del referenser till övriga produkter i WebSphere brandet, och var imponerande tekniskt påläst för nån som titulerar sig Vice President. Bl.a. tog han upp IBM:s samarbete med Amazon inom Cloud Computing (EC2), och han pratade lite om eXtreme Scale lösningar. Slutligen kom det fram att WebSphere Application Server numera är gratis för utvecklare

Enterprise Web 2.0 Architectures: From Pristine Java? EE

Presentation från ett litet sydamerikanskt företag om hur de bygger ganska normala
appar med Spring och Seam.Inte riktigt lika tok-bra föreläsare som annars, och inte
riktigt lika imponerande presentation

The Groovy and Grails BOF: With Live Grails Podcast Recording!

Dag 4 - Fredag

Friday Morning General Session - Gooslings Toyshop

Goosling visar en mängd mer eller mindre häftiga projekt. Från satelit kommunikations system till
bildanalys som används för att diagnositcera cancer, till JavaFX Studio som väntas släppas snart - Ett case verktyg för JavaFx utveckling som verkar vara extremt enkelt.

Man får också veta att Lincolnen som stått på mässgolvet är Neil Youngs, och kommer av någonting
han kläckte under ToyShow förra året - Han ville bygga en miljövänlig bil som hade stil och rockade!
Bilen har en stark elmotor, batterier och en generator i fronten, som kan gå på en mängd olika bränslens,
och som används för att ladda batterierna vid längre turer

James visar även ett styrsystem för bilar som utvecklas i samarbete med volkswagen som man kan köra en bil utan förare med i väldigt höga farter, och med hög presicion

Ajax Versus JavaFX? Technology

Ben Galbraith & Dion Almaner

Ben och Dion håller ett jättebra föredrag där de tar en ståndpunkt var och argumenterar för
respektive.Under tiden visar de hela tiden upp olika excempel som bekräftar resp ståndpunkt.

Saker jag fick med mig var bla:

  • HTML5.0 - man kan köra processer i bakgrunden i browsern
  • Google wave - verktyg för felrapportering och uppföljning
  • Google chrome har riktigt bra preformance i en jämförelse bland browsers, Safari är också ganska bra, medan IE klarar sig riktigt dåligt.
  • Överlag så är budskapet att det Ajax är någonting som har funnits länge och har en bred utvecklarbas.
  • Detta samman med det faktum att man kör på olika browsers som implementerar saker på vitt skiljda
    sätt, gör att tekniken blir väldigt “meckig” att implementera.

  • JavaFx å andra sidan är en ung teknik som ännu lider av “vassa kanter” och en del barnsjukdomar,
    men som ger allting med samma standard som java.

Building Next Generation Web Applications with the Spring 3.0 Web Stack

Här går man igenom nyheterna i Spring 3.0 vad betr. Spring MVC och WebFlow, samt demar och
visar en hel del excempel. Bla är REST officiell best practice for web applikationer ur SpringSorces perspektiv. Spring MVC kommer numer med Dojo och JSON support bundlat

Man visar en “Spring JavaSript Client with JSON based REST Interface” demo och går igenom “Spring BlazeDS Integration” - Spring’s Adobe Flex integrations projekt

Noteringar:

  • Det stora här på JavaOne 2009 var tveklöst Larry Ellis på tisdagens Keynote. Trots att han inte sa så mycket så är det förmodligen det som disskuterats mest här under veckan
  • JavaFx är med som huvudpunkt för 3:je året i rad. Skillnaden nu mot tidigare är att man kan visa ett växande antal komersiella applikationer som använder det. Kopplat med det Ellis sa om JavaFx så känns det som en teknik som kommer vara bestående
  • Ajax är lika förvirrande som vanligt, men Spring och GWT känns som två stora trygga teknikval med bred utvecklarbas
  • Det är väldigt mycket “hype” runt Cloud computing.. Frågan är hur snabbt det kan gå. Beslutsfattare har ju en tendens att vara konservativa. Pengar är ju å andra sidan en ganska stark drivkraft…
  • En annan sak som det är mycket liv om är REST!
  • Något som är intressant att notera är att 9 av 10 föredragshållare använder Macbook pro, och av resterande är Ubunto lika vanligt som Windows. Överhuvud taget så känns det som om det blir mer Mac:ar här för varje år.
  • Här är lite mer bilder från hela evenemanget!

Generera Hibernate Entity klasser i eclipse

När man väl har en datamodell man är nöjd med, så kan man generera Hibernates entity klasser, och även skelett till dao:ar och hibernate.cfg.xml filen

  • Börja med att ladda ner Hibernate-Tools. När zippen är uppackad ser det ut så här:



    Kopiera innehållet i “plugins” katalogen till motsvarande katalog under eclipse_home. Gör detsamma med “features” katalogen och starta sen om eclipse.

  • Om du nu högerklickar i Project explorern och väljer nytt > other så finns det nu en “Hibernate” folder bland wizardsen:

  • Välja att skapa en “Hibernate configuration file”.. dvs den traditionella “Hibernate.cfg.xml”. Med en Embedded Derby db kan inställningarna se ut så här:

    Detta genererar en fil som ser ut ung så här:



  • Välj därefter det sista alternativet bland hibernate-plugin:en :

    I panelen som dyker upp väljs den console-configuration som skapades samman med Hibernate.cfg.xml tidigare.

    Här får man upp sina scheman och tabeller i en trädmeny till vänster. I min miljö verkar den lida av en hel del problem. Det tar tid innan tabellerna dyker upp och jag får en hel del NoClassDefFoundErrors när jag expanderar trädet, eller trycker på “refresh”. Annars verkar det fungera!

    På högersidan kan man ange delmängder av databasen att bygga från.

    I slutändan ser det som genereras i filen hibernate.reveng.xml ut så här i mitt fall då jag valt att generera entitys av alla tabeller i db:

  • Slutligen väljs “Hibernate Code Generation” i Hibernate-menyn som ska finnas i java-perspektivet:


    Här behöver man ange var entiteterna ska hamna - förslagsvis under /src - paketnamn, reveng.xml:en vi just skapade etc. Man behöver även gå in under flik2 - Exporters - och ange åtmindstonde några val.

    Man kan även klicka i en checkbox att workspace ska refreshas efteråt under flik3.

  • Viola - så har vi våra entiteter, samt dao:ar om man har valt att generera dessa. Allt i samma paket och entiteterna är splittade i en Entity class och en embeddad class. De senare har dessutom “fina” equals() och hashCode() metoder färdiga.

Hur man tar högre timmpenning för en Java konsult?!

Det har väl inte undgått någon som försörjer sig som java konsult idag, att det är en väldig prispress på våra tjänster?! En bidragande orsak till detta är att det är svårt att gradera kompetensen. Det går inte att motivera för kunden som inte är insatt, varför han/hon ska betala +900 kr/timme för en “Java konsult”, när en del väldigt stora aktörer tar 500/timmen och några bolag som huvudsakligen rekryterar studenter, rentav erbjuder “java konsulter” för runt 350/timme. Kunden får ju ändå bara en “java konsult”!

Java är ett område som har haft en tillväxt enligt Moores lag, i stort sett sedan dag ett. I mitten på 90-talet gick det att svara jakande på frågan om man kunde java. I dag är det en heltids sysselsätning att täcka en bråkdel av det som händer inom området och det tar år att lära sig behärska ramverk och tekniker som ”måste” användas av utvecklare som inte har en fabläs för självspäkning.

Just detta att det har blivit så komplicerat är kanske det största problemet Java har idag. En mängd skärpta individer arbetar med lösningar på problemet – genom att uppfinna smartare språk som Groovy/Rails/Scala… ad perpetuum, som också kan vara bra att känna till(?)!

I moderna utvecklingsprojekt är kunskap och erfarenhet hos utvecklarna är helt avgörande för hur slutresultatet blir. Kunden som har fått tag på ett team ”java konsulter” till oslagbart pris från något dubiöst bolag, blir ändå inte glad när konsulterna, som saknar kompetens och erfarenhet, levererar någonting kunden inte vill ha, alldeles för sent. Det hjälper knappast att konsultbolaget erbjuder sig att rätta till situationen - givetvis på löpande räkning. I bästa fall lär man sig sin läxa, avvecklar det ursprungliga konsultbolaget och börjar om, men ofta fortsätter man att snärja in sig i ett arkitekturellt råttbo som över tid riskerar både kassa och kunder.

Flera konsultbolag försöker råda bot på problemet genom att erbjuda olika typer av bransch-satsningar. Det finns stora fördelar med detta då man bygger partnerskap med leverantörer och till viss del adresserar det problemet - Det går att ta mer betalt för en produktspecialist!

När det gäller Java utvecklare bygger det dock till stor del på illusionen att utveckling på t.ex. WebSphere, skiljer sig från utveckling på Jboss/Weblogic etc. Eftersom det låter rimligt så fungerar det, trots att alla utvecklare vet att JEE numer är så hårt specificerat att ytterst lite skiljer sig mellan applikations servrarna – I alla fall när det gäller just utveckling. Sen finns det olika utvecklings miljöer och en del special lösningar t.ex. runt portaler och integration, men även här styr olika JSR:er funktion väldigt hårt. Faktum kvarstår att lejonparten av kunskapen när det gäller java-utveckling inte är produktspecifik! (Med produkt avses proprietära ”brands”, t.ex. applikations servrar, inte ramverk som Spring, eller rentav Java)

Reklam branschen har en intressant lösning på problemet I och med branschtidningen Resumé. Där listas kontinuerligt samtliga etablerade Reklam Byråer baserat på kompetens. Resp. byrås ranking utgörs av de anställdas samlade kompetens (som naturligtvis också listas i alla olika skärningar). Det innebär att när Martin Stadhammar, som var nr 4 som Copywriter i Sverige, slutade på ”Lowe Brindfors”, och började på ”Grey”, så steg den senare byrån i ranking med motsvarande poäng som Martin innehade. Poängen har han erövrat genom att bl.a. vinna “Guldägget” som är en respekterad branch-tävling varje år.

Tävlings konceptet kanske inte fungerar inom java-utveckling. Däremot kan man mäta grundkompetens med tex Sun:s relativt omutbara certifieringar. Det är svårare att skilja eliten från de mediokra. Här kan man tänka sig någon form av bedömning på utförda åtaganden. Alla bolag lutar sig mot referenser, men här tänker jag mig en mer ingående, organiserad bedömning och ranking av lösningen – Inte bara en .ppt slide där kunden säger sig vara belåten med resultatet. Precis som för reklam branschen skulle poäng erövras av individerna, och respektive konsultbolags ranking utgöras av summan.

Potentiella kunder skulle sedan kunna lista individuella bedömningar av projekt för att säkra ett tryggt val av partner som man vet har vad som krävs för ett lyckat projekt

I slutändan skulle det leda till att kunden kan välja hur mycket ”kompetens” man vill betala för. Seriösa Konsultbolag kan ta mer betalt för gedigen kompetens, medan de oseriösa bolagen som prisar in sig till katastrofprojekt efter katastrofprojekt och svärtar ner hela branchen, får svårare att verka.

Nu finns det tyvvär inget branch-organ liknande Resumé och det finns en hel del utmaningar i att få till stånd någonting liknande då det gäller medverkan, opartiskhet etc. Däremot finns Javaforum som dels arrangerar JFocus varje år, och dessutom håller regelbundna seminarier i Trygg hansa huset i Sthlm (Man håller även möten i GBG och Malmö). Seminarierna håller förvånansvärt hög kvalitet och blir fullbokade någon timme efter släpp.

Här är lite mer bilder från hela evenemanget!

Spring/Hibernate setup för web-projekt - del 1

Spring/Hibernate har varit det dominerande ramverket allt efter som utvecklare har insett begränsningarna med tidigare EJB standarder. Först när EJB 3.0 och Persistence 2.0 släpptes 2005 så dök det upp en värdig konkurrent. Teamet bakom SpringSource har dock fortsatt ligga i framkant och sätter ännu de facto standarden för enterprice applikationer.

Den förmodligen största utmaningen är den komplexa setupen av ett Spring/Hibernate projekt, något man nu försöker bemöta med verktyget ROO.

Här följer en enkel setup för ett web-projekt med Spring 2.5 och Hibernate 3:

1.) Se till att kopiera in rätt .jar filer i projektet.

Samtliga jarer finns med om man laddat ner Spring med “dependencys”.

SpringWeb_jars.png

2.) Configurera deployment descriptorn att ladda applicationContext

Det rekommenderade sättet att göra detta på är att använda springs “ContextLoaderListener”. Per default kommer lyssnaren att leta efter /WEB-INF/applicationContext.xml att ladda.

    <listener>
        <display-name>springContextListener</display-name>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

Application context kan sedan splittas upp i flera filer för att göra konfigurationen hanterbar. Så här kan det se ut:

<?xml version="1.0"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- Import all beans that handles persistence -->
    <import resource="spring/persistenceConfig_was.xml"/>

    <!--  Service Layer -->
    <import resource="spring/services.xml"/>

    <!--  Dao Layer -->
    <import resource="spring/daos.xml"/>

</beans>

Man kan även configurera “contextConfiglocation” som context param i web.xml där man talar om vilka filer som ska mergas ihop till applicaktionContext. Detta är det rekommenderade sättet att göra det på. Filnamnen kan även föregås av “classpath:” om man tex vill addressera ett “shared library”.

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/persistenceConfig_was.xml
            /WEB-INF/spring/services.xml
            /WEB-INF/spring/daos.xml
        </param-value>
    </context-param>

Och här är filerna vi refererar till:

Springconfig.png

3.) Configurera Hibernate Session Factory

Vi använder Springs org.springframework.orm.hibernate3.LocalSessionFactoryBean och definierar upp nödvändig Hibernate configuration. Sessionfactoryn placerar vi i en fil vi kallar för persistenceConfig.xml, som vi laddar som en del av application context. Det är en fördel att ha detta i en egen fil när det väl fungerar, då man inte vill ändra i den av misstag. I det här fallet använder vi en DerbyDatabas.:

    <!-- HIBERNATE SESSION FACTORY -->
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

            <property name="dataSource">
                <ref bean="dataSource" />
            </property>

            <property name="configLocation">
                   <value>/WEB-INF/spring/hibernate.cfg.xml</value>
               </property>           

            <property  name="configurationClass">
                   <value>org.hibernate.cfg.AnnotationConfiguration</value>
            </property>

            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
                    <prop key="hibernate.show_sql">false</prop>
                    <prop key="hibernate.format_sql">false</prop><!-- Will "pretty print" sql in log if set to true -->
                    <prop key="hibernate.use_sql_comments">false</prop>
                    <prop key="hibernate.jdbc.batch_size">50</prop>
                    <prop key="hibernate.cache.use_second_level_cache">false</prop>

                    <prop key="hibernate.transaction.flush_before_completion">true</prop>
                    <prop key="hibernate.transaction.auto_close_session">true</prop>
                </props>
            </property>
        </bean>
    <!-- /HIBERNATE SESSION FACTORY -->

SessionFactory behöver även en datasource:

    <!-- DATASOURCE -->
        <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiName" value="java:comp/env/portalDs"/>
            <property name="lookupOnStartup" value="false"/>
            <property name="cache"     value="true"/>
            <property name="proxyInterface" value="javax.sql.DataSource"/>
         </bean>
    <!-- /DATASOURCE -->

4.) Configurera en transaction manager

Här använder vi sessionFactory och injectar i org.springframework.orm.hibernate3.HibernateTransactionManager. Vi konfigurerar även upp en sk txProxyTemplate att använda i tex framtida service proxys:

    <!-- TRANSATION CONFIGURATION -->
        <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>         

        <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true">
            <property name="transactionManager"><ref bean="transactionManager"/></property>
            <property name="transactionAttributes">
                <props>
                    <!-- A "-" before the exception indicates that the transaction should be rolled back -->
                    <prop key="*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
                </props>
            </property>
        </bean>
    <!-- /TRANSATION CONFIGURATION -->

Ett alternativ (och rekommendationen) om man kör WebSphere 6 eller senare, är att använda org.springframework.transaction.jta.WebSphereUowTransactionManager i stället:

        <bean id="transactionManager"
          class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>

Sitter man i stället med en äldre version av WebSphere kan man använda WebSphereTransactionManagerFactoryBean:

    <bean id="wsTransactionManager" class="org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean"/> 

    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager">
            <ref bean="wsTransactionManager"/>
        </property>
    </bean>

Med det avslutar jag första kapitlet - nästa steg är att börja konfigurera BO:s

IBM WebSphere Portal Server - Installera utvecklingsmiljön

Installationen börjar ganska “rakt på” - Klicka på Lauch pad och välj att installera RAD.
Först får man installera IBM:s installation mgr, sen ska denna uppdateras, och därefter kan man starta själva RAD installationen.

Inledningsvis får man välja ett host-namn - det går bra att ange “localhost” här! - Man kan även ange default admin-id och lösen för de was-instanser man har valt att ta med i installationen i en tidigare meny. Själva RAD installationen tar sedan en 35-40 min.

Därefter kan man i installation manager välja att uppdatera alla komponenter till senaste patch-nivå. Detta innebär att man laddar ner från IBM:s servrar i Boulder Colorado - I mitt fall ca 2,2GB för RAD, WAS7 och WAS6.1. Uppgraderingen tar ca 3h, med de val jag gjort.

Slutligen är det dags att installera portal server. Detta måste göras separat, men det finns ett val i Installation manager under rubriken “Install optional products” - “WebSphere Portal V6.1 Test environment”.

Ganska omedelbart i installationen får man upp en ruta där man ska fylla i “Node name” och “Host name”. Node name blir namnet på WebSphere noden, medan “Host name” måste finnas i DNS, och dessutom följa någon form av standard. Det duger alltså inte med “localhost”, vilket fungerar bra vid appserver installationen.

Här får man upp ett felmeddelande om att hostnamnet inte matchar ett lokalt “hostname”, även när man har gjort rätt, men kommer ändå vidare(?)! Försöker man ange “localhost”, ett icke existerande hostnamn eller något som installationsprogrammet inte gillar (tex pcnamn) så får man ett felmeddelande och kommer tillbaka till samma panel.

På nästa panel ska man ange administrations id och lösenord, och därefter får man även klicka i en ruta om man vill att portalen ska gå som en Windows Service. Det hela avslutas med en informationsruta som bla säger att det hela kommer att ta upp 4GB på disk!

Därefter fortlöper själva installationen. Eventuellt får man emellanåt ange var olika images ligger. Möjligen skulle man kunna komma runt detta genom att zippa upp allt i samma bibliotek?!

Jag kan konstatera att installationen går 5-10 ggr snabbare på min hemmabyggda prestandamaskin i jämförelse med laptoppen jag använder i arbetet. Den senare segar dessutom ihop fullständigt när jag drar igång portal server, trots 2GB minne och hyfsat ny core 2 duo propp.

När installationsprogrammet är klart blir man erbjuden att starta en konfigurations wizard där man bla kan konfigurera säkerheten för server - om man har varit förutseende och satt upp en ldap - Kanske inte nödvändigt initialt i en labbmiljö. Man blir dessutom erbjuden att starta WebSpheres traditionella “first steps console”.

När jag så öppnar RAD:en, som för övrigt känns något långsammare än 7.0:an jag är van vid (speciellt på laptopen) och ska skapa ett Portal projekt, så saknas “Portal” foldern i wizarden. Den ska ligga precis under foldern “Plug-in Development”.
Jag har inte sett någon option att välja portal extentions, detta trots att jag kikat runt ordentligt under installationen den här gången (har haft en del strul tidigare).

Alltså startar jag IBM Installation Mgr igen, väljer “Modify”, och bläddrar fram till en sida som listar “paket” att modifiera.

Här kan man expandera dem och lägga till options som Inte är default - tex “Portlet and Portal tools”!

Här uppstår nästa problem när jag försöker gå vidare och installera - Installationsprogrammet klagar över att det saknas paket för att “Portal and Portal tools” ska kunna läggas till. Efter att ha daskat huvudet i väggen ett tag lyckas jag komma runt det genom att gå tillbaka till Installation Mgrs grundmeny och välja att lägga till repositorys på disk - i det här fallet mina installations images(?)!

Så följer ytterligare en 30 min medan RAD:en uppdateras..

När detta äntligen är klart så startar jag RAD:en igen och går in och försöker skapa ett Portal projekt. “Portal” foldern saknas fortfarande! Däremot finns det en option att skapa ett portlet-projekt.

Efter att morrande ha kastat mig över Installation managern ännu en gång och fruktlöst letat efter fler “features” att addera, resignerar jag och provar portlet optionen.

Och se där dyker en ruta upp som frågar om jag vill enabla “Portal Development”. Efter detta finns även “Portal” foldern som option i Projekt wizarden.

Slutligen behöver vi en Portal-server instance att köra på i RAD:en. Vi kan högerklika i server-fliken i J2EE perspektivet och välja att lägga till server. Här väljs “Portal Server 6.1″ och därefter klickar vi på “Add” nere till höger för att tala om var runtimen - den vi installerade ovan - ligger.

Allt som allt har det tagit närmare 6h och är inte den värsta setupen jag varit med om, men detta kan definitivt göras enklare!

Gui utveckling - låg tröskel, svårt att bemästra!

Som java konsult möter man ofta en utbredd uppfattning att det är affärslogiken och lagren därunder, ejb:er, databaser och integration som är svårt och komplext i en JEE applikation. Själva gui:t är något som är bäst lämnat åt långhåriga, coka-cola drickande, ”html hackande” ynglingar.

Den här uppfattningen är vanligast bland människor som är bra på andra saker än just utveckling, men den är olycklig då det ofta handlar om personer som är tongivande, både då det handlar om hur stor del av projektbudgeten som ska avsättas, liksom i skapandet av nya affärer inom området – och därigenom möjligheten till intressanta uppdrag.

I min värld är den kritiska massan kunskap som behövs för att göra ett markadsmässigt gui, ofta större än vad som behövs för de flesta omgivande delar sammantaget.

Detta är naturligtvis en sanning med modifikation; Inom forskning runt artificiell intelligens så kanske inte guit kommer i första rummet. I rena integrationsprojekt lever guin en ofta undanskymd tillvaro och visst kan klustring och paralell programmering bli väldigt komplicerat

Själv rör jag mig dock mestadels bland kommersiella/administrativa applikationer ämnade att hjälpa företag med försäljning, logistik, integration, finansiella tjänster el dyl.

Ex:

Databaser med sql och stored procedures kan vara komplexa, men det man behöver känna till för att framgångsrikt kunna använda tekniken är begränsat. Lägger man därtill ORM mappning med tex Hibernate eller JPA så kompliceras världen ytterligare. men det finns en väldigt finit kunskapsnivå när du behärskar detta, och det rör sig om en specifikation på några hundra sidor för respektive. Nämnda två ORM tekniker täcker dessutom större delen av marknaden Och är extremt lika.

Integration kan vara komplext för integratörer, men om vi begränsar oss till området täcks av java kontainern och låter någon kunnig person fundera ut “övergripande arkitekturella principer” för hur meddelanden ska propageras och annat fluff, handlar det främst om att validera och skyffla xml. Kunskapen som behövs för att uppnå gurustatus på området ryms i en 2,5 cm tjock bok. Sen kan man därtill lägga kunskap om separata ”produkter” som sorterar inom integrationsområdet – brokrar, mappningsverktyg etc, som i sig kan vara komplexa, men som kanske heller inte sorterar inom JEE. För applikatören gäller det att känna till vida begrepp som grundläggande SOA och kanske REST.

Säkerhet är ett område som pockar på uppmärksamhet och här gäller detsamma som för integration – Kunskap i guru klass ryms i en bok om några centimeter.

Bygge, deploy och infrastruktur är ett annat område som utvecklare helt enkelt ”måste” kunna. Området rymmer allt från konfigurering av miljöer, till ant/maven, olika “continous build” och “code coverage” lösningar samt paketering, tex OSGi som kommit starkt de sista åren.

Detta, draget till sin spets, kan bli väldigt omfattande, och visst finns det riktigt kunniga människor som specialicerar sig inom detta. Tyvvär är detta också ett ofta eftersatt område som det snålas in på då människor som sitter på pengarna ofta saknar insikter. Det ironiska är att investeringar i den här delen av applikationen ofta betalar sig mångdubbelt på några års sikt

Unittest är en nödvändighet att känna till idag, men även här uppnås en gångbar kunskapsnivå med ganska liten ansträngning.

Spring och Ejb30 är omfattande och komplexa ramverk (i alla fall Spring och det spänner dessutom över i princip alla områden som ytterligare ett abstraktionslager på JEE) och här finns i mitt tycke den största utmaningen utanför guit. Sen gäller det ju för utvecklare - i alla fall de som är konsulter - att vara pragmatiska framför allt. Hur komplext behöver saker egentligen vara - enkelhet är nästan alltid bäst om annan motivering saknas.

Java och JEE är förutsättningar för att verka i den här världen. Att arkitektur är ett pletantiöst begrepp som egentligen handlar om att kunna använda och identifiera något dussintal designmönster kanske är att dra det väl snävt - speciellt som det finns många “arkitekter” som inte skulle känna igen ett pattern från g4 om det hoppade upp och bet… Kort sagt; dimmigt område

Gui däremot, kan handla om något så enkelt som en servlet driven html-sida, men moderna gui:n omfattar webbramverk som spring-mvc/webflow eller JSF/Struts, som i sig är omfattande och där det dessutom finns en mängd olika alternativ. Till detta har man förmodligen någon form av ajax-ramverk som sköter asynkron kommunikation med webbsidan, html med css som är långt mycket mer komplicerad än för bara några år sedan. JavaScript ramverk som Dojo, eller åtmindstonde avancerade javascript som använder DOM ramverk. Förutom detta kommer naturligtvis grundläggande kunskaper om layout och kanske bildbehandling som man kan tänka sig att man kan lägga ut på lämplig webbyrå (coka-coladrickarna), tyvvär en lyx som det ofta inte finns budget för i mindre projekt. Dessutom har det halkat in ytterligare ett abstraktionslager i gui-utvecklingen på i form av portaler och portlets. Portlets - förvirrande lika servlets, är ändå en helt separat teknikgren att känna till.

Sammantaget, gui utveckling kan blir grymt utmanande och har den egenheten att slutresultatet blir märkbart bättre ju mer tid man lägger på det. Ett bra gui har dessutom ett starkt affärsvärde – fråga valfri säljare vilken del av en applikation han helst presenterar för kund!

Inledning

Framtidens ”intelligenta” system kommer sannolikt att skrivas av andra, något mindre intelligenta system, i en lång kedja med en mänsklig utvecklare någonstans nere vid roten av trädet.

Java och java relaterade tekniker är basen för den, största utvecklar kulturen. Området har växt explosionsartat de sista tio åren och teknikbasen blir alltmer avancerad och kraftfull för varje år.

Samtidigt medför den ökade komplexiteten att tekniken blir svår att överbrygga. Det går inte längre att säga att man ”kan java”, då området är alldeles för stort.

Då det är svårt att bygga kompetens, använder många företag en föråldrad teknik som är långt mycket omständigare och dyrare att underhålla, än vad som skulle krävas för att lösa motsvarande uppgifter med dagens teknik och som inte utnyttjar den potential som finns.

Detta i sin tur, hämmar utvecklingen, då det minskar innovationsförmågan hos de som ägnar sig åt tekniken. Varför uppfinna smartare sätt att göra saker på, när vi inte använder de som redan finns?

Den här bloggen ägnas åt att tillgängliggöra tekniken