<?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; JavaScript</title>
	<atom:link href="http://blogg.athega.se/tagg/javascript/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>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>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>RailsConf: Tisdag</title>
		<link>http://blogg.athega.se/2009/05/06/railsconf-tisdag/</link>
		<comments>http://blogg.athega.se/2009/05/06/railsconf-tisdag/#comments</comments>
		<pubDate>Wed, 06 May 2009 02:00:12 +0000</pubDate>
		<dc:creator>Peter Hellberg</dc:creator>
				<category><![CDATA[Konferens]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Keynote]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[RailsConf]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=183</guid>
		<description><![CDATA[Keynote: Rails 3 ..and the real secret to high productivity Presentationen (PDF) David började med en tillbakablick på de 5 år som gått och vad som sagts om ramverket och hur det kom sig att det skapades så många kloner. Han fortsatte med att berätta om några förändringar i Rails 3.0 Ny router Snabbare och [...]]]></description>
			<content:encoded><![CDATA[<h2 id="keynote_rails_3_and_the_real_secret_to_high_productivity">Keynote: Rails 3 ..and the real secret to high productivity</h2>
<p><a href="http://assets.en.oreilly.com/1/event/24/Rails%203%20and%20the%20Real%20Secret%20to%20High%20Productivity%20Presentation.pdf">Presentationen</a> (PDF)</p>
<p>David började med en tillbakablick på de 5 år som gått och vad som sagts om ramverket och hur det kom sig att det skapades så många kloner. Han fortsatte med att berätta om några förändringar i Rails 3.0</p>
<ul>
<li>Ny router</li>
<li>Snabbare och bättre Rack-stöd</li>
<li>XSS skyddet uppdateras</li>
<li>JavaScript blir unobtrusive och ramverksagnostiskt</li>
<li>Mer agnostisism; Action ORM, Generatorer</li>
<li>Refakturering; Abstract Controllers, ActiveRecord, Callbacks</li>
</ul>
<p>En välkommen förändring är att output i vyerna kommer att bli escape:ad per default. För att skriva ut råformatet använder man metoden <strong>raw</strong>.</p>
<p>Unobtrusive JavaScript kommer att implementeras genom att använda HTML 5 attribut:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">## Rails 2.x
<span style="color:#006600; font-weight:bold;">&lt;%</span>= link_to_remote <span style="color:#996600;">&quot;Delete&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:url</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@comment</span>, <span style="color:#ff3333; font-weight:bold;">:method</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:delete</span> <span style="color:#006600; font-weight:bold;">%&gt;</span> 
&lt;a href=&quot;#&quot; onclick=&quot;new Ajax.Request('/comments/1', {asynchronous:true, 
evalScripts:true, method:'delete'}); return false;&quot;&gt;Destroy&lt;/a&gt;
&nbsp;
## Rails 3.x
<span style="color:#006600; font-weight:bold;">&lt;%</span>= link_to <span style="color:#996600;">&quot;Delete&quot;</span>, <span style="color:#0066ff; font-weight:bold;">@comment</span>, <span style="color:#ff3333; font-weight:bold;">:remote</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;">:method</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:delete</span> <span style="color:#006600; font-weight:bold;">%&gt;</span> 
&lt;a href=&quot;/comments/1&quot; data-remote=&quot;true&quot; data-method=&quot;delete&quot;&gt;Destroy&lt;/a&gt;</pre></div></div>

<p>Och sen appliceras metoderna med JavaScript:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">body</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;click&quot;</span><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: #003366; font-weight: bold;">var</span> element <span style="color: #339933;">=</span> event.<span style="color: #660066;">findElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a['data-remote']&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    <span style="color: #003366; font-weight: bold;">var</span> method <span style="color: #339933;">=</span> element.<span style="color: #660066;">readAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;data-method&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #3366CC;">&quot;get&quot;</span><span style="color: #339933;">;</span> 
    <span style="color: #003366; font-weight: bold;">new</span> Ajax.<span style="color: #660066;">Request</span><span style="color: #009900;">&#40;</span>element.<span style="color: #660066;">readAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;href&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> method<span style="color: #339933;">:</span> 
method <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
    event.<span style="color: #000066;">stop</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;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Han visade på hur viktigt hög produktivitet faktiskt är, hur motivation snabbt minskar vid svåra problem.</p>
