Agenda för Javaforum den 7:e februari

No Gravatar

Anmäl dig till mötet här

17:00 Registrering & mingel

17:30 Välkommen
Tomas Trolltoft & Rikard Thulin, Squeed

17:40 The Java EE 7 Platform: Boosting Productivity and Embracing HTML5
The Java EE 7 platform focuses on Productivity and HTML5. JAX-RS 2 adds a new Client API to invoke the RESTful endpoints. JMS 2 is undergoing a complete overhaul to align with improvements in the Java language. Long awaited Batch Processing API and Caching API are also getting added to build applications using capabilities of the platform itself. Together these APIs will allow you to be more productive by simplifying enterprise development.

WebSocket attempts to solve the issues and limitations of HTTP for real-time communication. A new API is getting added to build WebSocket driven applications. Processing JSON structures is inherent in any HTML5 applications and a new API to parse, generate, transform, and query JSON is being added to the platform. JavaServer Faces will add support for HTML5 forms. There are several other improvements coming in this latest version of the platform.

The Java EE 7 platform is scheduled to release in Q2 2013. Some of the implementations are already integrated in GlassFish. This talk will provide a code-intensive introduction to the updated Java EE 7 platform. Several live demos will be shown during the talk. Don’t miss out on this session to learn all about how to leverage the new and exciting standards in building your next enterprise application.
Arun Gupta, Oracle

18:30 PAUS

18:45 How I Learned to Stop Worrying and Love Javascript
Javascript kan för Javautvecklare te sig stökigt och oförutsägbart. Men genom att använda sig av flexibiliteten som Javascripts-objektmodell erbjuder kan man med enkla medel modellera många av de objektorienterade principer som kan tyckas saknas i språket. Under presentationen kommer metoder och javascript-bibliotek presenteras som kan förenkla utveckling av omfattande Javascript. Ett par problem som vanligtvis drabbar Javautvecklare som tar sig an Javascript kommer också att presenteras och de underliggande principerna förklaras. Se det hela som en Javascript crasch course för Javautvecklare!
Fredrik Sandell, Squeed

19:15 PAUS

19:45 Building WebSocket Applications in Java
WebSocket attempts to solve the issues and limitations of HTTP for real-time communication by providing a full-duplex communication over a single TCP channel. It brings new opportunities for efficient server-push and peer-to-peer communication, providing the basis for a new generation of interactive and ?live? Web applications.

This session provides a primer on WebSocket and supported use cases. It examines the efforts under way to support WebSocket in the Java programming model, from a simple annotation-driven programming model and integration in the Java EE containers using JSR 356. All of this support will be available in Java EE 7, scheduled to go final in Q2 2013.

The attendees will learn how to leverage WerbSocket in their web applications using several code samples though out the talk. Simple ?Hello World? to more elaborate Collaborative Whiteboard applications will show different features of both the technologies. A complete development using NetBeans, deployment on GlassFish, and debugging using Chrome and Wireshark will be shown.
Arun Gupta, Oracle

20:30 Öl och datasnack för de som orkar på The Bishops Arms, Järntorget 6

 

Tech Talk: How I Learned to Stop Worrying and Love JavaScript

No Gravatar

Fredrik Sandell bjuder på följande agenda:

  • Vanliga problem, vad skiljer JavaScript från t ex Java eller C#
  • Hur gör man för att ändå känna igen sig som OO-utvecklare
  • Viktiga verktyg & bibliotek
  • Real World case study
  • Utveckling av JavaScript i HTML5 med exempel

Tid: onsdag 23 januari klockan 16:00
Plats: Squeeds kontor på Södra Larmgatan 4, hållplats Grönsakstorget
Anmälan: dyk bara upp (men skicka gärna ett mail till techtalks (a) squeed.com så vi har koll på att stolarna räcker)

Pimpa Göteborgs Postens skolkarta

No Gravatar

OBS! Nedanstående kod fungerar när jag skriver detta (2012-12-13), om GP ändrar sin kod så kommer det antagligen inte funka så skyll inte på mig ;)

När man har barn i skolåldern så känns Göteborgs Postens karta över skolors resultat väldigt relevant. Det är ett utmärkt initiativ men eftersom jag är lat och ville få en bättre överblick snabbt så saknade jag färgkodning av skolorna direkt på kartan så man slapp klicka på varje skola för att se den.Så vad gör en lat nörd? Klickar runt manuellt i 5 minuter eller lägger en timme på att koda ett ful-hack istället? Jag tror ni kan gissa.

