dev:mobile 2013

No Gravatar

Tillsammans med Göteborgs utvecklarcommunity  arrangerar Squeed för andra året mobilutvecklingskonferensen dev:mobile. Årets konferens bjuder på inte mindre än 12 presentationer samt keynoten “Panel reflection about the future of mobile platforms from a developers perspective”.

Flera kända företag kommer och håller presentation som bla Spotify, Microsoft, IBM, Opera mfl.

Och det bästa av allt med en konferens som arrangerar av användargrupperna i Göteborg är att det är helt kostnadsfritt att delta! Anmäla och mer information finns här.

Continuous Delivery

No Gravatar

Fredrik Normén på Squeed kommer den 30:e April att prata om Continuous Delivery och hans erfarenheter kring området i det projekt han sitter i just nu för ett finansbolag. Ni kommer att få grundläggande förståelse kring begreppet Continuous Delivery, samt hur Fredrik och hans team har valt att lösa vissa problem i sitt utvecklingsteam, allt från process, källkodshantering, branchning, automatisering etc,  detta med hjälp av Microsoft Team Foundation Server 2012 och NuGet samt andra verktyg och hack!

Detta är ett event via Swenug som sponsras av Squeed AB.

Anmäl er här:

http://www.swenug.se/events/gbg-continuous-delivery

Strategy X vs Y

No Gravatar

X vs Y

Skrev nyss om agila affärer och länkade till Thoughtworks sida där de beskrev hur de lämnat det så organisatoriskt skadande sales commission-tänket. Av en händelse läste jag idag två X vs Y-inlägg hos Fog Creek (folket bakom Trello, Stackoverflow, “Joel on Software” etc) och det första var på just ämnet “Why do we pay sales commision“. De drar slutsatsen att det kommer från två olika synsätt på sina anställda:

Theory X which assumes that people are lazy, want to avoid work and need to be controlled, coerced, punished, and lavishly rewarded in order to perform.

Theory Y which assumes that people are self-motivated, derive satisfaction from their work, are creative, and thrive when given autonomy.

Gillar åsikten om konsekvensen av X:

Theory X demands a lot of managerial control and tends to demotivate, generate hostility, and generally make people into sour pusses.

Git vs Mercurial

På X vs Y-temat har Fog Creekarna klämt ur sig en ny version av Kiln, nu med Harmony där man helt enkelt lyckats – mer eller mindre – transparent få ett repo att agera så att man kan interagera med det från både git och mercurial utan att bry sig om vad det “egentligen” är på andra sidan. (hg bookmarks för git branches, och git refs för hg branches – ja, det finns antagligen fler problemområden de varit lite olika kreativ att kringgå.)

Java vs Java?

En helt annan reflektion – jag såg två helt olika annonser som skulle locka “Java-folk”. Det finns väldigt mycket som snurrar på JVM:en och detta ämne blir dagens avslutande X vs Y, eller är det möjligen bara en vanlig Feature Envy?

Java X: JSP, JSF, CDI (inte DCI), JEE, EJB, JPA, JAX-*, WS-*, Spring-*, …

Java Y: Scala, Clojure, JQuery, Event Sourcing, Concurrency, Distributed Computing/P2P, Scrum, Cloud, NoSql, REST, CQRS, DevOps, AWS, EC2, Android, HTML5, MongoDB, Functional programming, Mule, DCI, BigData/Hadoop, JRuby, Akka, Neo4j, Qi4j …

Snabbkok: Jenkins och Sonar

No Gravatar

