<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Citerus blogg om framgångsrik mjukvaruutveckling</title>
    <link>http://www.citerus.se</link>
    <atom:link href="http://www.citerus.se/blog.xml" rel="self" type="application/rss+xml" />
    <language>sv</language>
    <ttl>40</ttl>
     <image>
      <url>http://www.citerus.se/images/generic/CITERUS_grey_M.png</url>
      <title>Citerus blogg om framgångsrik mjukvaruutveckling</title>
      <link>http://www.citerus.se</link>
    </image>
    <description>Citerus erfarenheter och åsikter om hur man utvecklar mjukvara framgångsrikt</description>
       
     <item>
          <title>Sammanfattning av Crazy Snake - Jfokus Edition</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/pic_snakes.jpg&quot;&gt;
              &lt;p&gt;Kort beskrivet gick t&amp;auml;vlingen ut p&amp;aring; att deltagarna skapade sin egen ormhj&amp;auml;rna och m&amp;ouml;tte en annan ormhj&amp;auml;rna i en match best&amp;aring;ende av tre heat. Den som hann &amp;auml;ta mest frukt innan tiden var ute eller &amp;ouml;verlevde n&amp;auml;r motst&amp;aring;ndaren dog vann heatet. Den ormhj&amp;auml;rna som vann flest heat blev King of the hill och fick m&amp;ouml;ta n&amp;auml;sta utmanare. F&amp;ouml;r att vinna hela t&amp;auml;vlingen g&amp;auml;llde det att vara King of the hill klockan kvart &amp;ouml;ver tre den andra t&amp;auml;vlingsdagen. Citerus tillhandah&amp;ouml;ll ett API och en testmotor.&lt;/p&gt;
&lt;p&gt;Tolv bidrag var med och t&amp;auml;vlade fr&amp;aring;n start och redan d&amp;aring; kunde man se att det skulle bli en h&amp;aring;rd kamp om titeln som King of Jfokus 2012. N&amp;auml;r andra t&amp;auml;vlingsdagen startade var det tydligt att m&amp;aring;nga hade &amp;auml;gnat f&amp;ouml;reg&amp;aring;ende kv&amp;auml;ll &amp;aring;t kodning, nya bidrag och uppdaterade bidrag gjorde kampen &amp;auml;nnu h&amp;aring;rdare. Under de tv&amp;aring; t&amp;auml;vlingsdagarna deltog totalt 24 t&amp;auml;vlingsbidrag och sammanlagt uppdaterades bidragen 67 g&amp;aring;nger.&lt;/p&gt;
&lt;p&gt;N&amp;auml;r klockan slog kvart &amp;ouml;ver tre p&amp;aring; den andra t&amp;auml;vlingsdagen korades King of Jfokus 2012 och det vinnande bidraget var Paxport-Ygge. PetSnake7 var det bidrag som vann flest matcher under t&amp;auml;vlingens g&amp;aring;ng: 70 vinster p&amp;aring; 91 spelade matcher. Under t&amp;auml;vlingsdagarna delades ocks&amp;aring; tre spurtpriser ut till den som var King of the hill just d&amp;aring;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Resultat:&lt;br /&gt;
&lt;/strong&gt;King of Jfokus 2012 - Paxport-Ygge&lt;br /&gt;
Spurtpris 1 - pwnBrain&lt;br /&gt;
Spurtpris 2 - Nagini&lt;br /&gt;
Spurtpris 3 - Wurstmeister&lt;br /&gt;
Flest vunna matcher - PetSnake7&lt;/p&gt;
&lt;p&gt;Ett stort tack till alla deltagare och &amp;aring;sk&amp;aring;dare f&amp;ouml;r det stora engagemanget och intresset.&lt;/p&gt;
          </description>
          <pubDate>Tue, 21 Feb 2012 08:38:42 GMT</pubDate>
          <guid>http://www.citerus.se/post/722730-sammanfattning-av-crazy-snake-jfokus</guid>
          <link>http://www.citerus.se/post/722730-sammanfattning-av-crazy-snake-jfokus</link>
      </item>
       
     <item>
          <title>Crazy Snake - Jfokus Edition!</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/pic_snakes.jpg&quot;&gt;
              &lt;p&gt;Ibland handlar utmaningen om att &amp;auml;ndra en hel avdelnings arbetss&amp;auml;tt, ibland om att snabbt realisera v&amp;auml;rde ur en otymplig kodmassa, och ibland sitter sv&amp;aring;righeterna i den kod som skall skrivas. Fr&amp;aring;n stora till sm&amp;aring; utmaningar - n&amp;auml;stan alltid finns det mycket att l&amp;auml;ra och erfarenheter att utbyta. Just d&amp;auml;rf&amp;ouml;r vill vi &amp;aring;ter igen bjuda in dit till en programmeringsutmaning p&amp;aring; Jfokus. Gnugga dina genikn&amp;ouml;lar, sparka ig&amp;aring;ng din favorit-Maven-IDE och k&amp;ouml;r ig&amp;aring;ng &lt;a href=&quot;http://www.citerus.se/jfokus&quot;&gt;h&amp;auml;r&lt;/a&gt;!&lt;/p&gt;
          </description>
          <pubDate>Wed, 08 Feb 2012 10:48:33 GMT</pubDate>
          <guid>http://www.citerus.se/post/705212-crazy-snake-jfokus-edition</guid>
          <link>http://www.citerus.se/post/705212-crazy-snake-jfokus-edition</link>
      </item>
       
     <item>
          <title>Learn portable cloud development from founder of jclouds!</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/Adrian-Cole_150_SV.jpg&quot;&gt;
              &lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;quot;My goal is to make the cloud as easy and portable as the mobile phone network.&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Adrian Cole, founder of jclouds&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Between 8-10 February, Citerus will present a three-day hands-on class in portable cloud development, led by Adrian Cole, the founder of jclouds. Jclouds is an open library that simplifies the development of portable cloud applications for Java and Clojure developers.&lt;/p&gt;
&lt;h3&gt;Time To Market more important when launching cloud services&lt;/h3&gt;
&lt;p&gt;Today more and more business, services and applications are using cloud services, like Amazon EC2 or Microsoft Azure, to reduce their time to market and improve their agility. &amp;quot;The cloud&amp;quot; has fundamentally changed the deployment of services and data storage, reducing to mere minutes the time taken to provision hardware and deploy an application, an improbable dream several years ago.&lt;/p&gt;
&lt;h3&gt;Obstacle in API growth&lt;/h3&gt;
&lt;p&gt;However, in recent years the number of cloud providers has skyrocketed, creating a bewildering mix of 'standard' APIs. The number of&amp;nbsp;APIs, and the variations between them, complicates the selection of cloud services for developers and users and creates vendor lock-in. Correctly choosing a vendor and understanding their API can completely determine the success of your project! Jclouds provides an easy to use, open standard for accessing cloud services with different APIs, allowing you to create portable multi-cloud applications, without having to learn or worry about the differences between multiple APIs.&lt;/p&gt;
&lt;h3&gt;Jclouds solves API issues&lt;/h3&gt;
&lt;p&gt;Jclouds started as an open Java library for Amazon's Simple Storage Service when Amazon was pioneering cloud storage. Since then jclouds has grown to provide an easy to use, idiomatic, Java and Clojure API for compute and storage across more than thirty cloud providers. Jclouds provides a natural way to develop for the cloud on the Java platform without being tied to a particular clouds supplier. Many problems and complexities relating to error handling, concurrency and unique API 'features' are managed under the surface, allowing you to focus development on the application in the cloud, rather than troubleshooting specific implementations.&lt;/p&gt;
&lt;h3&gt;Jclouds used by distinguished brands&lt;/h3&gt;
&lt;p&gt;Jclouds has been designed from the ground up to handle concurrency, support a common domain model, transparently handle differences between APIs and providers, and provide a portable abstraction while allowing you to access cloud specific features. Jclouds' limited external dependencies allow it to run in restricted environments like Google App Engine and reduce the risk of code conflict. Test stubs are provided for each provider to ensure that your cloud application is fully testable, even without an internet connection. Twitter, Adobe, Red Hat, Enstratus and Neotys are already using jclouds for cloud provisioning and storage, now you can too!&lt;/p&gt;
&lt;p&gt;Citerus are proud to offer the oppurtunity to learn cloud development in collaboration with Adrian Cole, creator of jclouds. Sign up to Adrian's unique three-day course in Stockholm on 8-10 February 2012. The course will introduce the key concepts of cloud development and the toolkit required for development. Bring your own computer as you will be writing code during the class!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The course is held in Stockholm 8-10 February 2012&lt;br /&gt;
&lt;a href=&quot;http://www.citerus.se/jclouds&quot;&gt;Register here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Links:&amp;nbsp;&lt;br /&gt;
&lt;a href=&quot;http://www.citerus.se/jclouds&quot;&gt;http://www.citerus.se/jclouds&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.jclouds.org&quot;&gt;http://www.jclouds.org&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/jclouds/jclouds&quot;&gt;https://github.com/jclouds/jclouds&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.cloudsoftcorp.com&quot;&gt;http://www.cloudsoftcorp.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For more information&lt;br /&gt;
Karin Edstr&amp;ouml;m, CEO Citerus AB&lt;br /&gt;
&lt;a href=&quot;mailto:karin.edstrom@citerus.se?subject=Jclouds&quot;&gt;karin.edstrom@citerus.se&lt;/a&gt;&lt;br /&gt;
Phone:&amp;nbsp;+46 733 225 227&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.citerus.se&quot;&gt;www.citerus.se&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Wed, 23 Nov 2011 14:44:40 GMT</pubDate>
          <guid>http://www.citerus.se/post/591574-learn-portable-cloud-development-from-founder</guid>
          <link>http://www.citerus.se/post/591574-learn-portable-cloud-development-from-founder</link>
      </item>
       
     <item>
          <title>Lär dig molnutveckling från skaparen av jclouds!</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/Adrian-Cole_150_SV.jpg&quot;&gt;
              &lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;quot;Jag ska g&amp;ouml;ra molnet lika l&amp;auml;tt och &amp;aring;tkomligt som mobiln&amp;auml;tet.&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Adrian Cole, skapare av jclouds&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;Tidsfaktorn allt viktigare vid lansering av tj&amp;auml;nster i molnet&lt;/h3&gt;
&lt;p&gt;Att time-to-market &amp;auml;r viktigt i mjukvarubranschen numera &amp;auml;r ingen nyhet. Men att kunna drifts&amp;auml;tta flertalet servrar, bakom en lastbalanserare, med full kontroll &amp;ouml;ver val av b&amp;aring;de operativsystem och h&amp;aring;rdvara (provisionering), f&amp;ouml;r att sedan inom n&amp;aring;gra minuter drifts&amp;auml;tta sin applikation p&amp;aring; dessa noder trodde inte m&amp;aring;nga p&amp;aring; f&amp;ouml;r n&amp;aring;gra &amp;aring;r sedan. Molnet har i grunden f&amp;ouml;r&amp;auml;ndrat hur vi idag drifts&amp;auml;tter tj&amp;auml;nster och lagrar data. Fler och fler tj&amp;auml;nster och applikationer hittar numera sitt hem i moln som t ex Amazon EC2 eller Microsoft Azure.&lt;/p&gt;
&lt;h3&gt;St&amp;ouml;testenar med API:er och testning&lt;/h3&gt;
&lt;p&gt;Under de senare &amp;aring;ren har dock antalet API:er f&amp;ouml;r molnlagring och provisionering av virtuella maskiner &amp;ouml;kat men framf&amp;ouml;rallt har antalet leverant&amp;ouml;rer skjutit i h&amp;ouml;jden. Detta har skapat en stor blandning av olika API:er som alla har likheter och skillnader. Som utvecklare och anv&amp;auml;ndare av en molntj&amp;auml;nst finns det m&amp;aring;nga aspekter att titta p&amp;aring; n&amp;auml;r det handlar om att v&amp;auml;lja API, men &amp;auml;ven vilken leverant&amp;ouml;r man v&amp;auml;ljer kan spela stor roll f&amp;ouml;r hur v&amp;auml;l tj&amp;auml;nsten passar f&amp;ouml;r anv&amp;auml;ndningsomr&amp;aring;det.&lt;br /&gt;
Testbarhet har &amp;auml;ven det varit en grundpelare i jclouds &amp;auml;nda sedan starten och tack vare de stubbade API:erna &amp;auml;r det m&amp;ouml;jligt att utveckla helt utan n&amp;auml;tverks&amp;aring;tkomst. Stubbade API:er &amp;auml;r nedladdningsbara versioner som simulerar verkliga API:er fr&amp;aring;n molntj&amp;auml;nsteleverant&amp;ouml;rer.&lt;/p&gt;
&lt;h3&gt;Jclouds l&amp;ouml;ser API-problematik&lt;/h3&gt;
&lt;p&gt;Ramverket jclouds erbjuder ett naturligt s&amp;auml;tt att b&amp;ouml;rja utveckla f&amp;ouml;r molnet p&amp;aring; Javaplattformen utan att binda sig mot en speciell molnleverant&amp;ouml;r. M&amp;aring;nga problem relaterade till felhantering, samtidighet och skillnader mellan olika API:er och leverant&amp;ouml;rer hanteras under ytan p&amp;aring; ett konsekvent s&amp;auml;tt, utan att f&amp;ouml;r den sakens skulle g&amp;ouml;mmas f&amp;ouml;r utvecklaren. Jclouds har en pragmatisk syn p&amp;aring; portabilitet, med en gemensam dom&amp;auml;nmodell f&amp;ouml;r de flesta anv&amp;auml;ndningsfall, men d&amp;auml;r det &amp;auml;ven finns st&amp;ouml;d f&amp;ouml;r att hantera skillnaderna mellan API:er och olika leverant&amp;ouml;rer.&lt;/p&gt;
&lt;h3&gt;Stora plattformar&amp;nbsp;anv&amp;auml;nder jclouds&lt;/h3&gt;
&lt;p&gt;Amazon var tidigt ute med sin tj&amp;auml;nst Simple Storage Service (S3) och jclouds startades n&amp;auml;r de d&amp;aring; tillg&amp;auml;ngliga Java-biblioteken f&amp;ouml;r S3 inte h&amp;ouml;ll m&amp;aring;ttet g&amp;auml;llande samtidighet och skalbarhet. Fr&amp;aring;n att ha varit ett projekt som skulle st&amp;ouml;dja lagring p&amp;aring; Amazon S3 har initiativet v&amp;auml;xt betydligt. Numera handlar jclouds om att ge ett enkelt och idiomatiskt alternativ f&amp;ouml;r molnutveckling i Java eller Clojure, jclouds har idag st&amp;ouml;d f&amp;ouml;r &amp;ouml;ver 30 molnleverant&amp;ouml;rer. Jclouds &amp;auml;r fr&amp;aring;n grunden designat f&amp;ouml;r samtidighet och d&amp;aring; beroenden till externa bibliotek &amp;auml;r f&amp;aring; till antalet, l&amp;ouml;st kopplande och noggrant utvalda kan jclouds k&amp;ouml;ra i milj&amp;ouml;er som har speciella restriktioner, som till exempel&amp;nbsp;Google App Engine. Jclouds anv&amp;auml;nds f&amp;ouml;r provisionering och lagring hos bland annat Twitter, Adobe och Red Hat.&lt;/p&gt;
&lt;h3&gt;Djupdykning i molnutveckling&lt;/h3&gt;
&lt;p&gt;Tillsammans med Adrian Cole och Cloudsoft erbjuder Citerus en sp&amp;auml;nnande djupdykning i molnutveckling. Under tre unika dagar med Adrian visas det hur det g&amp;aring;r till att skriva kod i Java och Clojure som &amp;auml;r testbar, skalbar och flyttbar mellan olika molntj&amp;auml;nster. Kursen kommer att introducera de viktigaste begreppen inom molnutveckling samt den verktygsl&amp;aring;da som en utvecklare beh&amp;ouml;ver f&amp;ouml;r att komma ig&amp;aring;ng. Med sin egen dator f&amp;ouml;ljer deltagaren med i kodexempel och skriver egen kod i jclouds under kursens g&amp;aring;ng.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kursen g&amp;aring;r i Stockholm den 8-10 februari 2012&lt;br /&gt;
&lt;a href=&quot;http://www.citerus.se/jclouds&quot;&gt;Anm&amp;auml;l dig h&amp;auml;r&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L&amp;auml;nkar:&lt;br /&gt;
&lt;a href=&quot;http://www.citerus.se/curriculum/570338-jclouds-fundamentals&quot;&gt;http://www.citerus.se/jclouds&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.jclouds.org/&quot;&gt;http://www.jclouds.org&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/jclouds/jclouds&quot;&gt;https://github.com/jclouds/jclouds&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.cloudsoftcorp.com/&quot;&gt;http://www.cloudsoftcorp.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;F&amp;ouml;r mer information&lt;br /&gt;
Karin Edstr&amp;ouml;m, VD Citerus AB&lt;br /&gt;
&lt;a href=&quot;mailto:karin.edstrom@citerus.se?subject=Jclouds&quot;&gt;karin.edstrom@citerus.se&lt;/a&gt;&lt;br /&gt;
Tfn: 0733-225 227&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Citerus hj&amp;auml;lper sina kunder att lyckas med mjukvaruutveckling; antingen genom att utbilda och coacha, inf&amp;ouml;ra ett sj&amp;auml;lvstyrande ledarskap och ett l&amp;auml;ttr&amp;ouml;rligt arbetss&amp;auml;tt eller genom att utveckla mjukvara &amp;aring;t dem. Allt f&amp;ouml;r att de ska kunna h&amp;aring;lla en h&amp;ouml;g innovationstakt och skapa smarta l&amp;ouml;sningar som &amp;ouml;kar deras konkurrenskraft. Vi &amp;auml;r ledande p&amp;aring; Scrum, Java, Dom&amp;auml;ndriven design och m&amp;aring;nga andra metoder och tekniker i framkant.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.citerus.se&quot;&gt;www.citerus.se&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Wed, 23 Nov 2011 10:14:04 GMT</pubDate>
          <guid>http://www.citerus.se/post/591528-l-r-dig-molnutveckling-fr-n-skaparen-av</guid>
          <link>http://www.citerus.se/post/591528-l-r-dig-molnutveckling-fr-n-skaparen-av</link>
      </item>
       
     <item>
          <title>Med Domändriven Design hanteras dagens ökade systemkomplexitet</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/Citerus_3216.jpg&quot;&gt;
              &lt;h4&gt;Reducerad komplexitet - &amp;Ouml;kad produktivitet!&lt;/h4&gt;
&lt;p&gt;Dom&amp;auml;ndriven design handlar om att utforska modeller i en kreativ samverkan med dom&amp;auml;nexperter f&amp;ouml;r att p&amp;aring; s&amp;aring; s&amp;auml;tt lyfta komplexitetstaket. Programmerare kan d&amp;aring; bygga system som snabbt genererar aff&amp;auml;rsnytta och samtidigt &amp;auml;r konstruerade f&amp;ouml;r att kunna vidareuvecklas under m&amp;aring;nga &amp;aring;r. Inte s&amp;auml;llan finns l&amp;ouml;sningen p&amp;aring; till synes tekniska problem i en djupare f&amp;ouml;rst&amp;aring;else f&amp;ouml;r dom&amp;auml;nen!&lt;/p&gt;
&lt;p&gt;Under den fyra dagar l&amp;aring;nga kursen g&amp;ouml;rs en djupdykning inom dessa omr&amp;aring;den. Genom att varva taktiska och strategiska diskussioner samt teoripass med kodning och modellering ger kursen de verktyg som kr&amp;auml;vs. Citerus erbjuder kursen i samarbete med Eric Evans p&amp;aring; Domain Language Inc.&lt;/p&gt;
&lt;p&gt;Kursen ges 5-8 december. L&amp;auml;nk till information om kursen:&amp;nbsp;&lt;a href=&quot;http://www.citerus.se/curriculum/230923-domain-driven-design-dom-nmodellen-i-arbete&quot;&gt;DDD&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;F&amp;ouml;r mer information,&lt;br /&gt;
Karin Edstr&amp;ouml;m, VD Citerus AB&lt;br /&gt;
karin.edstrom@citerus.se&lt;br /&gt;
Tfn:&amp;nbsp;0733-225 227&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Citerus hj&amp;auml;lper sina kunder att lyckas med mjukvaruutveckling; antingen genom att utbilda och coacha, inf&amp;ouml;ra ett sj&amp;auml;lvstyrande ledarskap och ett l&amp;auml;ttr&amp;ouml;rligt arbetss&amp;auml;tt eller genom att utveckla mjukvara &amp;aring;t dem. Allt f&amp;ouml;r att de ska kunna h&amp;aring;lla en h&amp;ouml;g innovationstakt och skapa smarta l&amp;ouml;sningar som &amp;ouml;kar deras konkurrenskraft. Vi &amp;auml;r ledande p&amp;aring; Scrum, Java, Dom&amp;auml;ndriven design och m&amp;aring;nga andra metoder och tekniker i framkant.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.citerus.se&quot;&gt;www.citerus.se&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Thu, 10 Nov 2011 09:59:50 GMT</pubDate>
          <guid>http://www.citerus.se/post/574670-med-dom-ndriven-design-hanteras-dagens-kade</guid>
          <link>http://www.citerus.se/post/574670-med-dom-ndriven-design-hanteras-dagens-kade</link>
      </item>
       
     <item>
          <title>Premiär för Agil re-bootcamp hos Citerus</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/Citerus_3409.jpg&quot;&gt;
              &lt;p&gt;Mikael Boman och Tobias Fors arbetar i sina konsultroller p&amp;aring; Citerus n&amp;auml;ra m&amp;aring;nga olika kunder och s&amp;aring;g ett behov av erfarenhetsutbyte. De har tillsammans utvecklat Agil re-bootcamp som en &amp;quot;st&amp;ouml;dmottagning&amp;quot; f&amp;ouml;r insatser mot de utmaningar som uppst&amp;aring;r n&amp;auml;r omdaningen till l&amp;auml;ttr&amp;ouml;rliga metoder inte g&amp;aring;r som f&amp;ouml;rv&amp;auml;ntat. M&amp;aring;nga g&amp;aring;nger &amp;auml;r det helt naturliga hinder som det finns verktyg f&amp;ouml;r att hantera, det g&amp;auml;ller bara att hitta verktygen.&lt;/p&gt;