Jag har alltid tyckt att bookmarklets varit hur fantastiskt som helst men har fram tills nu inte funnit nått nyttigt användningsområde. Bookmarklets är bokmärken som i stället för länkar innehåller Javascript-kod som körs på den sida som är aktiv i webbläsaren när man klickar på bokmärket. Det som är så trevligt med detta är att koden i skriptet kan modifiera den aktiva sidan hur fanken den vill.

För den som bara vill se en trevligare version av GP:s skolkarta är det bara att dra följande länk:Pimpa GP Skolkarta” till bokmärkesfältet, surfa in på skolkartan och klicka på bokmärket.

Om man inte kan eller vill installera genom att dra och släppa länken så gör en länk manuellt genom skapa ett bokmärke och ange denna text som “Adress”:

javascript:(function(){function%20pimp(){var%20e={IG:"http://www.google.com/intl/en_us/mapfiles/ms/icons/red-dot.png",G:"http://www.google.com/intl/en_us/mapfiles/ms/icons/yellow-dot.png",VG:"http://www.google.com/intl/en_us/mapfiles/ms/icons/blue-dot.png",MVG:"http://www.google.com/intl/en_us/mapfiles/ms/icons/green-dot.png"};var%20t={};var%20n=null;var%20r=null;var%20i=setInterval(function(){s()},300);var%20s=function(){if(o()){clearInterval(i);u();l(n)}};var%20o=function(){if(mktmp.spots_ready===1&&!!mktmp.mgr&&!!mktmp.mgr[0].markers){n=mktmp.mgr[0].markers;r=mktmp.spots[0].spots;return%20n.length===r.length}};var%20u=function(){for(var%20e=0,t=r.length;e<t;e++){a(r[e])}var%20n="Pimpar%20skolkartan!";n+="\n"+r.length+"%20skolor\n";alert(n)};var%20a=function(e){var%20n=new%20google.maps.LatLng(e.latitude,e.longitude);var%20r=n.toUrlValue();t[r]=e};var%20f=function(e){return%20t[e.getPosition().toUrlValue()]};var%20l=function(t){t.each(function(t){var%20n=f(t);var%20r=c(n);var%20i=e[r];t.setIcon(i)})};var%20c=function(e){var%20t=e.summary;var%20n="G";if(t.indexOf("IG")!==-1){n="IG"}else%20if(t.indexOf("MVG")!==-1){n="MVG"}else%20if(t.indexOf("VG")!==-1){n="VG"}return%20n}}pimp()})();

Skolkartan innan att skriptet körts.

Skolkartan innan att skriptet körts.

Skolkarta efter att skriptet körts

Skolkartan efter att skriptet körts

För er som eventuellt vill veta mer om hur det går till rent tekniskt så läs vidare.

För att utveckla koden installerade jag Firefox och pluginen Greasemonkey som gör det lätt att köra egna Javascript på andras sidor. När de väl fungerar med Greasemonkey är det lätt att konvertera koden till bookmarklet. Men innan jag kunde börja koda behövde jag gräva i GP:s DOM träd för att se hur jag kunde få tag på Google kartan som de använde. För detta använde jag gamla hederliga Firefox pluginen Firebug. GP har en hel del kod på sidorna som inte var relevant för mig och namnen de använder på DOM-noder och Javascript variabler är inte självklara så det var det som var det bökigaste med hela projektet. Men efter lite grävande så kom jag fram till att kartan låg i en div med namnet “mkmap” och Javascript objektet “mktmp” samt att skolorna kallades “spots”.

Nu var det bara att skriva koden (se nedan) som ändra markörerna på kartan i olika färger beroende på skolans betyg. De använder Googles karta och som tur är hade jag hade lekt lite med Google maps API innan vilket underlättade väsentligt.

Ett problem som uppkommer när man hackar in kod på en redan initierad sida på detta sätt är att veta när alla skolor var laddade och kartan är redo att moddas. En timer som körs med 300ms mellanrum används för att kolla när skolorna laddats och alla kartmarkörerna har skapats.

// start periodic check for when map is ready
var timer_id_check_map_ready = setInterval(function() {
    waitForMapReady()
}, 300);
var waitForMapReady = function() {
    if (isMapReady()) {
        // turn off timer event
       clearInterval(timer_id_check_map_ready);
        ...
    }
};
var isMapReady = function() {
    if (mktmp.spots_ready === 1 && !!mktmp.mgr && !!mktmp.mgr[0].markers) {
        markers = mktmp.mgr[0].markers;
        schools = mktmp.spots[0].spots;
        return markers.length === schools.length;
    }
};

