<?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; Kod</title>
	<atom:link href="http://blogg.athega.se/kategori/kod/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogg.athega.se</link>
	<description>...</description>
	<lastBuildDate>Thu, 18 Nov 2010 22:17:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>lunch.athega.se</title>
		<link>http://blogg.athega.se/2010/10/30/lunch-athega-se/</link>
		<comments>http://blogg.athega.se/2010/10/30/lunch-athega-se/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 20:23:59 +0000</pubDate>
		<dc:creator>Peter Hellberg</dc:creator>
				<category><![CDATA[Athega Code Base]]></category>
		<category><![CDATA[Kod]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=927</guid>
		<description><![CDATA[Under Athega Code Base byggde jag en helt ny version av en webbapplikation som jag för två år sedan byggde i Ruby on Rails och Geokit. Denna gång valde jag att använda ramverket Sinatra, databasen MongoDB (genom Mongomatic) samt att hosta allt på Heroku och MongoHQ. Vad jag blev mest imponerad över var det inbyggda [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://lunch.athega.se/"><img class="size-full wp-image-929 alignleft" title="Lunch" src="http://blogg.athega.se/wp-content/uploads/2010/10/lunch-start-page.png" alt="Lunch, startsida" width="331" height="616" /></a></p>
<p><a href="http://lunch.athega.se/#/restaurants/matmekka"><img class="alignright size-full wp-image-928" title="Matmekka" src="http://blogg.athega.se/wp-content/uploads/2010/10/lunch-matmekka.png" alt="Matmekka" width="331" height="616" /></a></p>
<p style="clear: both; margin-top: 1em;">
Under Athega Code Base byggde jag en helt ny version av en webbapplikation som jag för två år sedan byggde i <a href="http://rubyonrails.org/">Ruby on Rails</a> och Geokit. Denna gång valde jag att använda ramverket <a href="http://www.sinatrarb.com/">Sinatra</a>, databasen <a href="http://www.mongodb.org/">MongoDB</a> (genom <a href="http://mongomatic.com/">Mongomatic</a>) samt att hosta allt på <a href="http://heroku.com/">Heroku</a> och <a href="https://mongohq.com/home">MongoHQ</a>.</p>
<p>Vad jag blev mest imponerad över var det inbyggda stödet för <a href="http://www.mongodb.org/display/DOCS/Geospatial+Indexing"><em>geospatial indexing</em></a> i MongoDB samt hur enkelt det var att jobba med Heroku.</p>
<p>Gränssnittet är utvecklat med hjälp av biblioteket <a href="http://jquerymobile.com/">jQuery Mobile</a> och det har visat sig fungera mycket bättre än <a href="http://www.jqtouch.com/">jQTouch</a> som jag tidigare har använt. Vad jag speciellt gillade var den inbyggda routern.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2010/10/30/lunch-athega-se/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScriptprestanda 2010</title>
		<link>http://blogg.athega.se/2010/09/21/javascriptprestanda-2010/</link>
		<comments>http://blogg.athega.se/2010/09/21/javascriptprestanda-2010/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 15:14:40 +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=754</guid>
		<description><![CDATA[Förra hösten skrev jag ett program som löser Sudokus och körde det som ett enkelt benchmark-test av javascriptprestandan i de olika webbläsarna. Nu har jag uppdaterat testresultatet för senaste versionen av de vanligaste webbläsarna och man kan lugnt konstatera att det hänt en hel del på javascriptfronten det senaste året. Testet jag körde är samma [...]]]></description>
			<content:encoded><![CDATA[<p>Förra hösten skrev jag ett <a href="http://athega.se/sudoku/" target="_blank">program som löser Sudokus</a> och körde det som ett enkelt <a href="http://blogg.athega.se/2009/10/01/javascriptprestanda/">benchmark-test av javascriptprestandan</a> i de olika webbläsarna.</p>
<p>Nu har jag uppdaterat testresultatet för senaste versionen av de vanligaste webbläsarna och man kan lugnt konstatera att det hänt en hel del på javascriptfronten det senaste året.<br />
Testet jag körde är samma <a href="http://athega.se/sudoku/#CzCJYmBdUXEZADK9UgmAjgFszJIhc" target="_blank">Sudoku-kombination</a> som förra gången. Tiden det tar att räkna fram alla möjliga lösningar på just min dator jämförs med tiden det tog i den version av respektive webbläsare som var aktuell för ett år sedan. </p>
<p>Internet Explorer står för den överlägset största förbättringen och är verkligen med i matchen nu. Opera har gjort ett rejält ryck och kapat sin tid till en bråkdel. Firefox har förbättrat sin tid lite men har ändå helt plötsligt hamnat efter de andra. Chrome och Safari har putsat mer marginellt på sina redan låga tider.</p>
<p><a href="http://athega.se/sudoku/#CzCJYmBdUXEZADK9UgmAjgFszJIhc" target="_blank"><img class="aligncenter size-full wp-image-755" alt="Tid för att lösa ett Sudoku med JavaScript i olika webbläsare" src="http://blogg.athega.se/wp-content/uploads/2010/09/jsgraph2010.png" width="680" height="463" /></a></p>
<p><em>Uppdatering:</em> Grafen ovan är kompletterad med värden för senaste betan av Firefox 4, beta 6, där man kan se att hastigheten tagit ett litet steg tillbaka. Däremot verkar det vara bra saker på gång eftersom den senaste &#8221;nightly&#8221;, beta 7 pre, visar att de klippt över hälften på tiden och hamnar på par med Chrome.</p>
<p><a href="http://athega.se/sudoku/#CzCJYmBdUXEZADK9UgmAjgFszJIhc" target="_blank"><img class="aligncenter size-full wp-image-755" alt="Tid för att lösa ett Sudoku med JavaScript i olika webbläsare på OSX" src="http://blogg.athega.se/wp-content/uploads/2010/09/jsgraph-osx.png" width="600" height="463" /></a></p>
<p>På Mac OSX ser det ut så här. Där skiljer ingenting mellan Firefox 3.6 och Firefox 4.0 beta 6. Men &#8221;nightly&#8221; beta 7 pre knappar in på sina fortfarande snabbare konkurrenter. Framförallt Chrome 6 imponerar stort med bara en halv sekund.</p>
<p><a href="http://athega.se/sudoku/#CzCJYmBdUXEZADK9UgmAjgFszJIhc" target="_blank"><img class="aligncenter size-full wp-image-755" alt="Tid för att lösa ett Sudoku med JavaScript i olika webbläsare på olika mobiltelefoner" src="http://blogg.athega.se/wp-content/uploads/2010/09/jsgraph-mobile.png" width="500" height="463" /></a></p>
<p>På mobiltelefoner går det förstås inte lika snabbt. Här blir det inte heller så mycket en jämförelse mellan olika webbläsare utan mellan olika mobilplattformar och dess hårdvara. Det kan ändå ge en liten uppfattning vad man har för javascriptprestanda att tillgå när man utvecklar webbapplikationer för en mobil jämfört med en fullstor webbläsare.<br />
Om du klickar på grafen och kör detta test på din mobil, skriv gärna resultatet som en kommentar.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2010/09/21/javascriptprestanda-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<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 [...]]]></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>3</slash:comments>
		</item>
		<item>
		<title>Extensions för EPiServer</title>
		<link>http://blogg.athega.se/2010/03/18/extensions-for-episerver/</link>
		<comments>http://blogg.athega.se/2010/03/18/extensions-for-episerver/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 18:17:29 +0000</pubDate>
		<dc:creator>Markus Ullmark</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[Kod]]></category>
		<category><![CDATA[Produktivitet]]></category>
		<category><![CDATA[Öppen källkod]]></category>
		<category><![CDATA[EPiServer]]></category>
		<category><![CDATA[Extensions]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=361</guid>
		<description><![CDATA[Jag har arbetat med EPiServer ett bra tag nu, och har sedan .NET 3.5 släpptes med möjligheten att &#8221;bygga ut&#8221; objekt med egna funktioner använt ett gäng sådana för att underlätta mitt dagliga arbete. Jag har haft mina Extensions liggande ett tag på Github men tänkte även skriva en liten post om det här. Ett [...]]]></description>
			<content:encoded><![CDATA[<p>Jag har arbetat med EPiServer ett bra tag nu, och har sedan .NET 3.5 släpptes med möjligheten att &#8221;bygga ut&#8221; objekt med egna funktioner använt ett gäng sådana för att underlätta mitt dagliga arbete. Jag har haft mina Extensions liggande ett tag på Github men tänkte även skriva en liten post om det här.</p>
<p>Ett exempel på en användning skulle t.ex kunna vara att du vill slumpa ut tio av en sidas barn, du vill också se till att bara hämta de som är publicerade. Genom att ha några smarta extensions så skulle du kunna göra såhär.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">PageDataCollection pages <span style="color: #008000;">=</span> CurrentPage.<span style="color: #0000FF;">GetChildren</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> FilterPublished<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #008000;">new</span> FilterRandom<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Utan Extensions skulle detta kräva ett antal rader kod ytterligare och det är det lilla extra som gör att man trivs med ett API.<br />
Eftersom filterparametern är en <em>params</em> parameter kan man kombinera ihop hur många filter man vill, egengjorda eller de som ingår i EPiServer. FilterRandom är bara ett enkelt filter för att slumpa ut ett antal sidor som jag gjort.<br />
Min klass innehåller ett antal funktioner för att underlätta arbetet med EPiServer så det är bara att ta ner min klass och se om det är något ni gillar.</p>
<ul>
<li><a href="http://github.com/ullmark/cs-extensions/blob/master/EPiServerExtensions.cs">EPiServer Extensions</a></li>
</ul>
<p>Inte nöjd med mina eller vill du ha ännu mer extensions så kan du kolla på EPiCode där man försöker sammanställa bra extensions från epi-utvecklare.</p>
<ul>
<li><a href="https://www.coderesort.com/p/epicode/wiki/Extensions">EPiCode</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2010/03/18/extensions-for-episerver/feed/</wfw:commentRss>
		<slash:comments>0</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 [...]]]></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 [...]]]></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://athega.se/sudoku/" target="_blank">program som löser Sudokus</a>.</p>
<p><a href="http://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://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://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>1</slash:comments>
		</item>
		<item>
		<title>Hpricot och Sinatra på Google App Engine</title>
		<link>http://blogg.athega.se/2009/09/01/hpricot-och-sinatra-pa-google-app-engine/</link>
		<comments>http://blogg.athega.se/2009/09/01/hpricot-och-sinatra-pa-google-app-engine/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 14:50:52 +0000</pubDate>
		<dc:creator>Mikael Forsberg</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Hpricot]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=420</guid>
		<description><![CDATA[Hpricot är en HTML parser som är skriven i Ruby. Jag gillar den eftersom den är snabb och extremt enkel att jobba med. Den är perfekt om man vill extrahera innehåll från en webbsida som inte tillhandahåller ett färdigt api. Det finns många bra tutorials på nätet. Ett enkelt exempel För att till exempel hitta [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Hpricot" href="http://github.com/whymirror/hpricot/tree/master">Hpricot</a> är en HTML parser som är skriven i Ruby. Jag gillar den eftersom den är snabb och extremt enkel att jobba med. Den är perfekt om man vill extrahera innehåll från en webbsida som inte tillhandahåller ett färdigt api. Det finns <a href="http://www.google.se/search?q=hpricot+tutorial&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=com.ubuntu:en-US:official&amp;client=firefox-a">många</a> <a href="http://soledadpenades.com/2007/06/15/extracting-data-with-hpricot/">bra</a> <a title="Installera Hpricot för Jruby" href="http://stackoverflow.com/questions/726412/installing-hpricot-for-jruby">tutorials</a> på nätet.</p>
<h2>Ett enkelt exempel</h2>
<p>För att till exempel hitta alla nyheter på Athegas första sida kan man göra så här.</p>

<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;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'open-uri'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'hpricot'</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Läs in Athegas första sida</span>
doc = Hpricot<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;http://athega.se&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># Xpath uttryck för att hitta nyheterna</span>
result = doc<span style="color:#006600; font-weight:bold;">/</span><span style="color:#996600;">&quot;//*[@id='helplist']/li/a&quot;</span></pre></div></div>

<h2>Hpricot på Google App Engine</h2>
<p>Jag ville använda Hpricot tillsammans med <a href="http://jruby.org/">Jruby</a> och <a href="http://www.sinatrarb.com/">Sinatra</a> (som Peter har <a href="http://blogg.athega.se/2009/03/08/sinatra-och-google-spreadsheet/">skrivit</a> mer om) på <a href="http://code.google.com/appengine/">Google App Engine</a>. Jag följde den här <a href="http://blog.bigcurl.de/2009/04/running-sinatra-apps-on-google.html">guiden</a> för att komma igång med min Sinatra applikation på App Engine  och det gick smärtfritt. Tyvärr så small det direkt när jag försökte använda mig av Hpricot. Ett AccessControlException kastades.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">javax.<span style="color: #006633;">servlet</span>.<span style="color: #006633;">ServletContext</span> log<span style="color: #339933;">:</span> Application <span style="color: #003399;">Error</span>
java.<span style="color: #006633;">security</span>.<span style="color: #003399;">AccessControlException</span><span style="color: #339933;">:</span> access denied <span style="color: #009900;">&#40;</span>java.<span style="color: #006633;">net</span>.<span style="color: #003399;">SocketPermission</span> athega.<span style="color: #006633;">se</span> resolve<span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">security</span>.<span style="color: #003399;">AccessControlContext</span>.<span style="color: #006633;">checkPermission</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">AccessControlContext</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">323</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">security</span>.<span style="color: #003399;">AccessController</span>.<span style="color: #006633;">checkPermission</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">AccessController</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">546</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">lang</span>.<span style="color: #003399;">SecurityManager</span>.<span style="color: #006633;">checkPermission</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">SecurityManager</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">532</span><span style="color: #009900;">&#41;</span>
at com.<span style="color: #006633;">google</span>.<span style="color: #006633;">appengine</span>.<span style="color: #006633;">tools</span>.<span style="color: #006633;">development</span>.<span style="color: #006633;">DevAppServerFactory</span>$CustomSecurityManager.<span style="color: #006633;">checkPermission</span><span style="color: #009900;">&#40;</span>DevAppServerFactory.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">lang</span>.<span style="color: #003399;">SecurityManager</span>.<span style="color: #006633;">checkConnect</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">SecurityManager</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">1031</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">net</span>.<span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">getAllByName0</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">1145</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">net</span>.<span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">getAllByName</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">1083</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">net</span>.<span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">getAllByName</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">1019</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">net</span>.<span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">getByName</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">969</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Vilket tyder på att någon javaklass som inte är med på Googles <a href="http://code.google.com/appengine/docs/java/jrewhitelist.html">lista</a> över tillåtna klasser användes.  När jag studerade stacktracet lite närmare märkte jag att det var open-uri som ville använda javaklassen <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/net/InetAddress.html">InetAddress</a> som inte finns med i listan på godkända klasser.</p>
<p>Eftersom man med hjälp av Jruby kan &#8221;scripta&#8221; java var det relativt enkelt att byta ut open-uri mot godkända javaklasser istället  och sedan <a href="http://kenai.com/projects/jruby/pages/CallingJavaFromJRuby#Convert_a_Java_InputStream_to_a_ruby_IO_object">automagiskt</a> göra om java InputStream objektet till ett ruby io objekt som Hpricot kan ta i sin konstruktor. Lösningen blev enligt nedan.</p>

<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;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'hpricot'</span>
<span style="color:#008000; font-style:italic;"># Importerar java istället för open-uri</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'java'</span>
<span style="color:#008000; font-style:italic;"># Skapa en instans av java-klassen URL</span>
url = java.<span style="color:#9900CC;">net</span>.<span style="color:#9900CC;">URL</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;http://athega.se&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># Kasta om java inputstreamen till ett ruby io objekt</span>
ruby_io = org.<span style="color:#9900CC;">jruby</span>.<span style="color:#9900CC;">RubyIO</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>JRuby.<span style="color:#9900CC;">runtime</span>, url.<span style="color:#9900CC;">openStream</span><span style="color:#006600; font-weight:bold;">&#41;</span>
io = Java.<span style="color:#9900CC;">java_to_ruby</span><span style="color:#006600; font-weight:bold;">&#40;</span>ruby_io.<span style="color:#9900CC;">java_object</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># Sen är det bara att använda Hpricot som vanligt</span>
doc = Hpricot<span style="color:#006600; font-weight:bold;">&#40;</span>io<span style="color:#006600; font-weight:bold;">&#41;</span>
result = doc<span style="color:#006600; font-weight:bold;">/</span><span style="color:#996600;">&quot;//*[@id='helplist']/li/a&quot;</span></pre></div></div>

<p>Sedan transformerade jag resultatet till JSON och la upp applikationen här <a href="http://athega-news-api.appspot.com">http://athega-news-api.appspot.com</a> (OBS, applikationen returnerar JSON direkt så jag rekommenderar <a href="https://addons.mozilla.org/en-US/firefox/addon/10869">JSONView</a> pluginet till Firefox om man vill titta på datan)</p>
<p>Om någon vill titta närmare på <a href="http://github.com/ragulin/hpricot-and-sinatra-on-google-app-engine/tree/master">koden</a> ligger den på Github men tänk på se till så att ni har tillstånd av rättighetsinnehavaren innan ni plockar data från webben.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/09/01/hpricot-och-sinatra-pa-google-app-engine/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 [...]]]></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>MongoDB</title>
		<link>http://blogg.athega.se/2009/07/06/mongodb/</link>
		<comments>http://blogg.athega.se/2009/07/06/mongodb/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 01:50:58 +0000</pubDate>
		<dc:creator>Peter Hellberg</dc:creator>
				<category><![CDATA[Databaser]]></category>
		<category><![CDATA[Kod]]></category>
		<category><![CDATA[Öppen källkod]]></category>
		<category><![CDATA[BSON]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Databas]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=268</guid>
		<description><![CDATA[MongoDB är en blandning av nyckel-värde databas (t.ex. Scalaris), dokumentdatabas (t.ex. CouchDB) och relationsdatabas (t.ex. MySQL). Den är skriven i C++ och passar bra för realtidsanalys av webbstatistik (sidvisningar, unika besökare, osv), Sessionsobjekt, Datacachning och mycket mer. Den har inbyggd replikering, automatisk failover och sharding, hög prestanda och den är open source. Internt så sparas [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" title="MongoDB - Scalability/Performance - Depth of Functionality" src="http://blogg.athega.se/wp-content/uploads/2009/07/MongoDB-Scalability_Performance-Depth-of-Functionality.png" alt="MongoDB - Scalability/Performance - Depth of Functionality" width="301" height="210" /></p>
<p>MongoDB är en blandning av nyckel-värde databas (t.ex. <a href="http://code.google.com/p/scalaris/">Scalaris</a>), dokumentdatabas (t.ex. <a href="http://couchdb.apache.org/">CouchDB</a>) och relationsdatabas (t.ex. <a href="http://www.mysql.com/">MySQL</a>).</p>
<p>Den är skriven i C++ och passar bra för realtidsanalys av webbstatistik<br />
(sidvisningar, unika besökare, osv), Sessionsobjekt, Datacachning och mycket mer.</p>
<p>Den har inbyggd replikering, automatisk failover och sharding, hög prestanda och den är open source.</p>
<p>Internt så sparas datan i formatet BSON, vilket är JSON med ett datumformat och möjlighet att spara binärdata.</p>
<h2 id="installation">Installation</h2>
<p>Jag kommer som vanligt att använda Mac OS X och Ruby men det finns förkompilerade paket för de vanligaste operativsystemen:</p>
<ul>
<li>OS X 32 bit</li>
<li>OS X 64 bit</li>
<li>Linux 32 bit</li>
<li>Linux 64 bit</li>
<li>Windows 32 bit</li>
<li>Solaris i86pc (EXPERIMENTAL)</li>
</ul>
<p>Det finns även bindningar till ett flertal olika språk, dock har jag inte sett någon för .NET</p>
<ul>
<li><a href="http://www.mongodb.org/pages/viewpage.action?pageId=133409">C++</a> (Inkluderas med databasen)</li>
<li><a href="http://www.mongodb.org/display/DOCS/Java+Language+Center">Java</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/Perl+Language+Center">Perl</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/PHP+Language+Center">PHP</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/Python+Language+Center">Python</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/Ruby+Language+Center">Ruby</a></li>
</ul>
<p>Installationen var helt smärtfri, bara att ladda ner senaste tarbollen (<a href="http://downloads.mongodb.org/osx/mongodb-osx-x86_64-0.9.5.tgz">mongodb-osx-x86_64-0.9.5</a>) och packa upp den på valfri plats.</p>
<p>Man behöver skapa en datakatalog (standard är <code>/data/db</code>) och sen starta servern med</p>
<p><code style="padding: 0 0.5em; color: #fff; background-color: #000;">./mongod --dbpath [DATAKATALOGEN]</code></p>
<p>Nu lyssnar databasen på port <code>27017</code> och det finns ett webbgränssnitt på port <code>28017</code>.</p>
<p>På Rubysidan behövde jag bara installera paketet <code>mongodb-mongo</code> från <a href="http://github.com/mongodb/mongo/tree/master">GitHub</a> med RubyGems:</p>
<p><code style="padding: 0 0.5em; color: #fff; background-color: #000;">sudo gem install mongodb-mongo</code></p>
<h2 id="dags_fr_lite_kod">Dags för lite kod</h2>
<p>Att ansluta till databasen:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'mongo'</span>
&nbsp;
db = <span style="color:#6666ff; font-weight:bold;">XGen::Mongo::Driver::Mongo</span>.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">db</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;mydb&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>MongoDB har konceptet <code>collections</code> för likartade dokument. (Eller olikartade.. det bestämmer du helt själv) Man kan likna dem vid tabeller.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Hämtar en collection, den skapas om den inte redan finns</span>
coll = db.<span style="color:#9900CC;">collection</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;testCollection&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Man kan stoppa in olika sorters dokument</span>
coll.<span style="color:#9900CC;">insert</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Peter&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:address</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:city</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Stockholm&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
coll.<span style="color:#9900CC;">insert</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Velociraptor&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:top_speed</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;25 m/s&quot;</span>,
              <span style="color:#ff3333; font-weight:bold;">:can</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
                <span style="color:#ff3333; font-weight:bold;">:open_doors</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>,
                <span style="color:#ff3333; font-weight:bold;">:turn_at_any_angle_at_any_velocity</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
              <span style="color:#006600; font-weight:bold;">&#125;</span>
            <span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Man kan sedan hämta ut datat ur databasen med metoden find_first.</span>
peter  = coll.<span style="color:#9900CC;">find_first</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'Peter'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
raptor = coll.<span style="color:#9900CC;">find_first</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:top_speed</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'25 m/s'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Man kan även hämta alla dokument i en collection</span>
coll.<span style="color:#9900CC;">find</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>doc<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> doc.<span style="color:#9900CC;">inspect</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<h2 id="vidare_lsning">Vidare läsning</h2>
<p>Jag har bara skrapat lite lätt på ytan av allt som går att göra med MongoDB, om du tycker att det verkar intressant så rekomenderar jag följande länkar:</p>
<ul>
<li><a href="http://www.slideshare.net/pengwynn/mongodb-ruby-document-store-that-doesnt-rhyme-with-ouch">MongoDB &#8211; Ruby document store that doesn’t rhyme with ouch</a> (Presentation av Wynn Netherland)</li>
<li><a href="http://mongodb.org">MongoDB</a> (Wiki)</li>
<li><a href="http://en.wikipedia.org/wiki/BSON">BSON-formatet</a> (Wikipedia)</li>
<li><a href="http://twitter.com/mongodb">@mongodb</a> (Twitter)</li>
<li><a href="http://www.10gen.com/">10gen</a> (Företaget som sponsrar utvecklingen)</li>
<li><a href="http://www.mbeckler.org/velociraptors/">Solution to XKCD Velociraptors Problem #2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/07/06/mongodb/feed/</wfw:commentRss>
		<slash:comments>1</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>
	</channel>
</rss>