&lt;h3&gt;Korta f&amp;ouml;redrag och Open space&lt;/h3&gt;
&lt;p&gt;- En s&amp;aring;n h&amp;auml;r dag samlar kunskap p&amp;aring; ett s&amp;auml;tt som drar ig&amp;aring;ng kreativiteten och skapar energi, s&amp;auml;ger Mikael Boman som tillsammans med Tobias Fors kommer leda dagen. - Det blir n&amp;aring;got kort f&amp;ouml;redrag men huvudfokus f&amp;ouml;r dagen &amp;auml;r p&amp;aring; workshoppar i Open Space-format. Vi hoppas kunna ge deltagarna ett riktigt lyft med de id&amp;eacute;er som kommer fram under dagen. V&amp;auml;l tillbaka i sin vardag kan de forts&amp;auml;tta utveckla sitt arbetss&amp;auml;tt. Vi har identifierat en vilja hos m&amp;aring;nga som fastnat i sin agila utveckling att komma vidare. D&amp;aring; kan en inspirations-injektion vara precis det som beh&amp;ouml;vs f&amp;ouml;r att kunna ta steget, avslutar Mikael Boman.&lt;/p&gt;
&lt;h3&gt;Genererar m&amp;aring;nga l&amp;ouml;sningar att v&amp;auml;lja bland&lt;/h3&gt;
&lt;p&gt;R&amp;auml;tt anv&amp;auml;nt &amp;auml;r Open Space ett effektivt format som fungerar v&amp;auml;ldigt bra f&amp;ouml;r att l&amp;auml;ra av varandra, till&amp;auml;gger Tobias Fors. - Vi vet att ett antal fr&amp;aring;gest&amp;auml;llningar kommer komma upp som m&amp;aring;nga k&amp;auml;nner igen sig i, och olika l&amp;ouml;sningsalternativ kan diskuteras fram. Genom att anv&amp;auml;nda Open Space som format &amp;auml;r alla med och v&amp;auml;ljer de diskussioner som &amp;auml;r intressanta och relevanta f&amp;ouml;r den situation de befinner sig i. Agil re-bootcamp ger en nystart och g&amp;ouml;r det l&amp;auml;ttare att ta ett steg till fram&amp;aring;t, avslutar Tobias Fors entusiastiskt.&lt;/p&gt;
&lt;p&gt;Premi&amp;auml;r f&amp;ouml;r Agil re-bootcamp &amp;auml;r den 24 november i Fryshuset.&lt;/p&gt;
&lt;p&gt;F&amp;ouml;r information och anm&amp;auml;lan:&amp;nbsp;&lt;a href=&quot;http://www.citerus.se/curriculum/385866-agil-re-bootcamp&quot;&gt;klicka h&amp;auml;r&lt;/a&gt; eller anv&amp;auml;nd l&amp;auml;nk:&lt;br /&gt;
&lt;a href=&quot;http://www.citerus.se/curriculum/385866-agil-re-bootcamp&quot;&gt;http://www.citerus.se/curriculum/385866-agil-re-bootcamp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;F&amp;ouml;r mer information&lt;br /&gt;
Karin Edstr&amp;ouml;m, VD Citerus AB&lt;br /&gt;
&lt;a href=&quot;mailto:karin.edstrom@citerus.se&quot;&gt;karin.edstrom@citerus.se&lt;/a&gt;&lt;br /&gt;
Tfn:&amp;nbsp;0733-225 227&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Citerus hj&amp;auml;lper sina kunder att lyckas med mjukvaruutvecklingen; antingen genom att utbilda och coacha, inf&amp;ouml;ra ett sj&amp;auml;lvstyrande ledarskap och ett l&amp;auml;ttr&amp;ouml;rligt arbetss&amp;auml;tt eller genom att utveckla mjukvara &amp;aring;t dem. Allt f&amp;ouml;r att de ska kunna h&amp;aring;lla en h&amp;ouml;g innovationstakt och skapa smarta l&amp;ouml;sningar som &amp;ouml;kar deras konkurrenskraft. Vi &amp;auml;r ledande p&amp;aring; Scrum, Java, Dom&amp;auml;ndriven design och m&amp;aring;nga andra metoder och tekniker i framkant.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.citerus.se&quot;&gt;www.citerus.se&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Mon, 31 Oct 2011 09:40:47 GMT</pubDate>
          <guid>http://www.citerus.se/post/557757-premi-r-f-r-agil-re-bootcamp-hos-citerus</guid>
          <link>http://www.citerus.se/post/557757-premi-r-f-r-agil-re-bootcamp-hos-citerus</link>
      </item>
       
     <item>
          <title>Holländske Apello utvecklar svenska chefer i agilt ledarskap</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/jurgen-appelo.jpg&quot;&gt;
              &lt;p&gt;Frit&amp;auml;nkaren och f&amp;ouml;rfattaren Jurgen Apello beskriver en ny niv&amp;aring; av ledarskap i boken Management 3.0, en bok som tagit v&amp;auml;rlden med storm. Efter att ha drivit f&amp;ouml;retag med hundra utvecklare &amp;auml;gnar han sedan publiceringen en stor del av sin tid &amp;aring;t att &amp;aring;ka runt i v&amp;auml;rlden som ledarskapskonsult. Han hj&amp;auml;lper ledare att praktiskt kunna till&amp;auml;mpa bokens nydanande teorier om ett agilt - l&amp;auml;ttr&amp;ouml;rligt - ledarskap.&lt;/p&gt;
&lt;h4&gt;Agila arbetsformer som g&amp;ouml;r jobbet roligt&lt;/h4&gt;
&lt;p&gt;Jurgen Apello har analyserat vad det &amp;auml;r som driver m&amp;auml;nniskor och hur en ledare genom att se dessa behov kan f&amp;ouml;rb&amp;auml;ttra sitt ledarskap och f&amp;aring; entusiastiska medarbetare. Han tar h&amp;aring;l p&amp;aring; myterna om d&amp;aring;liga ledare och ovilliga medarbetare genom att visa hur alla, med ett annat s&amp;auml;tt att se p&amp;aring; saker, kan bli b&amp;auml;ttre. Citerus har lyckats f&amp;aring; Jurgen Apello till Sverige s&amp;aring; att &amp;auml;ven svenska chefer kan ta del av de praktiska metoder som leder till ett framg&amp;aring;ngsrikt agilt ledarskap.&lt;/p&gt;
&lt;h4&gt;Agila metoder revolutionerar ledarskap&lt;/h4&gt;
&lt;p&gt;Ledarskapet &amp;auml;r ett omr&amp;aring;de som ofta gl&amp;ouml;ms bort n&amp;auml;r man talar om agilt och l&amp;auml;ttr&amp;ouml;rligt arbete. N&amp;auml;r organisationer inf&amp;ouml;r agil mjukvaruutveckling &amp;auml;r det inte bara utvecklare, testare och projektledare som m&amp;aring;ste l&amp;auml;ra sig ett nytt s&amp;auml;tt att jobba. Utvecklingschefer och ledare ska ocks&amp;aring; l&amp;auml;ra sig ett nytt s&amp;auml;tt att leda f&amp;ouml;r att stimulera agila organisationer. Det h&amp;auml;r &amp;auml;r en unik m&amp;ouml;jlighet f&amp;ouml;r ledare och chefer att snabbt n&amp;aring; ett agilt ledarskap.&lt;/p&gt;
&lt;p&gt;Kursen h&amp;aring;lls 24-25 oktober, f&amp;ouml;r information om kursen och Jurgen Apello, &lt;a href=&quot;http://www.citerus.se/curriculum/440987-management-3-0-agilt-ledarskap-i&quot;&gt;se Citerus hemsida&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;F&amp;ouml;r mer information&lt;br /&gt;
Karin Edstr&amp;ouml;m, VD Citerus AB&lt;br /&gt;
&lt;a href=&quot;mailto:karin.edstrom@citerus.se&quot;&gt;karin.edstrom@citerus.se&lt;/a&gt;&lt;br /&gt;
Tfn:&amp;nbsp;0733 225 227&lt;/p&gt;
&lt;p&gt;Citerus hj&amp;auml;lper sina kunder att lyckas med mjukvaruutveckling; antingen genom att utbilda och coacha, inf&amp;ouml;ra ett sj&amp;auml;lvstyrande ledarskap och ett l&amp;auml;ttr&amp;ouml;rligt arbetss&amp;auml;tt eller genom att utveckla mjukvara &amp;aring;t dem. Allt f&amp;ouml;r att de ska kunna h&amp;aring;lla en h&amp;ouml;g innovationstakt och skapa smarta l&amp;ouml;sningar som &amp;ouml;kar deras konkurrenskraft. Vi &amp;auml;r ledande p&amp;aring; Scrum, Java, Dom&amp;auml;ndriven design och m&amp;aring;nga andra metoder och tekniker i framkant.&lt;br /&gt;
&lt;a href=&quot;http://www.citerus.se&quot;&gt;www.citerus.se&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Fri, 30 Sep 2011 12:31:10 GMT</pubDate>
          <guid>http://www.citerus.se/post/516559-holl-ndske-apello-utvecklar-svenska-chefer-i</guid>
          <link>http://www.citerus.se/post/516559-holl-ndske-apello-utvecklar-svenska-chefer-i</link>
      </item>
       
     <item>
          <title>Turboladda din systemarkitektur med Domändriven design och CQRS</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/Greg Young1.jpg&quot;&gt;
              &lt;p&gt;Det har g&amp;aring;tt mer &amp;auml;n fem &amp;aring;r sedan Eric Evans introducerade begreppet Domain-Driven Design, DDD, med sin bok &lt;em&gt;Domain-Driven Design - Tackling Complexity in the Heart of Software&lt;/em&gt;. Boken samlade ett antal centrala begrepp inom&amp;nbsp;framf&amp;ouml;rallt objektorienterad analys, design och implementation under ett gemensamt tak och har p&amp;aring; m&amp;aring;nga s&amp;auml;tt skapat nytt liv i tankarna runt design av mjukvara med tydligt avstamp i dess problemdom&amp;auml;n.&lt;/p&gt;
&lt;p&gt;Introduktionen av begreppen dom&amp;auml;nh&amp;auml;ndelser (Domain Events), och Event Sourcing &amp;auml;r troligen de omr&amp;aring;den d&amp;auml;r Dom&amp;auml;ndriven design har utvecklats mest under de senaste &amp;aring;ren. S&amp;auml;rskilt arkitektur baserade runt designm&amp;ouml;nstret Command Query Responsibility Segregation, CQRS har r&amp;ouml;nt stor uppm&amp;auml;rksamhet under ett par &amp;aring;r och &amp;auml;r st&amp;auml;ndigt &amp;aring;terkommande &amp;auml;mnen p&amp;aring; konferenser som &amp;Oslash;redev, DDD eXchange och QCon. B&amp;aring;de den ordinarie och den extrainsatta workshopen om CQRS p&amp;aring; &amp;aring;rets upplaga av &amp;Oslash;redev &amp;auml;r uts&amp;aring;lda l&amp;aring;ngt innan konferensstart.&lt;/p&gt;
&lt;p&gt;CQRS &amp;auml;r i grunden, lite beroende p&amp;aring; vem man fr&amp;aring;gar, ett s&amp;auml;tt att tydligt dela upp metoder s&amp;aring; att l&amp;auml;sning (query) och kommandon (commands) indelas i olika klasser. CQRS kombineras ofta med andra m&amp;ouml;nster som Event Sourcing och Domain Events f&amp;ouml;r att skapa systemarkitekturer d&amp;auml;r interaktion med applikationen sker via kommandon och h&amp;auml;ndelser. L&amp;auml;sning skiljs tydligt fr&amp;aring;n skrivning, inte s&amp;auml;llan med olika modeller f&amp;ouml;r dessa.&lt;/p&gt;
&lt;p&gt;CQRS i kombination med Event Sourcing v&amp;auml;nder till viss del upp och ner p&amp;aring; etablerade s&amp;auml;tt att designa system och utmanar hur vi ser p&amp;aring; systemarkitektur. En design baserad p&amp;aring; Event Sourcing och CQRS &amp;ouml;ppnar upp en hel del intressanta m&amp;ouml;jligheter som &amp;auml;r begr&amp;auml;nsade i en mer traditionell CRUD-arkitektur. Det kanske mest omtalade &amp;auml;r m&amp;ouml;jligheten att bygga applikationer som helt separerar l&amp;auml;sning fr&amp;aring;n skrivning och d&amp;auml;r dessa tv&amp;aring; aktiviteter kan skalas oberoende av varandra f&amp;ouml;r att hantera mycket omfattande genomstr&amp;ouml;mning av data. Tidigt i tankarna runt DDD ans&amp;aring;gs dessa typer av applikationer, med mycket data och h&amp;ouml;ga krav p&amp;aring; prestanda, som mindre l&amp;auml;mpliga f&amp;ouml;r Domain-Driven Design, en uppfattning som CQRS och Event Sourcing har kommit att till stor del f&amp;ouml;r&amp;auml;ndra.&lt;/p&gt;
&lt;p&gt;En annan intressant egenskap hos dessa typer av arkitektur &amp;auml;r att vi genom att spara v&amp;aring;ra inkommande h&amp;auml;ndelser och kommandon kan sp&amp;aring;ra inte bara nuvarande systemtillst&amp;aring;nd, utan &amp;auml;ven hur vi kom dit. Detta, i sin tur, leder till andra m&amp;ouml;jligheter.&lt;/p&gt;
&lt;p&gt;Om vi till exempel st&amp;ouml;ter p&amp;aring; produktionsproblem kan vi i en testmilj&amp;ouml; &amp;aring;terst&amp;auml;lla systemet i ett tidigare tillst&amp;aring;nd och sedan l&amp;auml;gga p&amp;aring; alla sparade kommandon igen f&amp;ouml;r att p&amp;aring; s&amp;aring; s&amp;auml;tt sp&amp;aring;ra exakt vad som gick fel. Detta &amp;auml;r n&amp;aring;got som ofta kan vara sv&amp;aring;rt att g&amp;ouml;ra baserat enbart p&amp;aring; loggningsdata.&lt;/p&gt;
&lt;p&gt;Det kan ocks&amp;aring; ge oss m&amp;ouml;jlighet att k&amp;ouml;ra om gamla h&amp;auml;ndelser och kommandon i nya versioner av mjukvaran, eller mot alternativa modeller, och p&amp;aring; s&amp;aring; s&amp;auml;tt skapa nya aff&amp;auml;rsdata ur tidigare h&amp;auml;ndelser.&lt;/p&gt;
&lt;p&gt;Citerus kan nu erbjuda dig en utm&amp;auml;rkt m&amp;ouml;jlighet att l&amp;auml;ra dig mer om DDD och CQRS i samarbete med Greg Young, en av de absoluta frontfigurerna inom omr&amp;aring;det. Anm&amp;auml;l dig redan idag till Gregs legendariska tredagarskurs i Stockholm den 14-16 november. Kursen introducerar teorin bakom CQRS och Event Sourcing, men fr&amp;auml;mst ligger fokus p&amp;aring; att implementera DDD och skriva fungerande kod! Du tar med egen dator s&amp;aring; att du kan utveckla i den milj&amp;ouml; och det spr&amp;aring;k som du &amp;auml;r mest bekv&amp;auml;m med &lt;a href=&quot;http://www.citerus.se/cqrs&quot;&gt;www.citerus.se/cqrs&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://cqrsinfo.com/&quot;&gt;CQRS Info&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://codebetter.com/gregyoung/&quot;&gt;Greg Young&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.amazon.com/Event-Centric-Simplicity-Addison-Wesley-Signature/dp/0321768221/&quot;&gt;Greg Youngs kommande bok om CQRS&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://martinfowler.com/bliki/CQRS.html&quot;&gt;Martin Fowler om CQRS&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://martinfowler.com/eaaDev/EventSourcing.html&quot;&gt;Martin Fowler om Event Sourcing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
          </description>
          <pubDate>Thu, 29 Sep 2011 08:05:10 GMT</pubDate>
          <guid>http://www.citerus.se/post/515152-turboladda-din-systemarkitektur-med-dom-ndriven-design</guid>
          <link>http://www.citerus.se/post/515152-turboladda-din-systemarkitektur-med-dom-ndriven-design</link>
      </item>
       
     <item>
          <title>Citerus pratar Agil Innovation på Entreprenörsgalan idag</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/entreprenorsgalan_logotype.png&quot;&gt;
              &lt;p&gt;Agil Innovation och Agil Expansion &amp;auml;r begrepp som Citerus kommer prata om p&amp;aring; &lt;a href=&quot;http://www.foundersalliance.com/entrepren%C3%B6rsgalan&quot;&gt;Entrepren&amp;ouml;rsgalan 2011&lt;/a&gt; idag. Agil Innovation inneb&amp;auml;r att ta hj&amp;auml;lp av agila metoder, f&amp;ouml;r att fokusera p&amp;aring; aff&amp;auml;rsnytta genom design och utveckling av en f&amp;ouml;rsta version. F&amp;ouml;r att sedan klara en vidareutvecklings- och f&amp;ouml;rvaltningsfas n&amp;auml;r kunderna str&amp;ouml;mmar till och aff&amp;auml;rerna tar fart, hj&amp;auml;lper v&amp;aring;r erfarenhet av Agil Expansion.&lt;/p&gt;
&lt;h3&gt;Agil Innovation&lt;/h3&gt;
&lt;p&gt;Agil Innovation handlar om att anv&amp;auml;nda agila verktyg f&amp;ouml;r att p&amp;aring; ett flexibelt s&amp;auml;tt fokusera p&amp;aring; att maximera aff&amp;auml;rsnyttan, f&amp;ouml;r att snabbt kunna g&amp;aring; fr&amp;aring;n id&amp;eacute; till handling. Detta f&amp;ouml;r att kunna kommersialisera en aff&amp;auml;rsid&amp;eacute; med begr&amp;auml;nsade resurser, i form av tid och pengar.&lt;/p&gt;
&lt;h3&gt;Agil Expansion&lt;/h3&gt;
&lt;p&gt;N&amp;auml;r den f&amp;ouml;rsta lanseringen &amp;auml;r klar g&amp;auml;ller det att vara beredd p&amp;aring; expansion. P&amp;aring; n&amp;auml;tet kan framg&amp;aring;ngen g&amp;aring; extremt snabbt och d&amp;aring; g&amp;auml;ller det att vara f&amp;ouml;rberedd s&amp;aring; att alla delar kan expandera. S&amp;aring;v&amp;auml;l processer som organisationen beh&amp;ouml;ver ofta trimmas f&amp;ouml;r att klara en s&amp;aring;dan f&amp;ouml;r&amp;auml;ndring.&lt;/p&gt;
&lt;h3&gt;S&amp;aring; h&amp;auml;r gjorde reco.se&lt;/h3&gt;
&lt;p&gt;Det l&amp;ouml;nar sig att ta hj&amp;auml;lp n&amp;auml;r en briljant mjukvarubaserad aff&amp;auml;rsid&amp;eacute; skall realiseras med begr&amp;auml;nsade resurser. &lt;a href=&quot;/post/508676-reco-se-accelererar-l-ttr-rligt&quot;&gt;L&amp;auml;s om hur Citerus hj&amp;auml;lpte entrepren&amp;ouml;ren Tobias Basilius p&amp;aring; resan att vidareutveckla sin sajt reco.se&lt;/a&gt; f&amp;ouml;r att m&amp;ouml;ta kraven fr&amp;aring;n hundratusentals bes&amp;ouml;kare i veckan.&lt;/p&gt;
          </description>
          <pubDate>Tue, 27 Sep 2011 09:25:53 GMT</pubDate>
          <guid>http://www.citerus.se/post/512677-citerus-pratar-agil-innovation-p-entrepren-rsgalan</guid>
          <link>http://www.citerus.se/post/512677-citerus-pratar-agil-innovation-p-entrepren-rsgalan</link>
      </item>
       
     <item>
          <title>reco.se accelererar lättrörligt</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/reco.jpg&quot;&gt;
              &lt;h4&gt;Reco.se satsade p&amp;aring; coachning och kunskaps&amp;ouml;verf&amp;ouml;ring f&amp;ouml;r kvalitetsh&amp;ouml;jning&lt;/h4&gt;