Fråga: Hur lång tid tar det att sätta upp Continuous Integration, om man har lite bråttom? (Jag var iväg på en utbildning och den virtuella maskinen som skulle användas för koddelning och CI var trasig på flera sätt.)

  1. Starta virtuell maskin (Amazon i detta fall, valde en m1.large), Ubuntu Server 12.10. Lägg till portar 8080 och 9000 i den Security Group som används.
  2. ssh -i pem ubutu@machine-at-amazon
  3. sudo -s
  4. aptitude install openjdk-7-jdk git
  5. wget http://updates.jenkins-ci.org/latest/jenkins.war; java -jar jenkins.war &
  6. wget http://dist.sonar.codehaus.org/sonar-3.4.1.zip; unzip *.zip; ./sonar-3.4.1/bin/linux-x86-64/sonar.sh start
  7. http://machine-at-amazon:8080/pluginManager – installera “Jenkins GIT plugin”, “Jenkins Sonar plugin”
  8. http://machine-at-amazon:8080/configure
    1. JVM: /usr/lib/jvm/java-7-openjdk-amd64
    2. Sonar Runner: Install from Codehaus
    3. Maven: Install from Apache
    4. Sonar: Add Sonar
  9. Skapa repo på Github, peta in en pom.xml, kopiera URL (HTTP, read only) till repot.
  10. http://machine-at-amazon:8080/view/All/newJob – ange ett namn, Maven 2/3-projekt. Peta in URLen till Github-repot, välj “Sonar” som Post-build step (längst längst ner)***
  11. Tryck på Play-(bygg-)knappen – kontrollera att allt fungerar. Högerklicka på Play-knappen och kopiera länken
  12. Under Settings på Github-repot, gå till Service Hooks, Webhook URLs och klistra in URL:en från Play-knappen på Jenkins
  13. Peta på en fil i projektet lokalt (t ex stega nummer i pom.xml), git commit, git push. Kontrollera att Jenkins startar automatiskt (webhook från Github), att informationen trycks över till Sonar (http://machine-at-amazon:9000/).

Resultat

Komplett miljö igång på under 15 minuter. Användes i fyra dagar – kostnad: ~20 USD.

Ett par brasklappar

*** Gällande aktivering av Sonar som ett post-build step – detta gör ju att feedbackloopen blir långsammare för happy path: dvs om bygget går bra kommer analysen Sonar utför göra att det tar längre tid innan man får “grön flagg”. Om bygget däremot är trasigt är feedbackloopens längd oförändrad.

CloudBees är ju också ett givet alternativ och ännu roligare ihop med Sauce Labs om man t ex behöver Selenium WebDriver.

Både Jenkins och Sonar kan givetvis installeras som vanliga Ubuntu/Debian-paket istället, vilket är mer lämpligt för en permanent lösning (troligen vill man då fundera över databas och konfiguration till Sonar, kanske autentisering osv).

Balsamiq Mockups för interaktiva skisser

No Gravatar

Ett lättanvänt och snyggt program för att snabbt skapa prototyper med skiss-look är Balsamiq Mockups.

Balsamiq har ett dra-och-släpp GUI för skissning som samtidigt har ett gediget tangentbordskommandostöd. Så här kan det se ut när man skissar. I den mörka rutan ställer man in hur den markerade komponenten ska hanteras och se ut.

Exempel

Exempel. Klicka för större bild!

Det går fint att länka ihop skisser, så att man kan göra interaktiva prototyper. Länkarna följer även med när man exporterar skisserna till PDF.

Det finns också ett helskärmsläge för demonstration av skisserna där muspekaren blir härligt jättestor och en mega-hand visar sig när man hovrar över länkarna (rödmarkerade).

Helskärm

Helskärmsvyn.

Ett annat hjälpmedel om man ofta skissar liknande skisser är att återanvända delar av skisser. För att återanvända en del av en skiss, t ex en webbplats sidhuvud och sidfot gör man en symbol av en grupp:

  1. Markera komponenterna som ska återanvändas
  2. Gruppera dem genom att klicka på grupperingsikonen
  3. Namnge gruppen i popupen som kommer fram

Nu har en ny symbol skapats, som hamnar under fliken Project Assets. Den kan hämtas in till skisser precis som andra symboler, t ex textrutor eller ikoner. Symbolen kan antingen modifieras för alla skisser som använder den samtidigt eller så kan man välja att överrida med en viss skiss.

Det grönmarkerade är en symbol

Det grönmarkerade är en symbol. Klicka för större bild!

En lathund med kortkommandon finns att ladda ner härifrån.

Mer test, eller More Unit

No Gravatar

En Eclipse-plugin jag inte vill vara utan är MoreUnit. Den är väldigt liten men fyller en eller två funktioner som är mycket användbara:

  1. Skapa test
  2. Hoppa till test

Båda dessa funktioner dras igång från samma kortkommando (Ctrl+J på Win/Lin) – finns det inget test att hoppa till så får man upp “Vill du skapa ett test”-dialogen med vettiga förifyllda förslag. Finns det flera test att hoppa till så får man upp en liten ruta där man kan välja.

Installeras förslagsvis genom Eclipse Marketplace, sök bara på MoreUnit så dyker den upp.

Eclipse Marketplace

Jag brukar sedan peta lite på inställningarna för att passa min “smak” (testklassen skall sluta med …Test, JUnit4 är de inställningar jag oftast har). Extende

MoreUnit Settings

Sedan är det bara att gå loss på (legacy-)koden och trycka Ctrl+J för att skapa nya test, snabbt hoppa till testen eller kanske hitta test som “hamnat” fel.

MoreUnit - New Test Dialog

Bakom “Next”-knappen döljer sig också möjligheten att automatiskt få hjälp med att injicera mockar in i enheten under test.

Agenda för nforum den 7:e februari

No Gravatar

Den 7 Feb är det dags igen. Denna gång våra MVP (Microsoft Most Valuable Professional) Trioler från Göteborg. Anmälan dig här.

17:00 Macka & mingel

17:30 Intro

17:35 Windows 8 + Node.js = true?
Microsoft har lanserat en tjänst som heter Mobile Services i Azure. Mobile Services skall hjälpa app-utvecklare att komma igång med en backend snabbt och enkelt. Vi tar en titt på hur man kommer igång och vad man kan göra. Kan hända att vi springer på lite javascript också!
Anders Bratland – Bratland Consulting AB

18:25 Paus

18:35 Continuous Delivery med TFS Service och Azure
Att leverera oftare skapar förtroende mot beställare och marknaden, det blir viktigare och viktigare att snabbt kunna leverera nya features och få snabbare processer kring “deployment”. Fredrik Normén kommer att visa hur ni kan använda Microsoft Team Foundation Service och Microsoft Azure för att kunna göra en ”Continuous Delivery”.
Fredrik Normén – Squeed

19:15 Paus

19:45 Compilation as a Service
”Vi går mot en ny era där fler och fler vill kunna erbjuda möjligheten att bygga ut system med widgets och plugins. Genom att utnyttja Compilation as a Service kan man göra det enklare för alla parter att skapa plugins som t.ex. aktiveras vid vissa händelser i en applikation.”

Roslyn exponerar C# och VB.NET kompilatorn och vi kan utnyttja detta för att genomföra just ovanstående. Kom och lyssna på mig för att få en introduktion till vad just Roslyn är och hur vi kan utnyttja Compiler as a Service för att möjliggöra plugins i framtida applikationer.”
Filip Ekberg – Star Republic

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

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:

Smidig omvärldsbevakning

No Gravatar

I mitt nuvarande uppdrag gör jag en del omvärldsbevakning inom medicin. Jag har löst det så att jag prenumererar på RSS-flöden från intressanta utgivare, t ex Socialstyrelsen, Smittskyddsinstitutet, Läkartidningen, Läkemedelsverket och Dagens Medicin.

För att följa dem använder jag Google Reader i webbläsaren Safari. På jobbet brukar jag gå igenom rubrikerna och se vilka artiklar som vore intressanta att läsa igenom. De som är intressanta lägger jag till i min läslista i Safari. Snabbaste sättet att lägga till länken i läslistan är att högerklicka på den och helt enkelt välja Lägg till i läslista.

Google Reader i Safari

Läslistan till vänster och Google Reader till höger

Eftersom jag har installerat iCloud på min jobbdator (som kör Windows 7) och även har en iPhone med iCloud aktiverat synkroniseras läslistan automatiskt. När jag sedan sitter på pendeltåget på vägen hem från jobbet kan jag ta fram min läslista i mobilen och läsa så många artiklar som jag har lust med, resten ligger kvar olästa till nästa tillfälle dyker upp. Om jag får möjlighet att läsa något på jobbet har jag läslistan i Safari. Det funkar även mycket bra med iPaden som ger mer läsvänlig skärm men en större pryl att släpa med sig på tåget.

Øredev 2012

No Gravatar

We, Adam Lith and Magnus Härlin, from Squeed attended the Øredev conference this year, and we want to share our experience of this event.

How pairing adds value – Lisa Crispin (@lisacrispin)

Lisa Crispin made an excellent presentation on the subject of pair programming. She discussed why people might have a hard time starting to pair up, such as feeling uncomfortable and exposed. She also made several good arguments of the downside of pair programming as in the difficulty to get in the “zone”. She made one point which gave a nice transition to the next session we went to by Ryan McGeary, and that point was that even though you have a harder time getting into the zone as a pair, you will have a much more disciplined focus from not having your attention stolen from things such as Twitter, Facebook or emails.

Asynchronous Collaboration – Ryan McGeary (@rmm5t)

All in all this was one of the most thought provoking presentations, touching a very controversial subject, and therefore it deserved its very own blog post.

Software won – so what now? – David Rowan (@iRowan)

Volunteer your time and make great things. Lots of charity hacker groups have popped up and helped in different areas like maps with weather forecasts and videos from the New York storm.

Anything is possible. The tools and the platforms are here, the developers are the rock stars and can change the world.

Organizations where you can report if you paid a bribe to any official with all the data open so that everyone can see who are taking bribes and the extent of the corruption. With open data a lot can be achieved.

2 billion people currently connected to the internet, a number that is estimated to grow to 5 billion within 5 years. The reach of a good idea is endless.

Pure Functional Javascript – Christian Johansen (@cjno)

Informative session focusing on how to only use side effects and mutability where it is really necessary and the benefits that gives.

Pure functional functions are functions without side effects which make them easier to test and the risk for subtle bugs is reduced. The functions that have side effects should be isolated.

It is possible to use first class functions, functions that are declared as variables. That enables higher order functions that accepts functions as arguments or functions that return other functions. Utilizing that makes it easier to create small abstractions for common tasks.

For-loops can often be replaced with the foreach, map or reduce depending on the purpose of the loop. It gives a shorter more readable code.

Advanced Raven Db – Aeynde Rahien (@ayende)

Raven Db is a document database and compared to a lot of other document databases it has good tooling to view, update, import and export data. The size of the database only has a fractional impact on performance for read and write operations. The indexes are automatically created based on usage. First time a query is run a temporary index is created, it takes between 10 – 20 ms. If the same index is used multiple times it will be persisted as a permanent automatic index. All index updated and creates are done on the fly by a background thread. 

Any data that is stored can be queried. Raven utilizes Lucene so it is possible to make full text search as well as fuzzy search that gives suggestions if no matches are found. For data aggregation map reduce queries are used and they are created automatically and can also be updated without being recreated if the underlying data is changed. 

The Raven Db server can be run as a console application, in memory or as a Windows service. When running tests it’s very handy to use the in memory server. The only thing needed is to change to the connection string.

Micro-Services Architecture – Fred George (@fgeorge52)

As the session heading suggests, Micro-Service architecture consists of a lot of small services that only have one responsibility each which makes them quite small at about 100 lines of code in each service. This enables very rapid deployment of each service as soon as it is ready for release. Every service should be able to be deployed on its own. The messages that are passed around by the services are formatted in JSON. In the reference project that Fred referred to they had used Kafka for message passing. 

By using this setup the the micro services are made language agnostic. The services should be self monitoring and report problems that stops message processing. Multiple versions of the same service can exist, this way there won’t be any problems with several services needing to be updated at the same time.

Git scaling at GitHub – Vicent Martí (@vmg)

Vicent talked about the challenge of scaling the Github service. We won’t go into the details of this, but it was truly fascinating and we as windows users look forward to the future release of libgit2!

A note worthy to mention was that Vicent was excellent at rhetoric, and we would gladly listen to him again.

Exploring Datomic – Tim Ewald

This session blew our minds. Tim held a session about the Datomic database, with a very unique rethinking of the client-server architecture of most databases today. If this database is as promising as described by Tim, then you can expect a whole blog post about it in the future, once we have studied it more.

Build Web Apps Much Faster – Steve Sanderson (@stevensanderson)

Microsoft has release Windows Azure Mobile Services that is a backend service for simpler web applications, like mobile sites. By using the services you can just plug in authentication against Twitter, Facebook, Google and Microsoft Accounts. There is also a data store that is easy to use. It accepts json messages and automatically created the database structure based on the content. There is also the possibility to set up server side scripts that can be hooked in before an data manipulation to update the incoming request. The service runs on node.js and can use socket connections to make real time updates on the client.