<h3 id="relaterade_bloggposter">Relaterade bloggposter</h3>
<ul>
<li><a href="http://blogs.sun.com/arungupta/entry/rails_conf_2009_day_2">Rails Conf 2009 Day 2 &#8211; DHH Keynote</a></li>
</ul>
<h2 id="the_gilt_effect_handling_1000_shopping_cart_updates_per_second_in_rails">The Gilt Effect: Handling 1000 Shopping Cart Updates per second in Rails</h2>
<p>Anställda på <a href="http://www.gilt.com/">Gilt Groupe</a> berättade om hur deras serverarkitektur ser ut, de använder <a href="http://www.postgresql.org/">PostgreSQL</a>, 400+ Thin servrar, 2 <a href="http://www.zeus.com/products/zxtm/">ZXTM</a>&#8217;s  (Zeus Extensible Traffic Manager)</p>
<p>Applikationen är skriven i Ruby on Rails.</p>
<p>De måste jobba med sharding för att klara av den höga lasten.</p>
<p>De använder ett internt CMS skrivet i Rails och har två &#8220;CDN&#8221;-servrar framför som serverar förgenererade sidor. (En server på östkusten och en på västkusten)</p>
<h3 id="stort_antal_transaktioner">Stort antal transaktioner</h3>
<p>Dedikerade tjänster för varje transaktion &#8211; JRuby + EC2 + SQL + Rails</p>
<p>EC2 (lastbalanserad genom Zeus), expanderbar kapacitet, tid/behovsbaserad ökning av tillgänglig kapacitet.</p>
<p>De arbetar tillsammans med Joyent för hosting.</p>
<h3 id="hg_volym_delat_tillstnd">Hög volym / Delat tillstånd</h3>
<p>Unik ehandelsmodell, &#8220;flash sale&#8221; där alla produkter tar slut på en dag.</p>
<h3 id="inventariemodellen">Inventariemodellen</h3>
<p>Gilt hanterar varje fysiskt objekt individuellt</p>
<ul>
<li>Begränsat antal</li>
<li>Går inte att få tag i fler</li>
</ul>
<h3 id="varukorgsmodellen">Varukorgsmodellen</h3>
<h4 id="shoppingfasen">Shoppingfasen:</h4>
<ul>
<li>Att lägga till en produkt skapar en <em>reservation</em></li>
<li>Om produkten är tillgänglig får man en 10-minuters reservation
<ul>
<li>Man måste betala in</li>
</ul>
</li>
</ul>
<h4 id="betalningsfasen">Betalningsfasen</h4>
<ul>
<li>Förfråga om att förlänga reservationen</li>
<li>Om reservationen är <valid>, förlängs den med 10 minuter
<ul>
<li>Man kan får en prioriterad uppgradering</li>
</ul>
</li>
<li>Om reservationen inte är valid och det inte finns några lediga produkter
<ul>
<li>Meddelande till kunden att produkten är slut och att man kan skriva upp sig på en väntelista.</li>
</ul>
</li>
</ul>
<h4 id="betalning_genomfrd">Betalning genomförd</h4>
<p>Respektive produkt markeras som såld i databasen</p>
<h3 id="gilts_framtidsstrategi">Gilts framtidsstrategi</h3>
<ul>
<li>Kärntjänsterna är vy-lösa (MC)</li>
<li>Enda gränssnittet är JSON/HTTP</li>
<li>Externa tjänster skrivna i Ruby, Java för kritiska operationer internt</li>
<li>Internt ramverk kallat Blackbird under utveckling, det hanterar skalbar deployment av tjänter i Ruby.</li>
</ul>
<h2 id="pwn_your_infrastructure_behind_call_of_duty_world_at_war">PWN Your Infrastructure: Behind Call of Duty: World at War</h2>
<p>Tyvärr fick jag inte plats inne på föreläsningen <a href="http://en.oreilly.com/rails2009/public/schedule/detail/7073">UI Fundamentals for Programmers</a> med Ryan Singer från <a href="http://37signals.com/">37Signals</a> så det fick bli mitt andrahandsval om hur Agora Games skalar sin serverarkitektur.</p>
<p>Jason LaPorte (<a href="http://www.agoragames.com/">Agora Games</a>) talar om vad de tycker är fel med deployment av Rails. Ett av de största problemen är skalbarhet (Av administratörens tid) och i hans värld översätts detta i hur mycket den dagliga arbetsbördan ökar när antalet servrar ökar.</p>
<p>För att hantera fel jobbar de med virtualisering med hjälp av <a href="http://terremark.com">Terremark</a> och replikation för mjukvaruproblem.</p>
<p>De propagerar /usr/local till alla servrar med NFS, vilket gör att uppdateringar sker hyffsat smärtfritt.</p>
<p>De har ett internt system de kallar Overlord skrivet i Rails, det sköter hantering av konfigurationsfiler som sedan laddas ner av respektive server.</p>
<p><a href="http://mmonit.com/monit/">Monit</a> ser till att de konfigurerade tjänsterna startas samt startar om tjänster som gått ner.</p>
<p><a href="http://oss.oetiker.ch/rrdtool/">RRDTool</a> visualiserar hur de olika tjänsterna mår genom att använda Monits xml-format. (http://server/_status?format=xml)</p>
<p>Centraliserad deployment med ett enkelt shellscript som:</p>
<ul>
<li>Updaterar koden</li>
<li>Uppdaterar miljön</li>
<li>Startar om servrarna</li>
</ul>
<h2 id="javascript_testing_in_rails_fast_headless_in_browser_pick_any_three">JavaScript Testing in Rails: Fast, Headless, In-Browser. Pick Any Three.</h2>
<p>Larry Karnowski och Jason Rudolph (<a href="http://thinkrelevance.com/">Relevance, Inc.</a>) visar <a href="http://github.com/relevance/blue-ridge/tree/master">Blue Ridge</a>, ett ramverk för testdriven utveckling med JavaScript. </p>
<h3 id="delarna_i_blue_ridge">Delarna i Blue Ridge</h3>
<ul>
<li>Rhino &#8211; en Java-baserad JavaScript interpreter</li>
<li>Screw.Unit &#8211; en BDD syntax för JavaScript, liknar RSpec</li>
<li>Smoke &#8211; ett JavaScript mocking &amp; stubbing bibliotek, liknar Mocha</li>
<li>env.js &#8211; en DOM implementation skriven helt i JavaScript</li>
</ul>
<p>Det verkar grymt användbart att kunna köra tester av alla JavaScript från kommandoraden eller en CI-server. Tyvärr verkar det inte som om env.js fungerar tillsammans med jQuery 1.3.x så de kör med jQuery 1.2.6. De jobbar dock på att lösa problemet.</p>
<h3 id="relaterade_lnkar">Relaterade länkar</h3>
<ul>
<li><a href="http://github.com/relevance/blue-ridge-sample-app/tree/master">blue-ridge-sample-app</a></li>
<li><a href="http://pastie.org/469178">http://pastie.org/469178</a></li>
</ul>
<h2 id="smacking_git_around_advanced_git_tricks">Smacking Git Around &#8211; Advanced Git Tricks</h2>
<p><a href="http://tinyurl.com/gitrailsconf09">Presentationen</a> (PDF) |<br />
<a href="http://tinyurl.com/gitrailsconf09-cheat">Cheat-sheet</a> (PDF)</p>
<p>Scott Chacon (<a href="http://github.com">GitHub</a>) började med &#8220;Git in 60 seconds&#8221; och gick vidare med att gå igenom mer avancerade funktioner i Git.</p>
<ul>
<li>Med filter branches kan man ta bort en fil från alla commits.</li>
<li>Subtree merging är ett alternativ till Submodules.</li>
<li>Git Bisect är användbart för att hitta vilken commit som orsakade problem</li>
<li>Man kan diffa binära filer genom att använda .gitattributes</li>
</ul>
<h2 id="quality_code_with_cucumber">Quality Code with Cucumber</h2>
<p>Aslak Hellesøy (<a href="http://www.bekk.no/">Bekk Consulting AS</a>) berättar om BDD med hjälp av <a href="http://cukes.info/">Cucumber</a>.</p>
<ul>
<li>Step &#8211; Method invocation</li>
<li>Step definition &#8211; Method definition</li>
</ul>
<p>Jag är inte helt övertygad om att det är en bra idé att kunna definiera dataset i sina steps, men för övrigt verkar det riktigt användbart.</p>
<p>Tags är en riktigt trevlig liten feature.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/05/06/railsconf-tisdag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