&lt;p&gt;Det l&amp;ouml;nar sig att ta hj&amp;auml;lp n&amp;auml;r en briljant mjukvarubaserad aff&amp;auml;rsid&amp;eacute; skall realiseras med begr&amp;auml;nsade resurser. Fokus p&amp;aring; aff&amp;auml;rsnytta skall beh&amp;aring;llas genom design och utveckling av en f&amp;ouml;rsta version, till vidareutveckling och f&amp;ouml;rvaltning n&amp;auml;r kunderna str&amp;ouml;mmar till och aff&amp;auml;rerna tar fart. Citerus har hj&amp;auml;lpt entrepren&amp;ouml;ren Tobias Basilius p&amp;aring; resan att vidareutveckla sin sajt &lt;a href=&quot;http://www.reco.se&quot;&gt;reco.se&lt;/a&gt; f&amp;ouml;r att m&amp;ouml;ta kraven fr&amp;aring;n hundratusentals bes&amp;ouml;kare i veckan. Det &amp;auml;r ett exempel p&amp;aring; hur entrepren&amp;ouml;rer kan dra nytta av Agil innovation och Agil Expansion, begrepp som Citerus kommer samtala om p&amp;aring; &lt;a href=&quot;http://www.foundersalliance.com/Aktiviteter---FA-Event/Entrepren%C3%B6rsgalan-Sverige-2011.aspx&quot;&gt;Entrepren&amp;ouml;rsgalan 2011&lt;/a&gt; (som arrangeras av &lt;a href=&quot;http://www.foundersalliance.com/&quot;&gt;Founders Alliance&lt;/a&gt;) tisdagen den 27 september. Agil Innovation handlar om hur l&amp;auml;ttr&amp;ouml;rliga metoder anv&amp;auml;nds f&amp;ouml;r att snabbt kommersialisera en aff&amp;auml;rsid&amp;eacute;, Agil Expansion handlar om att organisera sig f&amp;ouml;r tillv&amp;auml;xt.&lt;/p&gt;
&lt;h4&gt;Oberoende rekommendationer s&amp;auml;rskiljande&lt;/h4&gt;
&lt;p&gt;Det som skiljer reco.se fr&amp;aring;n andra rekommendationssajter &amp;auml;r att de har omfattande rutiner som f&amp;ouml;rhindrar rekommendationer av egna aff&amp;auml;rsr&amp;ouml;relser och smutskastning av konkurrenter. Betygen ges av riktiga, oberoende anv&amp;auml;ndare. Idag &amp;auml;r det 110.000 bes&amp;ouml;kare i veckan som betraktar reco.se som en god v&amp;auml;n som ger bra tips.&lt;/p&gt;
&lt;h4&gt;Utmaning med explosionsartad tillv&amp;auml;xt&lt;/h4&gt;
&lt;p&gt;Efter lanseringen v&amp;auml;xte sajten explosionsartat i antalet bes&amp;ouml;kare, med allt st&amp;ouml;rre databas och fler funktioner. Eftersom id&amp;eacute;n &amp;auml;r att anv&amp;auml;ndaren bidrar frivilligt m&amp;aring;ste alla funktioner upplevas som anv&amp;auml;ndarv&amp;auml;nliga. Upptid &amp;auml;r aff&amp;auml;rskritiskt och stopp eller l&amp;aring;nga svarstider f&amp;aring;r absolut inte f&amp;ouml;rekomma.&lt;/p&gt;
&lt;p&gt;F&amp;ouml;r att klara tillv&amp;auml;xt under tidspress gjordes kompromisser under utvecklingen av koden. Tack vare duktiga programmerare fungerade koden bra trots att den blev allt yvigare. S&amp;aring; sakteliga b&amp;ouml;rjade dock uppdateringar i koden inneb&amp;auml;ra att bieffekter uppstod, till synes utan samband med &amp;auml;ndringen. Ibland blev svarstiderna l&amp;aring;nga och det h&amp;auml;nde till och med att sajten gick ned ibland. Entusiasmen hos anv&amp;auml;ndarna b&amp;ouml;rjade dala. De &amp;aring;terkommande larmen b&amp;ouml;rjade t&amp;auml;ra p&amp;aring; b&amp;aring;de utvecklare och ledning.&lt;/p&gt;
&lt;p&gt;M&amp;aring;let blev att bit f&amp;ouml;r bit &amp;aring;terst&amp;auml;lla kvaliteten i koden samt att coacha och kompetens&amp;ouml;verf&amp;ouml;ra till det befintliga utvecklingsteamet. Tobias Hill fr&amp;aring;n Citerus anlitades f&amp;ouml;r detta och under mottot &amp;quot;ingenting &amp;auml;r om&amp;ouml;jligt&amp;quot; gjordes en lista av prioriterade punktinsatser. Under den dag i veckan han jobbade axel mot axel med recos.se's utvecklare betades listan av bit f&amp;ouml;r bit. Dagen avslutades med guidning om vad som skulle g&amp;ouml;ras fram till n&amp;auml;sta bes&amp;ouml;k.&lt;/p&gt;
&lt;h4&gt;Ifr&amp;aring;ga s&amp;auml;tt allt&lt;/h4&gt;
&lt;p&gt;- Det Tobias Hill &amp;aring;stadkom p&amp;aring; en dag i veckan hos oss var magiskt, s&amp;auml;ger Tobias Basilius, grundare av reco.se. - Han&amp;nbsp;&amp;auml;r v&amp;auml;ldigt okonventionell, v&amp;auml;nder ut och in p&amp;aring; allt, tittar fram- och bakl&amp;auml;nges, hittar nya perspektiv, inget &amp;auml;r heligt. Han kan faktiskt vara riktigt jobbig med att &amp;auml;ven ifr&amp;aring;gas&amp;auml;tta teknikval, organisation och ledarskap. Men han l&amp;ouml;ser problem effektivt och n&amp;auml;r jag med lite perspektiv ser f&amp;ouml;r&amp;auml;ndringen k&amp;auml;nner jag en stor tacksamhet att han v&amp;aring;gade utmana oss.&lt;/p&gt;
&lt;p&gt;- vi hade en taktik att varje dag Tobias var h&amp;auml;r skulle vi attackera det mest relevanta problemet. N&amp;auml;stan alltid var det l&amp;ouml;st innan dagen var till &amp;auml;nda, ibland hade &amp;auml;ven n&amp;aring;gra andra problem eliminerats av bara farten, avslutar Tobias Basilius.&lt;/p&gt;
&lt;h4&gt;L&amp;auml;ttr&amp;ouml;rligt arbetss&amp;auml;tt accelerar nya id&amp;eacute;er&lt;/h4&gt;
&lt;p&gt;Sv&amp;aring;righeterna att tillf&amp;ouml;ra nya funktioner &amp;auml;r som bortbl&amp;aring;sta och reco.se kan idag expandera utan v&amp;auml;xtv&amp;auml;rk. F&amp;ouml;rr gjordes uppdateringar s&amp;aring; s&amp;auml;llan som m&amp;ouml;jligt eftersom det alltid blev problem. Idag g&amp;ouml;rs de varje vecka vilket inneb&amp;auml;r att sajten f&amp;ouml;rb&amp;auml;ttras lika ofta, utan n&amp;aring;gon oro. Tack vare stabiliteten och det l&amp;auml;ttr&amp;ouml;rliga arbetss&amp;auml;ttet kan f&amp;ouml;rb&amp;auml;ttringar och nya aff&amp;auml;rsid&amp;eacute;er hela tiden testas mot verkligheten. De aff&amp;auml;rskritiska svarstiderna har g&amp;aring;tt ned till en sj&amp;auml;ttedel och nedtid finns inte.&lt;/p&gt;
&lt;p&gt;Hemsida reco.se: &lt;a href=&quot;http://www.reco.se&quot;&gt;www.reco.se&lt;/a&gt;, hemsida Citerus: &lt;a href=&quot;http://www.citerus.se&quot;&gt;www.citerus.se&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;F&amp;ouml;r mer information&lt;br /&gt;
Karin Edstr&amp;ouml;m, VD Citerus AB&lt;br /&gt;
&lt;a href=&quot;mailto:karin.edstrom@citerus.se&quot;&gt;karin.edstrom@citerus.se&lt;/a&gt;&lt;br /&gt;
Tfn:&amp;nbsp;0733- 225 227&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Citerus hj&amp;auml;lper v&amp;aring;ra kunder att lyckas med mjukvaruutveckling; antingen genom att utbilda och coacha, inf&amp;ouml;ra ett sj&amp;auml;lvstyrande ledarskap och ett l&amp;auml;ttr&amp;ouml;rligt arbetss&amp;auml;tt eller genom att utveckla mjukvara &amp;aring;t dem. Allt f&amp;ouml;r att de ska kunna h&amp;aring;lla en h&amp;ouml;g innovationstakt och skapa smarta l&amp;ouml;sningar som &amp;ouml;kar deras konkurrenskraft. Vi &amp;auml;r ledande p&amp;aring; Scrum, Java, Dom&amp;auml;ndriven Design och m&amp;aring;nga andra metoder och tekniker i framkant.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Fri, 23 Sep 2011 08:57:31 GMT</pubDate>
          <guid>http://www.citerus.se/post/508676-reco-se-accelererar-l-ttr-rligt</guid>
          <link>http://www.citerus.se/post/508676-reco-se-accelererar-l-ttr-rligt</link>
      </item>
       
     <item>
          <title>Agil Innovation</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/karin_edstrom_grey.png&quot;&gt;
              &lt;h4&gt;S&amp;auml;tt aff&amp;auml;rsnyttan i fokus n&amp;auml;r innovationer skall realiseras!&lt;/h4&gt;
&lt;p&gt;Det &amp;auml;r ett stort steg fr&amp;aring;n att vara en driven entrepren&amp;ouml;r med aff&amp;auml;rs- och marknadsfokus, till att ha kunskap om verktyg och metoder f&amp;ouml;r hur man verkligen g&amp;ouml;r i praktiken f&amp;ouml;r att s&amp;auml;tta aff&amp;auml;rsnyttan i fokus. Fokus p&amp;aring; reell aff&amp;auml;rsnytta skall beh&amp;aring;llas genom hela kedjan; under design-, krav- och utvecklingsprocesserna - i n&amp;auml;ra anslutning till kundernas behov. Om detta kommer vi samtala med entrepren&amp;ouml;rer och innovat&amp;ouml;rer p&amp;aring; Entrepren&amp;ouml;rsgalan som anordnas av Founders Alliance f&amp;ouml;r tionde &amp;aring;ret i rad.&lt;/p&gt;
&lt;p&gt;Det kr&amp;auml;vs erfarenhet och tr&amp;auml;ning av hur man praktiskt g&amp;ouml;r f&amp;ouml;r att som entusiastisk entrepren&amp;ouml;r faktiskt h&amp;aring;lla fokus. Det underl&amp;auml;ttar, om man har n&amp;aring;gra praktiska och bepr&amp;ouml;vade verktyg till sin hj&amp;auml;lp.&lt;/p&gt;
&lt;p&gt;L&amp;auml;ttr&amp;ouml;rliga - agila - metoder, &amp;auml;r idag relativt v&amp;auml;l f&amp;ouml;rankrade s&amp;aring;v&amp;auml;l i mjukvaruindustrin (f&amp;ouml;retr&amp;auml;desvis Scrum) som inom delar av tillverkande industrin (Lean och Kanban). Samtliga metoder har sin grund i n&amp;aring;gra gemensamma principer.&lt;/p&gt;
&lt;p&gt;Dessa principer &amp;auml;mnar sig mycket bra som st&amp;ouml;d f&amp;ouml;r innovationsf&amp;ouml;retag i dess uppstartsfaser. Att g&amp;aring; fr&amp;aring;n en id&amp;eacute; till f&amp;auml;rdig tj&amp;auml;nst eller produkt &amp;auml;r en sn&amp;aring;rig bana. Att ha metoder och verktyg f&amp;ouml;r att f&amp;aring; hj&amp;auml;lp att fokusera p&amp;aring; prioritering av krav d&amp;auml;r realiserad aff&amp;auml;rsnytta st&amp;aring;r i centrum, skulle hj&amp;auml;lpa m&amp;aring;nga innovat&amp;ouml;rer och entrepren&amp;ouml;rer att komma till n&amp;auml;sta niv&amp;aring; i sitt f&amp;ouml;retagande, dvs kommersialiseringsfasen. M&amp;aring;nga utvecklingsprojekt som anv&amp;auml;nder Scrum som metodik, levererar anv&amp;auml;ndbar programvara var 14:e dag. I ett uppstartsl&amp;auml;ge kan detta vara enda chansen till &amp;ouml;verlevnad!&lt;/p&gt;
&lt;p&gt;Jag vill introducera begreppet Agil Innovation. Det vill s&amp;auml;ga hur man kan ta hj&amp;auml;lp av agila verktyg och metoder f&amp;ouml;r att underl&amp;auml;tta det innovativa arbetet. L&amp;aring;t mig konkretisera: P&amp;aring; Citerus hj&amp;auml;lper vi ofta snabbv&amp;auml;xande f&amp;ouml;retag och har under &amp;aring;ren f&amp;aring;tt otaliga bevis f&amp;ouml;r hur man genom att ta hj&amp;auml;lp av verktyg och metoder fr&amp;aring;n den agila v&amp;auml;rlden snabbare kan visa marknaden sina id&amp;eacute;er i form av demobara prototyper.&lt;/p&gt;
&lt;p&gt;Begreppet &amp;quot;Minimum Viable Product&amp;quot; &amp;auml;r centralt f&amp;ouml;r alla som jobbar med innovation som beh&amp;ouml;ver finansieras. Fokus p&amp;aring; MVP inneb&amp;auml;r att du designar din produkt f&amp;ouml;r att visa det som &amp;auml;r viktigt att bevisa och d&amp;auml;rmed skapar ett fundament f&amp;ouml;r en aff&amp;auml;r eller finansiering. Det kan du ofta g&amp;ouml;ra med mycket mindre resurser &amp;auml;n vad du tror.&lt;/p&gt;
&lt;p&gt;Det handlar om att snabbt kunna f&amp;aring; feedback fr&amp;aring;n kunder och anv&amp;auml;ndare, genom att faktiskt kunna se hur de anv&amp;auml;nder produkten, och om de &amp;aring;terkommer. D&amp;auml;rmed kan man iterera sig fram till en kommersiellt g&amp;aring;ngbar produkt.&lt;/p&gt;
&lt;p&gt;Under mina &amp;aring;r i branschen, har jag alltf&amp;ouml;r ofta sett motsatsen; d&amp;auml;r man antingen l&amp;aring;ter id&amp;eacute;n stanna vid en powerpointpresentation f&amp;ouml;r l&amp;auml;nge, eller att man spenderar allt f&amp;ouml;r l&amp;aring;ng tid (och f&amp;ouml;r mycket pengar) innan man har en produkt som kan visas upp f&amp;ouml;r omv&amp;auml;rlden. F&amp;ouml;r&amp;auml;ndringar och justeringar kostar d&amp;aring; f&amp;ouml;r&amp;ouml;dande mycket, b&amp;aring;de tid och pengar.&lt;/p&gt;
&lt;p&gt;Jag vill p&amp;aring;st&amp;aring; att Agil innovation b&amp;ouml;r l&amp;auml;ggas till listan &amp;ouml;ver inspel f&amp;ouml;r hur vi tillsammans kan jobba f&amp;ouml;r att s&amp;auml;kerst&amp;auml;lla att bra id&amp;eacute;er kommersialiseras tillr&amp;auml;ckligt snabbt och i tillr&amp;auml;ckligt h&amp;ouml;g utstr&amp;auml;ckning.&lt;/p&gt;
&lt;p&gt;Karin Edstr&amp;ouml;m, VD Citerus AB&lt;br /&gt;
&lt;a href=&quot;mailto:karin.edstrom@citerus.se&quot;&gt;karin.edstrom@citerus.se&lt;/a&gt;&lt;br /&gt;
+46 733 225 227&lt;/p&gt;
&lt;p&gt;&amp;quot;Citerus - frig&amp;ouml;r kraften i mjukvara &amp;aring;t alla som har en vision&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Wed, 21 Sep 2011 11:35:24 GMT</pubDate>
          <guid>http://www.citerus.se/post/505597-agil-innovation</guid>
          <link>http://www.citerus.se/post/505597-agil-innovation</link>
      </item>
       
     <item>
          <title>Varför Clojure?</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/patrik-fredriksson-clojure.png&quot;&gt;
              &lt;p&gt;Clojure &amp;auml;r ett av de m&amp;aring;nga nya JVM-spr&amp;aring;k som b&amp;ouml;rjar f&amp;aring; fotf&amp;auml;ste bland utvecklare. Som Lisp-dialekt s&amp;aring; skiljer sig dock Clojure ganska mycket fr&amp;aring;n m&amp;aring;nga andra spr&amp;aring;k, och programmerare med Javabakgrund verkar inte s&amp;auml;llan uppleva spr&amp;aring;ket s&amp;aring; pass annorlunda att de instinktivt ryggar tillbaka. Det &amp;auml;r lite synd tycker vi p&amp;aring; Citerus d&amp;aring; det finns m&amp;aring;nga bra anledningar att titta n&amp;auml;rmare p&amp;aring; Clojure. N&amp;aring;gra av de fr&amp;aring;gor jag ganska ofta f&amp;aring;r n&amp;auml;r jag f&amp;ouml;rel&amp;auml;ser eller hamnar i samtal runt spr&amp;aring;ket &amp;auml;r funderingar runt varf&amp;ouml;r man ska anv&amp;auml;nda Clojure. Vad man ska ha det till? Vad &amp;auml;r det bra p&amp;aring;?&lt;/p&gt;
