<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Sterk blanding &#187; Programmering</title>
	<atom:link href="http://sterkblanding.no/blog/tag/programmering/feed/" rel="self" type="application/rss+xml" />
	<link>http://sterkblanding.no</link>
	<description>– Sterke meninger om IT og ledelse</description>
	<lastBuildDate>Wed, 11 Jan 2012 10:00:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Code templates &#8211; ukjent gullgruve for utviklere ?</title>
		<link>http://sterkblanding.no/blog/2011/09/07/code-templates-ukjent-gullgruve-for-utviklere/</link>
		<comments>http://sterkblanding.no/blog/2011/09/07/code-templates-ukjent-gullgruve-for-utviklere/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 19:34:01 +0000</pubDate>
		<dc:creator>Anders Karlsen</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=1234</guid>
		<description><![CDATA[Mange som programmerer enten i java eller i andre programeringsspråk har en gullgruve rett under beina uten å vite om det, nemlig deres utviklingsmiljø eller IDE (Integrated Developing Enviroment). Jeg vil her beskrive Code Templates som finnes i de fleste IDE-er, og som kan hjelpe deg til en mer effektiv programmeringshverdag. Code templates kan generere [...]]]></description>
			<content:encoded><![CDATA[<p>Mange som programmerer enten i java eller i andre programeringsspråk har en gullgruve rett under beina uten å vite om det, nemlig deres utviklingsmiljø eller IDE (Integrated Developing Enviroment). Jeg vil her beskrive Code Templates som finnes i de fleste IDE-er, og som kan hjelpe deg til en mer effektiv programmeringshverdag. Code templates kan generere de rutinepregede delene av koden for deg slik at du kan konsentrere deg om det som gir forretningsverdi.</p>
<p><span id="more-1234"></span></p>
<p><em>Ville du ha brukt notepad til å skrive kode ?</em><br />
Selvsagt (forhåpentligvis) ikke. Vi bruker IDE til programmering fordi det gir en sikrere og raskere prosess. Moderne IDE-er inneholder et arsenal av verktøy. En av disse er code templates. Jeg skal her gå igjennom hvordan man kan bruke de innebygde code templatene eller endre disse slik at de passer perfekt. Man kan også lage nye selv. Jeg vil her bruke Eclipse og Java som et eksempel. Code templates finnes derimot i flere IDE-er (som for eksempel InteliJ og Netbeans) og kan også benyttes på samme måte i andre programeringsspråk enn java.</p>
<h2>Bruk de innebygde code templatene</h2>
<p>Eclipse kommer med mange innebygde templates. Disse listes opp under Preferences-Java-Editor-Templates. For å aktivere templaten i koden trykker du &#8220;Ctrl-Space-Space&#8221;.</p>
<p>Skal du opprette en junit-test (og det gjør du vel en del ganger?) finnes det en template for å dette. Denne ser slik ut:</p>
<p><a href="http://sterkblanding.no/files/2011/09/testtemplate.jpg"><img class="alignnone size-full wp-image-1242" src="http://sterkblanding.no/files/2011/09/testtemplate.jpg" alt="" width="512" height="75" /></a></p>
<p><a href="http://sterkblanding.no/files/2011/09/testtemplate.jpg"></a>Her lages det en metode annotert med test. org.junit.Assert importeres statisk. Og cursoren settes inne i metoden. Det opprettes også en variabel (testname). Dette gjør at brukeren skriver rett etter genereringen fylles inn der.</p>
<p>Det er fullt mulig å editere på templatene hvis de ikke passer helt. Dersom man for eksempel bruker fest assert så trenger man ikke statisk import av org.junit.Assert. Det er bare å slette den delen.</p>
<p>Ta deg tid til å ta en titt på de innebygde templatene. Det er antgelig flere ting du gjør ofte som det finnes templates som gjør denne jobben lettere.</p>
<h2>Lag dine egne templates</h2>
<p>Man kan også lage sine egne templates. Her skal vi ta for oss to eksempler.</p>
<h2>Template for equals metode</h2>
<p>Vi skal her se på en template for en eguals metode (Jada, det finnes mange andre måter for å enkelt lage en equalsmetode, men dette er et eksempel)</p>
<p><a href="http://sterkblanding.no/files/2011/09/equaltemplate1.jpg"><img class="alignnone size-full wp-image-1238" src="http://sterkblanding.no/files/2011/09/equaltemplate1.jpg" alt="" width="446" height="326" /></a></p>
<p>Minst 99% av alle equalsmetoder starter med å sjekke at objektet er av riktig type. Siden klassenavnet varierer fra klasse til klasse (duh), bruker vi en variabel &#8220;enclosing_type&#8221;. Denne erstates med navnet på klassen vi er i. I tillegg caster vi deretter objektet til den aktuelle typen. Det er i tillegg lagt på en nullsafe equalsmetode som kan brukes til å sjekke de aktuelle atributtene. Vi har også tatt med en gyldig (men ikke veldig bra) implementasjon av hashCode slik at man oppfyller kontrakten mellom equals og hashcode.</p>
<h2>Template for å generere en factory metode</h2>
<p>Mange ganger er det nyttig å opprette en klasse med en statisk metode. Følgende template hjelper deg på vei her :</p>
<p><a href="http://sterkblanding.no/files/2011/09/createTemplate.jpg"><img class="alignnone size-full wp-image-1240" src="http://sterkblanding.no/files/2011/09/createTemplate.jpg" alt="" width="662" height="128" /></a></p>
<p>Som vi ser brukes det mye av de samme teknikkene som i equals templaten. Det som er nytt er bruken av variable. Variable er felt som brukeren kan editere på umiddelbart etter å ha kjørt templaten. Her bruker vi dette til å redigere på variabelnavnet (som jo varierer mye fra klasse til klasse). Feltnavnet brukeren skriver inn oppdateres tre steder:</p>
<ol>
<li>I feltnavnet</li>
<li>I parameteren til metoden</li>
<li>I tilordningen på begge sider av likhetstegnet.</li>
</ol>
<p>Disse templatene er bare eksempeler. I et hvert domene finnes det noe som gjøres mange ganger og er nesten likt. Tenk deg om. Antagelig finnes det noe code templates kan hjelpe deg med. Hvis du vil kopiere noen av templatene fra eksemplene finner du dem og noen til <a href="https://github.com/anders88/eclipseTemplates/blob/master/templates.txt">her</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2011/09/07/code-templates-ukjent-gullgruve-for-utviklere/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Frihet til å lære: egenopplæring for systemutviklere</title>
		<link>http://sterkblanding.no/blog/2010/10/31/frihet-til-a-l%c3%a6re-egenoppl%c3%a6ring-for-systemutviklere/</link>
		<comments>http://sterkblanding.no/blog/2010/10/31/frihet-til-a-l%c3%a6re-egenoppl%c3%a6ring-for-systemutviklere/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 21:14:21 +0000</pubDate>
		<dc:creator>Thomas Kjeldahl Nilsson</dc:creator>
				<category><![CDATA[Kompetanse]]></category>
		<category><![CDATA[Kursing]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[kompetanse]]></category>
		<category><![CDATA[kunnskapsmedarbeider]]></category>
		<category><![CDATA[læring]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=955</guid>
		<description><![CDATA[For noen dager siden besøkte jeg Dagen@IFI på UiO, hvor jeg promoterte Steria for informatikk-studenter. En student fortalte om en bekymring han hadde: &#8220;Dersom jeg velger feil kurs på skolen &#8211; låser jeg meg da til feil karriere?&#8221; Han ble lettet da jeg forsikret ham om at det ikke var tilfelle. For heldigvis er arbeidslivet [...]]]></description>
			<content:encoded><![CDATA[<p>For noen dager siden besøkte jeg <a href="http://dagen.at.ifi.uio.no/">Dagen@IFI</a> på UiO, hvor jeg promoterte Steria for informatikk-studenter. En student fortalte om en bekymring han hadde: <em>&#8220;Dersom jeg velger feil kurs på skolen &#8211; låser jeg meg da til feil karriere?&#8221;</em> Han ble lettet da jeg forsikret ham om at det ikke var tilfelle. For heldigvis er arbeidslivet det man selv gjør det til: du kan utvikle deg selv og skifte retning underveis.</p>
<p>Systemutviklere er både heldige og uheldige. Vi kan tilegne oss kunnskap og ferdigheter helt på eget initiativ, men vi tvinges også til å gjøre det for å holde oss relevante, ettersom teknologi endrer seg raskt.</p>
<p>Selv synes jeg at det er topp å plukke opp nye ting &#8211; her er noen metoder for å lære&#8230;</p>
<p><span id="more-955"></span></p>
<h1>Bredde eller dybde?</h1>
<p><strong>Tenk på kunnskap som personøkonomi.</strong> Ikke invester alt i en aksje <em>(&#8220;Jeg kan bare Java!&#8221;)</em>. Spre eggene dine over flere kurver. For all del: legg ned tid i mainstream-teknologi som er populær idag. C# og Java f.eks er lavrisiko med grei avkastning. Men se også på nisje-teknologi (la oss si F# eller Scala, for eksempel) Disse er mer høyrisiko fordi det absolutt ikke er sikkert de blir populære i fremtiden. Smale temaer gir til gjengjeld langt høyere avkastning <em>hvis</em> de slår an: du får et fortrinn fordi du var tidlig ute.</p>
<p><strong>Balanse mellom generelle og spesialiserte emner.</strong> Brede, eviggrønne felt (f.eks OO-design, regular expressions, statistikk) hjelper deg i mange år, uavhengig av domener og platformer. Men ikke overse domenekunnskap og platformspesifikke verktøy (Oracle og Microsoft) som gjør deg mer ettertraktet i prosjekter her og nå.</p>
<p><strong>Kultiver personlige styrker.</strong> Hvis du bare kan “litt om alt” så er det vanskelig å utmerke seg. Finn en eller to ting som er dine hovedpillarer, som du stadig forbedrer og behersker bedre enn andre.  Hva gjør at du skiller deg ut? Hva er ditt <em>&#8220;Unique Selling Point&#8221;</em>?</p>
<h1>Studieteknikk-kungfu</h1>
<p><strong>Du har et enormt arsenal av studieteknikker.</strong> Min erfaring: jeg lærer meg ting langt mer effektivt nå enn da jeg var i skoleverket eller på universitetet. Dels fordi jeg har blitt flinkere til å lære, men mest fordi vi har fått flere måter å tilegne oss kunnskap. Her er en liten godtepose av muligheter:</p>
<ul>
<li><a href="http://see.stanford.edu/">Universiteter</a> <a href="http://ocw.mit.edu/index.htm">verden</a> <a href="http://www.ocwconsortium.org/">over</a> legger ut åpen “courseware”: videoforelesninger, notater, pensum, oppgaver, fritt tilgjengelig på nett.</li>
<li><a href="http://peepcode.com/">Screencasts</a> er en fin blanding av foredrag og praktiske demonstrasjoner. Noen av dem må du betale for. De er derfor ofte <em>optimalisert</em> for å levere lærdom og verdi, mer enn en umotivert foreleser på Blindern noengang blir&#8230;</li>
<li><em>“So You&#8217;d Like To&#8230;”</em>-guidene hos Amazon.com er i noen tilfeller knallbra utvalg av faglitteratur og fungerer bra som utgangspunkt for selvstudium.</li>
<li>Online nyhetsblogger og foredrag fra konferanser gjør deg oppdatert på tilstanden i fagfeltet ditt.</li>
<li>Podcasts og lydbøker gjør iPoden din til en forelesningssal &#8211; kanskje mens du tar oppvasken?</li>
<li>Møt andre engasjerte i meetups, brukergrupper, code camps og online studiegrupper. Få feedback fra likesinnede, ikke gjem deg bort!</li>
<li>Open source lar deg kikke bak kulissene og se hvordan andre utviklere jobber og tenker.</li>
<li>Mindmapping er en sterk måte å ta gode, raske notater mens du studerer.</li>
</ul>
<p>Og dette var bare en tilfeldig utvalg. Med andre ord: dersom du begrenser deg til å kun lese en papirbok i ny og ne så handicapper du deg selv. <em>Du har mange muligheter!</em></p>
<p><strong>Absorber som en svamp.</strong> Hvis jeg har en ekstrem &#8220;læredag&#8221; så hører jeg på en podcast når jeg går til stasjonen på morran, leser litt i en relatert bok mens jeg sitter på toget, plugger inn iPoden igjen når jeg bytter over til tbanen til jobben, samme opplegg på veien hjem på ettermiddagen, og setter meg ned og koder en prototyp etter at ungene har lagt seg. Teknikkene nevnt i forrige avsnitt gjør det stadig enklere å presse inn læring flere steder i hverdagen enn man kunne før.</p>
<p><strong>Jevn progresjon</strong>. Store skippertak <em>kan</em> fungere, men det er i lengden bedre å lære litt hver dag istedet. Når man er student så fungerer sånne &#8220;overdoser&#8221; til en viss grad, men det blir vanskeligere når du har jobb og familie. Tenk bærekraftig tempo&#8230;</p>
<h1>Bruk det du lærer</h1>
<p><strong>Jobb med relevante prosjekter i arbeidstida.</strong> Dette er idealsituasjonen, men lar seg ikke alltid gjøre. Prosjekter krever vanligvis at vi leverer det vi allerede behersker, ikke det vi ønsker å lære mer om. Derfor kan det bli nødvendig å&#8230;</p>
<p><strong>Lage ting på fritida.</strong> Bruk det du har lært til å gjøre sideprosjekter på egenhånd. Ambisjon og omfang trenger ikke være all verden, bare du lager noe konkret og nyttig. Du kan lage et verktøy eller en tjeneste som bare du selv trenger, eller slippe det som open source eller en kommersiell tjeneste for hele verden. Poenget er at du anvender kunnskapen til noe konstruktivt. Det kan være slitsomt å bruke fritida til dette &#8211; til gjengjeld eier du selv det du lager. Og du får en &#8220;portfolio&#8221; å vise til.</p>
<p><strong>Lær det bort til andre!</strong> Når du formidler til andre (f.eks via kurs, blogging, foredrag) så tvinges du selv til å få bedre grep på stoffet ditt.  Du trenger ikke være guru for å lære bort ting &#8211; det holder at du har noenlunde grep om temaet og evner å formidle det godt.</p>
<p><em>Robert &#8220;Uncle Bob&#8221; Martin sa på et av foredragene sine at en profesjonell utvikler må bruke tjue timer hver uke på å forbedre seg som håndtverker. Dette er kanskje ekstremt &#8211; men hvor mye gjør du selv? Og hvordan lærer du nye ting? Del gjerne av egen erfaring i kommentarene under!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/10/31/frihet-til-a-l%c3%a6re-egenoppl%c3%a6ring-for-systemutviklere/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Slik lykkes du med smidig utvikling</title>
		<link>http://sterkblanding.no/blog/2010/10/29/slik-lykkes-du-med-smidig-utvikling/</link>
		<comments>http://sterkblanding.no/blog/2010/10/29/slik-lykkes-du-med-smidig-utvikling/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 10:17:57 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[produkteier]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[prosjektledelse]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[Smidig]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=946</guid>
		<description><![CDATA[Har du startet å bruke smidige metoder, men lurer på hvordan du skal få det til å fungere bedre? I denne artikkelen kan du få konkrete tips om hvordan å forbedre kommunikasjonen, kvaliteten og forretningsfokus på ditt smidige eller ikke-smidige utviklingsprosjekt. Bedre kommunikasjon Inkluder produkteier på morgenmøtene: Daglig kommunikasjon mellom kunde og leverandør har en [...]]]></description>
			<content:encoded><![CDATA[<p>Har du startet å bruke smidige metoder, men lurer på hvordan du skal få det til å fungere bedre? I denne artikkelen kan du få konkrete tips om hvordan å forbedre kommunikasjonen, kvaliteten og forretningsfokus på ditt smidige eller ikke-smidige utviklingsprosjekt.</p>
<p><span id="more-946"></span></p>
<h3>Bedre kommunikasjon</h3>
<ul>
<li><strong>Inkluder produkteier på morgenmøtene</strong>: Daglig kommunikasjon mellom kunde og leverandør har en dokumentert enorm effekt på hvor vellykket et prosjekt blir. Teamets fokus blir mye bedre dersom det er noen på de daglige standup møtene som er interessert i å prøve ut det som har blitt laget i går, som er interessert i å komme med innspill på det som lages i dag og som har myndighet til svare på avklaringer angående dagens oppgaver.</li>
<li><strong>Programmér sammen</strong>: Utviklere på prosjekter innehar enorm kunnskap, både om de delene av systemet man lager og om programmering generelt. Når man programmerer i par og roterer hvem som jobber sammen hyppig, blir denne kunnskapen spredt til alle. Spe også gjerne på med seanser der hele teamet går gjennom deler av koden på storskjerm.</li>
<li><strong>Bruk en Scrum-tavle</strong>: For å hjelpe alle å huske på hva som er målet med sprinten, er det lurt om teamet holder standup møtene rundt en tavle med lapper for alle aktiviteter teamet har planlagt i iterasjonen. Lappene henger i kolonner &#8220;venter&#8221;, &#8220;under arbeid&#8221; og &#8220;ferdig&#8221;. Hver lapp bør ha et så lite omfang at teamet flytter flere lapper til &#8220;ferdig&#8221; hver dag.</li>
</ul>
<h3>Bedre kvalitet</h3>
<ul>
<li><strong>Verifiser krav med funksjonelle tester</strong>: Når teamet skal jobbe med en oppgave i en iterasjon, er det viktig at alle har konkret forståelse av oppgaven. Produkteier bør beskrive eksempler for å gjøre oppgavene konkrete. Om mulig, bør produkteier uttrykke eksemplene i et verktøy for automatisert funksjonell testing (for eksempel FitNesse eller Cucumber). Teamet kan da kjøre testene og automatisk sjekke at de oppfyller produkteiers forventning</li>
<li><strong>Skriv enhetstester før koden den tester</strong>: For å kunne utvikle funksjonalitet inkrementelt, må man kunne endre på kode som allerede har vært ferdigstilt, samtidig som man er (rimelig) sikker på at endringen ikke ødelegger noe som har virket før. De funksjonelle testene kan gi et sikkerhetsnett, men det tar typisk lang tid å kjøre dem og de gir ofte ikke en eksakt indikasjon av hva som er feil når noe ikke virker. Derfor bør teamet skrive raske tester som verifiser at klassene i systemet fungerer, gjerne før man skriver koden.</li>
<li><strong>Integrer endringer kontinuerlig og automatisk</strong>: Automatiske tester er kun verdifulle dersom de kjøres! Sett derfor opp en Continuous Integration server som sjekker ut og tester alle endringer hver gang en utvikler har sjekket inn en endring til kildekodekontroll. Om mulig bør dette systemet også automatisk installere den siste versjonen av programvaren til et egnet testmiljø, slik at produkteier alltid kan se hva som er siste versjon av systemet.</li>
</ul>
<h3>Bedre forretningsfokus</h3>
<ul>
<li><strong>Inkluder alle oppgaver i en prioritert produktkø</strong>: Mange team lurer på hvilke oppgaver som skal puttes på produktkøen. Dersom noe gir forretningsverdi og tar betydelig tid å utføre, bør produkteier inkludere oppgaven på produktkøen. Ikke-funksjonelle krav må som regel testes. Det tar tid å sette opp testene og rette opp eventuelle mangler. Ikke-funksjonelle krav skal på produktkøen. Brukerdokumentasjon må skrives og kvalitetsikres. Det tar tid å skrive god brukerdokumentasjon. Brukerdokumentasjon skal på produktkøen.</li>
<li><strong>Bli helt ferdig med funksjonalitet</strong>: Teamet får kun &#8220;poeng&#8221; for helt dønn ferdig utført arbeid. Etter en iterasjon bør alt som tilhører en oppgave være så ferdig at det er greit dersom man aldri mer bruker tid på koden. Koden, tester og dokumentasjon må være i en akseptabel tilstand. Det betyr ikke at koden er frosset. Dersom man for eksempel utfører en oppgave for å verifisere responstid, må teamet oppdatere eksisterende kode slik at den støtter tidsmålinger og at man korrigerer eventuelle ytelsesproblemer man oppdager. Dette arbeidet tilhører det å implementere responstidskravet &#8211; den originale funksjonen er ferdig.</li>
<li><strong>Ta med brukere på demo</strong>: Dersom du lager et system som interesserer dine (fremtidige) brukere, bør teamet ha noe spennende å vise dem på demo etter hver iterasjon. Bruk demo-møtet til å involvere brukerne. Sørg for at input fra brukerne blir tatt hensyn til, og at de får beskjed om innspill som har blitt implementert, slik at de fortsetter å interessere seg.</li>
</ul>
<p>Gjort riktig kan et smidig prosjekt levere ferdig funksjonalitet for hver iterasjon. Men det krever fortløpende kommunikasjon, kvalitet og fokus på forretningsverdi. Dét er hvordan du lykkes med smidige prosjekter.</p>
<p><em>Jeg planlegger å publisere en Steria 3-minuttersguide basert på denne artikkelen. Innspill til forbedringer mottas med stor takk!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/10/29/slik-lykkes-du-med-smidig-utvikling/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Hold stø kurs med autotesting!</title>
		<link>http://sterkblanding.no/blog/2010/05/31/hold-st%c3%b8-kurs-med-autotesting/</link>
		<comments>http://sterkblanding.no/blog/2010/05/31/hold-st%c3%b8-kurs-med-autotesting/#comments</comments>
		<pubDate>Mon, 31 May 2010 19:14:04 +0000</pubDate>
		<dc:creator>Thomas Kjeldahl Nilsson</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=643</guid>
		<description><![CDATA[Unit-tester er nyttig for de fleste systemutviklere. Noen av oss kjører strikt, metodisk testdrevet utvikling. Andre bruker bare automatiserte tester nå og da som sikkerhetsnett for å unngå regress-feil. Hvor ofte fyrer du selv av testene dine? Kjører du testsuiten din en gang i ny og ne, eller strikt for hver metode du implementerer? Jeg [...]]]></description>
			<content:encoded><![CDATA[<p>Unit-tester er nyttig for de fleste systemutviklere.</p>
<p>Noen av oss kjører strikt, metodisk testdrevet utvikling. Andre bruker bare automatiserte tester nå og da som sikkerhetsnett for å unngå regress-feil. <strong>Hvor ofte fyrer du selv av testene dine?</strong> Kjører du testsuiten din en gang i ny og ne, eller strikt for hver metode du implementerer?</p>
<p>Jeg liker å kjøre testene mine <strong>ofte</strong> mens jeg arbeider. Det jeg liker enda bedre er å la utviklingsmiljøet mitt kjøre dem for meg, automatisk. Poenget med yrket vårt er jo nettopp å automatisere og effektivisere arbeidsprosesser &#8211; dette forsøker jeg å gjøre også med mine egne rutiner og verktøy. La oss se hvordan vi kan få til dette.</p>
<p><span id="more-643"></span></p>
<p>Mange av oss bruker allerede <a href="http://martinfowler.com/articles/continuousIntegration.html">Continuous Integration</a> for å oppdage feil i den felles kodebasen. Personlig autotesting er det neste, logiske steget: enhetstestene våre burde kjøre i bakgrunnen hver gang vi endrer noe, og gi oss umiddelbar tilbakemelding når vi knekker funksjonalitet. På denne måten oppdager vi våre egne feil før resten av teamet blir påvirket av dem.</p>
<p>Det finnes flere verktøy som gjør dette for deg:</p>
<ul>
<li><span style="font-family: arial, sans-serif"><a href="http://improvingworks.com/products/infinitest/">Infinitest</a> (Java)</span></li>
<li><span style="font-family: arial, sans-serif"><a href="http://www.zenspider.com/ZSS/Products/ZenTest/">Autotest / ZenTest</a> (Ruby)</span></li>
<li><span style="font-family: arial, sans-serif"><a href="http://github.com/lacostej/nosyd">Nosyd</a> (Python)</span></li>
</ul>
<p><strong>Det er imidlertid ikke vanskelig å lage et enkelt autotest-verktøy på egen hånd</strong>. Jeg synes at det er en god ide å bruke litt tid her og der på å forbedre sitt eget utviklingsmiljø. Vi har jo muligheten til å lage våre egne verktøy (<a href="http://no.wikipedia.org/wiki/Smed">smeden</a> er en av få håndverkere som kan si det samme). Som utvikler bør man iallfall klare å slipe sine egne kniver, for å si det sånn. Og dette er en god anledning!</p>
<p><a href="http://sterkblanding.no/files/2010/05/smedVerktoy.jpg"><img class="alignleft size-full wp-image-669" style="margin-top: 0px;margin-bottom: 0px;margin-left: 10px;margin-right: 10px" title="smedVerktoy" src="http://sterkblanding.no/files/2010/05/iStock_000012701407Small.jpg" alt="" width="211" height="296" /></a></p>
<p><strong>Et naivt script for autotesting implementerer du på en ettermiddag.</strong> Alt du trenger er et lite program som reagerer på endringer i prosjektfilene dine, og kjører testene etter behov.</p>
<p>Algoritmen er enkel: La scriptet kjøre regelmessig, f.eks hvert sekund. Kontroller &#8220;forrige endring&#8221;-klokkeslettet for alle filene i prosjektet. Dersom klokkeslettet på en eller flere filer har endret seg siden forrige kontroll, så kjør enhetstestene til prosjektet. Analyser output fra testkjøringen, og se hvorvidt noen tester feilet eller kode knakk helt (exceptions). <strong>Gi så klar tilbakemelding om testene er ok eller feilet.</strong></p>
<p>Tilbakemeldingen kan være litt grafikk og lyd på desktopen (for eksempel med <a href="http://growl.info/">Growl</a> eller <a href="http://www.fullphat.net/index.php">Snarl</a>), en <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=67492">lavalampe</a> på pulten, <a href="http://marketplace.eclipse.org/content/eclipse-xps">blinkende LED-lamper</a> på laptopen&#8230; vær kreativ<strong>!</strong> Bare sørg for er at du får en tydelig tilbakemelding på hvorvidt testene feiler eller ikke.</p>
<p><strong>Filmklippet under viser hvordan mitt eget autotest-miljø fungerer.</strong> Koden er i dette tilfellet skrevet i et språk som heter <a href="http://clojure.org">Clojure</a> og ser derfor kanskje litt pussig ut, men ikke heng deg opp i det: det som demonstreres er at jeg knekker og fikser tester, og får automatisk godt synlig feedback på dette underveis.</p>
<p style="text-align: center"><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="480" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11633909&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="640" height="480" src="http://vimeo.com/moogaloop.swf?clip_id=11633909&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p>Ikke spesielt komplisert.</p>
<p><strong>&#8220;Dette ser jo genialt ut! Hvorfor bruker ikke alle autotest-verktøy allerede?&#8221;</strong></p>
<p>Vel, det finnes dessverre noen utfordringer.</p>
<p>Dersom autotesting skal fungere hensiktsmessig må testsuiten som kjøres kun bestå av raske enhetstester, ikke tunge integrasjonstester. Og enhetstestene må gå kjapt! En test-run må ta sekunder, ikke minutter, ellers mister du gevinsten ved den umiddelbare feedbacken.</p>
<p>Problemet med trege tester er betydelig. Det finnes workarounds: man kan analysere avhengigheter mellom tester og kode, kun kjøre de berørte testene, kjøre raske tester først, feilende tester først, nylig feilende tester først&#8230; Men mange av oss har dessverre erfart at det er vanskelig å få til et godt fungerende opplegg for dette i et vanlig moderat stort utviklingsprosjekt.</p>
<p>Så er ikke autotesting nyttig likevel, da? Jo! Autotesting fungerer <strong>knallbra</strong> i<strong> små prosjekter</strong> (som ikke har samlet på seg så mye kode ennå) og <strong>egenopplæring</strong> (når du lærer nye verktøy og språk og ønsker å ta små steg med kjapp feedback). Det kan kanskje også fungere i større prosjekter <strong>dersom</strong> du har muligheten til å segmentere koden og testene dine i mindre moduler på en hensiktsmessig måte.</p>
<p>I bunnen av denne artikkelen har jeg vedlagt et eksempel på hvordan et enkelt autotest-script kan se ut, implementert i <a href="http://ruby-lang.org/">Ruby</a>. Scriptet er skrevet for OS X-miljø, men koden bør være relativt lesbar og enkel å porte til ditt eget favorittspråk og utviklingsmiljø.</p>
<p><strong>Happy testing!</strong></p>
<p><em>Eksempel:</em></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code></p>
<pre># Command line command which launches all unit tests
RUN_TESTS_CMD = "mvn clean test"

# Pick up any changes in files matching this filepath
FILES_TO_MONITOR = "**/*.java"

# Determine test outcome by scraping test output for #telltale signs of failure or exceptions</pre>
<pre>def test_failed?(test_output)
  return (test_output["FAIL in"] != nil) # Any 'FAIL in' strings in test result indicates failure
end

def exception_occurred?(test_output)
  return (test_output["EXCEPTION in"] != nil)
end

# Indicate test state by turning the background color of the test terminal
# a different color - yellow red og green. Currently uses Mac AppleScripts, but could be
# an audible signal, lava lamp, or anything else instead.

def indicate_tests_running
  `osascript bin/autotest/make-term-yellow`
  puts "\n\n\n----------------------------------"
  puts "TESTRUN STARTED #{Time.now}"
  puts "----------------------------------\n\n\n"
end  

def indicate_test_success(description)
  `osascript bin/autotest/make-term-green`
  puts description
end  

def indicate_test_errors(description)
  `osascript bin/autotest/make-term-red`
  puts description
end  

$monitored_files = {} # Stores the last changed time of each file    

def files_changed? # Check if any files have been touched/saved since last check
  file_changed = false;  

  Dir[FILES_TO_MONITOR].each do |filepath|
    if(!File.new(filepath).ctime.eql?($monitored_files[filepath]))
      file_changed = true;
      $monitored_files[filepath] = File.new(filepath).ctime
    end
  end  

  return file_changed
end  

def run_test
  indicate_tests_running
  result = `#{RUN_TESTS_CMD}`  #Run the tests, pipe resulting console output back
  display_results(result)
end    

def display_results(testOutput)
  if test_failed?(testOutput)
    indicate_test_errors("SOME TEST(S) FAILED\n"+testOutput)
  elsif exception_occurred?(testOutput)
    indicate_test_errors("EXCEPTIONS OCCURRED\n"+testOutput)
  else
    indicate_test_success("ALL TESTS SUCCEED\n"+testOutput)
  end
end  

def test_loop
  while true
    if files_changed?
      run_test
    end
    sleep(1) #seconds between each poll for file changes
  end
end  

test_loop # Start testing!</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/05/31/hold-st%c3%b8-kurs-med-autotesting/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bugs of honor, bugs of shame</title>
		<link>http://sterkblanding.no/blog/2010/04/06/bugs-of-honor-bugs-of-shame/</link>
		<comments>http://sterkblanding.no/blog/2010/04/06/bugs-of-honor-bugs-of-shame/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 16:39:28 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=346</guid>
		<description><![CDATA[Det er flaut med bugs. Noen bugs gjør meg flauere enn andre. Andre bugs er helt akseptable. I prosjektet mitt er vi stolte av at såpass få feil finnes av testere (eller av brukere), men det er noen som faller gjennom sikkerhetsnettet vårt. Her er noen av bugsene vi har hatt i det siste, fra [...]]]></description>
			<content:encoded><![CDATA[<p>Det er flaut med bugs. Noen bugs gjør meg flauere enn andre. Andre bugs er helt akseptable. I prosjektet mitt er vi stolte av at såpass få feil finnes av testere (eller av brukere), men det er noen som faller gjennom sikkerhetsnettet vårt. Her er noen av bugsene vi har hatt i det siste, fra den minst ydmykende til den verste:</p>
<p><span id="more-346"></span></p>
<ul>
<li><strong>Bug rapport: &#8220;Administrative kostnader&#8221; skal fjernes:</strong> Når vi beregner totalkostnaden til et veiprosjekt, inkluderer vi kostnaden av nyanlegg, ombygging, bruer og administrative kostnader. Når vi demonstrerte applikasjonen til brukerne våre, husket de plutselig at administrative kostnader er sjelden i bruk og burde egentlig fjernes fra applikasjonen. Endringen var enkel og det er usannsynlig at en bedre analyse på forhånd hadde kommet fram til samme konklusjon. Dette er den type feilrapport vi liker å få.</li>
<li><strong>Bug rapport: Ikke-effektuerte utbetalinger skal telle mot totalt tilgjengelige midler:</strong> Når vi sjekket om det var tilstrekkelige midler for å utføre en utbetaling, glemte vi å ta med de utbetalingene som var registrert, men ikke utført enda. Tilstandsovergangen av utbetalinger fra registrert til godkjent til utført var litt mer kompleks enn vi hadde forventet, og enhetstestene sjekket ikke tilstrekkelig med varianter. Vi burde ha funnet denne feilen med enhetstestene våre, men dersom vi aldri får feil av denne typen, kan det være en indikasjon på at vi er <em>for</em> nøye med testingen vår. Så feilen er helt grei. Spesielt ettersom konsekvensene for brukeren ikke var spesielt store</li>
<li><strong>Bug rapport: Perioder som starter i desember rapporterer <em>IllegalArgumentException</em>:</strong> Når vi beregnet neste måned, glemte vi å ta hensyn til at du kan ikke bare legge til én på månedsnummer. Neste måned etter desember er ikke måned 13! Dette var en slurvete feil og jeg tror den ble introdusert en gang når vi ikke parprogrammerte (fordi koden var så triviell, liksom!). Brukerne våre forstår at slike type feil kan skje, men vi må se nøyere på prosessen vår for å unngå slike feil i fremtiden.</li>
<li><strong>Bug rapport: Layout ser rotete ut i Internet Explorer:</strong> For å unngå noen tekniske problemer når vi skrev enhetstester for HTML&#8217;en vi produserte, fjernet vi midlertidig doctype-definisjonen fra webside-malene våre. Så glemte vi å putte definisjonen inn igjen (jada, et nytt eksempel der vi ikke parprogrammerte). Sidene så fortsatt fine ut i Chrome og Firefox, som utviklerne brukte for manuell verifisering. Men i Internet Explorer så websidene direkte kaotiske ut. Den tekniske konsekvensen av feilen var triviell, men feilen kunne lett ha vært unngått, dersom vi vi hadde testet med samme nettleser som brukerne våre. Noen av brukerne våre fikk dette håpløse førsteinntrykket av applikasjonen mens de hjalp oss å teste. Det var skikkelig flaut. Dette vil vi ikke at skjer igjen!</li>
</ul>
<p>Det er litt vanskelig å definere hvilke bugs som gjør meg mest flau. Noen viktige faktorer er hvor vanskelig ville det vært for oss å unngå feilen og hvor stor konsekvens feilen har. Men andre faktorer påvirker også hvordan vi oppfatter en bug. Av feilene på lista over, så er den jeg er mest flau over kun en kosmetisk feil. Men siden dette var noen brukeres førsteinntrykk av applikasjonen, var det mye mer problematisk enn de særtilfellene vi ikke helt støttet.</p>
<p>Hva synes du gjør en feil mer eller mindre akseptabel?</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/04/06/bugs-of-honor-bugs-of-shame/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Kom igang med JavaScript!</title>
		<link>http://sterkblanding.no/blog/2010/03/24/kom-igang-med-javascript/</link>
		<comments>http://sterkblanding.no/blog/2010/03/24/kom-igang-med-javascript/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 06:25:32 +0000</pubDate>
		<dc:creator>Thomas Kjeldahl Nilsson</dc:creator>
				<category><![CDATA[Frontend]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=185</guid>
		<description><![CDATA[Stadig mer programvare utvikles som rike webapplikasjoner, og brukere og kunder stiller stadig høyere krav til disse løsningene. JavaScript er derfor i ferd med å bli et av de viktigste verktøyene våre for moderne applikasjonsutvikling.

Språket blir dessverre behandlet som den stygge andungen av mange utviklere fordi det tradisjonelt oppleves som knotete, skjørt og lite vedlikeholdbart. Slik trenger det ikke være!

Vi i Steria har utviklet et gratis, nedlastbart kurs som oppdaterer deg på dette området. Denne workshopen introduserer ferdighetene, teknikkene og verktøyene som gjør JavaScript-utvikling langt mer overkommelig enn tidligere. Alt materiale i kurset er fritt tilgjengelig til din egen bruk.]]></description>
			<content:encoded><![CDATA[<p>Stadig mer programvare utvikles som rike webapplikasjoner, og brukere og kunder stiller stadig høyere krav til disse løsningene. JavaScript er derfor i ferd med å bli et av de <strong>viktigste verktøyene</strong> våre for moderne applikasjonsutvikling.</p>
<p>Språket blir dessverre behandlet som den stygge andungen av mange utviklere fordi det tradisjonelt oppleves som knotete, skjørt og lite vedlikeholdbart. Slik trenger det ikke være!</p>
<p>Vi i Steria har utviklet et <strong>gratis, nedlastbart</strong> kurs som oppdaterer deg på dette området. Denne workshopen introduserer ferdighetene, teknikkene og verktøyene som gjør JavaScript-utvikling langt mer overkommelig enn tidligere. Alt materiale i kurset er fritt tilgjengelig til din egen bruk.<span id="more-185"></span></p>
<p>Du kan bruke foilene, forelesningsnotatene og øvelsene som <strong>personlig studiemateriell</strong>. Du kan også holde kurset som en formell <strong>workshop</strong> sammen med kollegaer eller kunder. Workshopen tar omtrent en halv dag (3-4 timer) når det gjøres skikkelig &#8211; beregn halvannen time forelesning, minst halvannen time praktiske øvelser.</p>
<p style="text-align: center"><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=slides-100310162930-phpapp02&rel=0&stripped_title=javascript-neednt-hurt-3390657" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=slides-100310162930-phpapp02&rel=0&stripped_title=javascript-neednt-hurt-3390657" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<h2 style="text-align: center"><a title="Download link" href="http://kjeldahlnilsson.net/jsnh.zip"><strong><span style="color: #ff6600"><span style="text-decoration: none"><span style="color: #0000ff">LAST NED HER</span></span></span></strong></a></h2>
<p style="text-align: center"><em>(Inneholder slides, forelesningsnotater, øvelser, løsninger, eksempler, verktøy. Utgitt under en Creative Commons Attribution 3.0 lisens. Du kan bruke, endre og dele det fritt, så lenge du krediterer opphavsmannen.)</em></p>
<p>Hvis du ikke har kapasitet til å kjøre kurset selv kan du ta kontakt med <a title="Steria Norge link" href="http://steria.no">Steria</a>; vi kan holde kurset i dine lokaler, i og rundt Oslo.</p>
<p>La oss avslutte med en smakebit. Filmklippet under illustrerer et av temaene som workshopen tar for seg, nemlig <a title="Wikipedia TDD link" href="http://en.wikipedia.org/wiki/Test-driven_development">testdrevet utvikling</a> i JavaScript. Enjoy!</p>
<p style="text-align: center"><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=9453172&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="640" height="424" src="http://vimeo.com/moogaloop.swf?clip_id=9453172&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p><em><br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/03/24/kom-igang-med-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Min første katacast</title>
		<link>http://sterkblanding.no/blog/2010/01/21/min-f%c3%b8rste-katacast/</link>
		<comments>http://sterkblanding.no/blog/2010/01/21/min-f%c3%b8rste-katacast/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 08:51:40 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=42</guid>
		<description><![CDATA[Etter at jeg så noen artige eksempler på programmere som jobbet med øvelsesprogrammering på KataCasts, bestemte jeg meg for å spille inn min egen video. Jeg er rimelig fornøyd, men jeg feilberegner bakgrunnsmusikken med cirka ett minutt. (Det gikk fortere på innspillingen enn på generalprøven). Uten mer om og men, poster jeg en video her [...]]]></description>
			<content:encoded><![CDATA[<p>Etter at jeg så noen artige eksempler på programmere som jobbet med øvelsesprogrammering på <a href="http://www.katacasts.com/">KataCasts</a>, bestemte jeg meg for å spille inn min egen video. Jeg er rimelig fornøyd, men jeg feilberegner bakgrunnsmusikken med cirka ett minutt. (Det gikk fortere på innspillingen enn på generalprøven).</p>
<p><span id="more-42"></span></p>
<p>Uten mer om og men, poster jeg en video her av hvordan jeg liker å jobbe med tester for å drive fram &#8220;kravene&#8221; til en applikasjon og refactoring for å forme designet til applikasjonen. Se spesielt rundt 11:30 minutter inn i videoen hvor jeg refactorer inn et regelmotordesign i en fungerende løsning.</p>
<p>Oppgaven kalles &#8220;Fizz buzz kataen&#8221;. Den går ut på å generere en sekvens av nummer der hvert tall som er delelig på 3 erstattes med &#8220;fizz&#8221; og alle tall som er delelig på 5 erstattes med &#8220;buzz&#8221;. Så starten blir &#8220;1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, etc.&#8221; Seks minutter inn i kataen endres kravet (og musikken!): Nå skal man kunne programmere inn hvilke erstatningsregler som gjelder. Som eksempel bruker jeg at &#8220;tall delelig med 2 skal erstattes med &#8216;coconut&#8217; og tall delelig med 7 skal erstattes med &#8216;banana&#8217;&#8221;.</p>
<p>Takk til Emily Bache for inspirasjon til oppgaven.</p>
<p><a href="http://vimeo.com/8459948">Fizz buzz code kata</a> av <a href="http://vimeo.com/user2873956">Johannes Brodwall</a> på <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Jeg bruker <a href="http://www.jetbrains.com/idea/free_java_ide.html">IntelliJ IDEA Community Edition</a> på Windows Vista (!) til å løse oppgaven. Videoen er filmet med <a href="http://www.bbsoftware.co.uk/BBFlashBack_FreePlayer.aspx?cc=true">BB FlashBack Express</a> (som er gratis), konvertert til AVI med Windows Media 1 codec og lastet opp til Vimeo.</p>
<p>Denne blogposten var originalt publisert på engelsk på <a href="http://johannesbrodwall.com">min personlige blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/01/21/min-f%c3%b8rste-katacast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

