<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>BEKK Open</title>
	
	<link>http://open.bekk.no</link>
	<description>Et innblikk i hva som skjer i BEKK</description>
	<lastBuildDate>Fri, 03 Feb 2012 13:56:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BekkOpen" /><feedburner:info uri="bekkopen" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Innovasjon – en unnskyldning for å være vag?</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/ZJroiOVIQsQ/</link>
		<comments>http://open.bekk.no/innovasjon-en-unnskyldning-for-a-vaere-vag/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 09:52:27 +0000</pubDate>
		<dc:creator>Stian Remåd</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[BEKK Management Consulting]]></category>
		<category><![CDATA[Alexander Osterwalder]]></category>
		<category><![CDATA[innovasjon]]></category>
		<category><![CDATA[Innovasjonsstrategi]]></category>
		<category><![CDATA[Robert Wolcott]]></category>
		<category><![CDATA[strategi]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=8024</guid>
		<description><![CDATA[Siden dette er mitt livs første blogginnlegg synes jeg det er rett og rimelig å starte med en litt kontroversiell påstand. Selv har jeg jobbet for en av Norges mest anerkjente innovatører, og sjelden har jeg vært borti mer usikkerhet om hva innovasjon egentlig er. Dette kompliserer diskusjonene og bidrar til flere myter rundt innovasjon, [...]]]></description>
			<content:encoded><![CDATA[<p>Siden dette er mitt livs første blogginnlegg synes jeg det er rett og rimelig å starte med en litt kontroversiell påstand. Selv har jeg jobbet for en av Norges mest anerkjente innovatører, og sjelden har jeg vært borti mer usikkerhet om hva innovasjon egentlig er. Dette kompliserer diskusjonene og bidrar til flere myter rundt innovasjon, noe min kollega også tar opp i sin bloggpost.</p>
<p><strong>Den skoleflinke definisjonen</strong></p>
<p>Det skulle ikke være nødvendig å si for mye om viktigheten av tydelige målsetninger og en tydelig strategi for å nå sine mål. Vi kjenner viktigheten av å prioritere satsningsområder, og alle som en gang har bitt over for mye vet at for mye bredde ender opp i ingenting – masser av ingenting.</p>
<p>Likevel – når det kommer til innovasjon virker det som noe har gått tapt i hukommelsen. Det er lett å bli arrestert når en forsøker å konkretisere: “Innovasjon for dette selskapet er…” og man kommer sjelden veldig mye lenger før noen påpeker at innovasjon er både inkrementelle forbedringer, radikale innovasjoner og disruptive nyskapninger, eller at man må huske Doblin, som sier at innovasjon kan og bør romme forretningsmodeller, produkter og tjenester, prosesser, merkevarer, kundeopplevelser også videre…</p>
<p>Vurder denne definisjonen: “Innovasjon er store og små endringer i produkter, prosesser, forretningsmodeller og adferd som skaper verdi for kunden og selskapet selv”. Ganske dekkende? Hvor verdifull er den imidlertid? Selv mener jeg at den er lite verd, fordi den ikke utelukker noen ting &#8211; den er ikke et middel for å lede oss på rett vei. Men den er skoleflink!</p>
<p><strong>Diskuter bredt, iverksett smalt</strong></p>
<p>Innovasjonsutfordringen bør absolutt angripes fra mange kanter – i et innledende strategiarbeid. Ta gjerne en titt på Alexander Osterwalders business model canvas eller på Robert Wolcotts innovasjonsradar – dette er verktøy som hjelper selskaper med å skape et bredt perspektiv på innovasjonsspillerommet.</p>
<p>Problemet oppstår når selskaper ikke kommer seg ut av diskusjonen, og ender med en definisjon og en strategi like bred som da de begynte fordi de har fått formaninger om å ikke begrense kreativiteten og innspillene – også gaper de over for mye. Imidlertid, flere og flere ser at innovasjonsledelse, som i all ledelse, handler om fokus. Booz &amp; Co “avslører” vinnertrikset innenfor innovasjon som evnen til å velge noen få retninger. Robert Wolcott er enda mer spesifikk, da han konkluderer med at vinnerne velger mellom 2 og 5 strategiske retninger i hans 12-armede innovasjonsradar.</p>
<p>De som forsker på vinnere har talt: Smalt vinner over bredt når det gjelder gjennomføring.</p>
<p><strong>Innovasjon i klartekst</strong></p>
<p>Så la oss si at et selskap ser en fremtid der kunden kjøper varer gjennom flere kanaler, og velger leverandør basert på evnen til å yte service. Så selskapet etablerer en strategi basert på etablering i nye kanaler, og på økt kundeopplevelse i selskapets kontaktpunkter. Min hypotese er at et slikt selskap vil ha en langt lettere jobb når de skal etablere måleparametere, prosesser og påkrevet kompetanse for å skape nye og bedre løsninger, enn et selskap som skal skape “store og små endringer i produkter, prosesser, forretningsmodeller og adferd…” også videre.<br />
Den skotske filosofen Thomas Reid sa en gang: “There is no greater impediment to the advancement of knowledge than the ambiguity of words”. Så vær tydelig med hva innovasjon er for ditt selskap, avgrens fokuset til noen veldig få satsningsområder, og kall en spade for en spade. Veien er vanskelig nok i seg selv – la oss sette målet klart for øyet.</p>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/ZJroiOVIQsQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/innovasjon-en-unnskyldning-for-a-vaere-vag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://open.bekk.no/innovasjon-en-unnskyldning-for-a-vaere-vag/</feedburner:origLink></item>
		<item>
		<title>Hva er HashDOS og hva gjør jeg med det?</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/-wkDBZnbxq0/</link>
		<comments>http://open.bekk.no/hva-er-hashdos-og-hva-gjor-jeg-med-det/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 22:43:16 +0000</pubDate>
		<dc:creator>Erlend Oftedal</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[hashdos]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[Sikkerhet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=7994</guid>
		<description><![CDATA[Rundt nyttår ble den årlige CCC-konferansen avholdt, og som vanlig ble det avdekket noen større sikkerhetssvakheter. Denne gangen var turen kommet til HashDOS. Dette er egentlig et gammelt problem (avdekket allerede i 2003) og gjelder Ruby on Rails, ASP.NET, java m.fl. En av få plattformer som ikke ble rammet var Perl, da de tok dette [...]]]></description>
			<content:encoded><![CDATA[<p>Rundt nyttår ble den årlige <a href="http://ccc.de/">CCC</a>-konferansen avholdt, og som vanlig ble det avdekket noen større sikkerhetssvakheter. Denne gangen var turen kommet til HashDOS. Dette er egentlig et gammelt problem (avdekket allerede i 2003) og gjelder Ruby on Rails, ASP.NET, java m.fl. En av få plattformer som ikke ble rammet var Perl, da de tok dette på alvor tilbake i 2003.</p>
<p><strong>Hva er HashDOS?</strong></p>
<p>En angriper kan, ved hjelp av relativt få ressurser, få CPUene på dine webservere til å gå i taket. Et eksempel fra <a href="http://events.ccc.de/congress/2011/Fahrplan/attachments/2007_28C3_Effective_DoS_on_web_application_platforms.pdf">slidesettet</a> viser f.eks. at man en java Tomcat kjørede på en i7 core kan utmattes med en ~6 kbits/s linje.</p>
<p><strong>Hva er det egentlig som skjer?</strong></p>
<p>Når en webapplikasjon mottar en POST-request, vil den, i de fleste rammeverk, lage en eller annen form for hashtabell eller hashmap som inneholder de parameterene som finnes i POST-requesten. En slik struktur benytter en hashfunksjon (derav navnet) for å fordele nøkler med tilhørende verdier på et begrenset antall med bøtter. Dette gjør det effektivt å slå opp verdier senere, fordi man ikke trenger å lete gjennom alle nøkler, men kan hashe nøkkelen, finne riktig bøtte, og se om nøkkelen med tilhørende verdi finnes i bøtta. </p>
<p>Men siden det er et begrenset antall bøtter, vil det naturligvis finnes flere mulige nøkler som hasher til samme bøtte (to strenger kan f.eks. gi samme hash). For å håndtere dette benyttes det gjerne en lenket liste i hver bøtte. Når man skal søke i denne bøtta, øker søketiden dermed lineært med antall nøkler i bøtta. Det samme gjelder innsettinger i tabellen. Før man kan sette inn et nytt element, må man sjekke om nøkkelen finnes der fra før. Og det er nettopp her problemet ligger.</p>
<p>En angriper sender f.eks. inn n=200,000 parametere som alle har navn med samme hash-kode. Når applikasjonen skal bygge opp hashtabellen, ender den da opp med å gjøre n^2 sammenligninger som i eksempelet blir 40,000,000,000 sammenligninger. Som man skjønner, kan dette bli svært kostbart CPU-messig.</p>
<p>Det er ikke spesielt vanskelig å finne slike strenger som gir samme hash. Hash-funksjonene som brukes i de forskjellige rammeverkene er ofte slik at der string A og B har samme hash, så vil AB (A konkatenert med B) få samme hash som BA, AA og BB. Dermed er det lett å lage permutasjoner som alle gir samme hash-verdi.</p>
<p><strong>Hvordan beskytter jeg meg?</strong></p>
<p>For flere rammeverkt, deriblant ASP.NET, leverer leverandøren av rammeverket en patch. Mange av patchene som har kommet baserer seg på at hash-funksjonen gjøres mindre forutsigbar. Hash-funksjonene har inntill nå, gitt samme hash-verdi for samme string hver gang man kjørte programmet. I noen rammeverk vil det nå være slik at en hash-funksjon alltid ville gi samme verdi for samme string innenfor samme prosess, men starter man applikasjonen på ny, endres hashfunksjonen slik at to verdier som før hadde samme hash, nå vil gi forskjellig hash. Dermed gjør man det nærmest umulig for en angriper å finne verdier som gir samme hash.</p>
<p>En annen mulighet som f.eks. PHP og Jetty benytter seg av, er å begrense hvor mange POST-parametere man kan ha. Man kan jo ganske greit argumentere for at man ikke trenger å kunne ha 200,000 POST parameter. De fleste klarer seg nok med under 100.</p>
<p>Dersom rammeverket man bruker enda ikke er patchet, kan man også begrense tillatt størrelse på POST-requester. For å sende 200,000 parametere må man kunne sende en POST-request på ca. 2 MB. Siden kompleksiteten er n^2, kan man ved å redusere til f.eks. 200KB, redusere fra 40,000,000,000 til 400,000,000. Og en lavere grense blir resultatet enda bedre. Men det beste er selvsagt om problemet håndteres i rammeverket eller webserveren.</p>
<p><strong>Ressurser</strong></p>
<ul>
<li><a href="http://www.youtube.com/watch?v=R2Cq3CLI6H8">Opptak av foredraget fra CCC</a></li>
<li><a href="http://events.ccc.de/congress/2011/Fahrplan/attachments/2007_28C3_Effective_DoS_on_web_application_platforms.pdf">Slides</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/-wkDBZnbxq0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/hva-er-hashdos-og-hva-gjor-jeg-med-det/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://open.bekk.no/hva-er-hashdos-og-hva-gjor-jeg-med-det/</feedburner:origLink></item>
		<item>
		<title>Emosjonell design – risky business? (6:6)</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/u7edbuYqXPo/</link>
		<comments>http://open.bekk.no/emosjonell-design-%e2%80%93-risky-business-66/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 08:48:16 +0000</pubDate>
		<dc:creator>Nina Volstad</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[FUNK]]></category>
		<category><![CDATA[brukeropplevelse]]></category>
		<category><![CDATA[funksjonalitet og brukeropplevelse]]></category>
		<category><![CDATA[psykologi og design]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=7585</guid>
		<description><![CDATA[Krysningen design og psykologi er i vinden som aldri før, og gjennom seks innlegg skriver Nina om kunnskap og refleksjoner fra boken “Designing for Emotion” av Aarron Walter. Innlegg nummer 6 avslutter vi med å se på utfordringer rundt emosjonell design.]]></description>
			<content:encoded><![CDATA[<h5><em>I de tidligere innleggene mine har jeg gitt en intro til emosjonell design gjennom boken “Design for emotion” av <a href="http://aarronwalter.com/">Aarron Walter</a>, ved å snakke om “<a href="https://open.bekk.no/en-intro-til-emosjonell-design/trackback/">Hva?</a>”, “<a href="https://open.bekk.no/hvorfor-bry-seg-om-emosjonell-design/trackback/">Hvorfor?</a>” og  “Hvordan?&#8221; (den siste gjennom <a href="https://open.bekk.no/psykologiske-fellesnevnere-i-emosjonell-design-hvordan-36/trackback/">psykologiske fellesnevnere</a>, <a href="https://open.bekk.no/personlighet-i-emosjonell-design-hvordan-46/trackback/">personlighet</a> og <a href="https://open.bekk.no/praktiske-fremgangsmater-i-emosjonell-design-56/trackback/">praktiske fremgangsmåter</a>). Denne gangen skal vi avslutte med å se på utfordringer ved emosjonell design.</em></h5>
<h2>Dette virker da litt risky…</h2>
<p>I <a href="https://open.bekk.no/praktiske-fremgangsmater-i-emosjonell-design-56/trackback/">det forrige innlegget mitt</a> så vi på tre ulike måter å implementere emosjonell design der de mer forsiktige kan ta vekk litt av riskfølelsen. Da vi snakket om emosjonell design gjennom <a href="https://open.bekk.no/personlighet-i-emosjonell-design-hvordan-46/trackback/">personlighet</a>, var vi også litt inne på det at dette kunne føles litt risky. Nå skal vi ta tyren ved hornene!</p>
<p>Å vise personlighet i design, som ellers i verden, innebærer alltid en liten risiko. Noen personligheter klikker rett og slett ikke. Dette kan høres veldig skummelt ut, og man kan fort bli fristet til å &#8220;safe&#8221; med å bare være generelt likandes og ikke så mye mer. Men tenk på hvordan det er i det vanlige liv; er det ikke bedre at folk knytter en følelse til deg, enn at du holder deg flat og nøytral og alle sier “ Nei, hun Nina er vel ok hun.. ”?</p>
<p>Det vil alltid være noen personligheter som ikke passer sammen, men dette kan faktisk være en ganske god reality-check. Dersom du har utviklet en personlighet som speiler brandet og systemet godt, og det er noen kunder som så ikke liker personligheten vår, har vi kanskje spart oss for et potensielt trøbblete kundeforhold i fremtiden? Og når vi på motsatt side ser alle dem som nå virkelig digger oss fordi vi har en bra personlighet, heller enn å bare si vi er ok – da er det vel win-win og en liten risk å ta?</p>
<h2>Hva annet enn personlighet er utfordrende?</h2>
<p>I tillegg til at personlighetene må passe, må man av og til overkomme skepsis, latskap og likegyldighet.</p>
<p>Det første er rett og slett å få brukerne til å stole på deg. Som nevnt i et <a href="https://open.bekk.no/psykologiske-fellesnevnere-i-emosjonell-design-hvordan-36/trackback/">tidligere innlegg</a>, er det da viktig at overflaten gir et tillitsvekkende ytre. Det er faktisk slik at når “panseret” tydelig har fått ettertanke og er gjennomarbeidet, da får man følelsen av at det som ligger bak sannsynligvis også er samvittighetsfullt og skikkelig gjort, og det er mindre grunn til å tro at du vil møte noe som ikke henger på greip senere i prosessen.</p>
<p>Folk er egentlig ikke så late, de bare leter etter minste motstands vei. Her kan man coache folk mot målet gjennom å gjøre prosessen nærmest til et spill ved å gi insentiver og premier som kommer nærmere og nærmere jo lenger brukeren kommer i prosessen. For eksempel bruker Dropbox en premie på 250MB lagringsplass som brukerne gradvis ser komme nærmere etterhvert som han bygger opp sin konto med bilder osv.</p>
<p><a href="http://open.bekk.no/wp-content/uploads/2011/12/dropbox.png"><img class="alignleft size-medium wp-image-7587" src="http://open.bekk.no/wp-content/uploads/2011/12/dropbox-300x175.png" alt="" width="300" height="175" /></a></p>
<p>Likegyldighet skjer når innholdet i siden er irrelevant eller dårlig presentert. Her er det rett og slett slik at</p>
<blockquote><p> &#8221;Great content delivered in an emotionally engaging manner is like kryptonite for apathy!&#8221;</p></blockquote>
<h2>Og når noe går galt…</h2>
<p>Enten man bruker emosjonell design eller ikke, vil systemer alltid feile. En eller annen gang har du downtime eller menneskelig feil eller lignende, og dette liker selvsagt ikke brukerne.</p>
<p>Men! Når du har en positiv emosjonell forbindelse med brukerne, da er det mye mer sannsynlig at de tilgir, og fortsetter å bruke og elske systemet. Når en feil skjer, vil responsen til brukerne være tuftet på hvordan forholdet deres til systemet allerede er. Dersom man allerede har et godt emosjonelt forhold og så takler feil med å kommunisere rolig og ærlig, og kommer med oppdateringer (“Vi jobber så hardt vi kan!”), forsikringer og beklagelser, kan man langt på vei roe negative følelser og vri disse tilbake til det positive.</p>
<blockquote><p> &#8221;Emotional deisgn is your insurance to maintain audience trust when things aren&#8217;t going your way&#8221;</p></blockquote>
<p><em>Dette var siste episode i seks-dels føljetongen om emosjonell design. Jeg håper det har vært interessant lesing og at du har fått lyst til å snuse på temaet!</em></p>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/u7edbuYqXPo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/emosjonell-design-%e2%80%93-risky-business-66/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://open.bekk.no/emosjonell-design-%e2%80%93-risky-business-66/</feedburner:origLink></item>
		<item>
		<title>Praktiske fremgangsmåter i emosjonell design (5:6)</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/iA96LzRhCyk/</link>
		<comments>http://open.bekk.no/praktiske-fremgangsmater-i-emosjonell-design-56/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 07:35:39 +0000</pubDate>
		<dc:creator>Nina Volstad</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[FUNK]]></category>
		<category><![CDATA[brukeropplevelse]]></category>
		<category><![CDATA[funksjonalitet og brukeropplevelse]]></category>
		<category><![CDATA[psykologi og design]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=7560</guid>
		<description><![CDATA[Krysningen design og psykologi er i vinden som aldri før, og gjennom seks innlegg skriver Nina om kunnskap og refleksjoner fra boken “Designing for Emotion” av Aarron Walter. Innlegg nummer 5 ser vi på praktiske fremgangsmåter for emosjonell design!]]></description>
			<content:encoded><![CDATA[<h5><em>I de tidligere innleggene har jeg gitt en intro til emosjonell design gjennom boken “Design for emotion” av <a href="http://aarronwalter.com/">Aarron Walter</a>, ved å snakke om <a href="https://open.bekk.no/en-intro-til-emosjonell-design/trackback/">“Hva?”</a>, <a href="https://open.bekk.no/hvorfor-bry-seg-om-emosjonell-design/trackback/">“Hvorfor?”</a> og  “Hvordan?&#8221; (den siste gjennom <a href="https://open.bekk.no/psykologiske-fellesnevnere-i-emosjonell-design-hvordan-36/trackback/">psykologiske fellesnevnere</a> og <a href="https://open.bekk.no/personlighet-i-emosjonell-design-hvordan-46/trackback/">personlighet</a>). Denne gangen skal vi se videre på praktiske fremgangsmåter for “Hvordan?”.</em></h5>
<p>Ok, så da vet du en del om emosjonell design, og kanskje du er fristet til å prøve det. Kanskje har du til og med overtalt oppdragsgiver om at dette er veien å gå, og nå trenger du en plan for hvor dypt i bassenget dere skal plumpe. I boka forslår Aarron tre veier å gå, tilpasset hvor modig og moden man føler seg på området.</p>
<h2>Dypenden</h2>
<p>Som du kanskje har forstått, er den modige veien å gå å redesigne hele systemet og brandet med emosjonell design og fokus på en personlighet i høysetet. Dette er nok det som kan gi mest uttelling, og det finnes mange gode eksempler på dem som har gjort det meget bra her.</p>
<p>Et tidligere nevnt eksemple er MailChimp, der personligheten til systemet virkelig klikket med brukerne og man opplevde brukere som virkelig digget personligheten til systemet og ble sterke ambassadører for tjenesten, noe utallige positive Twitter-meldinger vitnet om.</p>
<p><a href="http://open.bekk.no/wp-content/uploads/2011/12/twitter-mailchimp.png"><img class="aligncenter size-full wp-image-7567" src="http://open.bekk.no/wp-content/uploads/2011/12/twitter-mailchimp.png" alt="" width="760" height="162" /></a></p>
<p>I tillegg kan vi nevne Tapbots, som er nyttige, små iPhone apper som for eksempel konverterer mellom ulike måleenheter eller hjelper deg å følge med på kroppsvekten din. Ganske kjedelige oppgaver, men gjennom å ha gitt sine interface personligheter, føler brukerne at de har en “partner in crime”. Personlighetene er inspirert av Pixarkarakteren WALL.E, og når brukerne omtaler tapbots bruker de begreper som “love”, “adore” osv.</p>
<p><a href="http://open.bekk.no/wp-content/uploads/2011/12/tapbots.png"><img class="alignleft size-medium wp-image-7570" src="http://open.bekk.no/wp-content/uploads/2011/12/tapbots-300x222.png" alt="" width="300" height="222" /></a></p>
<p>Det er også verdt å merke seg <a href="betabrand.com">Betabrand.com</a>, en nettbutikk som selger klær, men de velger å se seg selv som et online magasin som tilfeldigvis selger klær. Betabrand skriver om sine produkter på en utrolig morsom måte, og har et stort galleri av “amatør superhelter” som utsetter klærne for dagligdagse prøvelser. Det finnes en morsom historie bak hvert produkt og mange av brukerne, også noen som intielt var skeptiske, har blitt hard-core ambassadører for produktene!</p>
<p><a href="http://open.bekk.no/wp-content/uploads/2011/12/betabrand-sammen.png"><img class="aligncenter size-full wp-image-7571" src="http://open.bekk.no/wp-content/uploads/2011/12/betabrand-sammen.png" alt="" width="760" height="350" /></a></p>
<h2>I det små</h2>
<p>Det går også an å begynne litt i det små. Du kan ta noen mindre, kanskje midlertidige stunt og følg emed på hvordan brukerne reagerer. Kanskje det kan være så enkelt som å vise mer personlighet i det du desverre må vise en feilmelding? Eller kanskje du rundt påske kan kjøre en påskeegg-jakt rundt på sidene dine?</p>
<p>CoffeCup Software kjørte en påskeeggjakt, der påskeeggene man skulle finne bare var synlige på enkelte tider av døgnet og etter så og så mange sidevisninger fra brukeren. Ved å samle påskeegg kunne man vinne cash og software-premier, og sidene opplevde voldsom trafikk. I tillegg gikk salget opp, og antall følgere på Facebook og Twitter like så.</p>
<p><a href="http://open.bekk.no/wp-content/uploads/2011/12/easteregg.png"><img class="alignleft size-full wp-image-7578" src="http://open.bekk.no/wp-content/uploads/2011/12/easteregg.png" alt="" width="482" height="260" /></a></p>
<h2>Den gyldne middelvei</h2>
<p>I<span style="color: #000000"> <a href="https://open.bekk.no/personlighet-i-emosjonell-design-hvordan-46/trackback/">mitt forrige innlegg</a> </span>snakket vi om MailChimp som virkelig hadde gått linja ut med emosjonell design. De var imidlertid ikke så selvsikre i begynnelsen, og innførte derfor et valg som kunne “slå av personligheten” til siten og få en “flat” versjon (de kalte denne “party pooper mode”!). Dette ga dem en trygghet og de følte seg sikre på at de nå ikke ville støte bort noen, men da de etter en stund gjorde noen analyser, viste det seg at bare 0,007% av brukerne ville være i party pooper mode!</p>
<p>Selv om det i MailChimps tilfelle viste seg at den “flate” løsningen nesten ikke var vits å ha, kan dette kanskje være en smart og trygg vei å gå for mange andre.</p>
<p><em>Da har vi vært gjennom “Hvordan?” og nå sitter sikkert noen og lurer på om alt er bare gull og grønne skoger, eller om det finnes noen risikoer her også. Og selvfølgelig gjør det det – de skal vi se på i <span style="color: #000000">mitt neste og siste innlegg i føljetongen!</span></em></p>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/iA96LzRhCyk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/praktiske-fremgangsmater-i-emosjonell-design-56/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://open.bekk.no/praktiske-fremgangsmater-i-emosjonell-design-56/</feedburner:origLink></item>
		<item>
		<title>Getting started with JS and TDD</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/1TwH-dMOHSg/</link>
		<comments>http://open.bekk.no/getting-started-with-js-and-tdd/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 07:00:26 +0000</pubDate>
		<dc:creator>Torstein Nicolaysen</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Dynamiske språk]]></category>
		<category><![CDATA[Grensesnittutvikling]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[jasmine]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[jstestdriver]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test-driven development]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=6436</guid>
		<description><![CDATA[Introduction Are you working on unmaintainable JavaScript code? Are you afraid to make changes to your 5000+ lines long JS file? If so, you&#8217;ve probably not written tests or done TDD. Fear not! Read on, and we will show you how to get started with writing tests and setting up the needed tools. We will [...]]]></description>
			<content:encoded><![CDATA[<h2>Introduction</h2>
<p>Are you working on unmaintainable JavaScript code? Are you afraid to make changes to your 5000+ lines long JS file? If so, you&#8217;ve probably not written tests or done TDD. Fear not! Read on, and we will show you how to get started with writing tests and setting up the needed tools. We will show by example how to create a small, yet complex, JS web application using TDD.</p>
<p>JavaScript is becoming increasingly popular for developing full-fledged applications &#8211; both <a href="http://en.wikipedia.org/wiki/Nodejs">server</a> and client side. Looking at the current trend of how JS is used, we can see that it’s being used for business critical applications and large-scale applications. With all this popularity and extensive use, we are under the impression that the testing and quality focus is lagging behind.</p>
<p>After reading this blog post, you will know how to get started with JS TDD using tools and frameworks we consider easy to use and relatively mature. If you already know <strong>why</strong> you should test your JS code, feel free to skip the background.</p>
<p>If you want to take a closer look at the example application, feel free to check out the entire project from GitHub @ <a href="http://github.com/bekk/jstdd">http://github.com/bekk/jstdd</a>.</p>
<h2>Background</h2>
<p><img class="size-full wp-image-7874" src="http://open.bekk.no/wp-content/uploads/2012/01/JavaScript-logo.png" alt="The JavaScript logo" width="192" height="192" align="right" /> JavaScript has received a popularity boost from browser vendor’s quest to write the fastest JS engine, as well as the popular programming language <a href="http://en.wikipedia.org/wiki/Nodejs">node.js</a>. In addition, jQuery has simplified the way we interact with the DOM and smooths over annoying browser differences &#8211; making JS more accessible for everyday developers. Focus have been primarily on producing functionality, and not on testing and good design/clean code. We believe that one reason is the lack of standardized or commonly available testing tools and frameworks. Another reason might be that traditionally JS have been written by UI and UX developers, who’s focus have been primarily on functionality &#8211; not on <em>Clean Code</em> and testability.</p>
<p>JS and all other dynamic programming languages is in dire need of tests since there is no compile-time checking. Tests can be used to ensure that the application <strong>behaves as expected</strong>, and gives developers confidence to make changes to existing code. Despite the obvious need for testing, many developers skimp on writing tests when developing large JS applications. All the advantages of TDD that applies for other programming languages, also applies for JS. Who does not want testable, maintainable, readable, well-designed, modular and working code? It’s well established that TDD has positive effects on code quality (read the chapter on TDD by Robert C. Martin in <a href="http://www.amazon.com/Clean-Coder-Conduct-Professional-Programmers/dp/0137081073">The Clean Coder</a>).</p>
<p>Other popular programming languages like Java and C# have mature and well-documented testing-tools. At the time of writing, JS has <a href="http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#JavaScript">several testing frameworks available</a>, but only a handful mature. Looking at the options, no one really stands out as a clear choice. To make things worse, getting started with JavaScript TDD can be challenging. There are so many ways of going about setting up a complete test-environment for JS. We have looked into this and had some experience with what works and what doesn&#8217;t.</p>
<h2>The runner</h2>
<p><a href="http://code.google.com/p/js-test-driver/">JsTestDriver</a> is (as it’s name implies) a tool that let you run your JS tests. You can run your tests directly from your favorite IDE (at least in theory) to get into your TDD rhythm. It runs from the command line and even on your continuous integration server. In our examples we’ll be running it from the command line.</p>
<p>A quote from their home site says it all: “The goal of JS Test Driver is to make JavaScript unit test development as seamless as and easy as Java unit tests.”</p>
<p>JsTestDriver supports testing in different browsers through capturing browsers as a slave machines. It includes it’s own limited assertion framework, but also supports add-ons, which opens for a wide range of <a href="http://code.google.com/p/js-test-driver/wiki/XUnitCompatibility">third party</a> assertion frameworks. We will be using Jasmine BDD through an adapter.</p>
<p>As with everything else, there is room for improvement. JsTestDriver&#8217;s configuration can sometimes be too simple, and advanced users may feel limited. In our simple example it works great, but expect some issues when scaling up. As a note, we did not get the IDE integration in IntelliJ IDEA to work properly.</p>
<p>Recently Buster.js was released as beta, and is worth checking out as an alternative to JsTestDriver.</p>
<h2>The framework</h2>
<p><img class="size-full wp-image-7875" src="http://open.bekk.no/wp-content/uploads/2012/01/jasmine_logo.png" alt="The Jasmine logo" width="282" height="90" align="right" /> We’ve picked out <a href="http://pivotal.github.com/jasmine/">Jasmine</a> because it is a mature (compared to most other frameworks) and a popular testing framework for JS. It features BDD syntax, which gives clear and readable tests with functionality in focus. It does not depend on any other framework and does not require a DOM. It can be run in the browser, through JsTestDriver or through node.js. It is well documented and is easy to get started with.</p>
<p>There are a few things to consider. They don’t separate between mocks, stubs and spies. All of that is packed into what Jasmine describes as a spy. The bundled matchers are good, but few. To get readable tests, it’s often necessary to write custom matchers to match the domain language. Still, we consider this one of the few viable options for doing TDD in JS.</p>
<p><a href="https://github.com/pivotal/jasmine/wiki">Installing, setting up and using Jasmine</a> is easy, and will not be detailed here. We’re using Jasmine through JsTestDriver, and have configured it thereafter.</p>
<p>QUnit was considered as an option, but it’s syntax did not help us achieve as readable and clear tests as Jasmine. It’s simplicity makes it very attractive and useful for beginners, but more advanced users will want more.</p>
<h2>Demo application</h2>
<p>As stated in the introduction, we’ll make a little application that does an “I feel lucky” search from Flickr. One of the choices we made was to have a minimal setup. No jQuery and third-party libraries in the production code, with the intention to reduce complexity and make the example more transparent as to how things work.</p>
<h3>Pre-requisites</h3>
<p>If you want to use the same setup as us, we recommend doing the following.<br />
(Or you can check out the entire project from GitHub @ <a href="http://github.com/bekk/jstdd">http://github.com/bekk/jstdd</a>).</p>
<h3>Download these libraries:</h3>
<ul>
<li><a href="https://github.com/ibolmo/jasmine-jstd-adapter">https://github.com/ibolmo/jasmine-jstd-adapter</a> (version 1.1.1)</li>
<li><a href="https://github.com/pivotal/jasmine">https://github.com/pivotal/jasmine</a> (version 1.0.1)</li>
<li><a href="http://code.google.com/p/js-test-driver/">http://code.google.com/p/js-test-driver/</a> (version 1.3.2)</li>
</ul>
<p>Create the following folder structure:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.
├── lib<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># 3rd party libs lies here</span>
│   ├── jasmine.js
│   ├── jasmine-jstd-adapter<span style="color: #000000; font-weight: bold;">/</span>
│   └── JsTestDriver-1.3.2.jar
├── spec<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># test/specs lies here</span>
├── src<span style="color: #000000; font-weight: bold;">/</span>  <span style="color: #666666; font-style: italic;"># application source lies here</span>
├── server.sh <span style="color: #666666; font-style: italic;"># Starts a JSTD server (symlinked)</span>
├── test.sh <span style="color: #666666; font-style: italic;"># Runs the test (symlinked)</span>
└── jsTestDriver.conf <span style="color: #666666; font-style: italic;"># JSTD configuration for our project</span></pre></div></div>

<p>server.sh and test.sh are just shortcuts to scripts bundled with js-test-driver.</p>
<p>Configure jsTestDriver.conf to match your setup.</p>
<h3>Getting familiar with the framework</h3>
<p>We started off with a simple test to get familiar with the syntax and to verify that everything is set up correctly. Consider it a warm-up exercise.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">describe<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Jasmine&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    it<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;makes testing JavaScript awesome!&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        expect<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toBeTruthy</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Running it</h3>
<p>Running it the first time might seem a bit overly hard, but once you’re set up it’s easy to run the tests. Before you start the server, you need to write a little config file. Take a <a href="https://github.com/bekk/jstdd/blob/master/jsTestDriver.conf">look at ours</a> if you need an example.<br />
Starting the server can seem a bit tedious, but we found a shell-script that starts the server. All we had to do was modify the path to suit our project structure (see <a href="https://github.com/bekk/jstdd/blob/master/server.sh">server.sh</a>). Running it is just a matter of typing ./server and seconds later the server is up and running.</p>
<p>Example output from a test run:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Running all tests
Chrome: Runner reset.
....
Total <span style="color: #000000;">1</span> tests <span style="color: #7a0874; font-weight: bold;">&#40;</span>Passed: <span style="color: #000000;">1</span>; Fails: <span style="color: #000000;">0</span>; Errors: <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1.00</span> ms<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Chrome 12.0.742.112 Mac OS: Run <span style="color: #000000;">4</span> tests <span style="color: #7a0874; font-weight: bold;">&#40;</span>Passed: <span style="color: #000000;">1</span>; Fails: <span style="color: #000000;">0</span>; Errors <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1.00</span> ms<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Next task is capturing browsers. We spun up browsers on each others computers and went to http://[my address]:9876/capture and the browser became a slave. Excellent! We used Safari, Firefox and Chrome to test. Make sure to keep the browser running while testing.</p>
<div id="attachment_6928" class="wp-caption aligncenter" style="width: 310px"><a href="http://open.bekk.no/wp-content/uploads/2011/10/Screen-shot-2011-10-21-at-18.04.51.png"><img class="size-medium wp-image-6928 " src="http://open.bekk.no/wp-content/uploads/2011/10/Screen-shot-2011-10-21-at-18.04.51-300x133.png" alt="Screenshot from captured browser" width="300" height="133" /></a><p class="wp-caption-text">Captured browser</p></div>
<p>JsTestDriver supports distributed test-running, but that is not something we will explore in this blog post. Now all that is left is telling the server to ask the browsers to run the tests. With the scripts, it’s just a matter of typing ./test in the shell and the tests are run.</p>
<p>The flow for starting the first time is the following:<br />
1. Start server<br />
2. Capture browsers<br />
3. Run tests</p>
<p>After than you just type ./test each time you want to run the tests.</p>
<h3>Working on LuckyFlickr</h3>
<h4>Start with the tests</h4>
<p>We decided to start with writing tests to verify output on the result page. The simplest possible test we could think of was to test for a message when no result was found.</p>
<p>Next, we added a new test to verify that if a result were received, the parser would pick the first result and display the image on the result page. Since we were doing unit testing we didn’t want to go all the way to Flickr when we ran the test, so we created a <a href="https://github.com/bekk/jstdd/blob/master/spec/result-stub.js">simple stub</a> that returned some JSON data on the expected flickr format so we could run the test in isolation. The specs for the parser read:</p>
<ul>
<li>&#8220;outputting result&#8221;</li>
<ul>
<li>&#8220;should not output an image when there are no results&#8221;</li>
<li>&#8220;should output the image from the result&#8221;</li>
</ul>
</ul>
<p dir="ltr">Note: When reading these specs, read them like “Outputting result should not output an image when there are no results”.</p>
<p>When pondering what to do next, we figured we could create a test for the component that would fetch data from flickr. Since we wanted to get out data from another site, we decided to use JSONP to overcome the cross-site problem. We also wanted the component to send the flickr request asynchronously, so we had to write a test that would handle that. To fix this we created setup code to temporarily replace the default XMLHttpRequest implementation in JS with our own. That way we could control what the response would be. We decided to let it respond with the same JSON stub as in the parser test.</p>
<ul>
<li>“when querying flickr”</li>
<ul>
<li>&#8220;should create a global function that handles the JSON-P callback&#8221;</li>
<li>“should do a search and call the callback function”</li>
</ul>
</ul>
<p>The last step was to create some tests to make sure the GUI was displaying the result in the right container in the result page. On this step, we saw that some of the components came together, and introduced the need for mocking. We mocked the result given by the “fetcher”. Doing so, we’re not dependent on a connection to flickr.com. We created 2 tests for this. The first asserts that the result from flickr is displayed in the result container, and the second one asserts that “Loading” is displayed while it is fetching data from flickr.</p>
<h4>The result</h4>
<p>Since our focus was unit testing, our implementation ended out with three separate “units” that each did one important thing. We have a “fetcher” that goes out and fetches the result from Flickr, a “result parser” that knows how to parse the JSON data structure from Flickr and finally the component that enables the user to do a search. No enterprisy patterns, no unneeded complexity, no silver bullets. Just enough to make things work. Also, the design emerged from writing the tests first.</p>
<h2>Our experiences</h2>
<p>We experienced a couple of notable challenges when doing TDD in JS. Doing TDD in it self is not a problem. Some challenges appear when doing browser-specific things with JS. Such as asynchronous callbacks, handling the DOM and the AJAX browser API.</p>
<p>The DOM is an issue. When not using jQuery, there are a lot of quirks that can mess up tests in specific browsers. Also, doing DOM-operations without jQuery results in a lot of ugly code that affects readability.</p>
<p>Testing AJAX without support from the test framework is problematic, and is why several tools exist and mitigate this (Sinon.js, Mockjax, etc.). Before we changed to JSONP, we wanted to do this with no extra support, and ended up with an extremely simplified version of what the mentioned tools provide. But for most people it would be simpler to use an existing tool to help you do AJAX-testing.</p>
<p>But all these things mentioned above are relatively easy to overcome and the upside of being able to write tests for your JS code easily outweighs the small quirks you may experience. And you won’t regret spending time on writing tests when your code base is expanding and you need to make a change.</p>
<h2>Give me more!</h2>
<p><a href="http://sinonjs.org/">Sinon.JS</a> &#8211; Standalone test spies, stubs and mocks for JavaScript. Works with any unit testing framework.<br />
<a href="http://docs.jquery.com/Qunit">QUnit</a> &#8211; alternative to Jasmine. Developed by the jQuery-team<br />
<a href="https://github.com/cucumber/cucumber-js">Cucumber.JS</a> &#8211; early stages. Could be good.<br />
<a href="http://busterjs.org/">Buster.js</a> &#8211; a new test framework (currently in beta) from Christan Johansen (the man behind Sinon.js)</p>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/1TwH-dMOHSg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/getting-started-with-js-and-tdd/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://open.bekk.no/getting-started-with-js-and-tdd/</feedburner:origLink></item>
		<item>
		<title>MVC med Sammy og Handlebars</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/8Q9hALedPI4/</link>
		<comments>http://open.bekk.no/mvc-med-sammy-og-handlebars/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 11:51:08 +0000</pubDate>
		<dc:creator>Hans Magnus Inderberg</dc:creator>
				<category><![CDATA[Dynamiske språk]]></category>
		<category><![CDATA[Grensesnittutvikling]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=7807</guid>
		<description><![CDATA[I disse dager hvor server-side er ut og klient-side er kult har det dukket opp mange avanserte JavaScript-rammeverk som flytter kompleksitet fra serveren til nettleseren. Backbone, Knockout og JavaScriptMVC er alle gode eksempler som kan brukes til å lage komplekse applikasjoner, uten antikvariske operasjoner som lasting av hele sider eller rendering av HTML på serveren. I denne [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://open.bekk.no/wp-content/uploads/2012/01/sammy.png"><img src="http://open.bekk.no/wp-content/uploads/2012/01/sammy.png" alt="" width="748" height="150" /></a></p>
<p>I disse dager hvor server-side er ut og klient-side er kult har det dukket opp mange avanserte JavaScript-rammeverk som flytter kompleksitet fra serveren til nettleseren. <a href="http://documentcloud.github.com/backbone/">Backbone</a>, <a href="http://knockoutjs.com/">Knockout</a> og <a href="http://javascriptmvc.com/">JavaScriptMVC</a> er alle gode eksempler som kan brukes til å lage komplekse applikasjoner, uten antikvariske operasjoner som lasting av hele sider eller rendering av HTML på serveren. I denne nye verden tilbyr serveren et REST-API, og all koden for å bruke dette API-et er Javascript som kjøres av brukerens nettleser.</p>
<p>Vi vil gjerne presentere én metode for å strukturere komplekse JS-applikasjoner, sammen med to flotte biblioteker: <a href="http://sammyjs.org/">Sammy</a> og <a href="http://handlebarsjs.com/">Handlebars</a>.</p>
<p><strong>Sammy</strong> er ikke like kjent eller kraftig som de tidligere nevnte rammeverkene, men er likevel svært godt til sitt bruksområde og fortjener en vurdering ved valg av rammeverk. Hovedsakelig brukes Sammy til routing, hvor en URL besvares av en JS-funksjon, og til å rendre HTML-en som skal vises på den aktuelle siden. Biblioteket er i seg selv svært lite, og delegerer det meste av funksjonalitet til sin strålende plugin-arkitektur. I dag er Sammy tungt avhengig av jQuery.</p>
<p><strong>Handlebars</strong> har den siste tiden fått masse oppmerksomhet, og bygger på det allerede kjente template-rammeverket Mustache. Handlebars brukes til å sammenflette data og HTML på en enklere og strukturert måte. Hensikten er å skille HTML- og DOM-maipulasjon fra resten av applikasjonen, og Handlebars inneholder mange hjelpemetoder som gjør dette ganske elegant.</p>
<p><strong>Model-View-Controller (MVC)</strong> er en type arkitektur som kan brukes til komplekse klient-side JS applikasjoner. I vår (svært) løse definisjon av MVC får vi følgende struktur:</p>
<ul style="font-size: 120%; line-height: 1.7em;">
<li><em>Datamodellene </em>håndterer entiteter og kommunikasjon med serveren.</li>
<li><em>View-modellene står </em>for oppførselen og strukturen til HTML-elementene.</li>
<li><em>Controllerene</em> knytter datamodeller og view-modeller sammen mot spesifikke URL-er.</li>
</ul>
<p>God struktur er vanskelig i komplekse JS-applikasjoner. Språket gir store muligheter og få begrensninger, og ingen forslag til hvordan strukturen bør være. Det hele kan fort bli uoversiktelig hvis man ikke baserer seg på velkjent struktur, som for eksempel MVC. I denne teksten bygger vi deler av en slik applikasjon.</p>
<p>I eksempelet har serveren en liste personer, som vi ønsker å få tak i, instansiere som modeller og vise en liste av i nettleseren. All kode i denne bloggposten kommer fra <a href="https://github.com/hinderberg/sammy-handlebars-blog-example">en minimal eksempelapplikasjon du finner på Github</a>. Last den gjerne ned og prøv resultatet i din nettleser. Koden kan også brukes som refferanse om det er noe som er uklart i teksten.</p>
<h2>Datamodeller og API-kall</h2>
<hr />
<p><a href="http://open.bekk.no/wp-content/uploads/2012/01/neurons.png"><img class="alignnone size-full wp-image-7919" src="http://open.bekk.no/wp-content/uploads/2012/01/neurons.png" alt="" width="748" height="150" /></a></p>
<p>Datamodellene tar seg av kommunikasjon med serveren via Ajax-baserte HTTP-kall mot et REST-API. Det er mange måter dette kan gjøres på, det finnes ingen fasit, men her kommer ett eksempel. Her har vi kodet modellene selv, men merk at på samme måte som Handlebars tar seg av templates, og Sammy tar seg av controller-ene, kunne vi brukt et tredje bibliotek til å ta seg av datamodellene. Men la oss lage noe selv.</p>
<p>Noen vil kanskje reagere på at datamodeller her potensielt defineres to steder &#8212; hos klienten og på serveren &#8212; men det er viktig å huske at disse modellene har lite felles funksjonalitet. Datamodellene på klientsiden er der utelukkende for å hjelpe view-modellene, ved å abstrahere bort funksjonalitet for kommunikasjon med serveren, formatering av modelldata og lignende.</p>
<p>Det er to <em>oppgaver</em> som kan skilles i datamodellene:</p>
<ul style="font-size: 120%; line-height: 1.7em;">
<li>Selve datamodellene som instansieres og har metoder for å jobbe med hver entitet,</li>
<li>og statiske metoder for hver klasse av modeller, som blant annet gjør API-kall.</li>
</ul>
<p>Vi har valgt å bruke standard prorotype-baserte JS objekter. I dette eksempelet lager vi en modell kalt “person”, lagt under namespacet “myapp.models”.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/* prototype for alle data-modeller. */</span>
myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">datamodel</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009966; font-style: italic;">/* Metode for å instansiere en modell. */</span>
myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">create</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>prototype<span style="color: #339933;">,</span> properties<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">merge</span><span style="color: #009900;">&#40;</span>Object.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>prototype<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> properties<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009966; font-style: italic;">/* Prototype for person-instanser. */</span>
myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">person</span> <span style="color: #339933;">=</span> myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">datamodel</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">firstname</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">lastname</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009966; font-style: italic;">/* Instansiering. */</span>
<span style="color: #003366; font-weight: bold;">var</span> person <span style="color: #339933;">=</span> myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">person</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> 
    firstname<span style="color: #339933;">:</span> “Foo”<span style="color: #339933;">,</span> 
    lastname<span style="color: #339933;">:</span> “Bar” 
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Som sagt kan API-kall tilhørende hver modell skilles ut i egne moduler. Dette er flott når man skal teste systemet, og hjelper holde kompleksiteten nede. Her er et enkelt eksempel på API-kall for modellen:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/* Metode for å lage mange instanser. */</span>
myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">createAll</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>prototype<span style="color: #339933;">,</span> propertiesList<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> propertiesList.<span style="color: #660066;">map</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>properties<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>prototype<span style="color: #339933;">,</span> properties<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009966; font-style: italic;">/* Metoder for å gjøre kall mot person-API. */</span>
myapp.<span style="color: #660066;">api</span>.<span style="color: #660066;">person</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
    all<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #009966; font-style: italic;">/* Hent listen over alle personer fra serveren. */</span>
        $.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> 
	    success<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>serverdata<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                callback<span style="color: #009900;">&#40;</span>myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">createAll</span><span style="color: #009900;">&#40;</span>
                    myapp.<span style="color: #660066;">models</span>.<span style="color: #660066;">person</span><span style="color: #339933;">,</span> 
                    serverdata<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            ........
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009966; font-style: italic;">/* Bruk */</span>
myapp.<span style="color: #660066;">api</span>.<span style="color: #660066;">person</span>.<span style="color: #660066;">all</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>people<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #009966; font-style: italic;">/* “people” er her et array av person-instanser. */</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dette kan virke som mye kode for enkle operasjoner, men etterhvert som applikasjonen blir større er det fint å ha alt som har med serverkommunikasjon og datamodeller skilt fra resten av applikasjonen. La oss nå se hvordan disse datamodellene kan kobles sammen med rendring av HTML.</p>
<p>&nbsp;</p>
<h2>View-modeller med Handlebars</h2>
<hr />
<p><a href="http://open.bekk.no/wp-content/uploads/2012/01/handlebars1.png"><img class="alignnone size-full wp-image-7913" src="http://open.bekk.no/wp-content/uploads/2012/01/handlebars1.png" alt="" width="748" height="120" /></a></p>
<p>View-modellene knytter data sammen med HTML. Disse modellene holder på dataene som trengs for å vise en side, representert av datamodellene. I tillegg legger view-modellene på oppførsel, animasjoner og hendelser på siden-, eller delen av siden de representerer. Dette kan for eksempel være ting som skal skje når brukeren klikker på en link, flytter på elementer eller vil lagre eller endre data.</p>
<p>Poenget med å bruke view-modeller er å abstrahere bort alt som omhandler hvordan HTML skal produseres og oppføre seg. På samme måte som datamodellene innkapsulerer alt som har med entiteter og server-kall, tar view-modellene seg av all JS-kode som manipulerer DOM-en direkte. Målet er som alltid å ende opp med veldefinerte og klart avskillte moduler med hver sine oppgaver. Her er et eksempel på en view-modell:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">myapp.<span style="color: #660066;">view</span>.<span style="color: #660066;">people</span> <span style="color: #339933;">=</span> myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">viewmodel</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
    compile<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span> people<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">people</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    apply<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#people li&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; clicked!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>En view-modell jobber i to faser og trenger to forskjellige metoder. For det første har vi compile-metoden, som returnerer alle variabler som skal kunne brukes fra template-filen. Deretter har vi apply-metoden, som kalles etter at template filen har blitt renderet.</p>
<p>Den første metoden gjør altså klar variabler som skal brukes, mens den andre tar seg av all DOM-manipuilasjon etter at HTML-en er rendret. <em>Apply-metodene til view-modellene er altså de eneste stedene i applikasjonen JS-kode jobber direkte med HTML-elementer, noe som gjør det hele svært ryddig</em>. Se eksempelapplikasjonen på GitHub [g] for mer av koden som jobber med view-modeller.</p>
<p>View-modellen jobber med en eller flere template-filer, som spesifiserer strukturen på markup-en til den aktuelle siden. Her er et eksempel på en slik template-fil:</p>

<div class="wp_syntax"><div class="code"><pre class="handlebar" style="font-family:monospace;">&lt;div id=&quot;content&quot;&gt;
{{ &gt;search }}
    &lt;ul id=&quot;people&quot;&gt;
    {{ #each people }}
        &lt;li&gt;{{ name }}&lt;/li&gt;
    {{ /each }}
    &lt;/ul&gt;
&lt;/div&gt;</pre></div></div>

<p>I Handlebars bruker man Handlebar Expressions til å hente ut objekter ved å skrive {<em>{ objektnavn }}</em>, eller <em>{{{ objektnavn }}}</em> når man ønsker å un-escape. <em>people</em> er definert av view-modellen og brukes direkte i template-filen. <em>name</em> er definert av data-modellen for person-entiteten, som også brukes direkte i dette templatet.</p>
<p>I templaten har vi også en partial komponent, kalt <em>search</em>. Partials vil bli brukt der man ønsker å dele opp templates og lage gjenbrukbare deler som kan brukes på tvers av andre templates. Partial-templaten vil også ha direkte tilgang til view-modellen og dens innhold, men vil som oftest tilhøre en egen view-modell.</p>
<p>I tillegg til å kunne hente ut objekter og kjøre funksjoner, kan man bruke såkalte Block Expressions. Block Expressions gjør det mulig å kjøre Block Helpers som er hjelpefunksjoner for å eksempelvis gjøre operasjoner med lister og sjekke verdier med if/else spørringer. Handlebars kommer med ett sett innebygde helpers, men man kan også lage sine egne om dette skulle være nødvendig.</p>
<p>Her er et eksempel på en Block Helper, som kjører en loop inntil et visst maksimalt antall ganger:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/* Definering av en egen hjelpemetode kalt “until”. */</span>
Handlebars.<span style="color: #660066;">registerHelper</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'until'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>context<span style="color: #339933;">,</span> block<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> max <span style="color: #339933;">=</span> block.<span style="color: #660066;">hash</span>.<span style="color: #660066;">max</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> ret <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> j <span style="color: #339933;">=</span> context.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> j<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&gt;=</span> max<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> ret<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
        ret <span style="color: #339933;">=</span> ret <span style="color: #339933;">+</span> block<span style="color: #009900;">&#40;</span>context<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">return</span> ret<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="handlebar" style="font-family:monospace;">/* Bruk av denne hjelpemetoden i en template-fil. */
{{ #until persons max=&quot;3&quot; }}
    {{ name }}
{{ /until }}</pre></div></div>

<p>En annen interessant mulighet man har i Handlebars er å gjøre kall mot parent-objektet til det objektet man jobber med. Her er et eksempel hvor vi bruker notasjonen “../” til å aksessere en variabel som tilhører parent-objektet til det vi looper gjennom:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/* Variabel definert i view-modellen. */</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">family</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> surname<span style="color: #339933;">:</span> “I skogen”<span style="color: #339933;">,</span> members<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
    <span style="color: #009900;">&#123;</span> <span style="color: #000066;">name</span><span style="color: #339933;">:</span> “Hans”<span style="color: #339933;">,</span> age<span style="color: #339933;">:</span> “<span style="color: #CC0000;">90</span>” <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span> <span style="color: #000066;">name</span><span style="color: #339933;">:</span> “Grete”<span style="color: #339933;">,</span> age<span style="color: #339933;">:</span> “<span style="color: #CC0000;">100</span>” <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span> <span style="color: #000066;">name</span><span style="color: #339933;">:</span> “Ulven”<span style="color: #339933;">,</span> age<span style="color: #339933;">:</span> “<span style="color: #CC0000;">120</span>” <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="handlebar" style="font-family:monospace;">/* Bruk av variabelen i template-filen. */
{{ #each family.members }}
    {{ name }} {{ ../surname }}
{{ /each }}</pre></div></div>

<p>Dette er selvfølgelig bare noen få av muligheten man har med Handlebars, men de viser hvordan komplekse templates kan spesifiseres i template-filer som jobber direkte mot en view-modell. Dette sørger for praktisk innkapsulering av alt som dreier seg om HTML og DOM-elementer i applikasjonen.</p>
<p>La oss nå se hvordan det hele kobles sammen ved hjelp av controller-ene og Sammy.</p>
<h2>Controllere med Sammy</h2>
<hr />
<p><a href="http://open.bekk.no/wp-content/uploads/2012/01/sammy.png"><img class="alignnone size-full wp-image-7916" src="http://open.bekk.no/wp-content/uploads/2012/01/sammy.png" alt="" width="748" height="150" /></a></p>
<p>Controller-ene er selve limet som holder applikasjonen sammen. Disse beskriver hva som skal skje når en bruker besøker en URL. Controlleren bruker datamodellene til å hente data som trengs på den aktuelle siden, og rendrer HTML ved hjelp av de tidligere nevnte view-modellene og deres representative template filer. Vi trenger både routing og template-rendring, altså er dette en perfekt oppgave for Sammy.</p>
<div style="background-color: #eee; line-height: 1.7em; padding: 1.5em; font-size: 120%; margin-bottom: 1em;">For å få et inntrykk av hva mer enn dette Sammy kan brukes til er det bare å se på listen over tilgjengelige <a href="https://github.com/quirkey/sammy/tree/master/lib/plugins">plugins</a>. Eksempler inkluderer templating med mange forskjellige biblioteker, Form Builder som minner om hvordan Ruby on Rails setter opp skjemaer, Storage som innkapsulerer mange forskjellige lokale lagringsmetoder i et enkelt API, eller OAuth-pluginen, forklart av sitt eget navn.</div>
<p>Vi ønsker å bruke Sammy-spesifikk kode utelukkende i controller-ene, og ikke i andre deler av applikasjonen. På denne måten vil minst mulig av applikasjonen bli avhengig av dette rammeverket, i tilfelle man skulle ønske bytte det ut på et senere tidspunkt. I tillegg blir applikasjonen enklere å teste, spesielt på enhetsnivå, da vi ikke trenger å bry oss om Sammy annet enn i controller-ene.</p>
<p>Her er en kodebit som kjøres når brukeren gjør en GET-request mot URL-en “/#people”:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/* Jobb på HTML-elementet “#page”. */</span>
$.<span style="color: #660066;">sammy</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#page&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009966; font-style: italic;">/* Bruk Handlebars-plugin. */</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #003366; font-weight: bold;">use</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Handlebars'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'hb'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009966; font-style: italic;">/* Start routes. */</span>
    myapp.<span style="color: #660066;">route</span>.<span style="color: #660066;">person</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">run</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #009966; font-style: italic;">/* Route for person-listen. */</span>
myapp.<span style="color: #660066;">route</span>.<span style="color: #660066;">person</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>app<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009966; font-style: italic;">/* Definer en route. */</span>
    app.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>context<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #009966; font-style: italic;">/* Gjør et kall mot serveren. */</span>
        myapp.<span style="color: #660066;">api</span>.<span style="color: #660066;">person</span>.<span style="color: #660066;">all</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>people<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            <span style="color: #009966; font-style: italic;">/* Definer hvilken template-filer som trengs. */</span>
            <span style="color: #003366; font-weight: bold;">var</span> template <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;template/person-list.hb&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #003366; font-weight: bold;">var</span> partials <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> searchbox<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;template/shared/searchbox.hb&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #009966; font-style: italic;">/* Instansierer view-modellene */</span>
            <span style="color: #003366; font-weight: bold;">var</span> search <span style="color: #339933;">=</span> myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>myapp.<span style="color: #660066;">view</span>.<span style="color: #660066;">shared</span>.<span style="color: #660066;">searchbox</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #003366; font-weight: bold;">var</span> list <span style="color: #339933;">=</span> myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">create</span><span style="color: #009900;">&#40;</span>myapp.<span style="color: #660066;">view</span>.<span style="color: #660066;">people</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> people<span style="color: #339933;">:</span> people <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #009966; font-style: italic;">/* Bytt ut innholdet i &quot;#page&quot; med ny HTML. */</span>
            context.<span style="color: #660066;">renderAll</span><span style="color: #009900;">&#40;</span>template<span style="color: #339933;">,</span> partials<span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span>list<span style="color: #339933;">,</span> search<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Den første kodebiten sier at Sammy skal jobbe på HTML-elementet med ID-en “page”, definert i den initsielle HTML-filen. Del to tar tak i URL-en ved hjelp av en <em>route</em>-funksjon. En <em>route</em> består av et <em>verb</em>, en <em>sti</em>, og en <em>callback-funksjon</em>. Verbet er et av de velkjente HTTP-metodene POST, PUT, GET eller DELETE. Stien kan enten være en vanlig URL, eller en hash-basert URL som i dette eksempelet.</p>
<p>Hver Sammy-rute tar inn et context-objekt som inneholder mye informasjon om tilstanden til applikasjonen. Dette objektet inneholder også mange nyttige hjelpefunksjoner. For at applikasjonen skal holde seg modulær er det viktig å kunn bruke dette objektet i controllerene. Hvis context-objektet blir med til datamodellene eller view-modellene, vil disse bli avhengig av Sammy-logikk, som igjen vil komplisere testing og vedlikehold.</p>
<p>Det meste skjer i context.renderAll-metoden. Denne rendrer et template, et sett partials og en samling view-modeller ved hjelp av Sammy’s context-render-metode:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">context.<span style="color: #660066;">helpers</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #009966; font-style: italic;">/* En hjelpefunksjon for å rendre sider med mange view-modeller. */</span>
    renderAll<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tmpl<span style="color: #339933;">,</span> partials<span style="color: #339933;">,</span> models<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       	<span style="color: #003366; font-weight: bold;">var</span> context <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span>
       	<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">render</span><span style="color: #009900;">&#40;</span>tmpl<span style="color: #339933;">,</span> myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">compileAll</span><span style="color: #009900;">&#40;</span>models<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>html<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            context.<span style="color: #660066;">swap</span><span style="color: #009900;">&#40;</span>html<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            myapp.<span style="color: #660066;">model</span>.<span style="color: #660066;">applyAll</span><span style="color: #009900;">&#40;</span>models<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> partials<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><em>context.render</em> tar først inn stien til template-filen man vil bruke. Det neste argumentet er dataene man vil bruke til å rendre template-filen, i vårt tilfelle representert dataene av en view-modell. Denne view-modellen vil da være tilgjengelig for template-filen når den rendres av Handlebars-pluginen til Sammy.</p>
<p>Callback-argumentet <em>context.swap</em> tar imot ferdig rendret HTML, og bytter ut hva som allerede er i elementet som jobbes på (“#<em>page</em>”) med den nye HTML-en.</p>
<p>Det siste argumentet, “partials”, er et objekt som kan inneholde flere deler som hovedtemplaten er avhengig av, for eksempel en topp, meny og bunn. Render-metoden cacher template-filene, uten å laste de på nytt hver gang, slik at operasjonen blir kjappere andre gang denne kalles.</p>
<p>En fin måte å organisere disse Sammy-routene på er å ha én JS-fil pr side (hvis det gir mening i applikasjonens sidestruktur, vel å merke). Metoden <em>$.sammy</em> kan brukes på tvers av filer uten problemer. Hver side får ofte flere routes for forskjellige operasjoner, for eksempel:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">/* settings.js: routes for én side. */</span>
&nbsp;
$.<span style="color: #660066;">sammy</span><span style="color: #009900;">&#40;</span>“#page”<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// Vise innstillinger</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span>“#<span style="color: #339933;">/</span>settings<span style="color: #339933;">/</span>profile”<span style="color: #339933;">,</span>  <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>context<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> … <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">get</span><span style="color: #009900;">&#40;</span>“#<span style="color: #339933;">/</span>settings<span style="color: #339933;">/</span>friends”<span style="color: #339933;">,</span>  <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>context<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> … <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Lagre innstillinger</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">put</span><span style="color: #009900;">&#40;</span>“#<span style="color: #339933;">/</span>settings<span style="color: #339933;">/</span>profile”<span style="color: #339933;">,</span>  <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>context<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> … <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">post</span><span style="color: #009900;">&#40;</span>“#<span style="color: #339933;">/</span>settings<span style="color: #339933;">/</span>friends”<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>context<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> … <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Med controllerene på plass er applikasjonens struktur komplett:</p>
<ul style="font-size: 120%; line-height: 1.7em;">
<li><strong>Datamodellene</strong> innkapsulerer alt som beskriver entiteter og serverkall.</li>
<li><strong>View-modellene</strong> innkapsulerer alt som beskriver HTML-en og oppførselen til DOM-elementer, og kobler dette med datamodellene.</li>
<li><strong>Controllerene</strong> tar det hele i bruk og bruker datamodellene og view-modellene til å rendre flott HTML når brukerne besøker forskjellige URL-er.</li>
</ul>
<h2></h2>
<h2>Oppsummering</h2>
<hr />
<p>Selv om en struktur som den presentert her kan virke overdrevet i starten av et prosjekt, vil det hjelpe etterhvert som kompleksiteten og kodemengden øker. Det viktigste er å starte med et godt utgangspunkt, og deretter kontinuerlig forbedre og utvikle arkitekturen.</p>
<p>Det er selvfølgeilig ulemper med tunge JS-applikasjoner. De setter store krav til nettleserens JS-motor, og til utviklernes testing på tvers av mange nettlesere. Språkets frie natur gjør det enkelt å skrive lite vedlikeholdbar kode, og det er sjelden klare svar på hvordan noe bør gjøres.</p>
<p>Til syvende å sist krever komplekse JS-applikasjoner mye av disiplin innen struktur og testing, men denne friheten betyr også at JS-programmering er veldig spennende. Med gode biblioteker som Sammy og Handlebars blir det hele enda morsommere.</p>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/8Q9hALedPI4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/mvc-med-sammy-og-handlebars/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		<feedburner:origLink>http://open.bekk.no/mvc-med-sammy-og-handlebars/</feedburner:origLink></item>
		<item>
		<title>Ett år med Git og Github</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/JkcKgga-ZLA/</link>
		<comments>http://open.bekk.no/et-ar-med-git-og-github/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 07:05:11 +0000</pubDate>
		<dc:creator>Jøran Vagnby Lillesand</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Fri Programvare]]></category>
		<category><![CDATA[IT-rådgivning]]></category>
		<category><![CDATA[Virksomhet 2.0]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[versjonskontroll]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=7775</guid>
		<description><![CDATA[For et drøyt år siden gikk prosjektet mitt over til Git og Github for versjonskontroll. Dette er en beskrivelse av noen av mine erfaringer fra året som har gått.]]></description>
			<content:encoded><![CDATA[<p>For et drøyt år siden besluttet prosjektet jeg sitter på å migrere fra internt hostet Subversion (SVN) til Git hostet på Github. Jeg var skeptisk. Jeg syntes SVN løste våre behov helt ok og så ikke helt behovet for å bruke tid og ressurser på å gå over til noe annet.</p>
<p>Dette handler om mine subjektive erfaringer med forskjellene fra tiden med SVN. Jeg kommer ikke til å skrive noe om hvordan vi migrerte til Git eller om tekniske forskjeller på de to versjonskontrollsystemene. Dette finnes det masse gode ressurser på allerede. Dette innlegget kommer til å handle om de forskjellene som faktisk har vært med på å endre min hverdag.</p>
<h2>Branch og merge</h2>
<p>Det er umulig å komme utenom den uovertrufne støtten for branching og merging i Git. Med Subversion opplevde jeg branching og den påfølgende mergingen som tungvint og vanskelig. Med Git er det lett å lage og håndtere flere branches. Github gjør veldig enkelt å holde oversikt over status på hver enkelt branch ved hjelp av verktøy som for eksempel <a target="_blank" title="network graph" href="https://github.com/blog/39-say-hello-to-the-network-graph-visualizer">network graph</a> og branch view.</p>
<p>Dette har for oss vist seg å være en god støtte for å øke hyppigheten for produksjonssettinger. Når det er lett å håndtere branches er det enkelt å holde master-branchen helt ren, slik at vi kan produksjonssette når vi ønsker.</p>
<p><img src="http://open.bekk.no/wp-content/uploads/2012/01/branch-small-e1326729553879.png" alt="Github network graph" /></p>
<h2>READMEs</h2>
<p>En av de tingene som &#8211; kanskje overraskende &#8211; har vist seg å være mest nyttig er READMEs på Github. Github støtter en <a target="_blank" title="rekke markup-språk" href="https://github.com/github/markup">rekke markup-språk</a>. Selv om det i utgangspunktet er en veldig enkel sak å skrive dokumentasjon for alle prosjektene og legge det et sted, har det vist seg svært kraftig at dette er så nært koden som mulig &#8211; og så synlig som mulig. Her har Github sin løsning vært utmerket for oss! Her legger vi instruksjoner om hvordan man kommer i gang med utvikling fra scratch (nye folk inn på prosjektet), tips til utvikling, informasjon om hvordan man deployer og så videre. At dokumentasjonen er så kodenær og synlig oppfordrer også til scripting og automatisering, som det har blitt mer og mer av.</p>
<h2>Sosial versjonskontroll</h2>
<p>Github kaller seg sosial versjonskontroll. Selv om dette er noe som opprinnelig ble lagd med fokus på open source prosjekter, gir det muligheter som også passer utmerker til vanlig enterprise-utvikling. Å ha en side man kan besøke for å se statusen til kildekontrollen veldig nyttig.</p>
<p>Sosiale features på GitHub som vi benytter oss hyppig av:</p>
<ul>
<li>Diskutere commits &#8211; helt ned på enkeltlinjer om ønskelig.</li>
<li>Følge med på ulike branches (hvor mange commits de er bak/foran master).</li>
<li>Sende pull requests på ferdige feature branches</li>
</ul>
<h2>Pris</h2>
<p>Github har en hyggelig prismodell &#8211; hvertfall hvis man sammenlikner med andre enterprisy tilbydere av versjonskontroll. Standardprisene deres gjelder ved hosting av data i skyen (hos Rackspace). Hvorvidt det er aktuelt å hoste koden sin hos en tredjepart varierer naturligvis fra prosjekt til prosjekt. Dersom cloud hosting ikke er aktuelt finnes det et <a target="_blank" title="enterprise-alternativ" href="https://github.com/blog/978-introducing-github-enterprise">enterprise-alternativ</a>.</p>
<h2>Snill læringskurve</h2>
<p>Git er et avansert versjonskontrollsystem. Likevel har det i utgangspunktet en veldig snill læringskurve. De første månedene brukte jeg Git omtrent akkurat som jeg tidligere brukte SVN. Først ved behov og lyst begynte jeg gradvis å ta i bruk mer og mer avansert funksjonalitet &#8211; funksjonalitet som jeg nå bruker omtrent hver dag.</p>
<h2>Tilgjengelighet</h2>
<p>Siden Github er hostet i skyen kan man få tak i det fra hvor som helst i verden, uten å måtte bruke VPN. De har også veldig god oppetid: vi har opplevd nedetid én gang på godt over ett år. Det er veldig sannsynlig at et internt hostet versjonskontrollsystem vil ha adskillig mye mer nedetid i løpet av et år enn det Github vil ha. Sikkerhet og tilgangskontroll er ivaretatt ved bruk av SSH-nøkler for hver enkelt utvikler.</p>
<h2>Konklusjon</h2>
<p>Git og Github har hos oss vært en revolusjon som ikke har føltes som en revolusjon. Ved å være litt bedre på så godt som alle aspekter av versjonskontroll har det fjernet masse små irritasjoner hos oss utviklere &#8211; og dermed git oss mulighet til å fokusere mer på kundens krav. I tillegg har det store antallet nyttige småting i kombinasjonen Git og Github gitt oss de verktøyene vi trenger til å endre prosessen vår til å møte kundens behov bedre.</p>
<p>Når man tar med i vurderingen av kostnaden for å gå over er ganske lav, er dette egentlig en no brainer for meg: <em>Jeg anbefaler Git!</em></p>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/JkcKgga-ZLA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/et-ar-med-git-og-github/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://open.bekk.no/et-ar-med-git-og-github/</feedburner:origLink></item>
		<item>
		<title>Personlighet i emosjonell design – hvordan? (4:6)</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/dlqpVbVDPzw/</link>
		<comments>http://open.bekk.no/personlighet-i-emosjonell-design-hvordan-46/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 08:19:44 +0000</pubDate>
		<dc:creator>Nina Volstad</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[FUNK]]></category>
		<category><![CDATA[brukeropplevelse]]></category>
		<category><![CDATA[funksjonalitet og brukeropplevelse]]></category>
		<category><![CDATA[psykologi og design]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=7550</guid>
		<description><![CDATA[Krysningen design og psykologi er i vinden som aldri før, og gjennom seks innlegg skriver Nina om kunnskap og refleksjoner fra boken “Designing for Emotion” av Aarron Walter. Innlegg nummer 4 fortsetter vi å se på hvordan vi kan få til emosjonell design gjennom å bygge personlighet!]]></description>
			<content:encoded><![CDATA[<h5><em>I de tidligere innleggene har jeg gitt en intro til emosjonell design gjennom boken “Design for emotion” av <a href="http://aarronwalter.com/">Aarron Walter</a>, ved å snakke om <span style="color: #ff0000"><a href="https://open.bekk.no/en-intro-til-emosjonell-design/trackback/">“Hva?”</a></span>, <span style="color: #ff0000"><a href="https://open.bekk.no/hvorfor-bry-seg-om-emosjonell-design/trackback/">“Hvorfor?”</a></span> og begynne så smått på <span style="color: #000000"><a href="https://open.bekk.no/psykologiske-fellesnevnere-i-emosjonell-design-hvordan-36/trackback/">“Hvordan?” gjennom å snakke om psykologiske fellesnevnere.</a></span> Denne gangen skal vi se videre på “Hvordan?” gjennom personlighet.</em></h5>
<h2>Personlighet</h2>
<p>Ved siden av å kunne bruke følelser som psykologiske fellesnevnere i emosjonell design (som vi snakket om i <span style="color: #000000"><a href="https://open.bekk.no/psykologiske-fellesnevnere-i-emosjonell-design-hvordan-36/trackback/">mitt forrige innlegg</a></span>), kan vi jobbe med den emosjonelle komponenten som ligger oppå følelsene, nemlig personlighet.</p>
<p>I denne sammenheng er det møtet mellom personligheter som er interessant. Personligheten til brukerne er selvsagt til stede, så den komponenten det må jobbes med her er systemets personlighet. Dette kan kanskje høres litt rart ut, men husk at det er først i møtet mellom personligheter at følelser oppstår! I boka snakker derfor Aarron om å jobbe med å gi systemet personlighet.</p>
<p>Alle kjenner til hvordan personligheter opererer i det vanlige liv, og alle vet at disse kan være uforutsigbare, og at av og til er det full krasj! Det kan derfor føles litt risky å introdusere noe som er så åpent for tolkning i våre dyrebare systemer, og det er lett å forstå hvorfor mange kan stille seg litt skeptisk til dette.</p>
<p>Nå har det seg imidlertid slik at vi kanskje bare må innse at tiden har kommet. Tidligere, da nettet var ungt og fortsatt i stor grad ble oppfattet som (og i noen tilfeller var!) useriøst og farlig, føltes det viktig å virke streit og veldig seriøs i sin fremstilling. Mange siter ble veldig like, og man kunne i stor grad skjule seg bak en generisk, flat og forretningsmessig fasade. Dette henger i stor grad igjen selv om nettet har modnet, og gjør at nettet er fylt med et mye flatere persongalleri enn verden ellers! Tiden har kommet for å skille seg ut i mengden ved å vise litt mer av seg selv!</p>
<h2>Å finne sin personlighet</h2>
<p>Men hva skal så denne personligheten være? Man skal selvsagt ikke finne opp en personlighet til systemet sitt sånn helt uten videre – falske personligheter fungerer sjelden! Det man velger å vise av personlighet må være ekte, og virkelig være det systemet står for og det bedriften bak virkelig er. Mange kjenner sikkert til teknikken “personas”. Personas brukes vanligvis til å beskrive personligheten til brukere i systemets målgruppe, slik at man kan bruke dette som en styrepinne for å treffe målgruppen. Aarron foreslår at man drar dette enda lengre, og faktisk utvikler en persona for systemet eller til og med brandet. Det er rett og slett “mannen i maskinen” som skal beskrives, slik at brukerne møter nettopp dette; en mann heller enn en maskin. Først når dette er på plass kan de gode møtene mellom brukerpersonligheter og systempersonligheter oppstå!</p>
<p>Aarron tilbyr en <a href="http://aarronwalter.com/design-personas/">mal</a> for hvordan å jobbe frem en brand- eller sitepersona på sine nettsider.</p>
<h2>Suksess!</h2>
<p>Det finnes en mengde gode eksempler på systemer som har fått til treffende og ekte personligheter. Et eksempel er MailChimp, et mailprogram som fremstår som lekent og hjelpsomt, og som til og med går så langt som å ha en liten maskot-ape. Apen har en solid kropp og et sympatisk fjes – noe som hinter om et solid system med en vennlig overflate!</p>
<p><a href="http://open.bekk.no/wp-content/uploads/2011/12/mailchimp2.png"><img class="aligncenter size-full wp-image-7556" src="http://open.bekk.no/wp-content/uploads/2011/12/mailchimp2.png" alt="" width="521" height="378" /></a></p>
<p>&nbsp;</p>
<p>For de systemene som bruker litt humor i sin personlighet er dette “omvendt-håkkisveis” prinsippet viktig; vi kan godt ha party in the front, men vi må vise at vi mener business in the back! Apen blander seg nemlig aldri inn i arbeidsflyen, og kommer aldri med tips eller kommentarer til selve arbeidet (som var der den beryktede bindersen til Microsoft i sin tid feilet – han kom med irrelevante og forstyrrende tips…), men han endrer seg stadig og sier morsomme og forfriskende ting. Folk får rett og slett lyst å arbeide seg gjennom for å se hva han gjør!</p>
<p>Nå er det slett ikke meningen at alle skal ha en maskot og bruke humor for alle penga, og i noen tilfeller fungerer ikke humor og lettbenthet i det hele tatt, f.eks ville det vært vanskelig å se for seg hos Kirkens Nødhjelp. Da er varme og personlige historier ofte en god vei å gå. Poenget er uansett at gjennom å gi noe med mer personlighet og ektehet, er man et steg på veien mot å knytte emosjonelle bånd.</p>
<p><em>Da har du fått mye bakgrunn for hvordan emosjonell design kan anvendes. I tillegg er det alltid kjekt med noen helt konkrete praktiske veier å gå, og disse kommer i <span style="color: #000000">mitt neste innlegg</span>.</em></p>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/dlqpVbVDPzw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/personlighet-i-emosjonell-design-hvordan-46/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://open.bekk.no/personlighet-i-emosjonell-design-hvordan-46/</feedburner:origLink></item>
		<item>
		<title>Folkevare</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/QBW0T7Gj468/</link>
		<comments>http://open.bekk.no/folkevare/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 12:18:45 +0000</pubDate>
		<dc:creator>Holger Ludvigsen</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Prosjektledelse]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=7698</guid>
		<description><![CDATA[Har du tenkt på at utvikling handler om tre aspekter? Det er maskinvaren, det vi kan ta og føle på. Det er programvaren, et abstrakt domene. Og det er folkene som gjør det hele mulig, utviklerne, som for eksempel deg og meg.]]></description>
			<content:encoded><![CDATA[<p><strong><br />
Har du tenkt på at utvikling handler om tre aspekter? Det er maskinvaren, det vi kan ta og føle på. Det er programvaren, et abstrakt domene. Og det er folkene som gjør det hele mulig, utviklerne, som for eksempel deg og meg.</strong></p>
<p><a href="http://open.bekk.no/wp-content/uploads/2012/01/1.jpg"><img class="aligncenter size-full wp-image-7723" src="http://open.bekk.no/wp-content/uploads/2012/01/1.jpg" alt="" width="748" height="259" /></a></p>
<p>For 25 år siden ble det utgitt en bok Peopleware &#8211; Productive Projects and Teams. Dette er en klassiker, og jeg synes det er sunt å minnes på de prinsippene som den omhandler. I tillegg til hardware og software er det en viktig del som vi kan kalle peopleware. Det er det menneskelige aspektet ved utvikling. Det er bare én måte å få frem de systemene og løsningen som vi utvikler, og det er gjennom mennesker. Dette er smarte, høyt utdannede mennesker med en driv for teknologi.</p>
<p>Disse folkene er katalysatoren for det vi lager. Hvordan oppnår vi da de beste resultatene? Svaret er ikke kynisk eller maskinelt. Peopleware er fortsatt utrolig relevant, og det er ikke til å kimse av etter hele 25 år. Årsaken er at folk fortsatt er folk. De har de samme behovene, motivasjonene og relasjonene. Det er lett å fokusere på hvor raskt vår bransje utvikler seg teknologisk. Men folkene bak, de som gjør det hele mulig, de som skaper selve verdien. De er like menneskelige som før.</p>
<p>Det er en utbredt illusjon i databransjen, at det vi jobber med er high tech. Vi jobber med avanserte, kompliserte tekniske systemer. Det er teknologi på sitt ypperste. Datamaskiner er noe av det mest imponerende og kraftige mennesker har utviklet. Og nøkkelen til å lykkes er å forstå og benytte den mest avanserte, den høyeste, teknologien. Når de teknologiske grensene pushes går vår verden fremover, og fremskritt og konkurransefortrinn blir mulig.</p>
<p><a href="http://open.bekk.no/wp-content/uploads/2012/01/2.jpg"><img class="aligncenter size-full wp-image-7724" src="http://open.bekk.no/wp-content/uploads/2012/01/2.jpg" alt="" width="748" height="259" /></a></p>
<h2>Mennesker vs. teknologi</h2>
<p>Men tilfellet er at databransjen ikke er high tech. Dette er ikke rakettforskning. De fleste systemer har ikke behov for eller berører avansert datavitenskap eller teknologi. Mange prosjekter er avarter av create, read, update og delete, eller handler om å vise data som allerede finnes på en ny måte til brukeren. Det er som oftest ingen fysikk eller matematikk bak systemene vi lager. Selv om hardwaren er avansert og datamaskinen fundamentalt kompleks, så kan vi ikke lure oss selv til å tro at vi er i high-tech-bransjen. Det er fristende å tenke slik. At å løse de tekniske, teoretiske problemene er nøkkelen til suksess. Det er på en måte en &#8220;enkel&#8221; løsning. Det er mer håndterbart å finne den optimale algoritmen enn å forstå hvorfor Arne ikke jobber produktivt. Men suksessfulle prosjekter og effektive team handler ikke om teknologi. Det handler ofte om menneskene bak. Vår bransje er teknisk, men det er ikke teknologien som skaper suksess. Om det bare hadde vært så enkelt.</p>
<p>Har du noen gang vært på et dream team? Fått følelsen av at dere sammen jobber nær optimalt og har høy produktivitet? Har du noen gang jobbet i det motsatte? En samling mennesker som ikke får utrettet store ting. Et team på papiret, men ikke i praksis? Resultatetene fra et dream team er ikke basert på teknologien de bruker, men heller av dynamikken mellom menneskene i teamet. De utfyller hverandre. De kommuniserer godt. De vet hvor de har hverandre, og hvordan de kan bruke hverandre. Teamet er støpt. De har høy suksess med sine prosjekter, og grunnen er at de kan bruke all innsats på å løse prosjektets problemer og klientens behov, i stedet for andre ikke-verdiskapende utfordringer.</p>
<p>Hva kjennetegner et slikt team? Et tegn er at de er kvalitetsorienterte. De vet hvilke kvalitative ting som gjør prosjektet vellykket, og de fokuserer på dem. Kvalitet i datasystemer ses ofte på som en kostnad, og noe man oppnår ved å ofre andre ting, som for eksempel penger og tid. Men the dream team oppnår suksess med kvalitet som en drivfaktor. Kvaliteten gir to verdier: Man unngår bortkastet tid på å &#8220;rydde opp&#8221; om man gjør det ordentlig fra første stund. Og kvalitet er en motivasjonsfaktor i seg selv.</p>
<p>I stedet for å &#8220;cut the corners&#8221; vil the dream team gjøre det ordentlig. Det man oppnår med dette er en jevn fremgang uten skitne overraskelser som for eksempel at man ikke har noen enhetstester, eller at man har hardkodete verdier som senere ønskes å endres. Progresjonen blir kanskje lavere enn et forhastet team, men den er forutsigbar uten teknisk gjeld og andre overraskelser.</p>
<p>Jeg ble engang forsøkt rekruttert av et større IT-selskap. Jeg spurte dem rett ut: Hvorfor bør jeg jobbe hos dere? Svaret deres var: Fordi vi er den beste aktøren i markedet og har de mest fornøyde kundene. Vi er de beste og mest suksessfulle. Rekruttererne tenkte nok at dette var imponerende, men jeg tenkte &#8220;what&#8217;s in it for me?&#8221;. Folk har lyst til å realisere seg seg selv, og sine behov. Ikke bedriftens behov og finansielle målsetninger. Heldigvis finnes det en synergi her. Ved å oppfylle arbeidernes behov, kan bedriftens mål nås. Kvalitet er en motivasjon og drivkraft i seg selv. Forteller du et team at kvaliteten i det de gjør ikke er så viktig, så vil selvrespekten og moralen følge derhen. Mennesker har en iboende kraft til å realisere seg selv, å lage ting som er så bra som de har kraft til å få til.</p>
<p>Et slikt støpt team utvikler elitiske holdninger. Det er et godt tegn. De er stolte av seg selv, og har tro i sine evner. Slike team vil også tendere mot å være selvledende. Siden motivasjonen er høy, og de ønsker å nå organisasjonens mål vil de selv ta grep for å få dette til. Fra et manager-perspektiv er dette en drømmesituasjon; og bør være et mål i seg selv.</p>
<p><a href="http://open.bekk.no/wp-content/uploads/2012/01/3.jpg"><img class="aligncenter size-full wp-image-7725" src="http://open.bekk.no/wp-content/uploads/2012/01/3.jpg" alt="" width="748" height="260" /></a></p>
<h2>Miljø</h2>
<p>Mennesker er i høy grad et produkt av omgivelsene rundt en. Disse omgivelsene kan løfte en frem og få det beste ut av en, eller de kan stikke kjepper i hjulene. Har du noen gang jobbet på kontoret sent på kvelden eller i helgen? Kontorlandskapet er tomt, det er stille og øde. Der sitter du, på din sedvanlige plass. Har du lagt merke til at man ofte er høyst effektiv i dette miljøet? Man har kanskje satt av en liste med oppgaver man må få ferdig. Det ble ikke plass til dem i den vanlige arbeidstiden, så man setter opp en økt på kvelden eller i helgen. Man pløyer gjennom de oppgavene. Man går hjem med følelsen av at i dag var jeg effektiv. God progresjon i dag, godt jeg tok meg tid til den ekstra økten.</p>
<p>En viktig årsak er nok rett og slett at du fikk være i fred. Det er en tendens for åpne kontorlandskap i vår bransje. Fra åtte om morgenen til fire om ettermiddagen er det folk rundt deg. Disse folkene skaper støy, uro og avbrytelser. På grunn av den innebygde forsinkelsen vårt sinn tar for å komme ordentlig i gang med en mental oppgave kan disse forstyrrelsene hindre produktiviteten. Vi jobber i en kunnskapsbransje, og tankekraft er essensen i produktene vi skaper. God konsentrasjon er avgjørende, men til dels ikke mulig i et støyende og kollektivt kontorlandskap. Det er en kontradiksjon egentlig; vi har høy utdannelse, jobber med kompliserte abstrakte konsepter som ikke har noen fysisk manifestasjon. Men allikevel er en lukkbar kontordør en luksus bedriften ikke tar seg råd til.</p>
<p>I Peopleware foretok de en programmeringsøvelse hvor et spesifisert system skulle implementeres. De gruppene som gjorde det godt ble sammenlignet med de som ikke nådde milepælene på samme tid:</p>
<table>
<tbody>
<tr>
<td></td>
<td>Den beste fjerdedelen</td>
<td>Den svakeste fjerdedelen</td>
</tr>
<tr>
<td>Hva er ditt eget arbeidsområde?</td>
<td>7 m2</td>
<td>4 m2</td>
</tr>
<tr>
<td>Er arbeidsområde stille?</td>
<td>57 % ja</td>
<td>29 % ja</td>
</tr>
<tr>
<td>Er arbeidsområdet privat?</td>
<td>62 % ja</td>
<td>19 % ja</td>
</tr>
</tbody>
</table>
<p>Resultatene er kanskje ikke overraskende. De som gjorde det best hadde avlukkede kontorer som de delte med 0, 1 eller 2 andre. De svakeste jobbet i åpne områder. Mange kan nok si seg enige i at kollektive rom hemmer konsentrasjonen. Men har du kvantifisert hvor mye plassbesparelsene koster i produktivitet?</p>
<h2>Management</h2>
<p>Hva er jobben til en manager? Han driver ikke direkte med verdiskapningen. Det er det utviklerne som gjør. Det er de som løser kunden og brukernes problemer. En av managerens viktigste oppgaver er å få de under ham til å gjøre en god jobb. Den beste jobben gitt deres forutsetninger. Det finnes mange ulike synspunkter på hvordan man får dette til. En viktig management-oppgave er å sette deadlines. Slike frister kan brukes som et virkemiddel i seg selv. Parkinsons &#8220;lov&#8221; sier at arbeid utvider seg selv til å fylle tiden det er satt av til. Vi kjenner alle godt til rasjonalen bak. Om man har press på seg skynder man seg. Om noe ikke haster kan man ta seg bedre tid. Dette leder til en logikk som er mye brukt i management. Tighte, kanskje urealistiske deadlines virker motiverende og øker produktiviteten. Bare pass på å ikke avslør at deadlinen er kunstig tidlig!</p>
<p>I praksis fungerer det ikke. Utviklerens produktivitet og arbeidsmetode er avhengig av deadlines, men en urealistisk deadline kan være høyst demoraliserende. En undersøkelse ble foretatt blant flere titalls prosjekter. Det ble sett på hvem som utførte tidsestimatetene, og hvor høy produktiviteten var for hver oppgave. Hvor utvikleren gjorde estimatet var produktiviteten 8. Dette er så klart et relativt tall. Hvor utviklerens sjef gjorde estimatet var produktiviteten 6.6. Haha, tenker man så klart. Dumme manageren tror han vet bedre enn gutta på gulvet!</p>
<p>Men i tilfeller hvor en ekstern system-analytiker gjorde estimeringen var produktiveten enda høyere med 9.5. Hva er grunnen til dette? Det kan være at systemanalytikeren er en profesjonell estimerer med god erfaring fra tilsvarende implementasjoner. At hans estimater er nærmere det egentlige innsatsbehovet kan være motiverende i seg selv. Realistiske deadlines er gir dermed høyst produktivitet. Et interessant resultat oppsto i oppgaver hvor intet estimat i det hele tatt var gitt. Her var produktiviteten 12, og dermed høyest. Dette kontradikterer helt tydelig Parkinsons lov, og setter i tvil dens effektivetet som management-verktøy.</p>
<p><a href="http://open.bekk.no/wp-content/uploads/2012/01/4.jpg"><img class="aligncenter size-full wp-image-7726" src="http://open.bekk.no/wp-content/uploads/2012/01/4.jpg" alt="" width="748" height="260" /></a></p>
<h2>Dream manager</h2>
<p>Et dream team krever en dream manager. Men hva kjennetegner en slik manager? Det er kanskje ikke hva en tradisjonelt forbinder med ledelse. Et dream team har en iboende egenskap å gjøre det godt, og en dream manager <em>enabler</em> dette. Det er ikke så lett å måle en managers evne til å enable sitt team, men det er allikevel en av det viktigste egenskapene. Det motsatte ville vært defensivt management. En defensiv manager stoler ikke på sine &#8220;undersåtter&#8221;. Han er opptatt av sitt eget bilde, og forsvarer det mot eventuelle utfordringer. Han ser på seg selv om drivkraften bak teamets progresjon og suksess, og underminerer deres evne til fatte de riktige avgjørelsene selv.</p>
<p>Et godt motivert og fungerende team er en drivkraft i seg selv. En god manager vil utnytte disse kreftene og enable og løfte teamet. Hindre i veien elimineres, og byråkratiske eller organisatoriske problemer løses. Manageren er oljen i teamets maskineri. Disse egenskapene er ikke alltid like lette å observere på overflaten. Kanskje manageren virker overflødig på grunn av teamets selvstendighet og effektivitet. Men nettopp dette kan være resultatet av en managers dedikerte arbeid bak kulissene.</p>
<h2>Folkevare</h2>
<p>Data og systemutvikling er tilsynelatende en teknologisk, komputasjonell bransje. Men faktum er at det er menneskene som jobber med dette som er drivkraften. De teknologiske utfordringene er interessante og nyttige som et minstemål. Men løsningene bunner alltid ut i mennesker som jobber sammen. Mennesker med sine behov, sine mål og sine motivasjoner. Disse endrer seg ikke i samme takt som prosessorkraft og minnestørrelse.</p>
<p>Det er ikke like lett å analysere sosiologien bak utvikling som det er å drøfte teknologien, men x-faktoren i systemutvikling er menneskene bak. Mens maskinvare og programvare skyter fremover, er det fortsatt de samme type mennesker som jobber med disse tingene. Kun ved å forstå disse temaene kan man få det meste ut av teknologien og lykkes i sine prosjekter.</p>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/QBW0T7Gj468" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/folkevare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://open.bekk.no/folkevare/</feedburner:origLink></item>
		<item>
		<title>Java til Scala #4: null som ukjent</title>
		<link>http://feedproxy.google.com/~r/BekkOpen/~3/p1-ZYiroh0M/</link>
		<comments>http://open.bekk.no/java-scala-null/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 12:39:34 +0000</pubDate>
		<dc:creator>Eivind Waaler</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[null]]></category>
		<category><![CDATA[option]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=6243</guid>
		<description><![CDATA[Et typisk problem med Javakode er bruken av null for objekt-referanser som ikke har noen verdi. Typisk vil et API returnere null i de tilfeller den etterspurte egenskapen ikke har noen verdi. For eksempel slik, ikke alle personer har noen registrert partner: // Returns &#34;null&#34; if no partner Person partner = customer.getPartner&#40;&#41;; &#160; // Potensial [...]]]></description>
			<content:encoded><![CDATA[<p>Et typisk problem med Javakode er bruken av <code>null</code> for objekt-referanser som ikke har noen verdi. Typisk vil et API returnere <code>null</code> i de tilfeller den etterspurte egenskapen ikke har noen verdi. For eksempel slik, ikke alle personer har noen registrert partner:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Returns &quot;null&quot; if no partner</span>
Person partner <span style="color: #339933;">=</span> customer.<span style="color: #006633;">getPartner</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Potensial NullPointerException</span>
doStuff<span style="color: #009900;">&#40;</span>partner.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Safe use - ugly code</span>
<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>partner <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  doStuff<span style="color: #009900;">&#40;</span>partner.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>De fleste kodebaser på Java-prosjekter har mange <code>null</code>-sjekker, og de får gjerne fler etter at man oppdager <code>NullPointerException</code> på steder man ikke hadde forutsett. Dette gjør koden stygg og uoversiktlig. Og enda verre blir det hvis man har flere nøstede objekter:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>partner <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003399;">Name</span> partnerName <span style="color: #339933;">=</span> partner.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>partnerName <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">String</span> partnerFirstName <span style="color: #339933;">=</span> partnerName.<span style="color: #006633;">getFirstName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>partnerFirstName <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      doStuff<span style="color: #009900;">&#40;</span>partnerFirstName.<span style="color: #006633;">toUpperCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Hvordan kan man løse dette problemet i Scala? Jo, ved å ta i bruk <a href="http://www.scala-lang.org/api/current/index.html#scala.Option" target="_blank"><code>Option</code>-typen</a>. Den har enten verdien <code>None</code> hvis det ikke er noen verdi, eller <code>Some[T]</code> hvis det er noen verdi. Selve verdien kan hentes på en rekke forskjellige måter. Det som er fint er at <code>None</code> også er et objekt med metoder, slik at man slipper exceptions om man ikke eksplisitt sjekker om verdien er satt.</p>
<p>Hvis vi selv skriver koden kan vi la verdien returnere en <code>Option</code> av typen i stedet for <code>null</code>/typen direkte:</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #008000; font-style: italic;">// Returns Option[Person] instead of Person directly</span>
<span style="color: #0000ff; font-weight: bold;">val</span> partner <span style="color: #000080;">=</span> customer.<span style="color: #000000;">getPartner</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">if</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">!</span>partner.<span style="color: #000000;">isEmpty</span><span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
  doStuff<span style="color: #F78811;">&#40;</span>partner.<span style="color: #000000;">get</span>.<span style="color: #000000;">getName</span><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

<p>Dette så jo ikke spesielt kult ut. Hvis vi fortsatt må sjekke om verdien er satt kan vi jo like godt sjekke for <code>null</code>? Men siden vi har masse funksjonelle godsaker tilgjengelig trenger vi ikke gjøre det. Metoden <code>foreach</code> vil bare la være å gjøre noe om verdien er <code>None</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">partner.<span style="color: #000000;">foreach</span><span style="color: #F78811;">&#40;</span>doStuff<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>.<span style="color: #000000;">getName</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span></pre></div></div>

<p>Det nøstede eksempelet løses fint med metoden <code>map</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">partner.<span style="color: #000000;">map</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>.<span style="color: #000000;">getName</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">map</span><span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>.<span style="color: #000000;">getFirstName</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">foreach</span><span style="color: #F78811;">&#40;</span>doStuff<span style="color: #F78811;">&#40;</span><span style="color: #000080;">_</span>.<span style="color: #000000;">toUpperCase</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span></pre></div></div>

<p>Eller tilsvarende med <code>for-comprehension</code> om man synes det blir rotete med alle metodene (mindre-enn tegnet blir dessverre feil her):</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">for</span> <span style="color: #F78811;">&#123;</span>
  name <span style="color: #000080;">&amp;</span>lt<span style="color: #000080;">;</span>- partner.<span style="color: #000000;">getName</span>
  firstName <span style="color: #000080;">&amp;</span>lt<span style="color: #000080;">;</span>- name.<span style="color: #000000;">getFirstName</span>
  upperCaseName <span style="color: #000080;">&amp;</span>lt<span style="color: #000080;">;</span>- firstName.<span style="color: #000000;">toUpperCase</span>
<span style="color: #F78811;">&#125;</span> <span style="color: #F78811;">&#123;</span>
  doStuff<span style="color: #F78811;">&#40;</span>upperCaseName<span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

<p><code>Option</code> løser altså problemet med <code>null</code>-sjekker. En siste liten detalj er at <code>Some(null)</code> er <code>None</code>. Det vil si at om du bruker et eksisterende Java-API som kan returnere <code>null</code> kan du bare pakke rundt med <code>Some</code> og slippe <code>null</code>-sjekk uansett. For eksempel om man henter parametre fra en http request, metoden <code>getOrElse</code> lar deg sette en default verdi hvis verdien er <code>None</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #008000; font-style: italic;">// Typical http request in Java-servlet-api</span>
<span style="color: #0000ff; font-weight: bold;">val</span> name <span style="color: #000080;">=</span> Some<span style="color: #F78811;">&#40;</span>request.<span style="color: #000000;">getParameter</span><span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;name&quot;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">getOrElse</span><span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;empty-name&quot;</span><span style="color: #F78811;">&#41;</span></pre></div></div>

<p>Konklusjonen er at bruken av <code>null</code> som default/ukjent verdi i Java utgjør et problem for de som skal benytte koden. Dersom man programmerer i Scala kan man bruke <code>Option</code> for å vise ta verdien ikke nødvendigvis er satt, i tillegg til at man tillater funksjonell bruk uten eksplisitt sjekking av verdien.</p>
<p>Må man skrive kode i Java kan det være lurt å ta i bruk en egen klasse for å representere slike verdier. For eksempel en av disse implementasjonene:</p>
<ul>
<li><a href="https://github.com/npryce/maybe-java">https://github.com/npryce/maybe-java</a></li>
<li><a href="http://blog.tmorris.net/maybe-in-java/">http://blog.tmorris.net/maybe-in-java/</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/BekkOpen/~4/p1-ZYiroh0M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/java-scala-null/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://open.bekk.no/java-scala-null/</feedburner:origLink></item>
	</channel>
</rss>