&lt;p&gt;P&amp;aring; Jfokus 2009 fick jag fr&amp;aring;gan vad det var med just Clojure som gjort att jag fastnade f&amp;ouml;r spr&amp;aring;ket. Svaret blev d&amp;aring; spontant ganska k&amp;auml;nslobaserat. F&amp;ouml;rsta g&amp;aring;ngen jag kom i kontakt med Clojure var under en presentation av Rich Hickey, och det var n&amp;aring;got i spr&amp;aring;ket som i stort sett omedelbart tilltalade mig. Minnen fr&amp;aring;n gamla universitetskurser i ML kom tillbaka. Elegansen i den funktionella programmeringsmodellen blev tydlig.&lt;/p&gt;
&lt;p&gt;Jag laddade direkt ner Clojure och b&amp;ouml;rjade utforska spr&amp;aring;ket. Jag fick den k&amp;auml;nsla som jag t&amp;auml;nker mig att m&amp;aring;nga personer som fastnat f&amp;ouml;r Ruby har; en k&amp;auml;nsla av att allt p&amp;aring; n&amp;aring;got s&amp;auml;tt k&amp;auml;nns naturligt och det blir omedelbart oerh&amp;ouml;rt kul att programmera igen. Jag lyckades aldrig frambringa denna passion f&amp;ouml;r Ruby trots att jag verkligen f&amp;ouml;rs&amp;ouml;kt flera g&amp;aring;nger. Men med Clojure s&amp;aring; k&amp;auml;ndes v&amp;auml;ldigt mycket r&amp;auml;tt, &amp;auml;ven om inl&amp;auml;rningstr&amp;ouml;skeln inte p&amp;aring; n&amp;aring;got s&amp;auml;tt varit l&amp;aring;g. Trots att verktygen &amp;auml;r relativt primitiva, utbudet av bibliotek och tredjepartskomponenter liten och mycket m&amp;aring;ste skrivas fr&amp;aring;n b&amp;ouml;rjan s&amp;aring; kunde jag komma l&amp;aring;ngt p&amp;aring; kort tid. Det var kul, och jag k&amp;auml;nde mig produktiv. Dessutom var Clojure-gemenskapen v&amp;auml;ldigt v&amp;auml;lkomnande och hj&amp;auml;lpsam.&lt;/p&gt;
&lt;p&gt;Nu tenderar rent k&amp;auml;nslom&amp;auml;ssiga argument kanske att fungerar lite s&amp;auml;mre som beslutsunderlag f&amp;ouml;r att f&amp;aring; en organisation att ta till sig ny teknik och nya arbetss&amp;auml;tt. Det f&amp;aring;r helst finnas andra argument, som upplevs lite mer rationella. Som tur &amp;auml;r s&amp;aring; saknas det inte argument av den typen f&amp;ouml;r Clojure.&lt;/p&gt;
&lt;h3&gt;Utrycksfullhet&lt;/h3&gt;
&lt;p&gt;Clojure &amp;auml;r uttrycksfullt och i grunden designat f&amp;ouml;r att vara &lt;a href=&quot;http://blip.tv/clojure/stuart-halloway-simplicity-ain-t-easy-4842694&quot;&gt;enkelt&lt;/a&gt;. Detta ger ett v&amp;auml;ldigt kraftfullt spr&amp;aring;k d&amp;auml;r mycket som kan upplevas som on&amp;ouml;dig ceremoni tagits bort. Det l&amp;aring;ter oss l&amp;auml;gga fokus p&amp;aring; det faktiska dom&amp;auml;nproblemen, och g&amp;ouml;r att vi mer effektivt kan styra bort fr&amp;aring;n teknisk komplexitet. De funktionella aspekterna av Clojure, s&amp;aring; som st&amp;ouml;d f&amp;ouml;r h&amp;ouml;gre ordningens funktioner, bidrar &amp;auml;ven de till att spr&amp;aring;kets uttrycksfullhet.&lt;/p&gt;
&lt;h3&gt;Java som plattform&lt;/h3&gt;
&lt;p&gt;Genom att k&amp;ouml;ra p&amp;aring; JVM:en finns en robust och effektiv exekveringsmilj&amp;ouml; redan p&amp;aring; plats som &amp;auml;r extremt v&amp;auml;l spridd och accepterad. Genom s&amp;ouml;ml&amp;ouml;s integration med Java finns m&amp;ouml;jlighet att nyttja redan existerande tredjepartskomponenter, samtidigt som nyutvecklad Clojurekod enkelt kan integreras med existerande l&amp;ouml;sningar och milj&amp;ouml;er. Clojure finns nu &amp;auml;ven i en version f&amp;ouml;r exekvering p&amp;aring; JavaScript-tolkar, ClojureScript.&lt;/p&gt;
&lt;h3&gt;Samtidighet&lt;/h3&gt;
&lt;p&gt;Det som ofta framf&amp;ouml;rs som en viktig del av Clojures t&amp;auml;nkta till&amp;auml;mpningsomr&amp;aring;de, &amp;auml;r parallellisering och hantering av samtidighet. Under de senaste &amp;aring;ren har utvecklingen mot snabbare och snabbare processorer bytts mot en utveckling som g&amp;aring;r mot fler och fler k&amp;auml;rnor. En modern b&amp;auml;rbar dator av i dag kan ofta vara bestyckad med en fyrk&amp;auml;rnig processor, inte s&amp;auml;llan med n&amp;aring;gon form av hyper-threadingteknik. Till och med telefoner och surfplattor kommer idag med flerk&amp;auml;rniga processorer. Man kan argumentera f&amp;ouml;r att m&amp;aring;nga befintliga spr&amp;aring;k, s&amp;aring; som Java, &amp;auml;r mindre l&amp;auml;mpade f&amp;ouml;r att skapa de program som kr&amp;auml;vs f&amp;ouml;r att till fullo utnyttja den kapacitet som flerk&amp;auml;rniga processorer erbjuder.&lt;/p&gt;
&lt;p&gt;Clojure &amp;auml;r designat runt den funktionella programmeringsparadigmen. Datastrukturerna &amp;auml;r &lt;a href=&quot;http://en.wikipedia.org/wiki/Persistent_data_structure&quot;&gt;persistenta&lt;/a&gt;, of&amp;ouml;r&amp;auml;nderliga, och det finns en fullst&amp;auml;ndig tanke runt identitet, tillst&amp;aring;nd och tid. Bara det att man arbetar med icke muterbara datastrukturer hj&amp;auml;lper l&amp;aring;ngt i att hantera samtidighet. En icke muterbar datastruktur &amp;auml;r tr&amp;aring;ds&amp;auml;ker.&lt;/p&gt;
&lt;h3&gt;Funktionell programmering&lt;/h3&gt;
&lt;p&gt;Clojure &amp;auml;r ett programmeringsspr&amp;aring;k f&amp;ouml;r funktionell programmering. Funktionell programmering &amp;auml;r till stor del deklarativ, det l&amp;aring;ter oss fokusera p&amp;aring; vad vi vill g&amp;ouml;ra framf&amp;ouml;r hur det ska g&amp;ouml;ras. St&amp;ouml;d finns f&amp;ouml;rst&amp;aring;s i spr&amp;aring;ket f&amp;ouml;r h&amp;ouml;gre ordningens funktioner, och datastrukturerna &amp;auml;r icke muterbara. Att datastrukturer inte g&amp;aring;r att f&amp;ouml;r&amp;auml;ndra efter att de &amp;auml;r skapade, tillsammans med fokuseringen p&amp;aring; rena funktioner, g&amp;ouml;r mycket f&amp;ouml;r att h&amp;aring;lla ner komplexiteten i program och underl&amp;auml;tta parallellisering. Inom Domain-Driven Design f&amp;ouml;respr&amp;aring;kar vi anv&amp;auml;nding av v&amp;auml;rdeobjekt mycket p&amp;aring; grund av detta, men det &amp;auml;r sv&amp;aring;rt att f&amp;aring; till i spr&amp;aring;k som Java. I Clojure f&amp;aring;r vi det som en integrerad del av spr&amp;aring;ket.&lt;/p&gt;
&lt;h3&gt;Lisp&lt;/h3&gt;
&lt;p&gt;M&amp;aring;nga har starka &amp;aring;sikter om Lisp. F&amp;ouml;rutom ett par rader som jag klistrade in min .emacs-fil tidigt under v&amp;aring;ren 1996 hade jag ingen tidigare erfarenhet av Lisp innan jag kom i kontakt med Clojure. Sl&amp;auml;ktskapet med Lisp g&amp;ouml;r Clojure annorlunda, och med det kommer n&amp;aring;gra riktigt sp&amp;auml;nnande m&amp;ouml;jligheter.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Data som kod&amp;rdquo;, eller &lt;a href=&quot;http://en.wikipedia.org/wiki/Homoiconicity&quot;&gt;homoiconicity&lt;/a&gt;, och makron &amp;auml;r ett par koncept som &amp;auml;r starkt f&amp;ouml;rknippade med Lisp. Det &amp;auml;r koncept som kanske inte &amp;auml;r helt enkelt att vrida sin hj&amp;auml;rna runt, men n&amp;auml;r man v&amp;auml;l b&amp;ouml;rjar f&amp;ouml;rst&amp;aring; vad det &amp;auml;r och hur det kan anv&amp;auml;ndas s&amp;aring; &amp;ouml;ppnas helt nya m&amp;ouml;jligheter. En konsekvens av denna egenskap, och att Clojure numera g&amp;aring;r att exekvera b&amp;aring;de p&amp;aring; JVM:en och i en JavaScriptmilj&amp;ouml;, &amp;auml;r att vi kan anv&amp;auml;nda samma spr&amp;aring;k f&amp;ouml;r att uttrycka klientkod, serverkod och den data som flyttas mellan klient och server utan behov av mellanformat s&amp;aring; som JSON eller XML.&lt;/p&gt;
&lt;p&gt;Om du &amp;auml;nnu inte kikat p&amp;aring; Clojure s&amp;aring; &amp;auml;r det verkligen n&amp;aring;got som jag kan rekommendera Bli inte avskr&amp;auml;ckt &amp;ouml;ver att det ser s&amp;aring; annorlunda ut. S&amp;auml;rskilt om du, som jag, har varit helt inne i en objektorienterad v&amp;auml;rld de senaste &amp;aring;ren s&amp;aring; &amp;auml;r det ett fantastiskt s&amp;auml;tt att vidga sina vyer och f&amp;aring; nya perspektiv!&lt;/p&gt;
&lt;h3&gt;Ett urval av l&amp;auml;nkar&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Stuart Halloway - Clojure&lt;/strong&gt;, &lt;a href=&quot;http://oredev.org/videos/clojure&quot;&gt;http://oredev.org/videos/clojure&lt;/a&gt;. En introduktion till Clojure och varf&amp;ouml;r spr&amp;aring;ket &amp;auml;r viktigt, fr&amp;aring;n &amp;Oslash;redev 2009.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Rich Hickey - Are We There Yet?&lt;/strong&gt;, &lt;a href=&quot;http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey&quot;&gt;http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey&lt;/a&gt;. En mycket sp&amp;auml;nnande diskussion om identitet, tillst&amp;aring;nd och tid som p&amp;aring; m&amp;aring;nga s&amp;auml;tt utmanar etablerade sanningar runt tillst&amp;aring;nd och OO, av Clojures skapare.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Paul Graham - Revenge of the Nerds&lt;/strong&gt;, &lt;a href=&quot;http://www.paulgraham.com/icad.html&quot;&gt;http://www.paulgraham.com/icad.html&lt;/a&gt;. En intressant diskussion om programmeringsspr&amp;aring;k, och om det verkligen spelar n&amp;aring;gon roll vilket spr&amp;aring;k man anv&amp;auml;nder. Fr&amp;aring;n den kanske st&amp;ouml;rste Lisp-f&amp;ouml;respr&amp;aring;karen av dem alla.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;sthml.clj  - Stockholm Clojure User Group&lt;/strong&gt;, &lt;a href=&quot;http://groups.google.com/group/stockholm-clojure-user-group&quot;&gt;http://groups.google.com/group/stockholm-clojure-user-group&lt;/a&gt;. Anv&amp;auml;ndargrupp f&amp;ouml;r Clojure i Stockholmsomr&amp;aring;det&lt;/li&gt;
&lt;/ul&gt;
          </description>
          <pubDate>Mon, 19 Sep 2011 12:40:18 GMT</pubDate>
          <guid>http://www.citerus.se/post/502304-varf-r-clojure</guid>
          <link>http://www.citerus.se/post/502304-varf-r-clojure</link>
      </item>
       
     <item>
          <title>Bellmanstafetten 2011</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/bellmanstafetten_2011/rickard.jpg&quot;&gt;
              &lt;p&gt;I &amp;aring;r lyckades vi f&amp;aring; i hop tv&amp;aring; lag med deltagare som i nytryckta Citerustr&amp;ouml;jor avverkade de totalt 25 kilometrarna. Och till skillnad fr&amp;aring;n f&amp;ouml;rra &amp;aring;ret n&amp;auml;r det var kallt och m&amp;ouml;rkt fick vi i &amp;aring;r en t&amp;auml;vling i fantastisk v&amp;auml;der med en sk&amp;ouml;n efterf&amp;ouml;ljande picknick i solen.&lt;/p&gt;
&lt;p&gt;N&amp;auml;sta &amp;aring;r satsar vi p&amp;aring; tre lag i Bellmanstaffetten - &lt;a href=&quot;/jobb&quot;&gt;h&amp;ouml;r av dig om du vill vara med&lt;/a&gt;! Under tiden laddar vi om inf&amp;ouml;r H&amp;auml;sselbyloppet i oktober.&lt;/p&gt;
          </description>
          <pubDate>Sun, 28 Aug 2011 20:56:28 GMT</pubDate>
          <guid>http://www.citerus.se/post/468370-bellmanstafetten-2011</guid>
          <link>http://www.citerus.se/post/468370-bellmanstafetten-2011</link>
      </item>
       
     <item>
          <title>Agila kurser i Västerås och Linköping</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/mikael-boman.jpg&quot;&gt;
              &lt;p&gt;Vi ser att agil/l&amp;auml;ttr&amp;ouml;rlig utveckling vinner f&amp;auml;ste i allt fler organisationer och behovet av att utbilda personer till Scrum Master &amp;ouml;kar &amp;ouml;ver hela landet, s&amp;auml;ger Karin Edstr&amp;ouml;m, VD p&amp;aring; Citerus. Att vara borta fr&amp;aring;n jobbet tv&amp;aring; kursdagar klarar de flesta men med besv&amp;auml;ret kring resor och boende ser vi att det finns en tr&amp;ouml;skel mot att utbilda sig, en tr&amp;ouml;skel som vi nu tar bort f&amp;ouml;r M&amp;auml;lardalen och Link&amp;ouml;pingsregionen. Som ambassad&amp;ouml;rer f&amp;ouml;r agila utvecklingsmetoder &amp;auml;r det min f&amp;ouml;rhoppning att fler f&amp;ouml;retag och m&amp;auml;nniskor ska f&amp;aring; del av f&amp;ouml;rdelarna i form av h&amp;ouml;gre effektivitet och p&amp;aring;litlighet, avslutar Karin.&lt;/p&gt;
&lt;p&gt;Citerus l&amp;auml;rare &amp;auml;r certifierade av Scrum Alliance och de arbetar sj&amp;auml;lva som konsulter med att inf&amp;ouml;ra och f&amp;ouml;rb&amp;auml;ttra l&amp;auml;ttr&amp;ouml;rliga metoder.&lt;/p&gt;
&lt;p&gt;Kurserna erbjuds f&amp;ouml;ljande datum:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;G&amp;ouml;teborg 30-31 augusti&lt;/li&gt;
    &lt;li&gt;V&amp;auml;ster&amp;aring;s 18-19 oktober&lt;/li&gt;
    &lt;li&gt;Link&amp;ouml;ping 22-23 november&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kursinformation hittar du p&amp;aring;:&amp;nbsp;&lt;a href=&quot;http://www.citerus.se/kurser&quot;&gt;www.citerus.se/kurser&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;F&amp;ouml;r information om kurser:&lt;br /&gt;
P&amp;auml;r Buskas, 0736 - 20 44 80&lt;br /&gt;
&lt;a href=&quot;mailto:par.buskas@citerus.se&quot;&gt;par.buskas@citerus.se&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
F&amp;ouml;r information om Citerus:&lt;br /&gt;
Karin Edstr&amp;ouml;m, 0733 - 225 227&lt;br /&gt;
&lt;a href=&quot;mailto:karin.edstrom@citerus.se&quot;&gt;karin.edstrom@citerus.se&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Citerus &amp;auml;r ett konsultf&amp;ouml;retag som hj&amp;auml;lper sina kunder att lyckas med mjukvaruutveckling. Sedan 1996 har Citerus utvecklat mjukvara, lett projekt, f&amp;ouml;rb&amp;auml;ttrat utvecklarpraxis&amp;nbsp;och f&amp;ouml;rfinat ledningsmetoder &amp;aring;t f&amp;ouml;retag fr&amp;aring;n m&amp;aring;nga olika branscher. Citerus &amp;auml;r experter p&amp;aring; agila (l&amp;auml;ttr&amp;ouml;rliga) utvecklingsmetoder s&amp;aring;som Scrum, Dom&amp;auml;ndriven design, Kanban och Lean. Citerus uppn&amp;aring;r resultat genom att h&amp;ouml;ja kvalitetsribban, s&amp;auml;tta m&amp;auml;nniskor i f&amp;ouml;rsta rummet och minska byr&amp;aring;kratin.&lt;br /&gt;
&lt;a href=&quot;http://www.citerus.se&quot;&gt;www.citerus.se&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Fri, 26 Aug 2011 08:21:53 GMT</pubDate>
          <guid>http://www.citerus.se/post/465808-agila-kurser-i-v-ster-s-och-link-ping</guid>
          <link>http://www.citerus.se/post/465808-agila-kurser-i-v-ster-s-och-link-ping</link>
      </item>
       
     <item>
          <title>Vad är återblickar?</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/tobias-fors.jpg&quot;&gt;
              &lt;p&gt;L&amp;auml;ttr&amp;ouml;rliga, eller agila, metoder har blivit ett vanligt s&amp;auml;tt att arbeta i mjukvaruf&amp;ouml;retag idag. En central del i l&amp;auml;ttr&amp;ouml;rliga metoder &amp;auml;r fokuset p&amp;aring; l&amp;auml;rande och f&amp;ouml;rb&amp;auml;ttring. Med l&amp;auml;ttr&amp;ouml;rliga metoder bygger vi inte bara produkter av h&amp;ouml;g kvalitet, vi bygger ocks&amp;aring; &amp;ouml;kad kapacitet i v&amp;aring;ra organisationer.&lt;/p&gt;
&lt;p&gt;Jag pratade med en utvecklare p&amp;aring; ett stort produktf&amp;ouml;retag om det h&amp;auml;r med innovation och id&amp;eacute;er. Han hade flera lovande id&amp;eacute;er som han g&amp;auml;rna ville utforska vidare, men fick inget geh&amp;ouml;r f&amp;ouml;r dem. Jag fr&amp;aring;gade honom hur det k&amp;auml;ndes. F&amp;ouml;ga &amp;ouml;verraskande svarade han att det fick hans motivation att sakta dala.&lt;/p&gt;
&lt;p&gt;F&amp;ouml;r att en id&amp;eacute; skulle anammas i f&amp;ouml;retaget kr&amp;auml;vdes att den kom fr&amp;aring;n r&amp;auml;tt, officiellt h&amp;aring;ll. I det h&amp;auml;r fallet betydde det att de skulle komma fr&amp;aring;n en chef p&amp;aring; en viss niv&amp;aring;. Jag fr&amp;aring;gade om han trodde att det fanns fler som satt p&amp;aring; id&amp;eacute;er som inte togs tillvara. Han svarade att han trodde att n&amp;auml;stan varenda en av hans kollegor hade en toppid&amp;eacute; som bara l&amp;aring;g och ruttnade bort i en byr&amp;aring;l&amp;aring;da n&amp;aring;gonstans. N&amp;auml;r man f&amp;ouml;rs&amp;ouml;kt lyfta sin id&amp;eacute; n&amp;aring;gra g&amp;aring;nger och misslyckats gav man helt enkelt upp.&lt;/p&gt;
&lt;p&gt;Hur ser det ut i ert f&amp;ouml;retag? Har ni en mekanism f&amp;ouml;r att f&amp;aring;nga upp id&amp;eacute;er om s&amp;aring;v&amp;auml;l produkt- som processf&amp;ouml;rb&amp;auml;ttringar? Hur g&amp;ouml;r ni f&amp;ouml;r att unders&amp;ouml;ka vilka resultatf&amp;ouml;rb&amp;auml;ttrande &amp;aring;tg&amp;auml;rder era kollegor har t&amp;auml;nkt ut, men &amp;auml;nnu inte f&amp;aring;tt geh&amp;ouml;r f&amp;ouml;r? Hur g&amp;ouml;r ni f&amp;ouml;r att utv&amp;auml;rdera dem, f&amp;ouml;rankra dem och planera f&amp;ouml;r deras genomf&amp;ouml;rande?&lt;/p&gt;
&lt;p&gt;Regelbundna &amp;aring;terblickar &amp;auml;r ett s&amp;auml;tt att tillsammans utv&amp;auml;rdera och f&amp;ouml;rb&amp;auml;ttra verksamheten. Till skillnad fr&amp;aring;n expertdrivna eller toppstyrda f&amp;ouml;rb&amp;auml;ttringar, bygger &amp;aring;terblickar p&amp;aring; att engagera de som g&amp;ouml;r jobbet i f&amp;ouml;rb&amp;auml;ttringarna. Det finns flera positiva effekter av det:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Det bygger engagemang f&amp;ouml;r f&amp;ouml;rb&amp;auml;ttringarna&lt;/li&gt;
    &lt;li&gt;Sannolikheten f&amp;ouml;r att f&amp;ouml;rb&amp;auml;ttringarna genomf&amp;ouml;rs och accepteras &amp;ouml;kar&lt;/li&gt;
    &lt;li&gt;De hj&amp;auml;lper deltagarna att se saker och ting ur olika perspektiv&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hur fungerar en &amp;aring;terblick rent praktiskt? Det kr&amp;auml;vs ingen svartkonst f&amp;ouml;r att lyckas g&amp;ouml;ra &amp;aring;terblickar effektiva, men det kr&amp;auml;vs t&amp;aring;lamod och uth&amp;aring;llighet. Med lite hj&amp;auml;lp kan ni l&amp;auml;tt s&amp;auml;tta ihop ett grundformat f&amp;ouml;r era &amp;aring;terblickar som ni kan anv&amp;auml;nda under till exempel ett halv&amp;aring;r, f&amp;ouml;r att sedan utv&amp;auml;rdera och f&amp;ouml;rb&amp;auml;ttra det allt eftersom ni l&amp;auml;r er mer om vad som fungerar bra f&amp;ouml;r er.&lt;/p&gt;
&lt;p&gt;Den som handleder en &amp;aring;terblick beh&amp;ouml;ver s&amp;auml;tta sig in i vad som f&amp;aring;r en &amp;aring;terblick att bli effektiv. En skicklig handledare fokuserar p&amp;aring; att:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Skapa en milj&amp;ouml; i &amp;aring;terblicken som &amp;auml;r trygg, s&amp;aring; att deltagarna t&amp;ouml;rs s&amp;auml;ga vad de t&amp;auml;nker&lt;/li&gt;
    &lt;li&gt;Engagera gruppen med hj&amp;auml;lp av interaktiva och &amp;auml;ndam&amp;aring;lsenliga &amp;ouml;vningar&lt;/li&gt;
    &lt;li&gt;F&amp;aring;nga upp det som s&amp;auml;gs s&amp;aring; att det inte g&amp;aring;r f&amp;ouml;rlorat&lt;/li&gt;
    &lt;li&gt;Hj&amp;auml;lpa gruppen oms&amp;auml;tta sina id&amp;eacute;er till en konkret och &amp;ouml;verenskommen handlingsplan&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ett s&amp;auml;tt att l&amp;auml;ra sig mer om &amp;aring;terblickar &amp;auml;r att unders&amp;ouml;ka om det redan finns n&amp;aring;gon i organisationen som anv&amp;auml;nder dem. I s&amp;aring; fall kan man fr&amp;aring;ga om det g&amp;aring;r bra att delta som, helt tyst, observat&amp;ouml;r vid n&amp;aring;gra tillf&amp;auml;llen. Kanske kan ocks&amp;aring; den som leder de &amp;aring;terblickarna hj&amp;auml;lpa din grupp med handledningen de f&amp;ouml;rsta g&amp;aring;ngerna, s&amp;aring; att ni blir varma i kl&amp;auml;derna. Ett annat s&amp;auml;tt &amp;auml;r att ta hj&amp;auml;lp av en erfaren extern handledare, dels f&amp;ouml;r handledning de f&amp;ouml;rsta g&amp;aring;nger, dels f&amp;ouml;r att hj&amp;auml;lpa   er att ta fram ett grundformat f&amp;ouml;r era &amp;aring;terblickar.&lt;/p&gt;
&lt;p&gt;R&amp;auml;tt utf&amp;ouml;rda &amp;auml;r regelbundna ett effektivt s&amp;auml;tt snabbt oms&amp;auml;tta den kunskap och kreativitet som finns i organisationen till l&amp;ouml;sningar p&amp;aring; b&amp;aring;de sm&amp;aring; och stora problem. &amp;Aring;terblickar &amp;auml;r med andra   ord en bra aff&amp;auml;r rent ekonomiskt.&lt;/p&gt;
          </description>
          <pubDate>Thu, 11 Aug 2011 10:15:04 GMT</pubDate>
          <guid>http://www.citerus.se/post/445089-vad-r-terblickar</guid>
          <link>http://www.citerus.se/post/445089-vad-r-terblickar</link>
      </item>
       
     <item>
          <title>Närproducerat och kravmärkt är bättre!</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/karin_edstrom_grey.png&quot;&gt;
              &lt;p&gt;Citerus &amp;auml;r ett exempel p&amp;aring; den typ av konsultbolag som n&amp;auml;mns; vi &amp;auml;r betydligt mindre &amp;auml;n j&amp;auml;ttarna i branschen och best&amp;aring;r till &amp;ouml;verv&amp;auml;gande del av konsulter med 10-15 &amp;aring;rs erfarenhet. V&amp;aring;ra konsulter har dessutom jobbat tillsammans under en stor del av dessa &amp;aring;r. Det g&amp;ouml;r att vi kan erbjuda v&amp;aring;ra kunder ett f&amp;auml;rdigt team som vi inte bara tror &amp;ndash; utan vet &amp;ndash; &amp;auml;r l&amp;aring;ngt mer effektivt &amp;auml;n de flesta team som s&amp;auml;tts ihop tillf&amp;auml;lligt, ofta med en mix av anst&amp;auml;llda och timkonsulter.&lt;/p&gt;