Kartmarkörerna hade ingen referens till skolobjekt så det fanns inget lätt sätt att para ihop dem för att uppdatera markörikon efter skolans betyg, men både skolobjekten och markörerna har samma geo-position så jag använde mig av detta för att lista ut vilken skola en markör representerar.
var addGeoPosition2SchoolMapping = function(school) {
  var latitudeAndLongitudeOne = new google.maps.LatLng(school.latitude, school.longitude);
  var pos_string_val = latitudeAndLongitudeOne.toUrlValue();
  geo_position_to_school_mapping[pos_string_val] = school;

};
var getSchoolForMarker = function(marker) {
  // use the markers geoposition to get the school
  return geo_position_to_school_mapping[marker.getPosition().toUrlValue()];
};

För att ta reda på betyget på skolan söker jag bara i skolobjektets “summary” information (ett fulhack men hittade inte betyget någon annan stans).
Nu var det bara att iterera över alla markörer och sätta färg beroende på betyg.

var updateMarkerIcons = function(markers) {
  markers.each(function(marker) {
    var school = getSchoolForMarker(marker);
    var grade = getGrade(school);
    var icon = icons[grade];
    marker.setIcon(icon);
  });
};

Det var det hela, ett bräckligt litet hack men det var kul att leka lite. Hoppas det inspirerar er till egna fantastiska bookmarklets!

Hela koden:

Tech Talk: Jasmine

No Gravatar

Jasmine är ett BDD-ramverk för test av JavaScript-kod. John kommer visa hur man kommer igång, sedan skriva ett par test och även visa hur man integrerar med Team Foundation Server.

Demo-filer från Tech Talk: Jasmine

Bodil Stokke håller presentation på Javaforum den 20:e November

No Gravatar

Influgen från Norge håller Bodil en mycket populär presentation:

“CoffeeScript – JavaScript without the Fail”

JavaScript. Love it or hate it, in the web development world it’s impossible to avoid it. It was designed in one week by one man at Netscape, just to keep the browser from standardising on something even worse?and it shows. Oh, it’s not all bad, but the Good Parts?which actually make up a pretty neat language?are well hidden in among all the Bad Parts, which are there to make you, the JavaScript developer, suffer.

CoffeeScript is a language designed to take the Good Parts out of JavaScript and make a new, concise and beautiful language out of them. It runs anywhere JavaScript does?in fact, it compiles to fairly readable JavaScript?so you can already use it in your web applications and wherever else you’ve been stuck with JavaScript. In this talk, you’ll learn what CoffeeScript looks like, how it relates to the JavaScript you know, and what new features it has to offer. In fact, if you already know JavaScript well, you’ll probably be perfectly fluent in CoffeeScript after this?it’s that easy. And trust me, your life will be so much better for it.

BIO

Bodil Stokke spends her days working as a Java developer at Steria, while silently plotting to overthrow the ancien régime, replacing current programming fashions with the Next Big Thing. She hopes the Next Big Thing will have lots of parentheses, but will settle for anything without checked exceptions. She is on intimate terms with JavaScript and the web platform, having been the senior JavaScript developer on one of Scandinavia’s biggest web based mapping application?kartor.eniro.se and friends?and has since taken an active interest in CoffeeScript and Node.JS as worthy challengers to the Ruby on Rails hegemony.

Anmäl dig till forumet här

use body, not head

No Gravatar

Har precis spenderat onödigt mycket tid på att hotfixa & -hacka ett problem som inte funnits om man bara följt best practice sedan 2007 (om det hunnit hamna på dött träd – dvs i en bok – bör det vara allmänt känt senast då).

Problemet

  • &lt;script&gt; i &lt;head&gt; som gjorde window.onresize = someFunction
  • IE startas och resize-eventet skjuts loss innan &lt;body&gt; och DOM:en är klar vilket ledde till att antaganden som someFunction gjorde inte var sanna

 Nödlösning

12 timmars hackande och testande av diverse människor, fram och tillbaka, av JavaScript-kod inbakad i slutkundens EAR(WAR(JAR)), bara för att fördröja resize-eventet.

Lösning

10 minuters flyttande av <script> till slutet av <body> (eller iaf window.onresize = someFunction).

Best Practice

Put Scripts at the Bottom (dock av annan orsak).

Vettig Maven JSLint-plugin

Äntligen en ordentlig maven-plugin som kör jslint på javascript-koden. Version 2.0.2 har bättre dokumentation än 2.0.1. Här är en snippet från en pom:

