<?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>Blogg - Athega AB &#187; Webbutveckling</title>
	<atom:link href="http://blogg.athega.se/kategori/webbutveckling/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogg.athega.se</link>
	<description>...</description>
	<lastBuildDate>Fri, 28 May 2010 01:00:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Unobtrusive JavaScripts</title>
		<link>http://blogg.athega.se/2010/04/10/unobtrusive-javascripts/</link>
		<comments>http://blogg.athega.se/2010/04/10/unobtrusive-javascripts/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 14:31:05 +0000</pubDate>
		<dc:creator>Markus Ullmark</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=633</guid>
		<description><![CDATA[I fredags så började jag och en kollega hastigt prata lite angående kodkonventioner vilket alltid får igång mig då jag älskar att ha rent och strukturerat i mina projekt. Därför kom jag på att jag kan skriva en liten bloggpost om hur jag tänker när jag lägger upp mina javascript när jag kodar gränssnitt.
Jag är [...]]]></description>
			<content:encoded><![CDATA[<p>I fredags så började jag och en kollega hastigt prata lite angående kodkonventioner vilket alltid får igång mig då jag älskar att ha rent och strukturerat i mina projekt. Därför kom jag på att jag kan skriva en liten bloggpost om hur jag tänker när jag lägger upp mina javascript när jag kodar gränssnitt.</p>
<p>Jag är ett stort fan av <a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript">Unobtrusive Javascripts</a> där man strävar efter att helt separera scriptdelen från sin html-content. Jag använder i dagsläget nästan alltid jQuery när jag kodar javascript. Jag tänker inte gå inte gå in djupare på hur det fungerar i denna bloggpost. Generellt när jag jobbar strävar jag åt <a href="http://en.wikipedia.org/wiki/Domain-driven_design">DDD</a>-hållet så att alla namespaces innehåll enkelt kan förstås av kunden, även om han inte har någon teknisk kunskap. (Självklart ligger oerhört mycket mer i konceptet DDD)</p>
<p>I mitt scenario jobbar jag med ett projekt som kallas &#8221;Acme&#8221;. Jag utgår därför från en scriptfil som jag döper till <b>&#8221;acme.js&#8221;</b>. I den lägger jag funktionalitet som är gemensam för hela sidan. Den skulle kunna se ut såhär;</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> acme <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>
&nbsp;
	<span style="color: #006600; font-style: italic;">// Initierare</span>
	<span style="color: #003366; font-weight: bold;">var</span> init <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;">// Initiera eventuella kontroller etc.</span>
		<span style="color: #006600; font-style: italic;">// Anropa eventuella andra privata funktioner</span>
		somePrivateFunction<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: #339933;">,</span> 
&nbsp;
	<span style="color: #006600; font-style: italic;">// Denna funktionen blir &quot;privat&quot; eftersom den inte returneras</span>
	somePrivateFunction <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>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
		init<span style="color: #339933;">:</span> init
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
$<span style="color: #009900;">&#40;</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>
	acme.<span style="color: #660066;">init</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></pre></div></div>

<p>När denna scriptfil körs på sidan kommer automatiskt init anropas efter dom:en har laddats. Då kan man där i manipulera dom:en eller kanske binda något event osv.</p>
<p>Säg sedan att mitt projekt innehåller ett forum som behöver specifik javascriptlogik som bara gäller för forumet. Jag skapar därför en <b>&#8221;acme.forum.js&#8221;</b> som skulle kunna se ut såhär;</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">acme.<span style="color: #660066;">forum</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: #003366; font-weight: bold;">var</span> someVariable<span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #006600; font-style: italic;">// Initierare, bind knapphändelser m.m</span>
	init <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;#someButton&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span>validateEmail<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: #006600; font-style: italic;">// Validerar e-postadress</span>
	validateEmail <span style="color: #339933;">=</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: #006600; font-style: italic;">// Logik för validering</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
		init<span style="color: #339933;">:</span> init
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
$<span style="color: #009900;">&#40;</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>
	acme.<span style="color: #660066;">forum</span>.<span style="color: #660066;">init</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></pre></div></div>

<p>Här bygger jag vidare på &#8221;acme&#8221; variabeln som vi tidigare skapat (eller &#8221;namespacet&#8221; om ni nu så vill). Enligt detta tänk fortsätter jag med alla delar av projektet. </p>
<p>När koden sedan skall ut i produktion brukar jag se till att minifiera och kombinera alla mina javascript (även tredjepartsbibliotek t.ex jQuery) till en enda fil vid namn <b>&#8221;acme.min.js&#8221;</b>. Detta gör jag för att få ner antalet requests så mycket som går och även få ner storleken på dem. Jag har haft nöjet att jobba ihop med <a href="http://twitter.com/robertnyman">Robert Nyman</a> som har en bra bloggpost om vilka minifierare som finns att tillgå i <a href="http://robertnyman.com/2010/01/19/tools-for-concatenating-and-minifying-css-and-javascript-files-in-different-development-environments/">denna posten</a>.</p>
<p>I mitt fall har jag använt <a href="http://yuicompressor.codeplex.com/Wikipage">YUI Compressor for .NET</a> som ett &#8221;post build-event&#8221; som även sköter minifiering av din CSS. Ett tips är att endast inkludera den minifierade CSS:en när det inte är debugg-kompilerat så blir det oerhört mycket enklare i utvecklingsprocessen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2010/04/10/unobtrusive-javascripts/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JSON och MooTools för Web Workers</title>
		<link>http://blogg.athega.se/2009/10/06/json-och-mootools-for-web-workers/</link>
		<comments>http://blogg.athega.se/2009/10/06/json-och-mootools-for-web-workers/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 15:48:51 +0000</pubDate>
		<dc:creator>Johan Beronius</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Programmeringsspråk]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[Web Workers]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=490</guid>
		<description><![CDATA[MooTools är en trevlig verktygslåda som främst är tänkt för att skriva JavaScript-kod som manipulerar element på en webbsida och skapar animeringar och grafiska effekter. Därför är den starkt knuten till objekten window och document som finns i det globala kontextet när JavaScript-kod körs på en vanlig webbsida.
MooTools i Worker-kontext
Men MooTools har även hjälpmedel för [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mootools.net/" target="_blank">MooTools</a> är en trevlig verktygslåda som främst är tänkt för att skriva JavaScript-kod som manipulerar element på en webbsida och skapar animeringar och grafiska effekter. Därför är den starkt knuten till objekten <code><b>window</b></code> och <code><b>document</b></code> som finns i det globala kontextet när JavaScript-kod körs på en vanlig webbsida.</p>
<h4>MooTools i Worker-kontext</h4>
<p>Men MooTools har även hjälpmedel för att skriva objektorienterad kod samt en del utökningar och förbättringar för språket som sådant. Om man vill dra nytta av detta för kod som körs i ett annat sammanhang där <code><b>window</b></code> och <code><b>document</b></code> inte finns tillgängliga, t.ex. i en Web Worker tråd, vad gör man för att få mootools att fungera då?<br />
En variant är att skapa mock-up objekt för att maskera det faktum att objekten inte finns, tomma skelett som bara innehåller det nödvändigaste för att mootools skall kunna laddas utan fel. Självklart ger inte detta tillgång till någon funktionalitet som är beroende av dessa objekt men övriga funktioner finns på plats.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// If we're in a worker we need to masquerade the global context and load mootools</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>self.<span style="color: #660066;">importScripts</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	document <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		prototype<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;">&#125;</span><span style="color: #339933;">,</span>
		createElement<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;">&#125;</span><span style="color: #339933;">,</span>
		getElementsByTagName<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;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	window <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		document<span style="color: #339933;">:</span> document<span style="color: #339933;">,</span>
		Document<span style="color: #339933;">:</span> document<span style="color: #339933;">,</span>
		Element<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> prototype<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;">&#125;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		Window<span style="color: #339933;">:</span>  <span style="color: #009900;">&#123;</span> prototype<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;">&#125;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
		addEventListener<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;">&#125;</span><span style="color: #339933;">,</span>
		attachEvent<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;">&#125;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	self.<span style="color: #660066;">importScripts</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'mootools.js'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h4>Skicka objekt till Workers</h4>
<p>Eftersom Web Workers är helt isolerade från webbsidan, dvs. inte har tillgång till något delat minne, går det inte att skicka objekt till dem hur som helst. Enda sättet att kommunicera är genom att posta meddelanden som bara kan överföra strängar. Självklart kan man då serialisera objekten till JSON och skicka med dem. </p>
<h5>Varför heter det JSON?</h5>
<p>Vad jag då skulle vilja reflektera över är varför det kallas <i>JavaScript <b>Object</b> Notation</i>. Ett objekt är ju en sak som vet vad den är och kan göra saker själv, dvs. en datastruktur med tillhörande kod som beskriver hur den skall uppföra sig.<br />
När man serialiserar ett objekt till en JSON-sträng försvinner alla kodreferenser, dvs. objektets metoder, kvar har man bara datastrukturen. Därför kan det tyckas vara mer korrekt att det borde kallas <i>JavaScript <b>Data</b> Notation</i></p>
<h5>Välsigna datastrukturer</h5>
<p>Vad gör vi då för att kunna använda datastrukturer som blivit deserialiserade från JSON som fullfjädrade objekt? Vi kan välsigna dem tillbaka till sin klasstillhörighet genom att koppla ihop datastrukturen med metoderna från klassen igen. Därför skapar vi en en konstruktor som heter <code><b>bless</b></code> i basklassen för alla klasser <code><b>Class</b></code> som tar en datastruktur och utökar en ny instans av klassen med denna.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Contructor that returns a new instance of this class</span>
<span style="color: #006600; font-style: italic;">// extended with all properties of the given data structure</span>
<span style="color: #003366; font-weight: bold;">Class</span>.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">bless</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> $extend<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> data<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>Då kan vi sedan göra exempelvis så här:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> MyClass <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> <span style="color: #003366; font-weight: bold;">Class</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
	myData<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Hello, world!&quot;</span><span style="color: #339933;">,</span>
	doStuff<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;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">myData</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>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> myObject <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> MyClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> string <span style="color: #339933;">=</span> JSON.<span style="color: #660066;">encode</span><span style="color: #009900;">&#40;</span>myObject<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> JSON.<span style="color: #660066;">decode</span><span style="color: #009900;">&#40;</span>string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// data.doStuff();  &lt;--- Not possible here</span>
<span style="color: #003366; font-weight: bold;">var</span> newObject <span style="color: #339933;">=</span> MyClass.<span style="color: #660066;">bless</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
newObject.<span style="color: #660066;">doStuff</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>På så vis kan man återskapa objekt som är identiska med de som skickades trots att de har blivit omvandlade till och från en ren textsträng på vägen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/10/06/json-och-mootools-for-web-workers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScriptprestanda</title>
		<link>http://blogg.athega.se/2009/10/01/javascriptprestanda/</link>
		<comments>http://blogg.athega.se/2009/10/01/javascriptprestanda/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 17:26:03 +0000</pubDate>
		<dc:creator>Johan Beronius</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Prestanda]]></category>
		<category><![CDATA[Programmeringsspråk]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[Benchmark]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=450</guid>
		<description><![CDATA[För moderna webbapplikationer där en större del av koden körs i webbläsaren blir det allt viktigare med bra prestanda för exekvering av JavaScript.
För att kontrollera text i formulärfält och liknande simpla uppgifter är inte hastigheten så avgörande, men vad händer om man försöker köra tyngre beräkningar? För att göra ett benchmark som testar prestandan i [...]]]></description>
			<content:encoded><![CDATA[<p>För moderna webbapplikationer där en större del av koden körs i webbläsaren blir det allt viktigare med bra prestanda för exekvering av JavaScript.<br />
För att kontrollera text i formulärfält och liknande simpla uppgifter är inte hastigheten så avgörande, men vad händer om man försöker köra tyngre beräkningar? För att göra ett benchmark som testar prestandan i de vanligaste webbläsarna har jag skrivit ett <a href="http://www.athega.se/sudoku/" target="_blank">program som löser Sudokus</a>.</p>
<p><a href="http://www.athega.se/sudoku/" target="_blank"><img class="aligncenter size-full wp-image-452" src="http://blogg.athega.se/wp-content/uploads/2009/10/sudoku1.png" alt="Ett program som löser Sudoku med JavaScript" width="190" height="184" /></a></p>
<p>För att jämföra de olika webbläsarna har jag kört <a href="http://www.athega.se/sudoku/#CzCJYmBdUXEZADK9UgmAjgFszJIhc" target="_blank">denna Sudoku-kombination</a> och jämfört tiden det tar att räkna fram alla möjliga lösningar på just min dator. Resultatet är ganska häpnadsväckande, som ni kan se i grafen nedan så utklassar Safari Internet Explorer med nästan en faktor på tio-till-ett. Chrome hamnar inte långt efter och både Firefox och Opera placerar sig hyffsat bra. Och då används inte ens Web Worker-trådar som har visat sig ha potential att dubbla prestandan och ytterligare öka försprånget för alla andra webbläsare framför Internet Explorer.</p>
<p><a href="http://www.athega.se/sudoku/#CzCJYmBdUXEZADK9UgmAjgFszJIhc" target="_blank"><img class="size-full wp-image-453" src="http://blogg.athega.se/wp-content/uploads/2009/10/jsgraph.png" alt="Tid för att lösa ett Sudoku med JavaScript i olika webbläsare" width="600" height="463" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/10/01/javascriptprestanda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 och canvas</title>
		<link>http://blogg.athega.se/2009/07/08/html5-och-canvas/</link>
		<comments>http://blogg.athega.se/2009/07/08/html5-och-canvas/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 11:23:49 +0000</pubDate>
		<dc:creator>Christian Lizell</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=289</guid>
		<description><![CDATA[Rita, animera och kontrollera pixlarna på webbsidan. Den nya &#60;canvas&#62;-taggen i HTML5 revolutionerar det som är möjligt att göra i en webbapplikation eller webbsida.
Det bubblar av exempel på och demonstrationer av vad som är möjligt med webbläsare som har stöd för HTML5. I skrivandets stund kan man slarvigt säga att det är de flesta större [...]]]></description>
			<content:encoded><![CDATA[<p>Rita, animera och kontrollera pixlarna på webbsidan. Den nya &lt;canvas&gt;-taggen i HTML5 revolutionerar det som är möjligt att göra i en webbapplikation eller webbsida.</p>
<p>Det bubblar av exempel på och demonstrationer av vad som är möjligt med webbläsare som har stöd för HTML5. I skrivandets stund kan man slarvigt säga att det är de flesta större alternativen till Internet Explorer som visar framfötterna. Firefox, Safari och Opera är alla långt framme vad gäller stöd för HTML5. Microsoft är <a title="Implementations in Web browsers" href="http://wiki.whatwg.org/wiki/Implementations_in_Web_browsers">inte riktigt med i matchen</a> ännu. men <a title="What's New in Internet Explorer 8" href="http://msdn.microsoft.com/en-us/library/cc288472%28VS.85%29.aspx#compat">jobbar på det</a>, i alla fall enligt egen utsago. Tyvärr är det ju så att IE måste med, för att vi ska kunna börja använda oss av HTML5-specifika funktioner på riktigt.</p>
<h2>Den populära spegeleffekten</h2>
<p><a href="http://www.athega.se/files/canvas_mirror.html"><img class="size-medium wp-image-292  alignright" title="Spegeleffekt med canvas-taggen" src="http://blogg.athega.se/wp-content/uploads/2009/07/Spegeleffekt-med-canvas-111x300.jpg" alt="Spegeleffekt med canvas-taggen" width="67" height="180" /></a></p>
<p>Vi ska titta på hur man kan skapa en spegeleffekt av exempelvis en bild med hjälp av canvas-taggen. Jag har använt två canvas-taggar, en för huvudbilden och en för den reflekterande ytan. Huvudbilden hade kunnat visas med en vanlig img-tagg, men jag ville ha möjligheten att &#8221;rita&#8221; och animera bilden också. Bilden föreställer min yngsta son, Carl.</p>
<p>Principen är enkel; skapa en canvas-tagg med vanlig markup, rita i den med JavaScript.</p>
<h3>1. Skapa canvas-taggar</h3>
<p>Börja med att definiera två canvas att rita i.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;canvas</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;myCanvas&quot;</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;164&quot;</span> <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;258&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Din webbläsare har inte stöd för canvas-taggen<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/canvas<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;br</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;canvas</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;mirrorCanvas&quot;</span> <span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;164&quot;</span> <span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;258&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/canvas<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Innehållet i canvas-taggen är valfritt, men är tänkt att visas för äldre webbläsare eller webbläsare som helt enkelt inte har stöd för canvas-taggen (Varning: tidiga versioner av Safari visade dock detta innehåll). För att enkelt komma åt canvasytorna ger vi dem varsitt ID och en definierad storlek.</p>
<h3>2. Ladda huvudbilden</h3>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> mainCanvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'myCanvas'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> mainCtx <span style="color: #339933;">=</span> mainCanvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> img <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Image<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
img.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'carl.jpg'</span><span style="color: #339933;">;</span>
img.<span style="color: #000066;">onload</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>
  mainCtx.<span style="color: #660066;">drawImage</span><span style="color: #009900;">&#40;</span>img<span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</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>För att komma åt pixlarna i canvas-ytan, hämtas ett 2d-kontext, som sedan används av <code>drawImage</code> för att rita bilden.</p>
<h3>3. Skapa spegeleffekten</h3>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> mirrorCanvas <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'mirrorCanvas'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> mirrorCtx <span style="color: #339933;">=</span> mirrorCanvas.<span style="color: #660066;">getContext</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'2d'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> mainData <span style="color: #339933;">=</span> mainCtx.<span style="color: #660066;">getImageData</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> mainCanvas.<span style="color: #660066;">width</span><span style="color: #339933;">,</span> mainCanvas.<span style="color: #660066;">height</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> mirrorData <span style="color: #339933;">=</span> mirrorCtx.<span style="color: #660066;">getImageData</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> mirrorCanvas.<span style="color: #660066;">width</span><span style="color: #339933;">,</span> mirrorCanvas.<span style="color: #660066;">height</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> gradientStep <span style="color: #339933;">=</span> <span style="color: #CC0000;">70</span> <span style="color: #339933;">/</span> mainData.<span style="color: #660066;">height</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> x <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> x <span style="color: #339933;">&lt;</span> mainData.<span style="color: #660066;">width</span><span style="color: #339933;">;</span> x<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> currentAlpha <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</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> y <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> y <span style="color: #339933;">&lt;</span> mainData.<span style="color: #660066;">height</span> <span style="color: #339933;">;</span> y<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> mainIdx <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">+</span> y <span style="color: #339933;">*</span> mainData.<span style="color: #660066;">width</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> mirrorIdx <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>mainData.<span style="color: #660066;">height</span> <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span> <span style="color: #339933;">-</span> y<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> mainData.<span style="color: #660066;">width</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">4</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>p<span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> p<span style="color: #339933;">&lt;</span><span style="color: #CC0000;">3</span><span style="color: #339933;">;</span> p<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			mirrorData.<span style="color: #660066;">data</span><span style="color: #009900;">&#91;</span>mirrorIdx<span style="color: #339933;">+</span>p<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> mainData.<span style="color: #660066;">data</span><span style="color: #009900;">&#91;</span>mainIdx<span style="color: #339933;">+</span>p<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		mirrorData.<span style="color: #660066;">data</span><span style="color: #009900;">&#91;</span>mirrorIdx <span style="color: #339933;">+</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> currentAlpha<span style="color: #339933;">;</span>
&nbsp;
		currentAlpha <span style="color: #339933;">+=</span> gradientStep<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
mirrorCtx.<span style="color: #660066;">putImageData</span><span style="color: #009900;">&#40;</span>mirrorData<span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Vi börjar med att hämta pixelarrayer för både huvudbilden och den spegelvända bilden. Detta görs med funktionen <code>getImageData</code>. Den returnerar en platt array med fyra poster för varje pixel. Dessa är i turordning värden för pixelns röda-, gröna-, blåa- och alphavärden.</p>
<p>Huvudbildens pixlar stegas sedan igenom kolumnvis, så att vi kan skapa en reflektion genom att gradvis öka värdet på alphakanalen från 0 till 70 (255 är max). Jag läser uppifrån och ner i huvudbilden, men ritar nerifrån och upp i spegelbilden och får på så sätt bilden spegelvänd.</p>
<p>Till sist uppdaterar vi spegelytan med den modifierade pixelarrayen genom att anropa <code>putImageData</code>.</p>
<h3>4. Ett fungerande exempel</h3>
<p><a href="http://www.athega.se/files/canvas_mirror.html">Här</a> finns ett fungerade exempel. För att visa att spegelytan är levande, har jag lagt till en animering som startas och stoppas genom att klicka i bilden. Tänk på att du behöver en hyfsat uppdaterad webbläsare som inte är Internet Explorer.</p>
<p>HTML och JavaScript:</p>
<ul>
<li><a href="http://www.athega.se/files/canvas_mirror.html">canvas_mirror.html</a></li>
<li><a href="http://www.athega.se/files/canvas_mirror.js">canvas_mirror.js</a></li>
</ul>
<h3>Avslutningsvis, några imponerande canvas-exempel</h3>
<div id="attachment_311" class="wp-caption alignleft" style="width: 260px"><a href="http://gyu.que.jp/jscloth/touch.html"><img src="http://blogg.athega.se/wp-content/uploads/2009/07/js-touch.jpg" alt="Realtidsrendrering av 3D-modell av en iPod Touch" title="js touch" width="250" height="245" class="size-full wp-image-311" /></a><p class="wp-caption-text">Realtidsrendrering av 3D-modell av en iPod Touch</p></div> <div id="attachment_312" class="wp-caption alignleft" style="width: 194px"><a href="http://www.kevs3d.co.uk/dev/asteroids/"><img src="http://blogg.athega.se/wp-content/uploads/2009/07/Asteroids-HTML-5-Canvas-and-JavaScript-demo.jpg" alt="Ett fullt fungerade Asteroids implementerat endast med Canvas och JavaScript" title="Asteroids - HTML 5 Canvas and JavaScript demo" width="184" height="219" class="size-full wp-image-312" /></a><p class="wp-caption-text">Ett fullt fungerade Asteroids implementerat endast med Canvas och JavaScript</p></div> <div id="attachment_314" class="wp-caption alignleft" style="width: 227px"><a href="http://blog.mozbox.org/post/2009/04/12/Firefox-35%3A-a-new-experiment-with-Canvas-Video"><img src="http://blogg.athega.se/wp-content/uploads/2009/07/Dynamic-Content-Injection.jpg" alt="Ett canvas tillsammans med bland annat video-taggen för att analysera var de två iPhone-telfonerna är och i realtid uppdatera innehållet mellan dem med exempelvis innehållet från en annan video-tagg." title="Dynamic Content Injection" width="217" height="288" class="size-full wp-image-314" /></a><p class="wp-caption-text">Ett canvas tillsammans med bland annat video-taggen för att analysera var de två iPhone-telfonerna är och i realtid uppdatera innehållet mellan dem med exempelvis innehållet från en annan video-tagg.</p></div>
<h2>Läs mer</h2>
<ul>
<li><a href="http://developer.mozilla.org/en/Canvas_tutorial">Mozilla Developer Tutorial</a></li>
<li>Bloggat om canvas på <a href="http://hacks.mozilla.org/category/canvas/">hacks.mozilla.org</a></li>
<li><a href="http://www.nihilogic.dk/labs/canvas_sheet/HTML5_Canvas_Cheat_Sheet.png">Canvas Cheat Sheet</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/07/08/html5-och-canvas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lär dig leva utan ancestorView</title>
		<link>http://blogg.athega.se/2009/07/02/lar-dig-leva-utan-ancestorview/</link>
		<comments>http://blogg.athega.se/2009/07/02/lar-dig-leva-utan-ancestorview/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 12:04:38 +0000</pubDate>
		<dc:creator>Christian Lizell</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[Escenic]]></category>
		<category><![CDATA[Kod]]></category>
		<category><![CDATA[Prestanda]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[ancestorView]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=255</guid>
		<description><![CDATA[Under våren har jag jobbat med att trimma en webbapplikation som levererar nätupplagan av en av Sveriges större tidningar. CMS-verktyget som används är Escenic i version 4.x och det kommer med en rad egna JSP-tagar. En av dom ska man dock akta sig för – &#60;section:ancestorView&#62;. Den är faktiskt inte så svår att leva utan [...]]]></description>
			<content:encoded><![CDATA[<p>Under våren har jag jobbat med att trimma en webbapplikation som levererar nätupplagan av en av Sveriges större tidningar. CMS-verktyget som används är <a href="http://www.escenic.com">Escenic</a> i version 4.x och det kommer med en rad egna JSP-tagar. En av dom ska man dock akta sig för – <code>&lt;section:ancestorView&gt;</code>. Den är faktiskt inte så svår att leva utan heller. I den här artikeln visar jag hur.</p>
<div id="attachment_256" class="wp-caption aligncenter" style="width: 625px"><img class="size-full wp-image-256 " title="Responstid" src="http://blogg.athega.se/wp-content/uploads/2009/07/response_time.jpg" alt="Responstid före och efter jag bytt ut &lt;section:ancerstorView&gt;" width="615" height="276" /><p class="wp-caption-text">Responstid före och efter jag bytt ut ancerstorview-taggen</p></div>
<h2>Vad är ancestorView?</h2>
<p><code>ancestorView</code> används för att skapa en hierarkisk vy av sektioner utgående från den sektion du anger. Inget speciellt avancerat eller konstigt. Det borde inte heller vara jobbigt för systemet att skapa vyn, tyvärr sker något under ytan som ställer till det. Berätta gärna vad i kommentarerna. <img src='http://blogg.athega.se/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2>Hur det kan se ut (före)</h2>
<p>Ett vanligt sätt att använda sig av <code>ancestorView</code> är för att exempelvis bygga en sökväg till en navigering:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;section:ancestorView</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;sectionView&quot;</span> <span style="color: #000066;">section</span>=<span style="color: #ff0000;">&quot;${article.homeSection}&quot;</span> <span style="color: #000066;">includeRoot</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;menu:use</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;navigation&quot;</span> <span style="color: #000066;">treeName</span>=<span style="color: #ff0000;">&quot;myMenuName&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:set</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;count&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;1&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;view:iterate</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;item&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;sectionView&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;menu:item</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;current&quot;</span> <span style="color: #000066;">sectionId</span>=<span style="color: #ff0000;">&quot;${item.id}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:when</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;${count eq 1}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:set</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;sectionPath&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${current.text}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/c:when<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:set</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;sectionPath&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${sectionPath}/${current.text}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/c:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/c:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:set</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;count&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${count+1}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/view:iterate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/menu:use<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<h2>Skapa en lättviktig ersättning till <code>ancestorView</code></h2>
<p>En enkel väg till ett liv utan <code>ancestorView</code>-taggar är att skapa en mycket enkel custom tag. Nedanstående implementation har inte stöd för precis allt du kan göra med Escenics variant, men den gör jobbet för de flesta användningsfallen. Jag döpte den till <code>ancestors.tag</code> och la den i <code>/WEB-INF/lib/tags/section</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #339933;">&lt;%</span>@tag body-content=<span style="color: #0000ff;">&quot;empty&quot;</span><span style="color: #339933;">%&gt;</span>
<span style="color: #339933;">&lt;%</span>@tag <span style="color: #000000; font-weight: bold;">import</span>=<span style="color: #0000ff;">&quot;neo.xredsys.api.Section, java.util.ArrayList&quot;</span><span style="color: #339933;">%&gt;</span>
<span style="color: #339933;">&lt;%</span>@attribute name=<span style="color: #0000ff;">&quot;id&quot;</span> required=<span style="color: #0000ff;">&quot;true&quot;</span> rtexprvalue=<span style="color: #0000ff;">&quot;false&quot;</span><span style="color: #339933;">%&gt;</span>
<span style="color: #339933;">&lt;%</span>@attribute name=<span style="color: #0000ff;">&quot;section&quot;</span> type=<span style="color: #0000ff;">&quot;neo.xredsys.api.Section&quot;</span> required=<span style="color: #0000ff;">&quot;true&quot;</span><span style="color: #339933;">%&gt;</span>
<span style="color: #339933;">&lt;%</span>@attribute name=<span style="color: #0000ff;">&quot;includeRoot&quot;</span> type=<span style="color: #0000ff;">&quot;java.lang.String&quot;</span> required=<span style="color: #0000ff;">&quot;false&quot;</span><span style="color: #339933;">%&gt;</span>
<span style="color: #339933;">&lt;%</span>@variable name-from-attribute=<span style="color: #0000ff;">&quot;id&quot;</span> alias=<span style="color: #0000ff;">&quot;sectionPath&quot;</span> scope=<span style="color: #0000ff;">&quot;AT_END&quot;</span><span style="color: #339933;">%&gt;</span>
<span style="color: #339933;">&lt;%</span>
	<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399; font-weight: bold;">ArrayList</span> sections = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">ArrayList</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>section <span style="color: #339933;">!</span>= <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000;  font-weight: bold;">do</span> <span style="color: #009900;">&#123;</span>
			sections.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span>, section<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			section = section.<span style="color: #006633;">getParent</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: #000000;  font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>section <span style="color: #339933;">!</span>= <span style="color: #006600; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;true&quot;</span>.<span style="color: #006633;">equals</span><span style="color: #009900;">&#40;</span>includeRoot<span style="color: #009900;">&#41;</span> || section.<span style="color: #006633;">getParent</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!</span>= <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	jspContext.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;sectionPath&quot;</span>, sections<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">%&gt;</span></pre></div></div>

<p>Det enda som egentligen sker här är att jag bygger upp en lista med föräldrasektioner i omvänd ordning genom att anropa Escenics API. Detta går av någon anledning massor med gånger snabbare.</p>
<h2>Hur det kan se ut utan <code>ancestorView</code (efter)</h2>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt;%@ taglib <span style="color: #000066;">prefix</span>=<span style="color: #ff0000;">&quot;sec&quot;</span> <span style="color: #000066;">tagdir</span>=<span style="color: #ff0000;">&quot;/WEB-INF/tags/section&quot;</span> %<span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;sec:ancestors</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;sectionView&quot;</span> <span style="color: #000066;">section</span>=<span style="color: #ff0000;">&quot;${article.homeSection}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;menu:use</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;navigation&quot;</span> <span style="color: #000066;">treeName</span>=<span style="color: #ff0000;">&quot;myMenuName&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:forEach</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;item&quot;</span> <span style="color: #000066;">items</span>=<span style="color: #ff0000;">&quot;${sectionView}&quot;</span> <span style="color: #000066;">varStatus</span>=<span style="color: #ff0000;">&quot;itemStat&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;menu:item</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;current&quot;</span> <span style="color: #000066;">sectionId</span>=<span style="color: #ff0000;">&quot;${item.id}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:when</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;${itemStat.first}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:set</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;sectionPath&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${current.text}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/c:when<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;c:set</span> <span style="color: #000066;">var</span>=<span style="color: #ff0000;">&quot;sectionPath&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${sectionPath}/${current.text}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/c:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/c:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/c:forEach<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/menu:use<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Eftersom jag inte längre arbetar med en vy av sektioner, kan jag iterera över listan med föräldrasektioner med en vanlig <code>c:foreach</code> med fördelar som <code>varStatus</code>, mm.</p>
<h2>Slutsats</h2>
<p>Om du använder Escenic i någon 4.x-version och om du får några träffar när du söker på ancestorView i din kodbas, finns all anledning att se över ett byte!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/07/02/lar-dig-leva-utan-ancestorview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf: Tutorials</title>
		<link>http://blogg.athega.se/2009/05/05/railsconf-tutorials/</link>
		<comments>http://blogg.athega.se/2009/05/05/railsconf-tutorials/#comments</comments>
		<pubDate>Tue, 05 May 2009 01:31:13 +0000</pubDate>
		<dc:creator>Peter Hellberg</dc:creator>
				<category><![CDATA[Konferens]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[RailsConf]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=171</guid>
		<description><![CDATA[
JRuby on Rails &#8211; Nick Sieger (SUN Microsystems)
Presentationen: jruby-railsconf-2009.pdf
Huvudpunkterna på föreläsningen var:

Installation
Utveckling
Prestandatestning
Interaktion med Java
Testning

Jag hade gärna sett att han gått in lite mer på djupet om skillnaderna
mellan JRuby och MRI, Olika sätt att deploya (Han visade GlassFish,
med tveksamt resultat)
Ett verktyg jag helt klart kommer att använda mig av i framtiden är VisualVM.
A Hat Full of [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blogg.athega.se/wp-content/uploads/2009/05/ruby_dinette.jpg" alt="ruby_dinette" title="ruby_dinette" width="750" height="280" class="alignnone size-full wp-image-172" /></p>
<h2 id="jruby_on_rails_nick_sieger_sun_microsystems">JRuby on Rails &#8211; Nick Sieger (<a href="http://sun.com">SUN Microsystems</a>)</h2>
<p>Presentationen: <a href="http://blog.nicksieger.com/jruby-railsconf-2009.pdf">jruby-railsconf-2009.pdf</a></p>
<p>Huvudpunkterna på föreläsningen var:</p>
<ul>
<li>Installation</li>
<li>Utveckling</li>
<li>Prestandatestning</li>
<li>Interaktion med Java</li>
<li>Testning</li>
</ul>
<p>Jag hade gärna sett att han gått in lite mer på djupet om skillnaderna<br />
mellan JRuby och MRI, Olika sätt att deploya (Han visade GlassFish,<br />
med tveksamt resultat)</p>
<p>Ett verktyg jag helt klart kommer att använda mig av i framtiden är <a href="https://visualvm.dev.java.net/">VisualVM</a>.</p>
<h2 id="a_hat_full_of_tricks_with_sinatra_blake_mizerany_heroku">A Hat Full of Tricks with Sinatra &#8211; Blake Mizerany (<a href="http://heroku.com">Heroku</a>)</h2>
<p>Det första som händer är att <a href="http://chneukirchen.org/">Christian Neukirchen</a>,<br />
huvudutvecklaren av <a href="http://rack.rubyforge.org/">Rack</a> sätter sig brevid mig.</p>
<p>Första fjärdedelen av Blakes föreläsning handlar inte om<br />
<a href="http://www.sinatrarb.com/">Sinatra</a> över huvud taget utan om just <a href="http://rack.rubyforge.org/">Rack</a>.</p>
<h3 id="minimal_rack_applikation">Minimal Rack-applikation</h3>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">run <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>env<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">200</span>, <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#996600;">'Content-Type'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'text/html'</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Hello'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<h3 id="minimal_sinatra_applikation">Minimal Sinatra-applikation</h3>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'sinatra'</span>
&nbsp;
get <span style="color:#996600;">'/'</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#996600;">'Hello'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<h3 id="rekomenderade_bcker">Rekomenderade böcker</h3>
<ul>
<li><a href="http://www.amazon.com/exec/obidos/ASIN/0135974445/objectmentorinc">Agile Software Development, Principles, Patterns, and Practices</a></li>
</ul>
<h3 id="exempelkod">Exempelkod</h3>
<ul>
<li>Modulen <a href="http://github.com/bmizerany/sinatra-captcha/tree/master">sinatra-captcha</a></li>
</ul>
<h2 id="links">Relaterade länkar</h2>
<ul>
<li><a href="http://blogs.sun.com/arungupta/entry/rails_conf_2009_day_1">http://blogs.sun.com/arungupta/entry/rails_conf_2009_day_1</a></li>
</ul>
<p><img src="http://blogg.athega.se/wp-content/uploads/2009/05/gae_hackathon.png" alt="gae_hackathon" title="gae_hackathon" width="750" height="818" class="alignnone size-full wp-image-176" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/05/05/railsconf-tutorials/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails under Nginx med Phusion Passenger</title>
		<link>http://blogg.athega.se/2009/04/16/ruby-on-rails-under-nginx-med-passenger/</link>
		<comments>http://blogg.athega.se/2009/04/16/ruby-on-rails-under-nginx-med-passenger/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 20:32:31 +0000</pubDate>
		<dc:creator>Peter Hellberg</dc:creator>
				<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[phusion]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rysk]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=131</guid>
		<description><![CDATA[
Sedan några timmar så kan man köra Phusion Passenger under Nginx!
Phusion Passenger och Apache har under en tid varit det populäraste sättet att enkelt driftsätta Ruby on Rails och Rack-applikationer. Nu kan man alltså välja att köra Passenger under den ryska (och tokigt snabba) Nginx.
Det enda man behöver göra är:

Installera gem: sudo gem install passenger
Köra [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wiki.nginx.org/"><img class="size-full wp-image-135" title="nginx-logo" src="http://blogg.athega.se/wp-content/uploads/2009/04/nginx-logo.png" alt="Nginx" width="350" height="90" /></a></p>
<p>Sedan några timmar så kan man köra <a href="http://www.modrails.com/">Phusion Passenger</a> under <a href="http://wiki.nginx.org/Main">Nginx!</a></p>
<p><a href="http://www.modrails.com/">Phusion Passenger</a> och <a href="http://httpd.apache.org/">Apache</a> har under en tid varit det populäraste sättet att enkelt driftsätta <a href="http://rubyonrails.org/">Ruby on Rails</a> och <a href="http://rack.rubyforge.org/">Rack</a>-applikationer. Nu kan man alltså välja att köra Passenger under den ryska (och <a href="http://www.linuxjournal.com/article/10108">tokigt snabba</a>) <a href="http://wiki.nginx.org/Main">Nginx</a>.</p>
<p>Det enda man behöver göra är:</p>
<ol>
<li>Installera gem: <code style="padding: 0 0.5em; color: #fff; background-color: #000;">sudo gem install passenger</code></li>
<li>Köra Nginx installern: <code style="padding: 0 0.51em; color: #fff; background-color: #000;">sudo passenger-install-nginx-module</code></li>
<li>Konfigurera (Det mesta sköts automagiskt)</li>
<li>Starta</li>
</ol>
<p>Mer ingående instruktioner finns på <a href="http://blog.phusion.nl/2009/04/16/phusions-one-year-anniversary-gift-phusion-passenger-220">Phusion’s blogg</a></p>
<h2>Phusion Passenger</h2>
<p>Hongli Lai och Ninh Bui <a href="http://en.oreilly.com/rails2008/public/schedule/detail/4354">presenterade</a> Phusion Passenger (också känd som <strong>mod_rails</strong>) under <a href="http://en.oreilly.com/rails2008/">RailsConf 2008</a>, det var då jag verkligen fick upp ögonen för projektet.</p>
<p>I den nya versionen har Phusion-grabbarna förutom att man nu kan använda sig av två olika webbservrar för att köra Passenger lagt till:</p>
<ul>
<li>Stöd för &#8221;chunked file uploads&#8221;</li>
<li>Stöd för Capistranos sätt att sköta driftsättning (Symlänkning av <code>current</code> osv.)</li>
<li>Förmåga att ladda <code>application_controller.rb</code> från en icke-standard sökväg</li>
<li>&#8221;Worker process event hooks&#8221; för Rack</li>
</ul>
<h2>Nginx</h2>
<p>Nginx driver ett flertal stora webbplatser, såsom <a class="external text" title="http://www.wordpress.com" rel="nofollow" href="http://www.wordpress.com/">WordPress</a>, <a class="external text" title="http://www.hulu.com" rel="nofollow" href="http://www.hulu.com/">Hulu</a>, <a class="external text" title="http://www.github.com/" rel="nofollow" href="http://www.github.com/">Github</a>, och <a class="external text" title="http://www.ohloh.net/" rel="nofollow" href="http://www.ohloh.net/">Ohloh</a>. Den serverar mer än två miljoner webbplatser och är därmed den näst populäraste webbservern under Linux.</p>
<p><img class="alignnone size-full wp-image-137" title="Fördelning mellan olika webbservrar" src="http://blogg.athega.se/wp-content/uploads/2009/04/web_servers_pie_chart.png" alt="Fördelning mellan olika webbservrar" width="300" height="150" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/04/16/ruby-on-rails-under-nginx-med-passenger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Athegas öppna källkod används av Valmyndigheten</title>
		<link>http://blogg.athega.se/2009/04/08/athegas-oppna-kallkod-anvands-av-valmyndigheten/</link>
		<comments>http://blogg.athega.se/2009/04/08/athegas-oppna-kallkod-anvands-av-valmyndigheten/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 15:14:43 +0000</pubDate>
		<dc:creator>Johan Beronius</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[CPAN]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Positionering]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=127</guid>
		<description><![CDATA[I mitt förra inlägg berättade jag om en Perl-modul som vi släppt som öppen källkod. Det visade sig att denna kod ganska snabbt skulle komma till nytta. Häromdagen fick jag ett e-postmeddelande från Valmyndigheten där de berättade att de använder modulen och att den passar deras behov perfekt. De använder den för att konvertera positionen [...]]]></description>
			<content:encoded><![CDATA[<p>I mitt <a href="http://blogg.athega.se/2009/03/25/athega-bidrar-till-oppen-kallkod/">förra inlägg</a> berättade jag om en Perl-modul som vi släppt som öppen källkod. Det visade sig att denna kod ganska snabbt skulle komma till nytta. Häromdagen fick jag ett e-postmeddelande från <a href="http://www.val.se/" target="_blank">Valmyndigheten </a>där de berättade att de använder modulen och att den passar deras behov perfekt. De använder den för att konvertera positionen för alla vallokaler från RT90 till SWEREF99 för presentation på en karta på webben.</p>
<p>Modulen hittar ni här: <a href="http://search.cpan.org/~jobero/Geo-SweGrid-1.0/SweGrid.pm" target="_blank">Geo::SweGrid</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/04/08/athegas-oppna-kallkod-anvands-av-valmyndigheten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Athega bidrar till öppen källkod</title>
		<link>http://blogg.athega.se/2009/03/25/athega-bidrar-till-oppen-kallkod/</link>
		<comments>http://blogg.athega.se/2009/03/25/athega-bidrar-till-oppen-kallkod/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 15:35:01 +0000</pubDate>
		<dc:creator>Johan Beronius</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[Öppen källkod]]></category>
		<category><![CDATA[CPAN]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Positionering]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=113</guid>
		<description><![CDATA[Athega har sedan länge, ända sedan starten 1997, arbetat mycket med programmeringsspråket Perl. Vi använder oss i mycket stor utsträckning av öppna och fria mjukvaror och verktyg för de system vi bygger. Därför är även en stor del av den kod vi själva producerar befriad från licenskostnader och betraktas som &#8221;open source&#8221; även om den [...]]]></description>
			<content:encoded><![CDATA[<p>Athega har sedan länge, ända sedan starten 1997, arbetat mycket med programmeringsspråket <a href="http://perl.org/" target="_blank">Perl</a>. Vi använder oss i mycket stor utsträckning av öppna och fria mjukvaror och verktyg för de system vi bygger. Därför är även en stor del av den kod vi själva producerar befriad från licenskostnader och betraktas som &#8221;<a href="http://sv.wikipedia.org/wiki/Open_source" target="_blank">open source</a>&#8221; även om den kanske i vissa fall inte finns publikt tillgänglig på nätet.</p>
<p>Saker som går att återanvända och andra kan ha nytta av delar vi gärna med oss av. Ett exempel på detta är Perl-modulen <a href="http://search.cpan.org/~jobero/Geo-SweGrid-1.0/SweGrid.pm" target="_blank"><tt>Geo::SweGrid</tt></a> som används för att konvertera geografiska koordinater mellan det system som används globalt och det som används på vissa svenska kartor.</p>
<p>Det distribuerade arkivet för Perl-moduler heter <a href="http://cpan.org/" target="_blank">CPAN</a>, dit kan alla bidra med sin kod. När en modul väl finns i arkivet kan den lätt installeras på vilken dator som helst så här:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>user<span style="color: #000000; font-weight: bold;">@</span>host ~<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> cpan
&nbsp;
cpan shell <span style="color: #660033;">--</span> CPAN exploration and modules installation <span style="color: #7a0874; font-weight: bold;">&#40;</span>v1.9304<span style="color: #7a0874; font-weight: bold;">&#41;</span>
ReadLine support enabled
&nbsp;
cpan<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">install</span> Geo::SweGrid</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/03/25/athega-bidrar-till-oppen-kallkod/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bloggportalen visar relaterade nyheter från Sesam</title>
		<link>http://blogg.athega.se/2009/03/14/bloggportalen-visar-relaterade-nyheter-fran-sesam/</link>
		<comments>http://blogg.athega.se/2009/03/14/bloggportalen-visar-relaterade-nyheter-fran-sesam/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 11:25:23 +0000</pubDate>
		<dc:creator>Johan Beronius</dc:creator>
				<category><![CDATA[Sociala nätverk]]></category>
		<category><![CDATA[Webbutveckling]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=110</guid>
		<description><![CDATA[Bloggportalen, som byggts av Athega, har en ny funktion för att visa relaterade nyheter från Sesam när man tittar på en av de mest diskterade nyheterna i bloggvärlden. Exempel på detta kan ses här.
Funktionen är liksom Bloggportalen i övrigt byggd i Java med Struts som applikationsramverk och Hibernate som ORM / Object-relational mapping och persistenslager. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bloggportalen.se/">Bloggportalen</a>, som <a href="http://www.athega.se/14/sv/Aftonbladet">byggts av Athega</a>, har en ny funktion för att visa relaterade nyheter från <a href="http://sesam.se/">Sesam</a> när man tittar på en av de mest diskterade nyheterna i bloggvärlden. Exempel på detta kan ses <a href="http://www.bloggportalen.se/BlogPortal/view/MostLinkedMediaEntries?id=217223">här</a>.</p>
<p>Funktionen är liksom Bloggportalen i övrigt byggd i <a href="http://java.sun.com/" target="_blank">Java</a> med <a href="http://struts.apache.org/" target="_blank">Struts</a> som applikationsramverk och <a href="http://www.hibernate.org/" target="_blank">Hibernate</a> som <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM / Object-relational mapping</a> och persistenslager. Data hämtas som XML över nätet från en webbtjänst hos Sesam. Sedan används <a href="http://www.w3.org/TR/xpath" target="_blank">XPath</a> för att välja ut relevant data att presentera.</p>
<p>Detta sätt att presentera information och funktionalitet från flera olika källor på en och samma webbplats kallas ibland för en <a href="http://en.wikipedia.org/wiki/Mashup_(web_application_hybrid)" target="_blank">&#8221;mashup&#8221;</a>. Ett annat exempel på detta är kartorna på Bloggportalen som skapas med hjälp av en tjänst från Google Maps.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/03/14/bloggportalen-visar-relaterade-nyheter-fran-sesam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