&lt;p&gt;Genom att anlita erfarna konsulter i sammansvetsade team, f&amp;aring;r man inte bara tillg&amp;aring;ng till best practices avseende tekniska v&amp;auml;gval och kodning. Akt&amp;ouml;rer som Citerus har mycket l&amp;aring;ng erfarenhet av hur man jobbar med helheten; fr&amp;aring;n att samverka med verksamheten f&amp;ouml;r att p&amp;aring; s&amp;aring; s&amp;auml;tt utg&amp;aring; fr&amp;aring;n dom&amp;auml;nkunskapen n&amp;auml;r systemet eller funktionen designas, via effektiva kravformuleringsprocesser till att jobba med effektiva metoder f&amp;ouml;r prioritering av arbetet, d&amp;auml;r aff&amp;auml;rsnytta alltid skall ha en framtr&amp;auml;dande plats.&lt;/p&gt;
&lt;p&gt;Hur teamen jobbar med estimering och planering av sitt arbete, samt hur integration av den f&amp;auml;rdiga koden sker, p&amp;aring;verkar i allra h&amp;ouml;gsta grad s&amp;aring;v&amp;auml;l kvalitet som produktivitet. Genom att kombinera standardverktyg f&amp;ouml;r enhetstestning, versionshantering och automatisering av byggprocessen kan man &amp;aring;stadkomma en byggmilj&amp;ouml; som garanterar den tekniska kvaliteten i koden. Vi ser alltf&amp;ouml;r f&amp;aring; f&amp;ouml;retag d&amp;auml;rute som jobbar kontinuerligt och l&amp;aring;ngsiktig p&amp;aring; detta omr&amp;aring;de.&lt;/p&gt;
&lt;p&gt;Samtliga moment i kedjan ovan kr&amp;auml;ver erfarenhet f&amp;ouml;r att beh&amp;auml;rska och en f&amp;ouml;rm&amp;aring;ga att kombinera kunskapen till en helhet. Att h&amp;ouml;ja och str&amp;ouml;mlinjeforma niv&amp;aring;n kring Engineering Practices tar tid, och f&amp;ouml;r varje g&amp;aring;ng team sl&amp;aring;s is&amp;auml;r och s&amp;auml;tts ihop igen kommer nya syns&amp;auml;tt in som ger olikheter i den f&amp;auml;rdiga koden. Det &amp;auml;r inte realistiskt att f&amp;ouml;rv&amp;auml;nta sig av juniora utvecklare som s&amp;auml;tts samman i nya team skall kunna vara produktiva p&amp;aring; en niv&amp;aring; som ens &amp;auml;r j&amp;auml;mf&amp;ouml;rbar med ett samspelt team av erfarna konsulter. Detta har inget med den enskilde konsultens kompetens att g&amp;ouml;ra, vi har f&amp;ouml;rm&amp;aring;nen att varje dag jobba med beg&amp;aring;vade yngre utvecklare. Vi l&amp;auml;r oss av dem lika ofta som de l&amp;auml;r av oss.&lt;/p&gt;
&lt;p&gt;Att adressera missade deadlines i projekten med att &amp;ouml;ka antalet utvecklare i teamen, ger s&amp;auml;llan &amp;ouml;nskad effekt. Att outsorca utveckling till l&amp;aring;gl&amp;ouml;nel&amp;auml;nder fungerar i vissa fall, n&amp;auml;r kraven &amp;auml;r enkla och utrymmet f&amp;ouml;r missf&amp;ouml;rst&amp;aring;nd litet. I de projekt d&amp;auml;r vi &amp;auml;r involverade ser det s&amp;auml;llan ut s&amp;aring;. En kontinuerlig, st&amp;auml;ndig och n&amp;auml;ra dialog &amp;auml;r en f&amp;ouml;ruts&amp;auml;ttning att resultatet skall bli det &amp;ouml;nskade.&lt;/p&gt;
&lt;p&gt;D&amp;auml;rf&amp;ouml;r erbjuder vi p&amp;aring; Citerus ett n&amp;auml;rproducerat och kravm&amp;auml;rkt alternativ till den traditionella outsourcingen; sammansvetsade, erfarna team p&amp;aring; l&amp;auml;ttr&amp;ouml;rliga kontrakt, d&amp;auml;r fokus &amp;auml;r att leverera prioriterad aff&amp;auml;rsnytta - inte att syssels&amp;auml;tta s&amp;aring; m&amp;aring;nga konsulter som m&amp;ouml;jligt!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Karin Edstr&amp;ouml;m&lt;br /&gt;
&lt;/strong&gt;VD, Citerus AB&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Citerus frig&amp;ouml;r kraften i mjukvara &amp;aring;t alla som har en vision&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;L&amp;auml;s mer&lt;/h4&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://computersweden.idg.se/2.2683/1.388865/storst-ar-inte-alltid-bast&quot;&gt;St&amp;ouml;rst &amp;auml;r inte alltid b&amp;auml;st&lt;/a&gt;, ledare i Computer Sweden 7 juni 2011&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Fri, 17 Jun 2011 09:13:48 GMT</pubDate>
          <guid>http://www.citerus.se/post/368618-n-rproducerat-och-kravm-rkt-r-b-ttre</guid>
          <link>http://www.citerus.se/post/368618-n-rproducerat-och-kravm-rkt-r-b-ttre</link>
      </item>
       
     <item>
          <title>Horisontell skrollning av vyer i Android</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/android_horizontal_scrollin.png&quot;&gt;
              &lt;p&gt;I ett Android-projekt hade jag ett krav att ta fram en UI-komponent f&amp;ouml;r horisontell skrollning av ett variabelt antal vyer. Jag b&amp;ouml;rjade titta efter vad andra har &amp;aring;stadkommit inom samma omr&amp;aring;de och &amp;auml;ven p&amp;aring; Androids egna &lt;code&gt;&lt;a href=&quot;http://developer.android.com/reference/android/widget/ViewFlipper.html&quot;&gt;ViewFlipper&lt;/a&gt;&lt;/code&gt;. &lt;code&gt;ViewFlipper&lt;/code&gt; &amp;auml;r en UI-komponent som l&amp;auml;mpar sig bra om man har ett fixt antal vyer att v&amp;auml;xla mellan. Dessa vyer l&amp;auml;ggs till antingen med XML eller programmatiskt. &amp;Auml;ven om det rent teoretiskt skulle vara m&amp;ouml;jligt att fylla en &lt;code&gt;ViewFlipper&lt;/code&gt;fr&amp;aring;n en dynamisk k&amp;auml;lla s&amp;aring; skulle det betyda att alla vyer i gruppen skulle vara laddade i minnet, trots att bara en vy syns &amp;aring;t g&amp;aring;ngen.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;a href=&quot;http://developer.android.com/reference/android/widget/ListView.html&quot;&gt;ListView&lt;/a&gt;&lt;/code&gt; &amp;auml;r en UI-komponent som klarar av en dynamisk m&amp;auml;ngd data utan att f&amp;ouml;r den sakens skull fylla minnet. Den g&amp;ouml;r det genom att ladda ur vyer som inte l&amp;auml;ngre &amp;auml;r visuellt synliga och &amp;aring;teranv&amp;auml;nda gamla vy-objekt n&amp;auml;r nya beh&amp;ouml;ver skapas, dvs n&amp;auml;r anv&amp;auml;ndaren skrollar upp eller ner i en listvy. Jag best&amp;auml;mde mig f&amp;ouml;r att skriva en UI-komponent f&amp;ouml;r horisontell skrollning som fungerar likt &lt;code&gt;ListView&lt;/code&gt;. Android-biblioteket, som &amp;auml;r sl&amp;auml;ppt som open source, heter &lt;code&gt;ViewFlow&lt;/code&gt; och finns f&amp;ouml;r nerladdning p&amp;aring; &lt;a href=&quot;https://github.com/pakerfeldt/android-viewflow&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ListView&lt;/code&gt; &amp;auml;r f&amp;ouml;rmodligen en av de mest anv&amp;auml;nda UI-komponenterna i Android. Elementen i en &lt;code&gt;ListView&lt;/code&gt; baseras p&amp;aring; inneh&amp;aring;llet i den &lt;code&gt;Adapter&lt;/code&gt; som kopplas till listvyn. En adapter tillhandah&amp;aring;ller &amp;aring;tkomst till ett antal element och &amp;auml;r ocks&amp;aring; ansvarig f&amp;ouml;r att generera vyer som representerar enskilda element. Adaptern fungerar s&amp;aring;ledes som en brygga mellan data och den &lt;code&gt;&lt;a href=&quot;http://developer.android.com/reference/android/widget/AdapterView.html&quot;&gt;AdapterView&lt;/a&gt;&lt;/code&gt;&amp;nbsp;(generalisering av &lt;code&gt;ListView&lt;/code&gt;) som visualiserar datat.&amp;nbsp;&lt;code&gt;ViewFlow&lt;/code&gt;, som &amp;auml;r en specialisering av &lt;code&gt;AdapterView&lt;/code&gt;, fungerar genom att buffra ett antal element om b&amp;aring;da sidor om den f&amp;ouml;r tillf&amp;auml;llet synliga vyn. &amp;Ouml;verg&amp;aring;ngen mellan tv&amp;aring; vyer i &lt;code&gt;ViewFlow&lt;/code&gt; &amp;auml;r kontinuerlig vilket betyder att tv&amp;aring; vyer kan vara visuellt synliga samtidigt. Av den anledningen beh&amp;ouml;ver man som minst ladda tre vyer &amp;aring;t g&amp;aring;ngen (den f&amp;ouml;r tillf&amp;auml;llet valda vyn samt en p&amp;aring; vardera sida). Om en vy tar tid att visualisera (t.ex. om bilder laddas in asynkront f&amp;ouml;r presentering i vyn) s&amp;aring; kan det dock kr&amp;auml;vas en st&amp;ouml;rre buffert f&amp;ouml;r att skrollningen ska flyta p&amp;aring; utan att f&amp;aring; k&amp;auml;nslan att vyer faktiskt laddas in dynamiskt.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ViewFlow&lt;/code&gt; &amp;auml;r publicerat som ett android-bibliotek vilket betyder att det &amp;auml;r v&amp;auml;ldigt l&amp;auml;tt att &amp;aring;teranv&amp;auml;nda. Du kan t.ex. med enkla medel &lt;a href=&quot;http://developer.android.com/guide/developing/projects/projects-eclipse.html&quot;&gt;referera ett android-bibliotek i Eclipse&lt;/a&gt;. F&amp;ouml;r att anv&amp;auml;nda &lt;code&gt;ViewFlow&lt;/code&gt; l&amp;auml;gger du bara till f&amp;ouml;ljande XML-kod i din layout:&lt;/p&gt;