<project ...>
	<build>
		<plugins>
			<plugin>
				<groupid>com.googlecode.jslint4java</groupid>
				<artifactid>jslint4java-maven-plugin</artifactid>
				<version>2.0.2</version>
				<executions>
					<execution>
						<id>lint</id>
						<phase>compile</phase>
						<goals>
							<goal>lint</goal>
						</goals>
						<configuration>
							<sourcefolders>
								<sourcefolder>${basedir}/src/main/webapp/js</sourcefolder>
							</sourcefolders>
							<failonerror>true</failonerror>
							<options>
								<browser>true</browser>
								<forin>true</forin>
								<fragment>true</fragment>
								<undef>true</undef>
								<nomen>true</nomen>
								<plusplus>true</plusplus>
								<predef>Ext,jQuery</predef>
								<sloppy>true</sloppy>
								<vars>true</vars>
								<white>true</white>
							</options>
						</configuration>
					</execution>
				</executions>
			</plugin>
</plugins></build></project>

Fantastisk utvecklarvår i Göteborg 2012!

Aldrig förr har utvecklarcommunityn i Göteborg varit så sprudlande som den är nu, iaf om du frågar mig! Till att börja med har vi minst tre rejäla konferenser, tyvärr inte fyra då Nordic Ruby går av stapeln i Stockholm i år. Hur som helst – ovanpå det har vi ju javaforum, nforum och alla user groups på Meetup, liksom SweNug, Alt.net, OWASP och en mängd andra aktiviteter som t ex Göteborgs Agilister och allt som anordnas av DataFöreningen Sverige (DFS).

Att vi har detta utbud i Göteborg tycker jag är kanon! Det ger varje utvecklare en möjlighet att välja själv, att inte bara vara tvingad till att stirra blint på en leverantörs erbjudanden, bara en teknik, bara en grupp – dvs inte bara smalna av och ramla in i “samma gamla hjulspår”, utan verkligen har en möjlighet att bredda sin insikt, kompetens och sitt nätverk.

Det som är än mer glädjande är att i all denna “konkurrens” så har verkligen de flesta user grupper jag varit i kontakt med satt just utvecklarna i första rummet. Det finns ett litet undantag som sätter sina egna ekonomiska intressen före utvecklarna i user groupen och försöker kontrollera informationen som når utvecklarna, istället för att låta medlemmarna själva bestämma vad de tycker. Jag gissar att detta blir uppenbart så småningom och att en ny grupp bildas spontant – som är till primärt för utvecklare, inte ett bolags ekonomiska intressen.
(Min uppfattning är att utvecklare är intelligenta, självständiga individer som är helt kompetenta nog att ta egna informerade beslut, inte få “så här skall du tycka och göra” nedtryckt i halsen. Nåväl, det lär som sagt självregleras inom tid.)

Så, without further ado: här är min lista på vårens toppar i Göteborg 2012!

Konferenser

WebCoast, 16-18 mars, Lindholmen Science Park (en unconference)
Software Passion Summit, 19-20 mars, Clarion Hotel Post (Centralstationen)
Scandinavian Developer Conference, 16-17 april, Svenska mässan (Korsvägen)
dev:mobile, 12 juni, Folkets hus (Järntorget)

User Groups etc

(Dessa har ju återkommande möten och byter emellanåt plats – därav blir datum/adress inte så intressant.)

vilket_är_lättast_AttLäsaTyckerDu

Jag har skaffat mig en åsikt: det_är_lättare_att_läsa_vanlig_text_så_här, änAttLäsaDetNärDetStårSammanSkrivetUtanNågonWhiteSpace. De flesta känner till att vi mnäskionr kan lsäa ord unta srröte poerblm bara start- och slutbokstaven står på rätt plats. FrsöökGröaSmmaaSakMedDtetaTxbtelcok. Så, jag har skaffat mig åsikten att underscore är en bra idé att använda i t ex namn på test(metoder). I JavaScript brukar de flesta testramverk erbjuda följande mönster:

TestCase("Nu testar vi logiken i UserManager", {
    "lägga till en användare": function() {
        var before = this.userManger.getUserCount();
        this.userManager.addUser("Fredrik", "Wendt");
        var after = this.userManger.getUserCount();
        assertThat(after, equals(before + 1));
    }
});

Det är då ganska lätt att se vad som gått fel när en rapport säger:

In Suite "Nu testar vi logiken i UserManager", the test "lägga till en användare" failed.

I Java kan vi inte använda blanktecken som del av identifierare. I Java 7 kan man iaf använda 1_000_000 för att skriva ut en miljon, yay! Men det löser inte problemet med att få läsbara namn på test(metoderna). Understreck till räddning!

Ett problem som följer med understreck är att Eclipse rätt ur lådan inte stödjer att hoppa inom identifierare som innehåller just understreck: ctrl+höger hoppar alltså till slutet av hela identifieraren. Med AnyEditTools (finns på Eclipse Marketplace) blir detta problem ett minne blott, och man får också hjälp att konvertera mellan Camel Case och Underscores. Perfekt julklapp! :)