&lt;div class=&quot;highlight&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 14px; font-family: inherit; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(255, 255, 255); background-position: initial initial; background-repeat: initial initial; &quot;&gt;
&lt;pre style=&quot;margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(248, 248, 248); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); display: block; line-height: 19px; overflow-x: auto; overflow-y: auto; &quot;&gt;&lt;code class=&quot;xml&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: Monaco, Consolas, monospace; vertical-align: baseline; &quot;&gt;&lt;span class=&quot;nt&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 0, 128); &quot;&gt;&amp;lt;org.taptwo.android.widget.ViewFlow&lt;br /&gt;  &lt;/span&gt;        &lt;span class=&quot;na&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 128, 128); &quot;&gt;android:id=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(221, 17, 68); &quot;&gt;&amp;quot;@+id/viewflow&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 128, 128); &quot;&gt;android:layout_width=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(221, 17, 68); &quot;&gt;&amp;quot;fill_parent&amp;quot;&lt;br /&gt; &lt;/span&gt;         &lt;span class=&quot;na&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 128, 128); &quot;&gt;android:layout_height=&lt;/span&gt;&lt;span class=&quot;s&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(221, 17, 68); &quot;&gt;&amp;quot;fill_parent&amp;quot;&lt;/span&gt; &lt;span class=&quot;nt&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 0, 128); &quot;&gt;/&amp;gt;&amp;nbsp;&lt;/span&gt; &lt;/code&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Du kommer nu ha en &lt;code&gt;ViewFlow&lt;/code&gt;-komponent med en sidobufferstorlek p&amp;aring; tre, vilket betyder maximalt sju (3*2 + 1) vyer i minnet &amp;aring;t g&amp;aring;ngen. Att koppla en adapter till &lt;code&gt;ViewFlow&lt;/code&gt; g&amp;ouml;rs precis som med &lt;code&gt;ListView&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;
&lt;meta charset=&quot;utf-8&quot;&gt;             &lt;/meta&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 14px; font-family: inherit; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(255, 255, 255); background-position: initial initial; background-repeat: initial initial; &quot;&gt;
&lt;pre style=&quot;margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(248, 248, 248); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); display: block; line-height: 19px; overflow-x: auto; overflow-y: auto; &quot;&gt;&lt;code class=&quot;java&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: Monaco, Consolas, monospace; vertical-align: baseline; &quot;&gt;&lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;ViewFlow&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;viewFlow&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;ViewFlow&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;findViewById&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;R&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 128, 128); &quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 128, 128); &quot;&gt;viewflow&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;); &lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;viewFlow&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 128, 128); &quot;&gt;setAdapter&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;myAdapter&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;);&amp;nbsp;&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Om man &amp;auml;r i behov av att veta vilken vy som &amp;auml;r aktiv f&amp;ouml;r tillf&amp;auml;llet s&amp;aring; kan man registrera en &lt;code&gt;ViewSwitchListener&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;meta charset=&quot;utf-8&quot;&gt;             &lt;/meta&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 14px; font-family: inherit; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(255, 255, 255); background-position: initial initial; background-repeat: initial initial; &quot;&gt;
&lt;pre style=&quot;margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 1em; padding-right: 1em; padding-bottom: 1em; padding-left: 1em; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(248, 248, 248); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(238, 238, 238); border-right-color: rgb(238, 238, 238); border-bottom-color: rgb(238, 238, 238); border-left-color: rgb(238, 238, 238); color: rgb(0, 0, 0); display: block; line-height: 19px; overflow-x: auto; overflow-y: auto; &quot;&gt;&lt;code class=&quot;java&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: Monaco, Consolas, monospace; vertical-align: baseline; &quot;&gt;&lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;viewFlow&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 128, 128); &quot;&gt;setOnViewSwitchListener&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;ViewSwitchListener&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;{&lt;br /&gt; &lt;/span&gt;     &lt;span class=&quot;kd&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(68, 85, 136); &quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(153, 0, 0); &quot;&gt;onSwitched&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;View&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(68, 85, 136); &quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;position&lt;/span&gt;&lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;{&lt;br /&gt; &lt;/span&gt;         &lt;span class=&quot;c1&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: inherit; font-style: italic; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(153, 153, 136); &quot;&gt;// Your code here&lt;/span&gt;&lt;br /&gt;     &lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;}&lt;br /&gt; &lt;/span&gt; &lt;span class=&quot;o&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; outline-width: 0px; outline-style: initial; outline-color: initial; font-weight: bold; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot;&gt;});&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;K&amp;auml;llkoden &amp;auml;r sl&amp;auml;ppt under Apache License 2.0 och finns att ladda ner p&amp;aring; &lt;a href=&quot;https://github.com/pakerfeldt/android-viewflow&quot;&gt;Github&lt;/a&gt;.&amp;nbsp;&lt;a style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 0, 153); text-decoration: underline; border-style: initial; border-color: initial; &quot; href=&quot;https://github.com/pakerfeldt/android-viewflow/issues&quot;&gt;Rapportera g&amp;auml;rna in&lt;/a&gt;&amp;nbsp;buggar och problem ni uppt&amp;auml;cker, eller allra helst, skicka&amp;nbsp;&lt;a style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; color: rgb(0, 0, 153); text-decoration: underline; border-style: initial; border-color: initial; &quot; href=&quot;http://help.github.com/pull-requests/&quot;&gt;pull request&lt;/a&gt;&amp;nbsp;om du kan l&amp;ouml;sa buggen sj&amp;auml;lv.&lt;/p&gt;
&lt;p&gt;
&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;/p&gt;
          </description>
          <pubDate>Mon, 30 May 2011 19:39:01 GMT</pubDate>
          <guid>http://www.citerus.se/post/350288-horisontell-skrollning-av-vyer-i-android</guid>
          <link>http://www.citerus.se/post/350288-horisontell-skrollning-av-vyer-i-android</link>
      </item>
       
     <item>
          <title>Filmen från Hackers’ Night Crazy Snake</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/generic/hackers_night_crazy_snake.png&quot;&gt;
              &lt;p&gt;Programmeringst&amp;auml;vlingen Hackers' Night Crazy Snake edition samlade tretton lag som gjorde upp om vem som p&amp;aring; begr&amp;auml;nsad tid kunde programmera den smartaste ormen. En gedigen insats fr&amp;aring;n kv&amp;auml;llens Snakemaster Mikael Boman och hans t&amp;auml;vlingsteam fr&amp;aring;n Citerus gjorde programmeringst&amp;auml;vlingen till sp&amp;auml;nnande underh&amp;aring;llning p&amp;aring; den stora sk&amp;auml;rmens virtuella ormgrop. Upplev kv&amp;auml;llen p&amp;aring; tre och en halv minut.   &lt;iframe width=&quot;560&quot; height=&quot;349&quot; src=&quot;http://www.youtube.com/embed/rV3KlFdbi1w?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/post/325559-lag-paxport-vann-crazy-snake&quot;&gt;L&amp;auml;s mer om t&amp;auml;vlingen och om det vinnande bidraget.&lt;/a&gt;&lt;/p&gt;
          </description>
          <pubDate>Mon, 30 May 2011 08:38:10 GMT</pubDate>
          <guid>http://www.citerus.se/post/349803-filmen-fr-n-hackers-night-crazy-snake</guid>
          <link>http://www.citerus.se/post/349803-filmen-fr-n-hackers-night-crazy-snake</link>
      </item>
       
     <item>
          <title>Tobias Fors blixttalar på Agila Sverige 2011</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/agila_sverige_2011.png&quot;&gt;
              &lt;p&gt;Begreppet systemt&amp;auml;nk eller framf&amp;ouml;rallt bristen p&amp;aring; det har stor p&amp;aring;verkan p&amp;aring; IT-intensiva f&amp;ouml;retag. Under f&amp;ouml;rel&amp;auml;sningen kommer m&amp;aring;nga tyv&amp;auml;rr k&amp;auml;nna igen sig i de problem som beskrivs. Systemt&amp;auml;nkande &amp;auml;r det nya s&amp;auml;ttet att m&amp;ouml;ta gamla utmaningar, att hitta kreativa l&amp;ouml;sningar p&amp;aring; bland annat f&amp;ouml;ljande problem:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Ett separat testteam inr&amp;auml;ttas f&amp;ouml;r att h&amp;ouml;ja kvalit&amp;eacute;n. Effekten blir den motsatta.&lt;/li&gt;
    &lt;li&gt;Sm&amp;aring; &amp;auml;ndringar g&amp;ouml;rs i ett system, pl&amp;ouml;tsligt sm&amp;auml;ller det p&amp;aring; sju olika st&amp;auml;llen.&lt;/li&gt;
    &lt;li&gt;L&amp;ouml;sningar ger helt motsatt effekt mot vad det &amp;auml;r t&amp;auml;nkt.&lt;/li&gt;
    &lt;li&gt;Problem biter sig kvar trots h&amp;aring;rt och l&amp;aring;ngvarigt arbete.&lt;/li&gt;
    &lt;li&gt;Ibland &amp;auml;r l&amp;ouml;sningen att flytta den b&amp;auml;ste utvecklaren!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;instory right profile&quot;&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; data-bio=&quot;&amp;lt;p&amp;gt;Tobias Fors &amp;auml;r en av Sveriges mest erfarna konsulter inom l&amp;auml;ttr&amp;ouml;rlig utveckling. Han har erfarenhet fr&amp;aring;n b&amp;aring;de programmering och ledarskap och en mycket god f&amp;ouml;rst&amp;aring;else f&amp;ouml;r helhetsbilden i &amp;hellip;&quot; src=&quot;/rendition.profile_medium/images/people/tobias-fors.jpg&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Tobias Fors&lt;/h3&gt;
&lt;p class=&quot;role&quot;&gt;Talare p&amp;aring; Agila Sverige 2011&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Tobias Fors &amp;auml;r en av Sveriges mest erfarna konsulter inom agil (l&amp;auml;ttr&amp;ouml;rlig) utveckling. Han har erfarenhet fr&amp;aring;n b&amp;aring;de programmering och ledarskap och en mycket god f&amp;ouml;rst&amp;aring;else f&amp;ouml;r helhetsbilden i mjukvaruutveckling. Tobias Fors har framg&amp;aring;ngsrikt st&amp;ouml;ttat f&amp;ouml;rb&amp;auml;ttringsarbetet hos b&amp;aring;de enskilda team och hela avdelningar.&lt;/em&gt;&lt;/p&gt;
          </description>
          <pubDate>Tue, 10 May 2011 14:07:54 GMT</pubDate>
          <guid>http://www.citerus.se/post/330188-tobias-fors-blixttalar-p-agila-sverige</guid>
          <link>http://www.citerus.se/post/330188-tobias-fors-blixttalar-p-agila-sverige</link>
      </item>
       
     <item>
          <title>Ladda Clojure-kod med java.util.ServiceLoader</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/generic/systemutveckling_IMG_1496.jpg&quot;&gt;
              &lt;p&gt;Jag t&amp;auml;nkte ber&amp;auml;tta lite om ett problem som vi st&amp;ouml;tte p&amp;aring; under utveckling av spelmotorn till v&amp;aring;r programmeringst&amp;auml;vling&amp;nbsp;&lt;a href=&quot;http://www.citerus.se/crazysnake&quot;&gt;Crazy Snake&lt;/a&gt;. F&amp;ouml;rhoppningsvis kan n&amp;aring;gra av v&amp;aring;ra l&amp;auml;rdomar kring klassladdning i Clojure och anv&amp;auml;ndandet av &lt;code&gt;&lt;a href=&quot;http://download.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html&quot;&gt;ServiceLoader&lt;/a&gt;&lt;/code&gt; att komma till anv&amp;auml;ndning f&amp;ouml;r andra.&lt;/p&gt;
&lt;p&gt;De t&amp;auml;vlande lagen tillhandah&amp;ouml;ll var sin jar-fil med en ormhj&amp;auml;rna (som implementerande &lt;code&gt;Brain&lt;/code&gt;-interfacet i &lt;a href=&quot;https://bitbucket.org/citerus/crazysnake-public&quot;&gt;v&amp;aring;rt API&lt;/a&gt;). Tanken var att ladda in de t&amp;auml;vlandes jar-filer i runtime och instantiera en hj&amp;auml;rna f&amp;ouml;r varje lag. Hj&amp;auml;rnan anv&amp;auml;ndes sedan f&amp;ouml;r att skapa en orm som r&amp;ouml;rde sig p&amp;aring; spelplanen. S&amp;aring;ledes beh&amp;ouml;vde vi anv&amp;auml;nda dynamisk klassladdning f&amp;ouml;r att ladda de olika lagens hj&amp;auml;rnor.&lt;/p&gt;
&lt;p&gt;Det vanligaste s&amp;auml;ttet att ladda klasser dynamiskt har tidigare varit att anv&amp;auml;nda klassens namn och anropa &lt;code&gt;Class.forName()&lt;/code&gt;. Eftersom vi inte ville styra vilket klassnamn de deltagande lagen skulle anv&amp;auml;nda tyckte vi inte om den l&amp;ouml;sningen. I Java SE 6 inf&amp;ouml;rdes klassen &lt;code&gt;&lt;a href=&quot;http://download.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html&quot;&gt;ServiceLoader&lt;/a&gt;&lt;/code&gt; som ger m&amp;ouml;jlighet att ladda en klass baserad p&amp;aring; dess typ ist&amp;auml;llet f&amp;ouml;r dess namn (som tidigare med &lt;code&gt;Class.forName()&lt;/code&gt;). &lt;code&gt;ServiceLoader&lt;/code&gt; l&amp;auml;ser filer i katalogen &lt;code&gt;META-INF/services&lt;/code&gt; i sin classpath och instantierar en klass baserat p&amp;aring; namnen som finns angivna i den filen. Dock m&amp;aring;ste klasserna implementera det interface som anges i &lt;code&gt;ServiceLoader.load()&lt;/code&gt;. Namnet p&amp;aring; filen med implementationsklasser m&amp;aring;ste &amp;auml;ven st&amp;auml;mma &amp;ouml;verrens med det interface som klasserna implementerar. I v&amp;aring;rt fall inneh&amp;ouml;ll allts&amp;aring; alla deltagares jar-filer filen &lt;code&gt;META-INF/services/se.citerus.crazysnake.Brain&lt;/code&gt;. Om denna f&amp;ouml;rklaring inte var tydlig kan du titta i exempel-projekten &lt;a href=&quot;https://bitbucket.org/citerus/crazysnake-public&quot;&gt;h&amp;auml;r&lt;/a&gt; f&amp;ouml;r att se hur det hela s&amp;aring;g ut.&lt;/p&gt;
&lt;p&gt;N&amp;auml;r vi implementerade spelmotorn anv&amp;auml;nde vi allts&amp;aring; &lt;code&gt;ServiceLoader&lt;/code&gt; f&amp;ouml;r att ladda deltagarnas implementationer av ormhj&amp;auml;rnor. Deltagarna packade in sin implementation av ormhj&amp;auml;rnan i en jar-fil och vi laddade dem med &lt;code&gt;ServiceLoader&lt;/code&gt; som fick en referens till en &lt;code&gt;URLClassLoader&lt;/code&gt; till deltagarens jar-fil. Koden s&amp;aring;g ut ungef&amp;auml;r s&amp;aring; h&amp;auml;r:&lt;/p&gt;
&lt;pre&gt;
  URL[] urls = {file.toURI().toURL()}; 
  ClassLoader classLoader = new URLClassLoader(urls); 
  ServiceLoader&amp;lt;Brain&amp;gt; services = ServiceLoader.load(Brain.class, classLoader);&lt;/pre&gt;
&lt;p&gt;Detta tillv&amp;auml;gag&amp;aring;ngss&amp;auml;tt fungerade f&amp;ouml;r v&amp;aring;ra f&amp;ouml;rsta test-hj&amp;auml;rnor och vi b&amp;ouml;rjade k&amp;auml;nna oss kanske n&amp;ouml;jda. Vi ville dock &amp;auml;ven g&amp;auml;rna ge m&amp;ouml;jligheten f&amp;ouml;r deltagarna att implementera &lt;code&gt;Brain&lt;/code&gt;-interfacet i andra JVM-st&amp;ouml;dda spr&amp;aring;k &amp;auml;n Java och snabbt kom vi att t&amp;auml;nka p&amp;aring; Clojure som ett utm&amp;auml;rkt alternativ. Detta visade sig dock vara n&amp;aring;got klurigare &amp;auml;n vi f&amp;ouml;rst ins&amp;aring;g.&lt;/p&gt;
&lt;p&gt;V&amp;aring;ra ormhj&amp;auml;rnor skriva i ren Java kunde laddas utan problem (&amp;auml;ven Groovy och Scala gick bra), men n&amp;auml;r vi provade att ladda v&amp;aring;r test-implementation som var skriven i Clojure st&amp;ouml;tte vi p&amp;aring; patrull. Vi implementerade v&amp;aring;r test-implementation i Clojure med :gen-class. En korkad exempel-orm som illustrerar detta ser ut s&amp;aring;h&amp;auml;r:&lt;/p&gt;
&lt;pre&gt;
(ns se.citerus.crazysnake.brain.clojure-brain
  (:import
    [se.citerus.crazysnake Movement])
  (:gen-class
    :name se.citerus.crazysnake.brain.ClojureBrain
    :implements [se.citerus.crazysnake.Brain]
    :main false))

;-- Implementation of Brain interface

(defn -init [this participants meta])

(defn -getName [this]
  &amp;quot;ClojureBrain&amp;quot;)

(defn -getNextMove [this state]
  Movement/FORWARD)
&lt;/pre&gt;
&lt;p&gt;N&amp;auml;r vi skulle ladda v&amp;aring;r Clojure-hj&amp;auml;rna genom att iterera &amp;ouml;ver v&amp;aring;r &lt;code&gt;ServiceLoader&lt;/code&gt; &amp;nbsp;s&amp;aring; kastades ett &lt;code&gt;ServiceConfigurationError&lt;/code&gt;. Vi gjorde lite efterforskning och fann p&amp;aring; att  &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-260&quot;&gt;Clojure per default anv&amp;auml;nder sig av kontextklassladdaren&lt;/a&gt; f&amp;ouml;r den anropande tr&amp;aring;den. Eftersom den anropande tr&amp;aring;dens klassladdare inte har k&amp;auml;nnedom om v&amp;aring;r Clojure-kod fungerade detta inte. Som tur var kan man s&amp;auml;tta om denna i Java och n&amp;auml;r vi ist&amp;auml;llet satte tr&amp;aring;dens kontextklassladdare innan vi anropade ServiceLoader.load() fungerade det hela mycket b&amp;auml;ttre. Koden som vi slutligen anv&amp;auml;nde i spelet s&amp;aring;g ut ungef&amp;auml;r s&amp;aring; h&amp;auml;r:&lt;/p&gt;
&lt;pre&gt;
File brainImplementingJarFile = new File(pathToJar);
URL[] urls = {file.toURI().toURL()};
ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
ClassLoader classLoader = new URLClassLoader(urls, contextLoader);
Thread.currentThread().setContextClassLoader(classLoader);
ServiceLoader&amp;lt;Brain&amp;gt; services = ServiceLoader.load(Brain.class, classLoader);

// Reset the context classloader    
Thread.currentThread().setContextClassLoader(contextLoader); &lt;/pre&gt;
&lt;p&gt;Detta &amp;auml;r en v&amp;auml;ldigt liten, detaljerad inblick i v&amp;aring;r implementation av spelet. Det var ocks&amp;aring; n&amp;aring;got som vi l&amp;auml;rde oss under resans g&amp;aring;ng och som vi g&amp;auml;rna vill dela med oss av.&lt;/p&gt;
&lt;p&gt;Hoppas det kommer till anv&amp;auml;ndning!&lt;/p&gt;
          </description>
          <pubDate>Thu, 05 May 2011 09:23:26 GMT</pubDate>
          <guid>http://www.citerus.se/post/325558-ladda-clojure-kod-med-java-util-serviceloader</guid>
          <link>http://www.citerus.se/post/325558-ladda-clojure-kod-med-java-util-serviceloader</link>
      </item>
       
     <item>
          <title>Lag Paxport vann Crazy Snake </title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/crazy_snake_final.jpg&quot;&gt;
              &lt;p&gt;Minns du spelet Snake? Det g&amp;ouml;r i princip alla som n&amp;aring;gon g&amp;aring;ng har haft en Nokiatelefon, inklusive vi p&amp;aring; Citerus. Inte utan en liten gnutta nostalgi best&amp;auml;mde vi oss d&amp;auml;rf&amp;ouml;r f&amp;ouml;r att ordna en t&amp;auml;vling under namnet &lt;a href=&quot;/kampanjer/hackers_night_snake_edition&quot;&gt;Hackers' Night - Crazy Snake edition&lt;/a&gt;. I korthet gick t&amp;auml;vlingen ut p&amp;aring; att skapa en orm som p&amp;aring; en spelplan med andra ormar kunde &amp;auml;ta s&amp;aring;&amp;nbsp;mycket frukt som m&amp;ouml;jligt och samtidigt undvika att krascha in i n&amp;aring;got - sig sj&amp;auml;lv, en annan orm eller en v&amp;auml;gg (&lt;a href=&quot;/kampanjer/hackers_night_snake_edition/hackers_tavlingsformat/&quot;&gt;de fullst&amp;auml;ndiga t&amp;auml;vlingsreglerna finns h&amp;auml;r&lt;/a&gt;). Lagen fick tillg&amp;aring;ng till ett API och en spelmotor som vi p&amp;aring; Citerus programmerade.&lt;/p&gt;
&lt;p&gt;Totalt samlades tretton lag med upp till tre medlemmar f&amp;ouml;r att g&amp;ouml;ra upp, p&amp;aring;hejade av &amp;ouml;ver 20 &amp;aring;sk&amp;aring;dare. Det blev tidigt tydligt att lagen hade f&amp;ouml;rberett sig olika mycket; en del inte alls och medan andra hade listat ut hur spelmotorn borde fungera och byggt en egen version att testa sin id&amp;eacute;er mot.&lt;/p&gt;
&lt;p&gt;En del hade sv&amp;aring;rt i f&amp;ouml;rsta heatet och ett lag l&amp;auml;mnade till och med walk over till f&amp;ouml;rsta heatet d&amp;aring; de inte hunnit med att skapa en fungerande    ormhj&amp;auml;rna. Efter detta b&amp;ouml;rjade det bli mer sp&amp;auml;nnande och f&amp;ouml;r varje heat s&amp;aring; blev det fler bra hj&amp;auml;rnor och d&amp;auml;rmed j&amp;auml;mnare heat.&amp;nbsp;Laget VSG valde till exemepl att k&amp;ouml;ra p&amp;aring; en och samma ormhj&amp;auml;rna i alla heat medan Paxport f&amp;ouml;rfinade sin kontinuerligt.&lt;/p&gt;
&lt;p&gt;Resultat&lt;/p&gt;
&lt;p&gt;Finalen blev en sp&amp;auml;nnande uppg&amp;ouml;relse som slutade p&amp;aring; f&amp;ouml;ljande s&amp;auml;tt:&lt;/p&gt;
&lt;table&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;1:a&lt;/td&gt;
            &lt;td&gt;Paxport Systems feat. Itello&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/joeljons&quot;&gt;Joel Jonsson&lt;/a&gt;, Henrik Ygge, Dmitry Palagin&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;2:a&lt;/td&gt;
            &lt;td&gt;Grand Champions&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/cykeltillsalu&quot;&gt;Jens St&amp;aring;hl&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/malinljungh&quot;&gt;Malin Ljungh&lt;/a&gt; och &lt;a href=&quot;http://twitter.com/RegalSkeppet&quot;&gt;Jonas Samuelsson&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;3:a&lt;/td&gt;
            &lt;td&gt;VSG&lt;/td&gt;
            &lt;td&gt;Johan Ringdahl, Magnus Rundl&amp;ouml;f&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Finalen avgjordes n&amp;auml;r tv&amp;aring; av ormarna kraschade och Paxport d&amp;auml;rmed kunde promenera, eller snarare ringla, hem segern i ensamt majest&amp;auml;t.&amp;nbsp;Grattis Paxport till en v&amp;auml;lf&amp;ouml;rtj&amp;auml;nt seger!&lt;/p&gt;
&lt;h4&gt;Kort om vinnaralgoritmen&lt;/h4&gt;
&lt;p&gt;Paxport beskrev sj&amp;auml;lva sin sista version, som de k&amp;ouml;rde i heat 3 och finalen, som b&amp;auml;ttre p&amp;aring; att &amp;auml;ta frukt men lite s&amp;auml;mre p&amp;aring; &amp;ouml;verlevnad &amp;auml;n tidigare versioner.&amp;nbsp;Vinnarhj&amp;auml;rnan gjorde A*-s&amp;ouml;k mellan alla maskars huvud och alla frukter och best&amp;auml;mde sedan &amp;quot;mest attraktiva frukt att navigera mot&amp;quot; som den n&amp;auml;rmaste frukt som garanterat kan n&amp;aring;s innan n&amp;aring;gon av motst&amp;aring;ndarna kan n&amp;aring; den. Till detta fanns ocks&amp;aring; en panic-move-strategi n&amp;auml;r n&amp;aring;gon motst&amp;aring;ndares huvud var n&amp;auml;ra, samt analys f&amp;ouml;r att inte &amp;aring;ka in i f&amp;ouml;r sm&amp;aring; konkava utrymmen.&lt;/p&gt;
&lt;h4&gt;Slutligen...&lt;/h4&gt;
&lt;p&gt;...vill vi tacka alla lag och &amp;aring;sk&amp;aring;dare som gjorde detta till en kv&amp;auml;ll som var b&amp;aring;de l&amp;auml;rorik och rolig. Ju mer vi satte oss in i att programmera ormhj&amp;auml;rnor, desto mer ins&amp;aring;g vi hur komplex och nyanserad det &amp;auml;r och att vinnaralgoritmen skulle kunna g&amp;aring; att f&amp;ouml;rb&amp;auml;ttras ytterligare. Till exempel kan man t&amp;auml;nka sig en ormhj&amp;auml;rna som h&amp;aring;ller koll p&amp;aring; vilka av de andra ormarna som g&amp;ouml;r avsteg fr&amp;aring;n deras respektive b&amp;auml;sta/s&amp;auml;kra v&amp;auml;gar och komma ih&amp;aring;g dessa som dumma ormar; detta i sin tur skulle kunna g&amp;ouml;ra att man ibland v&amp;auml;ljer att sikta p&amp;aring; frukt som en dummare orm har n&amp;auml;rmare till. V&amp;aring;r spelplan var 50*50 rutor, men p&amp;aring; en st&amp;ouml;rre spelplan med fler ormar (vi hade maximalt 6 ormar p&amp;aring; plan samtidigt) skulle man eventuellt beh&amp;ouml;va snabba upp s&amp;ouml;kalgoritmen till en naiv s&amp;ouml;kning mellan n&amp;auml;rmsta frukt och de andra ormarnas frukt.&lt;/p&gt;
&lt;p&gt;Tack ocks&amp;aring; f&amp;ouml;r &lt;a href=&quot;http://twitter.com/#!/search/crazysnake&quot;&gt;alla uppmuntrande tweets&lt;/a&gt; f&amp;ouml;re, under och efter t&amp;auml;vlingen. Inom kort kommer vi att publicera fler bilder och en video fr&amp;aring;n kv&amp;auml;llen, s&amp;aring; h&amp;aring;ll utkik!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Thu, 05 May 2011 09:27:34 GMT</pubDate>
          <guid>http://www.citerus.se/post/325559-lag-paxport-vann-crazy-snake</guid>
          <link>http://www.citerus.se/post/325559-lag-paxport-vann-crazy-snake</link>
      </item>
       
     <item>
          <title>Sammanfattning av Citerus programmeringstävling på Jfokus 2011</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/generic/parprogrammering_IMG_1505.jpg&quot;&gt;
              &lt;h3&gt;Godk&amp;auml;nda bidrag&lt;/h3&gt;
&lt;p&gt;F&amp;ouml;rst och fr&amp;auml;mst m&amp;aring;ste vi s&amp;auml;ga att responsen p&amp;aring; &lt;a href=&quot;/jfokus&quot;&gt;t&amp;auml;vlingen&lt;/a&gt; var l&amp;aring;ngt b&amp;auml;ttre &amp;auml;n vad vi hade kunnat dr&amp;ouml;mma om. Vi fick in hela 109 bidrag (plus en l&amp;ouml;sning p&amp;aring; papper av en kund som inte &amp;auml;r programmerare) och blev &amp;auml;ven omn&amp;auml;mnda i &lt;a href=&quot;http://csjobb.idg.se/2.9741/1.371124/motvillig-vinnare&quot;&gt;CS Jobb&lt;/a&gt;. Kul!&lt;/p&gt;
&lt;p&gt;Av 109 inl&amp;auml;mnade bidrag skrivna i 14 olika spr&amp;aring;k gav 63 stycken (58 %) korrekta svar p&amp;aring; v&amp;aring;rt testdata.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Spr&amp;aring;kf&amp;ouml;rdelning alla bidrag&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-weight: inherit; font-style: inherit; font-size: 12px; font-family: inherit; vertical-align: baseline; &quot; src=&quot;/images/blog/jfokus_sprak_alla_bidrag.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Utmaningen var allts&amp;aring; inte en helt trivial n&amp;ouml;t att kn&amp;auml;cka, men h&amp;auml;r kommer en komplett lista p&amp;aring; de 63 personer som klarade den bedriften och som d&amp;auml;rmed f&amp;ouml;rtj&amp;auml;nar ett hedersomn&amp;auml;mnande:&lt;/p&gt;
&lt;table&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;th&gt;&lt;strong&gt;Namn&lt;/strong&gt;&lt;/th&gt;
            &lt;th&gt;&lt;strong&gt;Spr&amp;aring;k&lt;/strong&gt;&lt;/th&gt;
            &lt;th&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/th&gt;
            &lt;th&gt;&lt;strong&gt;L&amp;auml;nk till kod&lt;/strong&gt;&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Anders Ahlgren&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;a href=&quot;http://www.citerus.se/post/257700-alternativ-l-sning-1-snabb-ven-p&quot;&gt;http://www.citerus.se/post/257700-alternativ-l-sning-1-snabb-ven-p&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Anders Ekstr&amp;ouml;m&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Anders Eriksson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/anders_eriksson&quot;&gt;anders_eriksson&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Anders Gustafson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;a href=&quot;http://www.citerus.se/post/260388-alternativ-l-sning-4-elegant-och-l-ttl-st&quot;&gt;http://www.citerus.se/post/260388-alternativ-l-sning-4-elegant-och-l-ttl-st&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Anders Malmros&lt;/td&gt;
            &lt;td&gt;groovy&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Bj&amp;ouml;rn Antonsson&lt;/td&gt;
            &lt;td&gt;scala&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Brian Al Saadi&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Carin Lidmar&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/carinlidmar&quot;&gt;carinlidmar&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;a href=&quot;http://www.citerus.se/post/255951-vinnaren-utsedd-i-citerus-programmeringsutmaning-p&quot;&gt;http://www.citerus.se/post/255951-vinnaren-utsedd-i-citerus-programmeringsutmaning-p&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Daniel Andefors&lt;/td&gt;
            &lt;td&gt;scala&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Daniel Rejment&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Dmitry Palagin&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Fredrik Pr&amp;uuml;zelius&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.compruzze&quot;&gt;pruzze&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Henrik Hjelte&lt;/td&gt;
            &lt;td&gt;lisp&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Henrik Warne&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Henrik Ygge&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Jakob Bergendahl&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/jakber&quot;&gt;jakber&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Jan &amp;quot;pi&amp;quot; B&amp;auml;ckstr&amp;ouml;m&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/JanBackstrom&quot;&gt;JanBackstrom&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Jan Palmquist&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Jens Jansson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/Peppe_&quot;&gt;Peppe_&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Jens St&amp;aring;hl&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/cykeltillsalu&quot;&gt;cykeltillsalu&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Joakim Andersson&lt;/td&gt;
            &lt;td&gt;scala&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/joakim666&quot;&gt;joakim666&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Joel Jonsson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/joeljons&quot;&gt;joeljons&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Johan Andr&amp;eacute;n&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Johan Haukka&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Johan Wirde&lt;/td&gt;
            &lt;td&gt;clojure&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/jwirde&quot;&gt;jwirde&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Jonas Samuelsson&lt;/td&gt;
            &lt;td&gt;groovy&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;J&amp;ouml;rgen Andersson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/se_thinking&quot;&gt;se_thinking&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;K&amp;aring;re Jonsson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/karejonsson&quot;&gt;karejonsson&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Kristian Skotte&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Kristofer Karlsson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Magnus &amp;Aring;hlander&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Magnus Eriksson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/JavaFanBoy&quot;&gt;JavaFanBoy&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Magnus Ljung&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;a href=&quot;http://www.citerus.se/post/257716-alternativ-l-sning-2-graf-och-dijkstra&quot;&gt;http://www.citerus.se/post/257716-alternativ-l-sning-2-graf-och-dijkstra&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Magnus Svedjebratt&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Marcus Fr&amp;ouml;din / Jonas Wiklund&lt;/td&gt;
            &lt;td&gt;scala&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Mathias Jiderhamn&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Matti Pehrs&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/pehrs&quot;&gt;pehrs&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Mattias Jansson&lt;/td&gt;
            &lt;td&gt;jython&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/fimblo&quot;&gt;fimblo&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Mattias Norrby&lt;/td&gt;
            &lt;td&gt;jruby&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Mikael L&amp;ouml;thman&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Mikael Vessg&amp;aring;rd&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Mikael Wikblom&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/mwikblom&quot;&gt;mwikblom&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Mikko Puustinen&lt;/td&gt;
            &lt;td&gt;groovy++&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Niklas Udd&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Odd M&amp;ouml;ller&lt;/td&gt;
            &lt;td&gt;scala&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/oddan&quot;&gt;oddan&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Olle Sundblad&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Patrik Nordwall&lt;/td&gt;
            &lt;td&gt;scala&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/patriknw&quot;&gt;patriknw&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Pelle Andersson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Per Ullberg&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Peter Jaric&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/peterjaric&quot;&gt;peterjaric&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://javahacker.com/?p=412&quot;&gt;http://javahacker.com/?p=412&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Petrus Bergman&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Petter Cederqvist&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Petter Hill&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Roger Westerlund&lt;/td&gt;
            &lt;td&gt;groovy&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/rogerwesterlund&quot;&gt;rogerwesterlund&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Staffan N&amp;ouml;teberg&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/staffannoteberg&quot;&gt;staffannoteberg&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://blog.staffannoteberg.com/2011/02/15/my-solution-to-citerusjfokus-programming-contest/&quot;&gt;http://blog.staffannoteberg.com/2011/02/15/my-solution-to-citerusjfokus-programming-contest/&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Stefan Olsson&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Thomas Alexandre&lt;/td&gt;
            &lt;td&gt;scala&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/tomalex1&quot;&gt;tomalex1&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://talexandre.wordpress.com/2011/03/15/jfokus-2011citerus-programming-contest/&quot;&gt;http://talexandre.wordpress.com/2011/03/15/jfokus-2011citerus-programming-contest/&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Thomas Bladh&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Thomas Podal&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Tomas Lundstr&amp;ouml;m&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Viktor Hedefalk&lt;/td&gt;
            &lt;td&gt;scala&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://hedefalk.posterous.com/43264654 &quot;&gt;http://hedefalk.posterous.com/43264654&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&amp;Ouml;rjan Lundberg&lt;/td&gt;
            &lt;td&gt;scala&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/oluies&quot;&gt;oluies&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&amp;Ouml;sten Forshed&lt;/td&gt;
            &lt;td&gt;java&lt;/td&gt;
            &lt;td&gt;&lt;a href=&quot;http://twitter.com/ofdofd&quot;&gt;ofdofd&lt;/a&gt;&lt;/td&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Spr&amp;aring;k&lt;/h3&gt;
&lt;p&gt;Av de 62 godk&amp;auml;nda bidragen var den absoluta merparten, 45 stycken, skrivna i Java. Nio bidrag var skrivna i Scala, tre i Groovy eller Groovy++ medan de &amp;ouml;vriga bidragsl&amp;auml;mnarna var ensamma med sitt val av spr&amp;aring;k.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Spr&amp;aring;kf&amp;ouml;rdelning r&amp;auml;tta svar&quot; src=&quot;/images/blog/jfokus_sprak_ratta_svar.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Det mest sv&amp;aring;rl&amp;auml;sta bidraget som l&amp;auml;mnades in var skrivet i &lt;a href=&quot;http://sv.wikipedia.org/wiki/Brainfuck&quot;&gt;Brainfuck&lt;/a&gt;, &amp;quot;Hj&amp;auml;rntrassel&amp;quot; (f&amp;ouml;r att anv&amp;auml;nda den mer familjev&amp;auml;nliga &amp;ouml;vers&amp;auml;ttningen p&amp;aring; Wikipedia). &amp;quot;Att programmera i brainfuck &amp;auml;r sv&amp;aring;rt, att l&amp;auml;sa brainfuckkod &amp;auml;r &amp;auml;nnu sv&amp;aring;rare&amp;quot; h&amp;auml;vdar Wikipedia helt korrekt och tyv&amp;auml;rr var det Brainfuck-bidrag som l&amp;auml;mnades in inte en godk&amp;auml;nd l&amp;ouml;sning p&amp;aring; problemet. Vi vill &amp;auml;nd&amp;aring; tacka bidragsl&amp;auml;mnaren f&amp;ouml;r att ha bidragit till m&amp;aring;ngfalden i t&amp;auml;vlingen och publicerar bidraget i sin helhet nedan s&amp;aring; att den hugade kan f&amp;ouml;rs&amp;ouml;ka sig p&amp;aring; att felr&amp;auml;tta koden (och v&amp;aring;gar oss p&amp;aring; att utlova ett hederspris till den som lyckas):&lt;/p&gt;
&lt;pre&gt;
build VOCDIITEIOCRUDOIANTOCSLOIOCVESTAIOCVOLIOCENTSU in memory
 
&amp;gt;++++++[-&amp;gt;++++++++++++++&amp;lt;]&amp;gt;++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;-------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;------------[-
&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;+[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;+++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;+++++++++++[-&amp;gt;&amp;gt;+&amp;gt;+
&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;---------------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;----
--------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;+++++++++++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;+++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;[-----&amp;gt;&amp;gt;++
++&amp;gt;++++&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;+++++++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;--------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]
&amp;gt;&amp;gt;&amp;gt;+++++++++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;-----[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;---------
---[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;++++++++++++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;-------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;+++[-&amp;gt;&amp;gt;+&amp;gt;+
&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;------------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;-[---
&amp;gt;&amp;gt;++++&amp;gt;++++&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;--&amp;gt;---[-----&amp;gt;&amp;gt;++++&amp;gt;++++&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;+&amp;gt;+++++++++++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;+
[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;[----&amp;gt;&amp;gt;+++&amp;gt;+++&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;++&amp;gt;++++++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]
&amp;gt;&amp;gt;&amp;gt;------------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;-[---&amp;gt;&amp;gt;++++&amp;gt;++++&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;--&amp;gt;---------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;-
--[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;---[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;------------[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;
&amp;gt;++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;+++++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;++++++[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;-[-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;++[
-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
replace strings
 
TDD
[&amp;lt;++++++++++++[-&amp;gt;-------&amp;lt;&amp;lt;+++++++&amp;gt;]&amp;gt;&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++++++++
++++++[-&amp;gt;----&amp;lt;&amp;lt;++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++++++++++++++[-&amp;gt;-
---&amp;lt;&amp;lt;++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;[[-&amp;lt;&amp;lt;&amp;lt;&amp;lt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
DDD
[&amp;lt;+++++++++++++++++[-&amp;gt;----&amp;lt;&amp;lt;++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;++++++++
+++++++++[-&amp;gt;----&amp;lt;&amp;lt;++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++++++++++++++[
-&amp;gt;----&amp;lt;&amp;lt;++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;[[-&amp;lt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
ANT
[&amp;lt;++++++++[-&amp;gt;--------&amp;lt;&amp;lt;++++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++++++
++++[-&amp;gt;------&amp;lt;&amp;lt;++++++&amp;gt;]&amp;gt;&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;++++++++++++[-&amp;gt;-------&amp;lt;
&amp;lt;+++++++&amp;gt;]&amp;gt;&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;[[-&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;
+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
IOC
[&amp;lt;+++++++++[-&amp;gt;--------&amp;lt;&amp;lt;++++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;++++++++
+++++[-&amp;gt;------&amp;lt;&amp;lt;++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++++++++[-&amp;gt;----
--&amp;lt;&amp;lt;++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;[[-&amp;lt;&amp;lt;&amp;lt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
LOC
[&amp;lt;+++++++++[-&amp;gt;--------&amp;lt;&amp;lt;++++++++&amp;gt;]&amp;lt;++++&amp;gt;&amp;gt;----&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;++
+++++++++++[-&amp;gt;------&amp;lt;&amp;lt;++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++++++++[
-&amp;gt;------&amp;lt;&amp;lt;++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
[[-&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
DI
[&amp;lt;+++++++++++++++++[-&amp;gt;----&amp;lt;&amp;lt;++++&amp;gt;]&amp;gt;&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++++++[-&amp;gt;
--------&amp;lt;&amp;lt;++++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;[[-&amp;lt;&amp;lt;&amp;lt;&amp;lt;
&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
DO
[&amp;lt;+++++++++++++++++[-&amp;gt;----&amp;lt;&amp;lt;++++&amp;gt;]&amp;gt;&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;++++++++++++
+[-&amp;gt;------&amp;lt;&amp;lt;++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;[[-&amp;lt;&amp;lt;&amp;lt;&amp;lt;
&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
OO
[&amp;lt;+++++++++++++[-&amp;gt;------&amp;lt;&amp;lt;++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;++++++++
+++++[-&amp;gt;------&amp;lt;&amp;lt;++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;[[-
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
UI
[&amp;lt;++++++++++++[-&amp;gt;-------&amp;lt;&amp;lt;+++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++++
++[-&amp;gt;--------&amp;lt;&amp;lt;++++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;[[
-&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
CV
[&amp;lt;+++++++++++++++++[-&amp;gt;----&amp;lt;&amp;lt;++++&amp;gt;]&amp;lt;-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;++++++++
++++[-&amp;gt;-------&amp;lt;&amp;lt;+++++++&amp;gt;]&amp;lt;++&amp;gt;&amp;gt;--&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
[[-&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
SU
[&amp;lt;++++++++++++[-&amp;gt;-------&amp;lt;&amp;lt;+++++++&amp;gt;]&amp;lt;-&amp;gt;&amp;gt;+&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++++
+++++[-&amp;gt;-------&amp;lt;&amp;lt;+++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;[
[-&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
VO
[&amp;lt;++++++++++++[-&amp;gt;-------&amp;lt;&amp;lt;+++++++&amp;gt;]&amp;lt;++&amp;gt;&amp;gt;--&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;gt;+++++
++++++++[-&amp;gt;------&amp;lt;&amp;lt;++++++&amp;gt;]&amp;lt;+&amp;gt;&amp;gt;-&amp;gt;+&amp;lt;[&amp;gt;-]&amp;gt;[&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;[-&amp;gt;&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;[-&amp;lt;[-]&amp;lt;&amp;lt;&amp;lt;[-]&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;
[[-&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;+&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;[&amp;lt;&amp;lt;&amp;lt;]&amp;gt;&amp;gt;&amp;gt;
 
[.&amp;gt;&amp;gt;&amp;gt;]
 
\n
++++++++++.
&lt;/pre&gt;
&lt;p&gt;Andra mindre vanliga spr&amp;aring;k som f&amp;ouml;rekom bland bidragen var &lt;a href=&quot;http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/&quot;&gt;F#&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/AWK&quot;&gt;awk&lt;/a&gt;, &lt;a href=&quot;http://www.jython.org/&quot;&gt;jython &lt;/a&gt;och de funktionella spr&amp;aring;kens old-boy &lt;a href=&quot;http://en.wikipedia.org/wiki/Lisp_(programming_language)&quot;&gt;Lisp&lt;/a&gt;&amp;nbsp;fr&amp;aring;n 1958 som aktiverade nostalgigenerna hos mer &amp;auml;n en av Citerus konsulter eftersom flera av oss introducerades till systemutvecklingens fascinerande v&amp;auml;rld p&amp;aring; 1990-talet genom funktionell programmering i spr&amp;aring;ket ML. Vi har dessutom ett gott &amp;ouml;ga till Lisp-dialekten &lt;a href=&quot;http://clojure.org&quot;&gt;Clojure&lt;/a&gt; som k&amp;ouml;rs p&amp;aring; Java Virtual Machine.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;L&amp;auml;ngd och l&amp;auml;sbarhet&lt;/h3&gt;
&lt;p&gt;Slutligen n&amp;aring;gra ord om antal kodrader och l&amp;auml;sbarhet:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Genomsnittsl&amp;auml;ngden var ungef&amp;auml;r 60 rader kod, men de olika bidragen varierade enormt i l&amp;auml;ngd.&lt;/li&gt;
    &lt;li&gt;Den mest omfattande l&amp;ouml;sningen i antal kodrader var ett helt projekt med en snygg presentation (&lt;a href=&quot;/post/257716-alternativ-l-sning-2-graf-och-dijkstra&quot;&gt;se alternativ l&amp;ouml;sning 2&lt;/a&gt;).&lt;/li&gt;
    &lt;li&gt;De kortaste l&amp;ouml;sningarna var bara n&amp;aring;gra f&amp;aring; rader kod. En av de kortaste som dessutom anv&amp;auml;nder en hel del av tricken &amp;auml;r den som vi t&amp;aring;tat ihop sj&amp;auml;lva (se &lt;a href=&quot;/post/260390-alternativ-l-sning-5-koncis-groovy&quot;&gt;alternativ l&amp;ouml;sning 5&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;Det finns inte n&amp;aring;gon strikt b&amp;auml;sta l&amp;ouml;sning p&amp;aring; n&amp;aring;got problem; v&amp;auml;rdet eller kvaliteten av koden beror helt och h&amp;aring;llet p&amp;aring; vilket problem som den ska l&amp;ouml;sa.&lt;/blockquote&gt;
&lt;p&gt;Det finns inget sj&amp;auml;lvklart samband mellan antal rader kod och l&amp;auml;sbarhet (som ju dessutom &amp;auml;r ett subjektivt begrepp som beror mycket p&amp;aring; l&amp;auml;saren). Vissa korta l&amp;ouml;sningar gick snabbt att s&amp;auml;tta sig in i medan andra kr&amp;auml;vde desto mer tankeanstr&amp;auml;ngning f&amp;ouml;r att f&amp;ouml;rst&amp;aring;. Slutsatsen och k&amp;auml;rnfr&amp;aring;gan i den efterf&amp;ouml;ljande diskussionen &amp;auml;r att det inte finns n&amp;aring;gon strikt b&amp;auml;sta l&amp;ouml;sning p&amp;aring; n&amp;aring;got problem; varje l&amp;ouml;sning har starka och svaga sidor ur olika perspektiv och v&amp;auml;rdet eller kvaliteten av koden beror helt och h&amp;aring;llet p&amp;aring; vilket problem som den ska l&amp;ouml;sa.&lt;/p&gt;
&lt;h3&gt;Tack!&lt;/h3&gt;
&lt;p&gt;Slutligen vill vi passa p&amp;aring; att tacka alla som har engagerat sig i t&amp;auml;vlingen och bevisat att det finns en stor vilja bland svenska utvecklare att skapa vacker, l&amp;auml;sbar och effektiv kod som l&amp;ouml;ser problem och att debattera f&amp;ouml;r- och nackdelar med olika l&amp;ouml;sningar. Det betyder att det finns gott hopp f&amp;ouml;r svensk mjukvaruindustri i den &amp;ouml;kande globala konkurrensen. Tack!&lt;/p&gt;
&lt;p&gt;Vi laddar nu inf&amp;ouml;r n&amp;auml;sta t&amp;auml;vling som kommer att ha ett helt annat, mer slingrande, format!&lt;/p&gt;
&lt;blockquote&gt;Det finns gott hopp f&amp;ouml;r svensk mjukvaruindustri i den &amp;ouml;kande globala konkurrensen.&lt;/blockquote&gt;
&lt;p&gt;T&amp;auml;vlingsjuryn,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;/profile/204079-tobias-hill&quot;&gt;Tobias Hill&lt;/a&gt;, &lt;a href=&quot;/profile/204075-patrik-kerfeldt&quot;&gt;Patrik &amp;Aring;kerfeldt&lt;/a&gt;, &lt;a href=&quot;/profile/204070-mattias-holmqvist&quot;&gt;Mattias Holmqvist&lt;/a&gt; och &lt;a href=&quot;/profile/204064-jesper-hammarb-ck&quot;&gt;Jesper Hammarb&amp;auml;ck&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
          </description>
          <pubDate>Wed, 16 Mar 2011 10:58:15 GMT</pubDate>
          <guid>http://www.citerus.se/post/280165-sammanfattning-av-citerus-programmeringst-vling-p-jfokus</guid>
          <link>http://www.citerus.se/post/280165-sammanfattning-av-citerus-programmeringst-vling-p-jfokus</link>
      </item>
       
     <item>
          <title>Citerus i vinnarlag på Appening 2011</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/blog/appening_2011.png&quot;&gt;
              &lt;p&gt;I helgen t&amp;auml;vlade - och vann - Citerus konsult &lt;a href=&quot;/profile/204075-patrik-kerfeldt&quot;&gt;Patrik &amp;Aring;kerfeldt&lt;/a&gt;&amp;nbsp;&amp;nbsp;i Mittuniversitetets och E-delegations&amp;nbsp;&lt;a href=&quot;http://www.appening.se/&quot;&gt;Appening 2011&lt;/a&gt;. Det &amp;auml;r&amp;nbsp;en 24-timmarst&amp;auml;vling med syfte att ta fram tj&amp;auml;nster som baseras p&amp;aring; offentliga data, tj&amp;auml;nster som i f&amp;ouml;rl&amp;auml;ngningen ska leda till att Sverige tar t&amp;auml;tpositionen globalt n&amp;auml;r det g&amp;auml;ller att tillg&amp;auml;ngligg&amp;ouml;ra offentlig data. I&amp;nbsp;Sundsvall m&amp;ouml;ttes deltagare fr&amp;aring;n n&amp;auml;ringsliv, offentlig f&amp;ouml;rvaltning och fr&amp;aring;n akademi f&amp;ouml;r att g&amp;ouml;ra upp om totalt fem priser.&lt;/p&gt;
&lt;p&gt;Lagmedlemmarna i Team Avtryck som ett dygn senare stod som vinnare till &amp;nbsp;tv&amp;aring; av dessa fem priser fann varandra p&amp;aring; Twitter och bestod av Patrik&amp;nbsp;&lt;a target=&quot;_blank&quot; href=&quot;http://www.twitter.com/pakerfeldt&quot;&gt;@pakerfeldt&lt;/a&gt;&amp;nbsp;&amp;Aring;kerfeldt (Citerus), Johan &lt;a target=&quot;_blank&quot; href=&quot;http://www.twitter.com/johanni&quot;&gt;@johanni&lt;/a&gt;&amp;nbsp;Nilsson, Joakim&amp;nbsp;&lt;a target=&quot;_blank&quot; href=&quot;http://www.twitter.com/jbripley&quot;&gt;@jbripley&lt;/a&gt;&amp;nbsp;Bodin, Jonas&amp;nbsp;&lt;a target=&quot;_blank&quot; href=&quot;http://www.twitter.com/jonasbeckman&quot;&gt;@jonasbeckman&lt;/a&gt;&amp;nbsp;Beckman och Johan&amp;nbsp;&lt;a target=&quot;_blank&quot; href=&quot;http://www.twitter.com/nollbit&quot;&gt;@nollbit&lt;/a&gt;&amp;nbsp;Mj&amp;ouml;nes.&lt;/p&gt;
&lt;h3&gt;Anv&amp;auml;ndarv&amp;auml;nlighet och sociala funktioner skapar nytta&lt;/h3&gt;
&lt;p&gt;- &amp;quot;V&amp;aring;rt val av datak&amp;auml;lla f&amp;ouml;ll ganska snabbt p&amp;aring; Riksantikvarie&amp;auml;mbetet och deras K-Sams&amp;ouml;k som &amp;auml;r ett API f&amp;ouml;r att h&amp;auml;mta ut kulturarvsdata. Deras datam&amp;auml;ngd &amp;auml;r otroligt rik med i dagsl&amp;auml;get &amp;ouml;ver 3,5 miljoner objekt.&amp;quot;, f&amp;ouml;rklarar Patrik.&lt;/p&gt;
&lt;p&gt;- &amp;quot;Riksantikvarie&amp;auml;mbetet har redan en Android-applikation idag som kan anv&amp;auml;ndas f&amp;ouml;r att s&amp;ouml;ka ur all den information som finns i denna databas, men nyttan med detta f&amp;ouml;r vanliga anv&amp;auml;ndare &amp;auml;r begr&amp;auml;nsad.&amp;nbsp;Vi ville ist&amp;auml;llet g&amp;ouml;ra en applikation som v&amp;auml;ljer ut och presenterar information fr&amp;aring;n K-Sams&amp;ouml;k p&amp;aring; ett mer anv&amp;auml;ndarv&amp;auml;nligt och socialt s&amp;auml;tt. D&amp;auml;rf&amp;ouml;r utvecklade vi en tj&amp;auml;nst vi kallar Avtryck.&amp;quot;&lt;/p&gt;
&lt;p&gt;Med Android-appen Avtryck kan man g&amp;ouml;ra guidade turer baserat p&amp;aring; information ur K-Sams&amp;ouml;k. Turerna skapar man genom ett webbgr&amp;auml;nssnitt och tanken &amp;auml;r att vem som helst ska kunna ta fram guidade turer. Tj&amp;auml;nsten ineh&amp;aring;ller ocks&amp;aring; sociala funktioner s&amp;aring; som m&amp;ouml;jlighet att kommentera och &amp;quot;gilla&amp;quot; turer och att kunna dela med sig av information man ges under turen via sociala medier som till exempel Twitter.&lt;/p&gt;
&lt;p&gt;Vi p&amp;aring; Citerus brinner visserligen f&amp;ouml;r v&amp;auml;lskriven kod av h&amp;ouml;g kvalitet i sig, men det vi riktigt g&amp;aring;r ig&amp;aring;ng p&amp;aring; &amp;auml;r n&amp;auml;r de tj&amp;auml;nster och applikationer som vi utvecklar kan skapa h&amp;ouml;g aff&amp;auml;rsnytta och p&amp;aring; sitt s&amp;auml;tt bidra till en b&amp;auml;ttre v&amp;auml;rld. D&amp;auml;rf&amp;ouml;r &amp;auml;r vi extra stolta &amp;ouml;ver Patriks och Team Avtrycks bedrift att kamma hem b&amp;aring;de B&amp;auml;sta tj&amp;auml;nst eller app som bygger p&amp;aring; kulturarvsdata &lt;em&gt;och&lt;/em&gt; B&amp;auml;sta tj&amp;auml;nsteid&amp;eacute;. Bra jobbat!&lt;/p&gt;
&lt;h3&gt;Mer information&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;Samtliga vinnare p&amp;aring; Appening 2011: &lt;a href=&quot;http://www.appening.se/resultat&quot;&gt;http://www.appening.se/resultat&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Team Avtrycks kod: &lt;a href=&quot;https://github.com/Avtryck&quot;&gt;https://github.com/Avtryck&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Mon, 21 Mar 2011 13:19:47 GMT</pubDate>
          <guid>http://www.citerus.se/post/284669-citerus-i-vinnarlag-p-appening-2011</guid>
          <link>http://www.citerus.se/post/284669-citerus-i-vinnarlag-p-appening-2011</link>
      </item>
       
     <item>
          <title>Konferens om Lean och Agile i Stockholm</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/mikael-lundgren.jpg&quot;&gt;
              &lt;div&gt;&lt;i&gt;(Dessutom kommer jag att gnabbas med experter p&amp;aring; scen om likheter och skillnader mellan Lean och Agile, det blir sp&amp;auml;nnande att se vad som kommer ut av det)&lt;/i&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;L&amp;auml;s mer &lt;a href=&quot;http://www.teknologiskinstitut.se/29813&quot;&gt;h&amp;auml;r&lt;/a&gt; och innan du klickar p&amp;aring; anm&amp;auml;lan, &lt;a href=&quot;/profile/204072-mikael-lundgren&quot;&gt;kontakta mig&lt;/a&gt;, s&amp;aring; ordnar jag 30% rabatt p&amp;aring; priset eftersom du l&amp;auml;ser den h&amp;auml;r bloggen :)&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/14020764-559441048822914534?l=mikaellundgren.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
          </description>
          <pubDate>Fri, 18 Mar 2011 07:02:36 GMT</pubDate>
          <guid>http://www.citerus.se/post/281963-konferens-om-lean-och-agile-i</guid>
          <link>http://www.citerus.se/post/281963-konferens-om-lean-och-agile-i</link>
      </item>
       
     <item>
          <title>Securing webservices without going crazy</title>
          <description>
            &lt;img src=&quot;http://www.citerus.se//rendition.small/images/people/magnus-mickelsson.jpg&quot;&gt;
              &lt;div&gt;I have issues with Webservices. As you might not remember even if you read it, I wrote an article for PNEHM a while back about how we could avoid the madness of how Webservices used to be created and configured (the article was in Swedish back then): &lt;a href=&quot;http://www.citerus.se/post/220208-en-titt-p-xfire&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 153);&quot;&gt;http://www.citerus.se/post/220208-en-titt-p-xfire&lt;/span&gt;&lt;/a&gt;. Using a framework called XFire, we could use a simple Javabean as a service and avoid all the fluff that was needed to publish a service and create a dynamic client to connect to it - without for instance generating a bunch of classes via a WSDL.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Since then, some of the things that used to make XFire special have been adopted as the standard way of doing things, which is really nice. However, there are still annoyances and headaches associated with making Webservices working easily.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Given a free choice, I would suggest that the reader stay away from all the &amp;quot;heavy&amp;quot; things defined by the standards and just go along the route of REST based services, secured on URL/resource level via HTTPS and normal web session login. Sometimes however, the choice is not yours, so you need to get along with whatever is chosen for you.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;This small article is about such a time, making something work decently enough. In this case, it's about setting up a simple Webservice and securing the communication to it via WSSecurity - what we&amp;rsquo;ll do is set a timestamp and signature on SOAP messages, and encrypt the information being sent. The client side should be set up to have the capability to communicate with such a Webservice, and do some serious logging of what's being transferred - so we can actually tell if the messages have been encrypted or not.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;My framework of choice for this, is the evolution of the old XFire framework - CXF. It makes (dynamic) service/client creation a breeze, and also allows for adding logging and security in an easy enough way for me to endure it. CXF can't do all of this on its own though, it uses the open-source WSS4J project to provide WSSecurity functionality.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;So, what do we need to get started?&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;First of all, we need encryption keys if the communication is supposed to be decently secure. If you don't know much about public/private keys, certificates and their role in WSSecurity, take a look at this introduction:&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://cwiki.apache.org/CXF20DOC/ws-security.html&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 153);&quot;&gt;https://cwiki.apache.org/CXF20DOC/ws-security.html&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;We want to generate keys for both the client and for the server, and they should each have their own keystore. We also want to establish mutual trust between the server and the client, meaning that we want the keystore of the client to know and trust the server's signature, and vice versa.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The link above describes this scenario quite well.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The actual commands to make things work are run using a shell script called setup-keystore.sh (or use the .bat file) inside the sample zip file, so you don't have to type it all out. There are however already generated keystores available, to make things work more easily.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;(See &lt;a href=&quot;http://www.sslshopper.com/article-most-common-java-keytool-keystore-commands.html&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 153);&quot;&gt;http://www.sslshopper.com/article-most-common-java-keytool-keystore-commands.html&lt;/span&gt;&lt;/a&gt; for a good listing of keytool operations.)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;After having created the certs, we now need to create a basic Webservice to use - and to configure it the way we want it.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;This is the code of the Webservice:&lt;/div&gt;
&lt;pre class=&quot;sh_java&quot;&gt;
/**
 * @see se.citerus.wssecurity.TheService
 */
@WebService(endpointInterface = &amp;quot;se.citerus.wssecurity.TheService&amp;quot;)
public class TheServiceImpl implements TheService
{
    @Override
    public String sayHello(String name)
    {
        return &amp;quot;Hello &amp;quot; + name + &amp;quot;!&amp;quot;;
    }
}&lt;/pre&gt;
&lt;div&gt;.. implementing this interface:&lt;/div&gt;
&lt;pre class=&quot;sh_java&quot;&gt;
@WebService
public interface TheService
{
    String sayHello(String name);
}&lt;/pre&gt;
&lt;div&gt;Yikes, such an enterprise project right there.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;So, now we have the Webservice - what about the client?&lt;/div&gt;
&lt;pre class=&quot;sh_java&quot;&gt;
// Configure Spring
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(&amp;quot;client-context.xml&amp;quot;));

// Get a handle to the service via CXF generated client
TheService helloService = (TheService) factory.getBean(&amp;quot;service&amp;quot;);
System.out.println(&amp;quot;Message received: &amp;quot; + helloService.sayHello(&amp;quot;Blahonga Blahonga&amp;quot;));&lt;/pre&gt;
&lt;div&gt;This is when the observant reader realizes that this little example is actually using Spring for configuring CXF. This is for two reasons; partly because the old article also used Spring, partly because I figured it would be more relevant to see this example in a context that's not just CXF on its own - even though configuring this with just CXF in plain Java is quite doable.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Anyway, as we're trying to do WSSecurity configuration - the Spring configuration for that is going to require some explaining. To secure the communication, we need to do the following things before it will work the way we want it to:&lt;/div&gt;
&lt;ul&gt;
    &lt;li&gt;Configure CXF to add interceptors to the SOAP communication call stack, applying WSSecurity (via WSS4J) to the message exchange.&lt;/li&gt;
    &lt;li&gt;Add the keystores containing our generated keys to the solution, and make WSS4J aware of them.&lt;/li&gt;
    &lt;li&gt;Define what the WSS4J framework should do about the messages we send.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;First, let's have a look at the server-side configuration. We'll package the Webservice in a war archive, which means that we need a web.xml descriptor:&lt;/div&gt;
&lt;pre class=&quot;sh_xml&quot;&gt;
    &amp;lt;context-param&amp;gt;
        &amp;lt;param-name&amp;gt;contextConfigLocation&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;/WEB-INF/applicationContext.xml&amp;lt;/param-value&amp;gt;
    &amp;lt;/context-param&amp;gt;
    &amp;lt;listener&amp;gt;
        &amp;lt;listener-class&amp;gt;org.springframework.web.context.ContextLoaderListener&amp;lt;/listener-class&amp;gt;
    &amp;lt;/listener&amp;gt;
    &amp;lt;servlet&amp;gt;
        &amp;lt;servlet-name&amp;gt;CXFServlet&amp;lt;/servlet-name&amp;gt;
        &amp;lt;servlet-class&amp;gt;org.apache.cxf.transport.servlet.CXFServlet&amp;lt;/servlet-class&amp;gt;
        &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;
    &amp;lt;/servlet&amp;gt;
    &amp;lt;servlet-mapping&amp;gt;
        &amp;lt;servlet-name&amp;gt;CXFServlet&amp;lt;/servlet-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;/pre&gt;
&lt;div&gt;We're basically just saying here to use Spring, and refer to a configuration file for Spring to use that we'll review in a moment.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;We also configure CXF's Servlet for receiving Webservice requests, and map all incoming requests to use the CXF Servlet.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The below Spring XML configuration sets up the Webservice:&lt;/div&gt;
&lt;pre class=&quot;sh_xml&quot;&gt;
    &amp;lt;import resource=&amp;quot;classpath:META-INF/cxf/cxf.xml&amp;quot;&amp;gt;&amp;lt;/import&amp;gt;
    &amp;lt;import resource=&amp;quot;classpath:META-INF/cxf/cxf-extension-soap.xml&amp;quot;&amp;gt;&amp;lt;/import&amp;gt;
    &amp;lt;import resource=&amp;quot;classpath:META-INF/cxf/cxf-servlet.xml&amp;quot;&amp;gt;&amp;lt;/import&amp;gt;

    &amp;lt;!-- Define the webservice doing Hello World in a pretty secure way :o --&amp;gt;
    &amp;lt;jaxws:endpoint implementor=&amp;quot;se.citerus.wssecurity.TheServiceImpl&amp;quot; address=&amp;quot;/HelloWorld&amp;quot;&amp;gt;
         &amp;lt;jaxws:outinterceptors&amp;gt;
             &amp;lt;ref bean=&amp;quot;WSSecurityServiceResponseInterceptor&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;
         &amp;lt;/jaxws:outinterceptors&amp;gt;
         &amp;lt;jaxws:ininterceptors&amp;gt;
             &amp;lt;ref bean=&amp;quot;WSSecurityServiceRequestInterceptor&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;
         &amp;lt;/jaxws:ininterceptors&amp;gt;
      &amp;lt;/jaxws:endpoint&amp;gt;&lt;/pre&gt;
&lt;div&gt;We import the Spring bean declarations that CXF requires, and then we define our Webservice as a JaxWS endpoint.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Not too bad. However, the configuration refers to two interceptors - and this is where it gets a bit confusing.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The interceptor definitions look like this:&lt;/div&gt;
&lt;pre class=&quot;sh_xml&quot;&gt;
    &amp;lt;!-- Interceptor for decrypting and validating the signature of the request --&amp;gt;
   &amp;lt;bean id=&amp;quot;WSSecurityServiceRequestInterceptor&amp;quot; class=&amp;quot;org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor&amp;quot;&amp;gt;
       &amp;lt;constructor-arg&amp;gt;
           &amp;lt;map&amp;gt;
               &amp;lt;entry key=&amp;quot;action&amp;quot; value=&amp;quot;Timestamp Signature Encrypt&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;signaturePropFile&amp;quot; value=&amp;quot;keystore.properties&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;decryptionPropFile&amp;quot; value=&amp;quot;keystore.properties&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;passwordCallbackClass&amp;quot; value=&amp;quot;se.citerus.wssecurity.ServerPasswordCallback&amp;quot;/&amp;gt;
           &amp;lt;/map&amp;gt;
       &amp;lt;/constructor-arg&amp;gt;
   &amp;lt;/bean&amp;gt;

   &amp;lt;!-- Interceptor for timestamping, signing and encrypting the response --&amp;gt;
   &amp;lt;bean id=&amp;quot;WSSecurityServiceResponseInterceptor&amp;quot; class=&amp;quot;org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor&amp;quot;&amp;gt;
       &amp;lt;constructor-arg&amp;gt;
           &amp;lt;map&amp;gt;
               &amp;lt;entry key=&amp;quot;action&amp;quot; value=&amp;quot;Timestamp Signature Encrypt&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;user&amp;quot; value=&amp;quot;helloService&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;signaturePropFile&amp;quot; value=&amp;quot;keystore.properties&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;encryptionPropFile&amp;quot; value=&amp;quot;keystore.properties&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;encryptionUser&amp;quot; value=&amp;quot;useReqSigCert&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;passwordCallbackClass&amp;quot; value=&amp;quot;se.citerus.wssecurity.ServerPasswordCallback&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;signatureParts&amp;quot; value=&amp;quot;{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp;{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;encryptionParts&amp;quot; value=&amp;quot;{Element}{http://www.w3.org/2000/09/xmldsig#}Signature;{Content}{http://schemas.xmlsoap.org/soap/envelope/}Body&amp;quot;/&amp;gt;
               &amp;lt;entry key=&amp;quot;encryptionSymAlgorithm&amp;quot; value=&amp;quot;http://www.w3.org/2001/04/xmlenc#tripledes-cbc&amp;quot;/&amp;gt;
           &amp;lt;/map&amp;gt;
       &amp;lt;/constructor-arg&amp;gt;
   &amp;lt;/bean&amp;gt;&lt;/pre&gt;
&lt;div&gt;Did I lose you there? If not, let's go through what this really means.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;We use two classes from the CXF WSSecurity API to create two Spring beans, which also happen to be interceptors that can be added to the communication stack of the dynamic Webservice, in this case on the server side.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The interceptor stack receives incoming calls to the wrapped service, and can do things when that call is made. The image below shows such a scenario.&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;http://www.citerus.se/images/blog/I%20have%20issues.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;div&gt;The interceptor for inbound traffic is responsible for decrypting, checking timestamp and message signature. The one for outbound traffic adds timestamp, signature and encrypts the message using the tripple DES algorithm.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The timestamps add the behaviour that messages expire after a set time (default in WSS4J version 1.5.9 seems to be 300 seconds from what I could see in the code), thus reducing the risk of some malicious person intercepting messages to be replayed with some modifications later. If the message takes longer than 300 seconds to be delivered, the receiving side will respond with an error.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Signing a message is done to guarantee the message is from a certain trusted party, and is accomplished via creating a signature generated using the private encryption key of the sender. We have to give the interceptors a reference to a callback for verifying the private password used when signing the message, so the client and server can be sure that they are in fact not talking to an impostor.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;This is set with the passwordCallbackClass property in the XML configuration. The passwords used in the respective callback correspond to the key passwords from when the keystores were created. A keystore password and a key password are quite different things, and the callbacks deal with the key passwords. WSS4J needs to know about the keystore passwords to unlock the keystores, however - but that is accomplished via the property files.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Read more about the interceptors in CXF here: &lt;a href=&quot;http://cxf.apache.org/docs/interceptors.html&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 153);&quot;&gt;http://cxf.apache.org/docs/interceptors.html&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The interceptors delegate the WSSecurity handling to the WSS4J library, which we&amp;rsquo;ll set up using the keystore.properties file on the server side:&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;pre class=&quot;sh_properties&quot;&gt;
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
# Service keystore password
org.apache.ws.security.crypto.merlin.keystore.password=service
# Service keystore certificate alias
org.apache.ws.security.crypto.merlin.keystore.alias=helloService
org.apache.ws.security.crypto.merlin.file=serviceKS.jks&lt;/pre&gt;
&lt;div&gt;We basically use the certificate alias we defined when we created the server-side keystore, the password required to access the keystore, the name of the keystore file and the type of it.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;So, we're done setting up the server-side, let&amp;rsquo;s move on to the client. As you remember from the client code that was shown earlier, we refered to a Spring configuration file for setting up the client:&lt;/div&gt;
&lt;pre class=&quot;sh_java&quot;&gt;
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(&amp;quot;client-context.xml&amp;quot;));&lt;/pre&gt;
&lt;div&gt;The contents of this client-context.xml file looks like this:&lt;/div&gt;
&lt;pre class=&quot;sh_xml&quot;&gt;
    &amp;lt;!-- The client bean definition --&amp;gt;
    &amp;lt;bean id=&amp;quot;client&amp;quot; class=&amp;quot;se.citerus.wssecurity.WSClient&amp;quot; factory-bean=&amp;quot;clientFactory&amp;quot; factory-method=&amp;quot;create&amp;quot;/&amp;gt;

    &amp;lt;!-- Webservice client factory bean, adds interceptors to the communication --&amp;gt;
    &amp;lt;bean id=&amp;quot;clientFactory&amp;quot; class=&amp;quot;org.apache.cxf.jaxws.JaxWsProxyFactoryBean&amp;quot;&amp;gt;
        &amp;lt;property name=&amp;quot;serviceClass&amp;quot; value=&amp;quot;se.citerus.wssecurity.TheService&amp;quot;/&amp;gt;
        &amp;lt;!-- Where we find the Webservice to connect to --&amp;gt;
        &amp;lt;property name=&amp;quot;address&amp;quot; value=&amp;quot;http://localhost:8080/ws_security/HelloWorld&amp;quot;/&amp;gt;
        &amp;lt;property name=&amp;quot;inInterceptors&amp;quot;&amp;gt;
            &amp;lt;list&amp;gt;
                &amp;lt;ref bean=&amp;quot;WSSecurityResponseInterceptor&amp;quot;/&amp;gt;
            &amp;lt;/list&amp;gt;
        &amp;lt;/property&amp;gt;
        &amp;lt;property name=&amp;quot;outInterceptors&amp;quot;&amp;gt;
            &amp;lt;list&amp;gt;
                &amp;lt;ref bean=&amp;quot;WSSecurityRequestInterceptor&amp;quot;/&amp;gt;
            &amp;lt;/list&amp;gt;
        &amp;lt;/property&amp;gt;
    &amp;lt;/bean&amp;gt;

  &amp;lt;!-- Interceptor that will add a timestamp, a signature, and encrypt the message using triple DES --&amp;gt;
    &amp;lt;bean id=&amp;quot;WSSecurityRequestInterceptor&amp;quot; class=&amp;quot;org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor&amp;quot;&amp;gt;
        &amp;lt;constructor-arg&amp;gt;
            &amp;lt;map&amp;gt;
                &amp;lt;entry key=&amp;quot;action&amp;quot; value=&amp;quot;Timestamp Signature Encrypt&amp;quot;/&amp;gt;
                &amp;lt;entry key=&amp;quot;user&amp;quot; value=&amp;quot;client&amp;quot;/&amp;gt;
                &amp;lt;entry key=&amp;quot;signaturePropFile&amp;quot; value=&amp;quot;client.properties&amp;quot;/&amp;gt;
                &amp;lt;entry key=&amp;quot;encryptionPropFile&amp;quot; value=&amp;quot;client.properties&amp;quot;/&amp;gt;
                &amp;lt;entry key=&amp;quot;encryptionUser&amp;quot; value=&amp;quot;helloService&amp;quot;/&amp;gt;

                &amp;lt;!-- The class implementing the client password verification callback --&amp;gt;
                &amp;lt;entry key=&amp;quot;passwordCallbackClass&amp;quot;
                       value=&amp;quot;se.citerus.wssecurity.ClientPasswordCallback&amp;quot;/&amp;gt;
                &amp;lt;entry key=&amp;quot;signatureParts&amp;quot;
                       value=&amp;quot;{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd}Timestamp;{Element}{http://schemas.xmlsoap.org/soap/envelope/}Body&amp;quot;/&amp;gt;
                &amp;lt;entry key=&amp;quot;encryptionParts&amp;quot;
                       value=&amp;quot;{Element}{http://www.w3.org/2000/09/xmldsig#}Signature;{Content}{http://schemas.xmlsoap.org/soap/envelope/}Body&amp;quot;/&amp;gt;
                &amp;lt;entry key=&amp;quot;encryptionSymAlgorithm&amp;quot; value=&amp;quot;http://www.w3.org/2001/04/xmlenc#tripledes-cbc&amp;quot;/&amp;gt;
            &amp;lt;/map&amp;gt;
        &amp;lt;/constructor-arg&amp;gt;
    &amp;lt;/bean&amp;gt;

    &amp;lt;!-- Interceptor that will decrypt the response, and verify the timestamp and signature --&amp;gt;
    &amp;lt;bean id=&amp;quot;WSSecurityResponseInterceptor&amp;quot; class=&amp;quot;org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor&amp;quot;&amp;gt;
        &amp;lt;constructor-arg&amp;gt;
            &amp;lt;map&amp;gt;
                &amp;lt;entry key=&amp;quot;action&amp;quot; value=&amp;quot;Timestamp Signature Encrypt&amp;quot;/&amp;gt;
                &amp;lt;entry key=&amp;quot;signaturePropFile&amp;quot; value=&amp;quot;client.properties&amp;quot;/&amp;gt;
                &amp;lt;entry key=&amp;quot;decryptionPropFile&amp;quot; value=&amp;quot;client.properties&amp;quot;/&amp;gt;
                &amp;lt;!-- The class implementing the client password verification callback --&amp;gt;
                &amp;lt;entry key=&amp;quot;passwordCallbackClass&amp;quot;
                       value=&amp;quot;se.citerus.wssecurity.ClientPasswordCallback&amp;quot;/&amp;gt;
            &amp;lt;/map&amp;gt;
        &amp;lt;/constructor-arg&amp;gt;
    &amp;lt;/bean&amp;gt;&lt;/pre&gt;
&lt;div&gt;Since you saw similar definitions for the server with regards to the interceptors, I assume it&amp;rsquo;s not confusing anymore.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;We basically say the same thing as for the server, we point out the properties of the WSSecurity configuration, and how the messages should be handled - timestamped, signed and encrypted using triple DES.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The properties needed by WSS4J are defined in the client.properties file, which looks like this:&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;pre class=&quot;sh_properties&quot;&gt;
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
# Password of the client keystore
org.apache.ws.security.crypto.merlin.keystore.password=client
# Client keystore certificate alias
org.apache.ws.security.crypto.merlin.keystore.alias=client
org.apache.ws.security.crypto.merlin.file=clientKS.jks&lt;/pre&gt;
&lt;div&gt;Pretty similar to the server side, right?&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;We&amp;rsquo;ll also add logging the communication between client and server, but using Java code on the client. This could just as easily be injected via Spring XML, just showing another way to add interceptors to the CXF call stack.&lt;/div&gt;
&lt;pre class=&quot;sh_java&quot;&gt;
Client client = ClientProxy.getClient(helloService);

// Add logging interceptors to trace the request+response XML
client.getInInterceptors().add(new LoggingInInterceptor());
client.getOutInterceptors().add(new LoggingOutInterceptor());&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Once again, we use the interceptor concept; adding two standard interceptor classes existing within CXF to the call stack.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Now we have all the pieces in place to get this working. If you want to try this out for yourselves without actually writing any code, feel free to download the example code here:&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://www.citerus.se/downloads/wssecurity.zip&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 153);&quot;&gt;http://www.citerus.se/downloads/wssecurity.zip&lt;/span&gt;&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The code has been tested on JBoss 5.1.0 GA, Glassfish v3, Jetty 7.3.0 and Tomcat 7.0.8. It builds using an included Ant-script, or via the IntelliJ project files.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Go to the wssecurity directory, and run &amp;quot;ant -projecthelp&amp;quot; to see the available build targets for Ant. Just run &amp;quot;ant&amp;quot; without arguments to create a deployable WAR archive.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Deploy the WAR to an application server of choice, and ensure that the serviceKS.jks file is in the &amp;quot;start directory&amp;quot; of the application server*. Or, you could modify the path to it in the property file and just place the keystore whereever you'd like.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The client is started using the Ant target &amp;quot;run-client&amp;quot; in the ws-security-client directory.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;The reader should note, that this is not the only way to solve this problem. An option might for instance be to have a look at &lt;a href=&quot;http://static.springsource.org/spring-ws/sites/1.5&quot; target=&quot;_blank&quot;&gt;Spring Web Services: http://static.springsource.org/spring-ws/sites/1.5&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I hope this little exercise was useful, if not I hope it's because you're already using Webservices in a more pragmatic and easy way - and in that case I'd like you to share your secrets with me. :)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;* = Start directories:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Glassfish = (installation path)/glassfishv3/glassfish/domains/domain1/config/&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tomcat = (installation path)/bin/&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Jetty = (installation path)/&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JBoss = (installation path)/bin/&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
          </description>
          <pubDate>Thu, 24 Feb 2011 13:00:55 GMT</pubDate>
          <guid>http://www.citerus.se/post/262521-securing-webservices-without-going-crazy</guid>
          <link>http://www.citerus.se/post/262521-securing-webservices-without-going-crazy</link>
      </item>
    
  </channel>
</rss>
